入力として 2 つのリストを取り、適切なサブセットをチェックするプログラムを作成しようとしています。私はから始めました:
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2]) :- proper(T1,T2).
これは、まったく同じ順序の入力に対して完全に機能します。例えば:
?- proper([a,b,c],[a,b,c,d]).
Yes
ただし、次のような入力には使用できません。
?- proper([a,b,c],[b,d,a,c]).
No
このサイトを調べたところ、以前に尋ねられた次の質問が見つかりました。
そのため、コードを次のように変更しました。
proper([A],[]).
proper([],[A]).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
これはサブセットではうまく機能しますが、適切なサブセットでは機能しません。私の問題は、proper/4 の 2 番目の節がどのように機能するかを理解していることから生じていると思います。どんな助けでも大歓迎です。
編集:
最初のリストが 2 番目の適切なサブセットであり、2 番目のリストが最初の適切なサブセットであるかどうかを判断しようとしていたことに気付きました。より正確になるようにコードをクリーンアップしました。
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).