在Prolog中转换逻辑语句时未定义sister谓词的报错问题
Prorolog规则定义问题解答
问题场景
尝试将自然语句“对于所有X,若X的某个孩子有姐妹,则X有两个孩子”转换为Prolog规则,编写了如下代码:
has_two_children(X) :- parent(X,Y), sister(Y,_Z).
运行时触发报错:
"procedure `sister(A,B)' does not exist Reachable from: has_two_children(A)"
已单独定义parent关系,但未定义sister关系。原本预期代码返回false,对此感到困惑:若关注的对象中无人有姐妹,那sister关系无内容可定义,是否必须在规则外定义sister关系?
解答
Prolog规则里用到的所有谓词必须先有定义——哪怕是没有任何事实或规则体的空定义,不然解释器会直接报错,而不是返回false。
你现在的问题就是sister/2完全没被定义,Prolog不知道这个谓词代表什么逻辑,根本没法进行推理判断,所以直接抛出“过程不存在”的错误,而非你预期的false。
解决办法很简单:
- 要么给
sister/2补全正确的逻辑定义(比如基于parent、个体唯一性、性别来定义姐妹关系),哪怕暂时没有符合条件的事实; - 要么先写一个空定义占位:
sister(_, _).
空定义只是让解释器不报错,若没有对应的事实,调用has_two_children(X)还是会返回false,符合你的预期。
另外,如果你想准确实现原语句的逻辑,sister的标准定义可以参考下面的代码(如果不需要性别限制,可去掉female相关条件):
sister(Y, Z) :- parent(X, Y), parent(X, Z), Y \= Z, female(Y), female(Z).
内容的提问来源于stack exchange,提问作者Dan Öz
相关产品推荐
相关产品推荐

