我有本书的下一个功能:
% 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]
?我想我错过了一条基本规则。
答案 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]
,不绑定到Zs
。 select
的下一个select(4, [3, 2, 4, 5, 2, 4], Zs)
来电会找到Zs
,依此类推。这就是返回结果的原因:
正如您所料,K=[2,3,2,5,2,4]
而不是K=[5, 2, 4]
。