私はPrologを初めて使用し、なぜこのルールが1つの真の後に偽の結果を与えるのかを考えていました。
likes(1,banana).
likes(1,mango).
test :- likes(1,banana),likes(1,mango).
?- test.
true;
false.
この誤りの背後にある理由を知りたい。
私はPrologを初めて使用し、なぜこのルールが1つの真の後に偽の結果を与えるのかを考えていました。
likes(1,banana).
likes(1,mango).
test :- likes(1,banana),likes(1,mango).
?- test.
true;
false.
この誤りの背後にある理由を知りたい。
プロローグが機能する方法は、否定によって失敗するまでクエリを評価することです。
ここで、次の 2 つの事実が確立されました。
likes(1, banana).
「1 はバナナが好き」と言う
likes(1, mango).
「1人はマンゴーが好き」と言う
次に、基本的に次のように評価されるルールを確立しました。
left_hand_side :- right_hand_side.
left_hand_side
もしも right_hand_side
クエリとしてのルールの評価は、ファクトの一致を試み、一致する場合は返され、一致しtrue
ない場合は false が返されます。注意すべき重要な点の 1 つは、指定されている場合、prolog は、ルールが に評価される限りファクトに一致し続けるということtrue
です。
それでは、ステップスルーしましょうtest :- likes(1,banana),likes(1,mango).
がクエリとして実行される場合test
、prolog は最初likes(1,banana)
に、以前に確立された事実であり、真であるものを試行します。次に、これが事実であり、真であることに移りlikes(1,mango)
ます。その後、Prolog はルールの最後に到達し、 を出力しますtrue
。
この時点で、さらに一致するものを検索しない場合は、クエリを短くして true にすることができます。ただし、より多くの (すべての) 一致を探している場合、prologはバックトラックしてルールを再度評価し、より多くの一致を検索します。
ただし、あなたのルールは「バナナが好きでマンゴーが好き」にのみ一致し、既に一致しているlikes(1,banana)
ため、プロローグがバックトラックしてlikes(1,banana)
再度評価を試みると、以前に一致したため、今回は別の事実はありません (つまり、1 は「できません」 like" バナナが定義されていない限り、2 回以上) 一致します。というのはそこからfalse
来ているのです。
プロローグ インタープリターでは、クエリを入力して実行することで、プログラムの実行を追跡できる場合がありtrace.
ます。私のトレースを以下に示します。
| ?- trace
.
The debugger will first creep -- showing everything (trace)
(1 ms) yes
{trace}
| ?- test.
1 1 Call: test ?
2 2 Call: likes(1,banana) ?
2 2 Exit: likes(1,banana) ?
3 2 Call: likes(1,mango) ?
3 2 Exit: likes(1,mango) ?
1 1 Exit: test ?
true ? ;
1 1 Redo: test ?
2 2 Redo: likes(1,banana) ?
2 2 Fail: likes(1,banana) ?
1 1 Fail: test ?
(1 ms) no
{trace}
| ?-
最後に 1 つ注意してください。プロンプトで を押す代わりに を押していたら;
、スクリプトは.true ?
<ENTER>
true
この質問をしてよかったです。なぜなら、私が本当に気に入っているものの、長い間使用していなかったプロローグを少し復習することができたからです。