为何查询distance(c2,c5,X-0,1)无法匹配知识库中的20?
为什么Prolog查询中
X-0无法匹配事实中的20? 你的问题核心在于对Prolog的合一(匹配)机制理解有误:
- 当你在查询中写
distance(c2, c5, X-0, 1)时,X-0并不是一个算术表达式,而是一个复合项——它的结构是「函子为-,第一个参数是变量X,第二个参数是常量0」。 - 而你知识库中的事实是
distance(c2, c5, 20, 1),这里的第三个参数是一个整数常量20,和X-0的结构完全不同,所以Prolog无法将两者合一,返回false。
Prolog只有在特定算术上下文中(比如is/2谓词、CLP(FD)约束、算术比较符=:=等),才会把-当作减法运算符进行数值计算。要实现你想要的效果,需要显式触发算术运算:
方法1:使用is/2谓词
distance(c2, c5, D, 1), X is D - 0.
这里先匹配事实中的D=20,再通过X is D-0计算出X=20。
方法2:使用CLP(FD)约束(适用于支持的Prolog,如SWI-Prolog)
distance(c2, c5, D, 1), X #= D - 0.
CLP(FD)支持更灵活的算术约束,即使变量顺序调换也能正常工作。
内容的提问来源于stack exchange,提问作者matti1499
相关产品推荐
相关产品推荐

