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).
你应该拥有它
只需将 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).
所以我有这段代码可以从列表中删除任何元素=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).
你应该拥有它
只需将 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).