2016-11-20 8 views
0

私はPrologコードを書こうとしていますが、これを真に戻すことはできません。私はすべての要素が2つの他のリストに含まれるリストを見つけようとしています。例えば、すべてのリストAの要素は、BとCのリストにあります。 マイPrologのコードは次のとおりです。要素がリストにある場合はメンバーの述語がtrueを返すプロローグ内のこの行がfalseを返すのはなぜですか?

member(X, [X|_]). 
member(X, [_|T]) :- 
    member(X, T). 

first([H0|T0], [H0|T1], A) :- 
    member(H0, A), 
    first(T0, [H0|T1], A). 
first([H0|T0], [_|T1], A) :- 
    first([H0|T0], T1, A). 

。述語 'first'を使用して、メンバーリストを使用して、CリストのAとBの一致する要素を検索しようとしています。私が見つけたら、さらに最初のリストに行き、その最初の要素を2番目のリスト要素と比較し、再び一致させると、3番目のリストでそれを見つけることができます。私はそれが叶うことを願っていますが、私が走るときに

?- first([4, 6, 4], [4, 5, 6, 4], [1, 2, 4, 6]). 

それは偽を与えて、私は理由を理解できません。これは単純な注意間違いのように思われますが、私はその周りに頭を浮かべることはできません。

+0

あなたは空のリストのための基本ケースが欠けているように見えます。 –

答えて

1

私はプロローグについて何も知らないが、みんなのように前に論理エラーに噛まれてしまった。 (=

私がコメントしたように、あなたはfirst([], _, _)のための基本ケースが欠けているように見える例:。

first([4], [4], [4]) :- 
    member(4, [4]), // quite true 
    first([], [4], [4]). // No matching rule, as all those assume an existing head in the first argument 
+0

はい、これは私の間違いでした、ありがとうございました!解決済み – Oskars

0

私は私はあなたの質問を理解してわからないが、私はあなたの述語をさらに指定しようとすることができます最初/ 3

first(+L, +L1, +L2) 
    succeeds if every element of L is found either in L1 or in L2. 

これはあなたが探しているものであれば、:

first([], _, _). 
first([E|L], L1, L2) :- 
    (member(E, L1); member(E, L2)), 
    first(L, L1, L2). 
成功のの

例:faiureの

first([1, 2, 3], [1, 2, 3], [1, 2]). 
first([1], [1, 2, 3], [1, 2]). 
first([1, 2, 3], [1, 2, 3], []). 

例:

first([1, 2, 3, 5], [1, 2, 3], [1, 2]). 
first([7], [1, 2, 3], [1, 2]). 
first([1, 2, 3], [], []). 
関連する問題