Prolog中变量X与makis查询结果不同的原因咨询
为什么
makis和X的查询结果不同? 嘿,这个问题的核心其实是你混淆了Prolog里的变量和**原子(Atom)**的定义,这是新手入门时很容易踩的坑!我来给你拆解清楚:
关键概念:Prolog的变量 vs 原子
在Prolog的语法规则里:
- 变量必须以大写字母或者下划线
_开头(比如X、User、_Person),它是一个占位符,可以匹配知识库中任何符合条件的项。 - 原子(可以理解为固定的名称/常量)是以小写字母开头,或者用单引号包裹的字符串(比如
makis、petros、'John Doe'),它代表一个具体的、固定的实体,必须和知识库中存在的事实完全匹配才能成功。
你的两个查询分析
第一个查询:?- follows(petros,X),follows(X,petros).
这里的X是变量,Prolog会按以下步骤执行:
- 先执行第一个目标
follows(petros,X):在知识库中找所有petros关注的对象,匹配到X=ilias和X=demos。 - 对每个匹配到的
X,执行第二个目标follows(X,petros):- 当
X=ilias时,检查follows(ilias,petros),知识库中有这个事实,成功,返回X=ilias。 - 当
X=demos时,检查follows(demos,petros),知识库中也有这个事实,成功,返回X=demos。
- 当
- 没有更多匹配项后,返回
false表示查询结束。
第二个查询:?- follows(petros,makis),follows(makis,petros).
这里的makis是原子,不是变量!Prolog会这样执行:
- 先执行第一个目标
follows(petros,makis):在你的知识库中,根本没有petros关注makis的事实,所以第一个目标直接失败。 - 因为Prolog的查询是“与”逻辑(逗号
,表示同时满足所有目标),只要有一个目标失败,整个查询就直接返回false,不会再执行后面的follows(makis,petros)。
如果想让makis作为变量怎么办?
只要把它改成大写开头的Makis,这样它就变成变量了,查询:
?- follows(petros,Makis),follows(Makis,petros).
运行后会和第一个查询得到完全一样的结果:X = ilias ; X = demos ; false.
内容的提问来源于stack exchange,提问作者OG_
相关产品推荐
相关产品推荐

