一个Prolog谓词结果

一个Prolog谓词结果,prolog,Prolog,我已经编写了一个Prolog关系remove(E,L,R),如果R是从列表L中删除E的一个实例而得到的列表,则该关系为真。如果E不是L的成员,则关系为false 我想知道以下查询的结果 remove(p(X),[a,p(a),p(p(a)),p(p(p(a)))],R). 那么?问问吧。不是我们,而是问序言。结果应该是 或者类似的东西,如果你写得对的话。如果您允许回溯(换句话说,从列表中删除一个元素,从第一个元素开始),您将得到如下结果 ?- remove(p(X),[a,p(a),p(p(a

我已经编写了一个Prolog关系
remove(E,L,R)
,如果
R
是从列表
L
中删除
E
的一个实例而得到的列表,则该关系为真。如果
E
不是
L
的成员,则关系为false

我想知道以下查询的结果

remove(p(X),[a,p(a),p(p(a)),p(p(p(a)))],R).

那么?问问吧。不是我们,而是问序言。结果应该是

或者类似的东西,如果你写得对的话。如果您允许回溯(换句话说,从列表中删除一个元素,从第一个元素开始),您将得到如下结果

?- remove(p(X),[a,p(a),p(p(a)),p(p(p(a)))],R).
X = a,
R = [a, p(p(a)), p(p(p(a)))] ;
X = p(a),
R = [a, p(a), p(p(p(a)))] ;
X = p(p(a)),
R = [a, p(a), p(p(a))] ;
false.

您到底有什么问题?在实现后,根据您处理变量统一的方式,您可能能够匹配并仅删除模式统一到的第一个元素。等效
remove(A,B,C):-选择(A,B,C)。
?- remove(p(X),[a,p(a),p(p(a)),p(p(p(a)))],R).
X = a,
R = [a, p(p(a)), p(p(p(a)))] ;
X = p(a),
R = [a, p(a), p(p(p(a)))] ;
X = p(p(a)),
R = [a, p(a), p(p(a))] ;
false.