我正在嘗試編寫一個程序,它將兩個列表作爲輸入並檢查正確的子集。我開始:正確的子集 - Prolog
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的第二項如何工作而引起的。任何和所有的幫助,不勝感激。
編輯:
意識到,我試圖以確定第一列表是第二和第二的真子集是第一的真子集。清理代碼更加精確。
proper([],_).
proper([A|T1],[A|T2) :- member(A,T2), proper(T1,T2).
proper([H1|T1], [H2|T2]) :- \+ member(H1, T2).
只需對您的列表進行排序即可。這是最明智的做法,也是標準庫如何處理它。 – 2013-10-24 09:44:30
@Boris你能指點我的標準庫謂詞適當的子集嗎? –
@aBathologist查看庫(ordsets)(例如,在SWI-Prolog實現中)及其來源。沒有「適當」子集的謂詞,但只要看看長度應該足夠好,正如你在答案中已經指出的那樣。 – 2013-10-24 22:00:49