PROLOG定义'删除'谓词

时间:2016-11-13 07:40:44

标签: prolog

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

2 个答案:

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