2017-10-08 16 views
0

私は手紙を含むリストの数を持っていると私は、これらの与えられたリストの1に存在する重複があるかどうかをチェックする述語書かれています:Prologで述語をN回繰り返す方法は?

noDuplicates([]). 
noDuplicates([H|T]):- 
    not(member(H, T)), 
    noDuplicates(T). 

が、私は10本のリストを持っているが、私はそこかどうかを知りたいですそれらのいずれにも重複していないので、私は一つの大きなリスト、のようなもののサブリストにそれらを作っ:

[[A,B,C], [C,A,D], [E,F,G]...]] 

(だからすることができ、大きなリストで重複はなく、個々のサブリスト)。

私は重複テストを10回行う必要があります。サブリストごとに1回ですが、これをPrologでどのように記述しますか?私はおそらくそれを10回書くことができますが、私の推測では、すべてのサブリストがチェックされるまで、再帰を使ってプロローグを繰り返すことができます。

基本的に、Nが10になるまで、この述語をN回繰り返す必要があります。私は本当にそれに苦しんでいます。誰が何をすべきか考えていますか?

答えて

4

は、次のように私たちが質問にを一般してみましょう:

あなたは単一リストについては、欲しいものを表現する述語p/1を持っています。

次のようにこのように、このようなリストのリストからリフトこの定義には、あなたが述語ps/1を定義することができます。

 
ps([]). 
ps([L|Ls]) :- 
     p(L), 
     ps(Ls). 

あなたはこのパターンを見るたびに、あなたはmaplist/2を使用することができます。これは、上記で同等にされています

 
ps(Ls) :- maplist(p, Ls). 

目標maplist(p, Ls)p場合に限っが  Lsの各要素Lのために保持している事実です。

「ループする」と「繰り返す」と考えると、Prologの理解が制限されることに注意してください。これらは命令であるの概念であり、リストがすでに完全にインスタンス化されている場合にのみ意味をなさない。しかし、Prologからは、それ以上のものが期待されています。との本格的な関係も、関係が成立するリストを生成すると期待しています。そしてそのような場合には、まだ「繰り返す」ものは何もありません。何もないから始まり、に何の解決策があるのか​​をPrologに尋ねます。 一般。したがって

、関係ps/1はリストのリストのために保持している場合を説明の観点から考える:

  1. それは空のリスト[]のために保持しています。Lps/1が残っているリストLsのために保持しているため我々の最初の述語(p/1)が保持している場合
  2. それはリスト[L|Ls]のために保持しています。

この宣言型読書は関係なく、任意の 場合、多くのリスト要素は既に、インスタンス化されているか、すべての方向で適用されません。それは10の のためだけでなく0のリストのために働きます。  50.