PROLOG定义“delete”谓词

PROLOG定义“delete”谓词,prolog,Prolog,上面是我对delete谓词的定义,用于deleteX,L,R,旨在删除L中X的每一次出现,结果为R 我在下面查询过,得到了G2397797。这根绳子代表什么 delete(X,[X|R],[_|R]). delete(X,[F|R],[F|S]) :- delete(X,R,S). 答案是X=[[u G2397797,2,3,4,5]_G2397797不是字符串,而是未实例化的变量。这是由于以下条款: ?- delete(1,[1,2,3,4,5],X). X = [_G2397797

上面是我对delete谓词的定义,用于deleteX,L,R,旨在删除L中X的每一次出现,结果为R

我在下面查询过,得到了G2397797。这根绳子代表什么

delete(X,[X|R],[_|R]).
delete(X,[F|R],[F|S]) :-
    delete(X,R,S).
答案是X=[[u G2397797,2,3,4,5]_G2397797不是字符串,而是未实例化的变量。这是由于以下条款:

?- delete(1,[1,2,3,4,5],X).
X = [_G2397797, 2, 3, 4, 5] .
在输出列表中放置一个匿名变量。你可以写deleteX,[X | R],R

但这有多重问题。首先,它只删除第一次出现的X,而不是全部,因为在上面的子句中,当您找到一个时,您就成功了。您还没有考虑过空列表的情况,它也是递归的基本情况。最后,在你的第二个子句中,你没有应用任何规则,说F和X不同,当F等于X时,这个子句给出错误的结果

所以你可以写:

delete(X,[X|R],[_|R]).

如果您只需更正第一个子句并删除不必要的匿名变量,您将得到:

delete(_,[],[]).
delete(X,[X|R],S):-delete(X,R,S).
delete(X,[F|R],[F|S]):-dif(X,F),delete(R,S).
这将使用统一,并在回溯时删除列表中出现的每个X:

delete_each(X, [X|L], L).
delete_each(X, [Y|Ys], [Y|Zs]) :-
        delete_each(X, Ys, Zs).
您看到这与select/3的相同之处了吗


如果要删除列表中所有出现的X,可以查看。

deleteX、[X | R]、[UU | R]。不只是删除X,而是将其替换为一个匿名变量。这就是您真正想要的吗?的文档中有一条非常有说服力的注释,至少是:deprecated:有太多的方法可以从列表中删除元素以证明名称的合理性。考虑匹配=vs.=,首先删除/全部删除,是否确定。无论如何,我认为OP的delete应该与=,first-only,delete-next在回溯时匹配。我不太确定我是否完全理解。你的意思是:删除、[]、[]。deleteX[Y | R],S:-X=Y->S=[X | T],deleteX,R,T;注释中的deleteX、R、S.代码有点困难;看我的回答谢谢Boris!,我理解。
?- delete_each(a, [a,b,a,c], R).
R = [b, a, c] ;
R = [a, b, c] ;
false.