Prolog递归规则返回结果存疑:为何奇偶判断查询返回两个结果?
为什么你的Prolog奇偶规则会返回true后再返回false?
嘿,我太懂这种困惑了——当初刚上手Prolog递归的时候,我也被这种“先对后错”的输出搞懵过!其实问题核心出在Prolog的回溯机制和你的规则结构上,咱们一步步拆解:
首先,我猜你写的规则大概是类似这样的(毕竟这是最常见的踩坑写法):
even(0). even(N) :- N > 0, odd(N-1). odd(1). odd(N) :- N > 0, even(N-1).
咱们拿even(0)的查询过程来分析:
- 当你输入
even(0),Prolog会从上到下扫描规则:- 第一条规则
even(0)完全匹配,直接成功,所以第一个输出是true。
- 第一条规则
- 这时候如果你按下分号
;(或者有些Prolog环境会自动提示是否要找下一个解),Prolog会触发回溯:它会回到刚才匹配的位置,尝试下一条可能匹配even(0)的规则,也就是第二条even(N)。 - 绑定
N=0后,检查条件N > 0——显然0 > 0是false,这条规则的条件不满足,匹配失败,输出false。 - 没有更多规则可以尝试了,查询结束。
同样的逻辑适用于odd(1)、even(2)这些查询:比如odd(1)会先匹配第一条规则返回true,回溯后尝试第二条规则,虽然N>0成立,但调用even(0)时,even(0)的回溯分支会失败,最终导致odd(1)的第二个分支也返回false。
本质上来说,Prolog是“穷尽所有可能性”的语言——只要有一条规则能匹配查询,它就会返回成功;但当你要求下一个解时,它会继续尝试剩下的所有规则,不管前面已经找到成功的结果了。如果剩下的规则匹配失败,就会返回false。这就是你看到“先true后false”的根本原因。
内容的提问来源于stack exchange,提问作者smackattack
相关产品推荐
相关产品推荐

