31

私の SWI-Prolog ナレッジ ベースには、次の 2 つの事実が含まれています。

f(a,b).
f(a,c).

今、私がクエリを提起した場合

?- f(a,c).
true.

しかし

?- f(a,b).
true ;
false.

f(a,b) が真であり偽でもあるのはなぜですか? これは、KB に 3 つのファクトがある場合にも発生します。f(a,d) を追加するとします。KB では、f(a,d) は true (のみ) ですが、f(a,b) と f(a,c) は true と false の両方です。何が起こっているのでしょうか? Prolog がこれらのクエリに対して (のみ) 真の回答をするようにするにはどうすればよいでしょうか?

4

2 に答える 2

31

(注:この答えは多少推測です)

f(a,c)Prologが真であるかどうかをどのように判断するかを検討してください。最初のルールをチェックしf(a,b)、一致するものを見つけませんが、2番目のルールはf(a,c)一致します。したがって、f(a,c)真実です。さらに、のルールがこれ以上ないためf、バックトラックの発生を許可しても意味がありません。他に考えられる解決策はありません。

ここで考えてみましょうf(a,b)。Prologは最初のルールをチェックし、一致するものを見つけます。したがって、f(a,b)真実です。ただし、すべてのルールが使い果たされているわけではありません。したがって、Prologは検索を続行できるようにします(を押した場合;)。検索とバックトラックを続行すると、残りのルール、具体的f(a,c)には、が一致しないことがわかりf(a,b)ます。したがって、結果は偽です。

于 2010-07-24T00:11:39.680 に答える
15

マイケル・ウィリアムソンの答えに加えて。Prolog に、最初のヒットが成功した後に答えを探すのをやめさせたい場合は、カット ( !)を使用します。

?- f(a, b), !.
true.

?- f(a, c), !.
true.
于 2010-07-24T02:11:53.537 に答える