Prolog入门:如何编写传递关系规则实现大小比较连锁推导
Prolog传递关系规则补全答案
你需要补充的规则右侧内容为 bigger(X,Z), bigger(Z,Y),补全后完整规则如下:
bigger(X,Y) :- bigger(X,Z), bigger(Z,Y).
规则说明
- 逻辑原理:只要存在任意中间对象
Z,同时满足X比Z大、Z比Y大两个条件,就可以推导出X比Y的大小关系,完全符合传递性的数学定义。 - 实际效果:结合你给出的基础事实,Prolog可以自动推导所有连锁大小关系,比如
bigger(elephant, dog)会通过中间项buffalo验证成立,bigger(elephant, cat)也可以通过多层中间项自动推导得出结果。
优化建议(可选)
上述写法在部分Prolog解释器中查询时可能出现重复返回结果、或者递归深度过大的问题,更稳妥的写法是将直接事实和推导规则拆分到不同谓词:
% 直接大小关系事实 bigger_direct(elephant,buffalo). bigger_direct(buffalo,dog). bigger_direct(dog,cat). % 大小关系推导规则 bigger(X,Y) :- bigger_direct(X,Y). bigger(X,Y) :- bigger_direct(X,Z), bigger(Z,Y).
这种写法可以避免规则递归调用自身产生的逻辑问题,运行更稳定。
内容的提问来源于stack exchange,提问作者Sion12 C
相关产品推荐
相关产品推荐

