所以我有这段代码从列表中删除任何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
?
我怎么摆脱它?
其他一切都按预期工作。
答案 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)
只需结合使用meta-predicate 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/3
和dif/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).