我在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)
中的所有成员都显示在L2
中,则 L1
会返回true。 (contains([1,2],[1,1,1])
是真的)。
minus(L1, L2, L3)
,则{p> L3=L1\L2
会返回true,这意味着L3
由L1
但L2
成员组成。
当我问minus([1,2,3,4],[2,1],L)
时,我会得到L=[]
的答案,但逻辑上应该是L=[3,4]
。有人知道为什么吗?
答案 0 :(得分:1)
mbratch的上述评论非常有用。
请注意,您当前的minus(L1, L2, L3)
定义是:L3
的所有成员都在L1
,而L3
的成员都不在L2
。
Prolog通过L3 = []
为您提供了很好的答案,它符合我上面写的定义。
编辑:下面的代码应该可以做你想要的,但目前我的计算机上没有prolog,所以我无法测试它。
remove(X, [X|T], T) :- !.
remove(X, [H|T], [H|T2]) :- remove(X, T, T2).
minus(L1,[],L1).
minus(L1,[H|T2],T3) :- member(H, L1), !, remove(H,L1,L4), minus(L4, T2, T3).
minus(L1,[H|T2],[H|T3]) :- minus(L1, T2, T3).
remove(X,LA,LB)
说:LB
LA
没有首次出现X
,所以它只是从列表中删除元素。