delete(X,[X|R],[_|R]).
delete(X,[F|R],[F|S]) :-
delete(X,R,S).
上面是我对删除谓词的定义,对于删除(X,L,R),用于删除结果为R的L中每次出现的X.
我在下面查询过,得到“G2397797
”。这个字符串代表什么?
?- delete(1,[1,2,3,4,5],X).
X = [_G2397797, 2, 3, 4, 5] .
答案 0 :(得分:1)
如果您只是更正了您的第一个子句并删除了不必要的匿名变量,那么您将得到:
delete_each(X, [X|L], L).
delete_each(X, [Y|Ys], [Y|Zs]) :-
delete_each(X, Ys, Zs).
这将使用统一,并在回溯时删除列表中每次出现的X:
?- delete_each(a, [a,b,a,c], R).
R = [b, a, c] ;
R = [a, b, c] ;
false.
您是否看到这与select/3
完全相同?
如果要删除列表中所有出现的X,可以看到answer by @coder。
答案 1 :(得分:0)
在得到X = [_G2397797, 2, 3, 4, 5] .
的答案中,_G2397797不是字符串,它是未实例化的变量。这是由于以下条款:
delete(X,[X|R],[_|R]).
在输出列表中放置一个匿名变量“_”。你可以写delete(X,[X|R],R).
但这有很多问题。首先它只删除X的第一个出现并不是全部,因为在上面的子句中,当你找到一个成功时。你还没有想到空列表的情况,这也是递归的基本情况。最后在你的第二个条款中,你没有应用任何说F和X不同的规则,当F等于X时,这个子句给出错误的结果。
所以你可以写:
delete(_,[],[]).
delete(X,[X|R],S):-delete(X,R,S).
delete(X,[F|R],[F|S]):-dif(X,F),delete(R,S).