2017-09-14 126 views
0

我對Prolog很陌生。我陷入了這個問題: 如果我有兩個列表,我如何檢查列表1是否包含第二個列表的所有元素,但它們不必相同。所以列表2可能包含更多的元素。如何檢查列表2是否包含所有列表1元素?

我知道我可以使用member/2來檢查某個元素是否在列表中。但是我檢查後不知道如何不包含這兩個列表的成員。例如:
如果我有列表A = [a,b,c,a]和列表B = [a,b,c,d,e],我首先檢查列表A中的第一個'a'是否在列表B中。顯然這返回True,但是如果我從列表中檢查最後一個'a' A,我應該得到一個返回的False,因爲列表A有2個'a',B只有1個,而我返回True。我真的不知道如何解決這個問題。

我真的很感激,如果有人能幫助我:) 謝謝!

編輯:解釋我的問題有點多

+0

看在['member/2'](http://www.swi-prolog.org/pldoc/man?predicate=member/2)並查找(Google)[「Prolog基本列表處理」](https:// www.doc.gold.ac.uk/~mas02gw/prolog_tutorial/prologpages/lists.html)。請在代碼方面展示您嘗試的內容,並詢問有關您卡在哪裏的更具體問題。 – lurker

+0

我改變了我的問題:) – Boomer

+0

先嚐試一下自己,然後通過提供一個最小的,完整的和可驗證的代碼示例來問你已經嘗試過的代碼,然後詢問具體的問題(即爲什麼我的代碼不能完成我所期望的)。 – Heri

回答

0

select/3不正是我們想要的:

is_sublist([], []). 
is_sublist([], [_|_]). 
is_sublist([H|T], L) :- 
    once(select(H, L, L2)), 
    is_sublist(T, L2). 

我們once/1包住,以避免在一個元素出現了多次的情況下多餘的成功。

注:可以去除once/1,以獲得更多的工作行爲:

?- is_sublist(Z,[a,b,c]).   % Without once 
Z = [] ; 
Z = [a] ; 
Z = [a, b] ; 
Z = [a, b, c] ; 
Z = [a, c] ; 
Z = [a, c, b] ; 
Z = [b] ; 
Z = [b, a] ; 
Z = [b, a, c] ; 
Z = [b, c] ; 
Z = [b, c, a] ; 
Z = [c] ; 
Z = [c, a] ; 
Z = [c, a, b] ; 
Z = [c, b] ; 
Z = [c, b, a] ; 
false. 

這不會列舉所有可能的答案相反的方向,所以不是一切都是完美的:

?- is_sublist([a,b],Z).    % Without once 
Z = [a, b] ; 
Z = [a, b, _886|_888] ; 
Z = [a, _880, b|_888] ; 
Z = [a, _880, _892, b|_900] ; 
Z = [a, _880, _892, _904, b|_912] 
… 
相關問題