入力として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).
これはサブセットでは問題ありませんが、適切なサブセットでは問題ありません。私の問題は、正しい/ 4の第2節がどのように働くかを私が理解することから生ずると思います。すべての助けが大歓迎です。
編集:
私は最初のリストは、第二と第二の適切なサブセットは、最初の適切なサブセットあったかどうかを判断しようとしていた実現。より正確になるようにコードをクリーンアップしました。
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
リストを並べ替えるだけです。これは最も賢明なことであり、標準ライブラリがそれをどのように取り扱うかです。 –
@Boris適切なサブセットの標準ライブラリ述語に向けて私を指摘できますか? –
@aBathologistライブラリ(ordsets)(例えば、SWI-Prolog実装で)とそのソースを見てください。 「適切な」サブセットの述語はありませんが、あなたの答えで既に指摘したように、長さを見るだけで十分です。 –