如何解决Prolog-SWI:消除一个事件的过程
| 这本书有下一个功能:% 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,4],X].
X=[2,4]
但是我不明白它是如何找到正确答案的。除去所有Y =!X之后,得出规则编号1,其中有:Xs=4,4
,然后返回true
。然后呢?如果继续执行规则2,则他还将删除下一个\“ 4 \”。如果它不继续遵守规则1,那么Z 3是多少?我认为我缺少基本规则。
解决方法
通过考虑将如何执行,您可以了解为什么会发生这种情况。
所以你有了:
% 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,4],K).
首先,它将检查规则1,但是将ѭ5选中,因此它将继续执行规则2。在规则2中,您具有以下\“ bindings \”:
X = 2
[Y | Ys] = [2,4] (which means Y = 2,Ys = [3,4])
[Y | Zs] = [2 | Zs] (because Y was binded to 2)
K
绑定到to8 bind,而不仅仅是just9ѭ。下一个呼叫select(4,[3,Zs)
的呼叫是Zs
,以此类推。这就是为什么返回结果是:
K=[2,4]
,而不是您期望的K=[5,4]
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。