Prolog中使用匿名变量与普通变量查询出现结果差异的原因解析
Prolog 查询返回
true而非具体绑定值的原因 差异的核心来源是匿名变量的特殊设计
Prolog的语法规则里,独立下划线_是专门定义的匿名变量,和X这类常规命名变量的处理逻辑有本质区别:
- 常规命名变量(比如查询里的
X):解释器会全程追踪这个变量的状态,每当查询匹配到知识库中的对应事实/规则,就会自动把当前匹配分支下的变量绑定值作为结果回显。因此执行vegetarian(X).时,解释器会逐次匹配两条vegetarian事实,依次输出X = jose、X = james的结果。 - 匿名变量
_的设计初衷只是做位置占位匹配,不承担值追踪、结果展示的功能:- 它适合用在只需要验证「目标谓词有没有可匹配的条目」,不需要关心具体匹配内容的场景
- 解释器不会为独立的
_维护绑定状态,匹配成功后也不会尝试回显它的绑定值,只会输出true表示当前分支匹配成立。
为什么会连续输出两次true
你的知识库中一共定义了两条独立的vegetarian事实:vegetarian(jose).和vegetarian(james).。执行vegetarian(_).查询时,解释器会依次遍历、匹配这两个事实,每匹配成功一条就触发一次成功响应。由于匿名变量不需要展示绑定值,两次成功响应就直接表现为true; true.,和实际运行的结果完全一致。
补充细节:同一查询里出现的多个独立
_是互相独立的,不会共享绑定值。比如查询likes(_, _).里的两个_可以匹配任意不同的参数,不会强制要求两个位置的取值一致。
内容的提问来源于stack exchange,提问作者rhododendron
相关产品推荐
相关产品推荐

