PROLOG学习疑问:查询结果返回yes/no的原因咨询
搞懂Prolog查询返回yes/no的原因
嘿,我来帮你理清这个问题!Prolog里查询结尾的yes/no其实和它的“逻辑证明”机制直接相关,结合你的知识库我给你拆解清楚:
首先先把你的知识库整理出来(顺便提个小错误,后面会说):
male(albert). male(bob). male(bill). male(carl). male(charlie). male(dan). male(edward). female(alice). female(betsy). female(diana). parent(albert, bob). parent(albert, betsy). parent(albert, bill). parent(alice, bob). parent(alice, betsy). parent(alice, bill). parent(bob, carl). parent(bob, charlie). % 原代码里是Charlie(大写),Prolog里大写是变量,改成小写才是和male(charlie)对应的原子
核心逻辑:Prolog是在“找证据”
你输入的每个查询,本质都是让Prolog帮你证明某个目标是否成立:
- 如果它在知识库的事实/规则里找到了至少一个能匹配目标的证据,就返回
yes;要是查询带变量(比如?- female(X)),它会先给出变量的第一个绑定值,你按分号;它会继续找下一个,直到所有可能都搜完,最后返回no——这时候的no不是说查询失败,而是“我已经把所有符合条件的结果都找出来啦,没别的了”。 - 如果从头到尾翻遍知识库都找不到匹配的证据,那就直接返回
no,表示这个目标不成立。
结合你的知识库举几个实际例子
- 确定事实的查询:
- 输入
?- male(bob).,Prolog一眼就找到male(bob).这个事实,匹配成功,所以返回yes。 - 输入
?- male(diana).,知识库根本没这个事实,所以直接返回no。
- 输入
- 带变量的查询:
输入?- female(X).,Prolog先返回X = alice,你按;,它接着返回X = betsy,再按;返回X = diana,再按;的时候,所有female的事实都搜完了,就返回no——这个no只是告诉你“没有更多结果了”,不是说你的查询错了。 - 你知识库的小坑:
原代码里的parent(bob, Charlie).,Charlie首字母大写了!在Prolog里,首字母大写的是变量,而不是你之前定义的charlie(小写是固定的原子)。所以如果你查?- parent(bob, charlie).,Prolog会返回no,因为事实里的Charlie是个变量,和原子charlie不匹配,把它改成小写charlie就正常了。
一句话总结
yes=找到匹配的证据,目标成立;- 查询完所有结果后的
no=没有更多结果了; - 直接返回的
no=找不到任何证据,目标不成立。
内容的提问来源于stack exchange,提问作者Carmine Reddit
相关产品推荐
相关产品推荐

