我将我的知识库定义为:
edge(mammal,isa,animal).
edge(human,isa,mammal).
edge(simba,isa,human).
edge(animal,swim,bybirth).
edge(human,swim,mustlearn).
path(X,Y) :- edge(X,isa,Y).
path(X,Y) :- edge(X,isa,Z), path(Z,Y).
swim(X,Y) :- edge(X,swim,Y).
swim(X,Y) :- path(X,Z), swim(Z,Y).
现在,要使用上述知识库,我使用以下内容:
?- swim(simba,bybirth).
?- swim(simba,mustlearn).
对于这两个查询,Prolog 都返回 true。我希望 Prolog 首先在本地检查属性游泳,然后查看直接父级,依此类推。一旦我们知道辛巴“必须学会”游泳,它就应该停止搜索,并且不应该再往下看。因此,它应该为第一个查询返回 false,为第二个查询返回 true。
我知道必须通过限制回溯来完成。我尝试使用 cut 而不是运算符,但没有成功。有没有办法做到这一点?