Prolog从列表中删除元素,结果很奇怪

时间:2015-02-25 19:59:26

标签: prolog

所以我有这段代码从列表中删除任何element = X.

remove(X,[],L).
remove(X,[X|T],Result):- remove(X,T,Result), !.
remove(X,[H|T],[H|Result]):- remove(X,T,Result).

但是当我运行它时,在结果中我得到了这个奇怪的|_G19。 我理解这与[Head|Tail]的事情有关 但我无法找到一种摆脱结果的方法。

?- remove(2,[1,2,3,2,5,6,2],R).
R = [1, 3, 5, 6|_G19].

那么它有什么问题? 为什么会出现6|_G19? 我怎么摆脱它? 其他一切都按预期工作。

2 个答案:

答案 0 :(得分:1)

你的错误在第一个条款:

remove(X,[],L).

对你而言,第二个参数是输出,所以...在这个基本情况下,什么是L?这就是为什么你得到_G19(指向某事物的指针)。

如果直接执行:

remove(X,[],[]).
remove(X,[X|T],Result):- remove(X,T,Result).
remove(X,[H|T],[H|Result]):- remove(X,T,Result).

你应该拥有它

答案 1 :(得分:1)

只需结合使用 tfilter/3即可 reified term inequality dif/3

remove(E,Xs,Ys) :- tfilter(dif(E),Xs,Ys).

让我们看一下OP在问题中提出的问题:

?- remove(2,[1,2,3,2,5,6,2],R).
R = [1,3,5,6].                     % succeeds deterministically

由于tfilter/3dif/3都是纯粹的,如果我们提出更一般的问题,我们会得到合理的答案:

?- remove(X,[A,B,C],Ys).
Ys = [     ],     X=A ,     X=B ,     X=C  ;
Ys = [    C],     X=A ,     X=B , dif(X,C) ;
Ys = [  B  ],     X=A , dif(X,B),     X=C  ;
Ys = [  B,C],     X=A , dif(X,B), dif(X,C) ;
Ys = [A    ], dif(X,A),     X=B ,     X=C  ;
Ys = [A,  C], dif(X,A),     X=B , dif(X,C) ;
Ys = [A,B  ], dif(X,A), dif(X,B),     X=C  ;
Ys = [A,B,C], dif(X,A), dif(X,B), dif(X,C).