私はLearn Prolog Now! 's chapter on cutsを読むのと同時に、Bratkoの人工知能のためのプロローグプログラミング、第5章:バックトラックを制御しています。最初は、他のプログラミング言語から知られているif-else節を模倣する単純な方法でした。カットを読む!プロローグ
例えば、このコードは、我々はfalse
を期待しても、すべての変数がインスタンス化されている場合に失敗しますラインを書き留めているようしかし
# Find the largest number
max(X,Y,Y):- X =< Y,!.
max(X,Y,X).
、
?- max(2,3,2).
true.
理由はっきりしています:最初のルールは失敗し、2番目のルールはそれ以上接続されていないため、成功します。私はそれを理解したが、その後解決策が提案されている(ここではswishです):
max(X,Y,Z):- X =< Y,!, Y = Z.
max(X,Y,X).
そして私は、私はこれを読むべきか混乱しています。私は!
が意味すると思った: 'これの前に来るものがすべて!
であれば、同じ述語で他のルールも含めて終了を止める'。しかし、それは正しいとは言えません。これは、Y = Z
のインスタンス化が失敗の場合にのみ発生することを意味するため、そのルールでは役に立たないからです。
こうしてカットを「人」的に読むべきですか?また、拡張として、上記のmax/3
の提案されたソリューションをどのように読むべきですか?
あなたの言うことはほぼ正しいですが、以下が欠落しています:操作上、 '!/ 0' **は常に成功します**。したがって、推論の誤りは、検索ツリーの終了*、*失敗*、*後続*、*切断という概念を混乱させることに起因します。この混乱は、「停止終了」という言葉に反映されます。あなたの質問に答えるには、「人間/人間」の「!/ 0」を読む方法は、「ここから、私がやっていることのすべての結果を理解できなくなった」と言うことです。これは、そのような不純な構造を含むプログラムについては、すぐに推論するのが非常に難しくなるからです。 – mat
*この '!'の前に来るものがすべて真**であれば、同じ述語で他のルールを念頭に置いてはいけません(失敗の場合は続行してください) - **あなたは今のところ唯一の真実*となっています。 **** ***の前にあるものはすべて***だから、 'Y = Z'のインスタンス化は***成功の場合にのみ起こります***、失敗ではないので。 –
@WillNessコメントを明確にしていただきありがとうございます。ブラットコの本の例を追加して私の理解をさらに深めました。 –