4

私はPrologを初めて使用し、なぜこのルールが1つの真の後に偽の結果を与えるのかを考えていました。

likes(1,banana).
likes(1,mango).

test :- likes(1,banana),likes(1,mango).

?- test.  
true;  
false.

この誤りの背後にある理由を知りたい。

4

1 に答える 1

6

プロローグが機能する方法は、否定によって失敗するまでクエリを評価することです。

ここで、次の 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

この質問をしてよかったです。なぜなら、私が本当に気に入っているものの、長い間使用していなかったプロローグを少し復習することができたからです。

于 2011-02-16T07:55:11.723 に答える