2

我想删除列表中元素的所有出现,类似于this,但在我的情况下,列表可能有未实例化的变量。例如:

delMember(z, [A,B,A,z], L).
L = [A, B, A];
false.

delMember(A, [A, B, A, z], L).
L = [B,z];
false.

我尝试将 delMember 定义如下:

delMember(_, [], []).
delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y).
delMember(X, [T|Xs], [T|Y]) :- X \== T, delMember(X, Xs, Y).

有了这个定义,我得到的最后一个结果是正确的,但它仍在尝试在此之前实例化变量。

?- delMember(A, [A,B,A,z], R).
A = B, B = z,
R = [] ;
A = B,
R = [z] ;
A = z,
R = [B] ;
R = [B, z] ;

有任何想法吗???

4

1 回答 1

1

如果您查看第二个谓词子句:

delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y).

X在第一个和第二个参数中发生了统一。这会导致您在进行查询时观察到的结果。您需要应用与第三个子句中相同的运算符。因此,您的完整谓词(稍微更改了一些变量名称以更常规)将如下所示:

delMember(_, [], []).
delMember(X, [X1|Xs], Ys) :- X == X1, delMember(X, Xs, Ys).
delMember(X, [X1|Xs], [X1|Ys]) :- X \== X1, delMember(X, Xs, Ys).
于 2016-06-06T15:08:58.863 回答