1
我定義我的知識基礎爲:Prolog的切割操作
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).
而對於這兩個疑問,序言返回true 。我希望Prolog先檢查本地游泳場所,然後以分級方式查看直接父級,等等。當我們知道Simba「mustlearn」游泳時,它應該停止搜索,並且不應再往下看。因此,它應該爲第一個查詢返回false,爲第二個查詢返回true。
我知道它必須通過限制回溯來完成。我嘗試使用剪切而不是運營商,但不能成功。有沒有辦法做到這一點?