私は以下のコードを持っています: このコードはリストで動作しますが、これらのリストはセットを表しているので、[1,1,2,2,3,3]と[1,2,3]は同等でなければならない。このProlog述語はなぜ機能しますか?
%contains(L1, L2), returns true if L1 contains L2
contains(_, []).
contains(L1, [Head|Tail]) :- member(Head, L1), contains(L1, Tail).
%equals(L1, L2), returns true if L1 is equal to L2
equals([X|L1],[X|L2]) :- equals(L1, L2).
equals(L1, L2) :- contains(L1, L2), contains(L2, L1).
アイデアは、等号([1,2,3]、[1,2,1,3])がtrueを返すべきであるということです。しかし、上記の定義に基づいて、私は次のようなことが起こります:
- equals([1,2,3]、[1,2,1,3])が最初のルールに一致し、 ([2,3]、[2,1,3]])と等しくなります。
- equals([2,3]、[2,1,3]])は第2の規則と一致し、contains([2,3]、[2,1,3])を呼び出す。 contains([2,1 、3]、[2,3])。
- ([2,3]、[2,1,3])失敗し、リターン号
に等しく、まだ、それはまだ動作が含まれています。それを混乱させる他の試みも同様です。誰かが私にそれを説明できますか?
(Prologの実装:SWI-Prologのバージョン2.7.12)
実際、これは私がこれまで作業していた最初のPrologプログラム(またはより正確には宿題)であり、実際にはそれほど遠くには達しませんでした。私は完全な初心者です。とにかく、それを私に説明してくれてありがとう。 –