Prologでユニオン関数を書き込もうとしていますが、問題が発生しています。私は例を調べて、ユニオンの組み込みの例をリストしましたが、私は課題のために自分で書いています。リストの値が重複している場合や、リストの順序が昇順でない場合に、奇妙な結果が生じることに気づきました。組み込みのユニオンコードは次のとおりです。
union([], A, A) :- !.
union([A|C], B, D) :-
memberchk(A, B), !,
union(C, B, D).
union([A|B], C, [A|D]) :-
union(B, C, D).
ここでの擬似コードは、結果内でリスト1のすべてを検索し、それが使い果たされたら、リスト2とリスト3を比較することだと思います。これらは同じである必要があります。ただし、これは順序をチェックしません。
30 ?- union([1,2,3],[],[3,2,1]).
false.
なぜこれは間違っているのですか?リスト1とリスト3は、順序は異なりますが同じセットです。
24 ?- union([a],[a,a],[a,a]).
true.
25 ?- union([a,a],[a],[a,a]).
false.
これら2つの違いは何ですか?それらは同じ結果をもたらすはずです。ただし、関数の記述方法により、最終的には、25行目で異なるリスト2とリスト3を比較するだけです。
私の質問はです。。。重複が適切に処理され、順序が重要にならないように、これらの関数を作成するためのより良い方法はありますか?組み込みのメソッドはトリックを実行しますが、サイコロは実行しないと想定されます。