2016-05-23 7 views
3

を除いて同じ要素を持っているかどうかをチェックし、私は文字の二つのリストで働いていると私は、彼らが同じ位置にあるものを除いて同じ要素を持っている場合は、このように、チェックしたい:プロローグ - 二つのリストが1

compare([L1,L2,L3,L4],[W1,W2,W3,W4]) :- 
((W1 \= L1, W2 = L2, W3 = L3, W4 = L4); 
(W1 = L1, W2 \= L2, W3 = L3, W4 = L4); 
(W1 = L1, W2 = L2, W3 \= L3, W4 = L4); 
(W1 = L1, W2 = L2, W3 = L3, W4 \= L4)). 

これは機能していますが、単純な方法がありますか?

ありがとうございました。

答えて

3

ソリューションが機能しても、それは長さ4のリストに対してのみ機能するため、きれいでも再利用可能でもありません。どんなサイズのリストでも機能する再帰的述語を定義しようとしましょう。

両方の要素を一度に表示すると、実際には2つの要素しか考慮されません。要素が同じかどうかです。

もしそれらが同じであれば、それは成功するためには両方のリストの残りの要素がちょうど1つ異なる必要があることを意味します。そして、それはまさに私たちが最初に書いている述語です!

compare([H|T1], [H|T2]) :- compare(T1, T2). 

今や第2のケースです。リストの最初の要素が異なる場合は、両方のリストの残りの部分はまったく同じでなければなりません(私たちはすでに別の要素があり

compare([H1|T1], [H2|T1]) :- H1 \= H2. 

に遭遇したとして、それがすべてです!今、次のような出力が表示されることがありこれは:

がオープンチョイス・ポイントはまだあるので、これは次のとおりです。最初の句が一致する最初の要素については、しかし、第二節はまだ考慮されていないが、このケースでは、我々は両方の句ことを知っていますは相互に排他的ですので、カットポイント(!)を追加して、選択肢が残っていないことを確認してください。

これにより、2番目の終了を簡略化することもできます。最初の要素が同じではないことがわかったので、もう一度確認する必要はありません。

一緒にすべてを置くと、コードは次のようになります。

compare([H|T1], [H|T2]) :- !, compare(T1, T2). 
compare([_|T], [_|T]). 
+1

これは私が必要なものです!ありがとうございました! – KonaKona

+1

問題なく動作しますが(+1)、警告があります:両方のリストが可変である必要があります。そうでない場合、コードは単調ではありません。 – repeat