質問

私は Prolog を初めて使用するのですが、なぜこのルールが 1 つの true の後に false の結果を与えるのか疑問に思っていました。

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

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

?- test.  
true;  
false.

この嘘の背後にある理由を知りたいです。

役に立ちましたか?

解決

prolog の動作方法は、否定によって失敗するまでクエリを評価することです。

ここで、次の 2 つの事実が証明されました。

likes(1, banana). これは「1 はバナナが好きです」と言う

likes(1, mango). 「1はマンゴーが好きです」というもの

次に、基本的に次のように評価されるルールを確立しました。

left_hand_side :- right_hand_side. left_hand_side もし right_hand_side

クエリとしてルールを評価すると、ファクトとの一致が試行され、返されます。 true 一致する場合は false、一致できない場合は false。注意すべき重要な点の 1 つは、指定されている場合、ルールが次のように評価される限り、プロローグは引き続きファクトと一致することです。 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 はバナナを複数回「いいね」することはできません)。そこで、 false から来た。

prolog インタープリタでは、次のように入力することでプログラムの実行をトレースできる場合があります。 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.

この質問をしていただいてうれしく思います。なぜなら、この質問のおかげで、本当に気に入っているものの、長い間使っていなかった prolog について少し復習することができたからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top