私は私の知識ベースを定義した:私は、次を使用し、上記の知識ベースを使用して、今すぐ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を返し、2番目のクエリではtrueを返します。
私はそれがバックトラックを制限することによって行われなければならないことを知っています。私はカットを使用して、演算子を使用しようとしましたが、成功することはできませんでした。これを達成する方法はありますか?