Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 序言:删除具有非实例化值的列表成员_List_Prolog_Prolog Dif_Logical Purity - Fatal编程技术网

List 序言:删除具有非实例化值的列表成员

List 序言:删除具有非实例化值的列表成员,list,prolog,prolog-dif,logical-purity,List,Prolog,Prolog Dif,Logical Purity,我想删除列表中元素的所有外观,类似于,但在我的例子中,列表可能有非实例化变量。例如: delMember(z, [A,B,A,z], L). L = [A, B, A]; 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(z, [A,B,A,z], L).
L = [A, B, A];
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] ;

有什么想法吗?

如果你看第二个谓语从句:

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

统一发生在您的第二个子句中:
delMember(X,[X | Xs],Y):-delMember(X,Xs,Y)。
,如果第一个参数是可统一的,它将统一第一个参数与第二个参数中的列表头。既然您试图避免这种情况,那么您也需要在那里使用
=
delMember(X[Y | Xs],R):-X==Y,delMember(X,Xs,R)。
谢谢@lower!这正是我所需要的。如果你想回答这个问题,我很乐意接受。
delMember(_, [], []).
delMember(X, [X1|Xs], Ys) :- X == X1, delMember(X, Xs, Ys).
delMember(X, [X1|Xs], [X1|Ys]) :- X \== X1, delMember(X, Xs, Ys).