2016-07-02 6 views
1

で別のリストにあるリストでリストを比較します。 (のwriteln文でデバッグした後に見られるような) は、私は二つのリストを持っているプロローグ

?- common([[a,b,c], [e,b,d], [f,g,a]], [a,e], Outlist). 
false. 

メインリスト

は、リスト内のリストのまま:

common([],L). 
common([H|T], L, Out):-  
    intersection(H,L,Out), common(T, L, Out), 
    length(Out,Len). 

しかし、それは動作していない:私は次のコードをしようとしています

L is: 
[a,e] 
H|T is: 
[[f,g,a]] 
Outlist = [] . 

問題はどこにありますか?これをどのように修正できますか?

私はデバッグにコードを編集し、何とかそれが仕事を始めたことがわかった:

common([],L,Out). 
common([H|T], L, Out):-  
    writeln('------------in common--------------'), 
    writeln('L is:'), writeln(L), 
    writeln('H is:'), writeln(H), 
    intersection(L,H,Out2list), 
    writeln('Out2list is:'), writeln(Out2list), 
    common(T, L, Out2). 

41 ?- common([[a,b,c], [e,b,d], [f,g,a]], [a,e], Outlist). 
------------in common-------------- 
L is: 
[a,e] 
H is: 
[a,b,c] 
Out2list is: 
[a] 
------------in common-------------- 
L is: 
[a,e] 
H is: 
[e,b,d] 
Out2list is: 
[e] 
------------in common-------------- 
L is: 
[a,e] 
H is: 
[f,g,a] 
Out2list is: 
[a] 
true. 
+1

? – dasblinkenlight

+0

共通アイテムなので、交差点に出なければならないので、[a]を表示することを期待します。 – rnso

+2

'[[f、g、a]]'は '[f、g、a]'という1つの要素のリストです。 '[a、e]'は2つの要素のリストで、 'a'と' e'です。明らかに、 '{f、g、a]'は 'a'または' e'と同じではないので、これらの2つのリストに共通の要素はありません。したがって、 'intersection([a、e]、[[f、g、a]]、R)'は 'R = []'となります。ですから元の問題は、あなたがフラットリストと交差している*リストのリストがあることです。 '[[f、g、a]]'は一つの要素のリストです。 '[f、g、a]'は3つの要素のリストです。 – lurker

答えて

1

まずあなたが述語共通/ 2と述語の共通/ 3を書かれていることを確認してみましょう。あなたの質問を読んで、私はあなたがcommon/3の基本ケースになると思っています。あなたが記述したい関係について考える、それは空のリストの交差点やその他のリストが空リストであることを定義するために理にかなって:

common([],_,[]). 

はしかし、あなたが三分の一を期待完全には明らかではありません議論する。あなたの質問では、それはの共通数でなければならないと書いています。あなたの述語common/3で長さ/ 2を使用すると、この解釈がサポートされます。あなたは3番目のリストにある各交点の長さを持っていると思います。この場合:

common([],_,[]). 
common([H|T], L, [Len|Out]):- % Len is in the 3rd list 
    intersection(H,L,I),   % I is intersection of H and L 
    length(I,Len),    % Len is length of I 
    common(T, L, Out).   % the same for T, L and Out 

このバージョンではあなたの例のクエリ利回り:あなたの最初のコメントで

?- common([[a,b,c], [e,b,d], [f,g,a]],[a,e],I). 
I = [1,1,1] 

は、しかし、あなたはあなたのことを書きますOutlist[a]とします。これは、第3引数に数字の代わりにリストが必要であることを示唆しています。しかし、あなたのサンプルクエリ[a]を見ることは答えにはなり得ません。一方で、あなたは第二引数で最初のリストの要素の全ての交点を見たいという意味であれば、あなたのような何かを書くのが好きかもしれません:

common2([],_,[]). 
common2([H|T], L, [I|Out]):- % I is in the third list  
    intersection(H,L,I),  % I is intersection of H and L 
    common2(T, L, Out).   % the same for T, L and Out 

これはあなたの例で得られます。

一方
?- common2([[a,b,c], [e,b,d], [f,g,a]],[a,e],I). 
I = [[a],[e],[a]] 

、あなたは第二引数で最初の引数のすべてリストの交差点を見たいという意味であれば、あなたはこのような何かに行くのが好きかもしれません:

common3([],_,[]).    % special case empty list 
common3([H|T],L,I) :-   % if 1st list not empty 
    common3_([H|T],L,I).  % I is described in common3_/3 

common3_([],I,I).    % if the list is empty I = Outlist 
common3_([H|T], L, O) :- 
    intersection(H,L,I),  % I is intersection of H and L 
    common3_(T,I,O).   % only the elements in I can be in O 
あなたの例のリストでは

aeでもないが、すべての3つのリストで発生するので、これは

?- common3([[a,b,c], [e,b,d], [f,g,a]],[a,e],I). 
I = [] 

が得られます。しかし、あなたは第二のリストにaを追加した場合:

?- common3([[a,b,c], [e,b,d,a], [f,g,a]],[a,e],I). 
I = [a] 
あなたは `outlist`で取得できると期待何を出力
+0

詳細を説明していただきありがとうございます。 – rnso

関連する問題