Prolog-SWI:删除一次事件的程序

时间:2011-06-12 09:14:41

标签: prolog

我有本书的下一个功能:

% Signature: select (X,HasXs,OneLessXs)/3 
% purpose: The list OneLessXs is the result of removing 
 one occurrence of X from the list HasXs. 
select(X,[X|Xs],Xs).  *rule number 1* 
select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs).  * rule number 2*

?- select(4,[2,3,2,4,5,2,4],X].
X=[2,3,2,5,2,4]

但我不明白它是如何找到正确答案的。删除所有Y =!X后,它将变为规则编号1,其中包含:Xs=4,5,2,4,然后返回true。什么呢?如果它继续规则2,那么他也删除下一个“4”。如果它不继续规则1,则Zs如何[2,3,2,5,2,4]?我想我错过了一条基本规则。

1 个答案:

答案 0 :(得分:1)

你可以通过思考它将如何执行来理解为什么会这样。 所以你有:

% I use K here instead of X, so there is no
% confusion with the X on the rules
select(4,[2,3,2,4,5,2,4], K).

首先,它会检查规则1,但是4 != 2所以它将继续规则2.在规则2中,你有这些“绑定”:

X = 2
[Y | Ys] = [2, 3, 2, 4, 5, 2, 4] (which means Y = 2, Ys = [3, 2, 4, 5, 2, 4])
[Y | Zs] = [2 | Zs] (because Y was binded to 2)

K绑定到[2 | Zs]绑定到Zsselect的下一个select(4, [3, 2, 4, 5, 2, 4], Zs)来电会找到Zs,依此类推。这就是返回结果的原因: 正如您所料,K=[2,3,2,5,2,4]而不是K=[5, 2, 4]