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

Prolog remove element from list,weird result

所以我有这段代码可以从列表中删除任何元素=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? 我该如何摆脱它? 其他一切都按预期工作。

你的错误在第一个子句上:

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).

你应该拥有它

只需将 tfilter/3reified 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).