ルールを理解する - 答えは false
-
14-11-2019 - |
質問
私は 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 について少し復習することができたからです。