Prolog变量没有任何价值

时间:2014-01-11 19:16:19

标签: prolog

我在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,这意味着L3L1L2成员组成。

当我问minus([1,2,3,4],[2,1],L)时,我会得到L=[]的答案,但逻辑上应该是L=[3,4]。有人知道为什么吗?

1 个答案:

答案 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,所以它只是从列表中删除元素。