我已經寫了下面的代碼在序言:的Prolog變量變得沒有價值
contains(L1, []).
contains(L1, [X | T2]) :- member(X, L1), contains(L1, T2).
minus(L, [], L).
minus(L1, L2, L3) :- contains(L1, L3), nomembers(L3, L2).
nomembers(L1, []).
nomembers(L1, [X | T2]) :- not(member(X, L1)), nomembers(L1, T2).
contains(L1, L2)
返回true,如果所有在L2
成員出現在L1
。 (contains([1,2],[1,1,1])
是真的)。
minus(L1, L2, L3)
返回true,如果L3=L1\L2
,意思L3
由L1
成員但不是L2
。
當我問minus([1,2,3,4],[2,1],L)
,我得到的答案是L=[]
,雖然邏輯上它應該是L=[3,4]
。有人知道爲什麼嗎?
問題出在'contains/2'上。儘管'contains/2'在兩個變量都被實例化時給出了正確的響應,如果你查詢,比如說'contains([a,b],L)',它將生成'L = []',那麼'L = [a ]',那麼'L = [a,a]'等等。因此,在你的「minus/3」謂詞中包含(L1,L3)的查詢沒有做你想要的。 – lurker