Learn Prolog Now!を読んでいます。のカットに関する章と、同時に Bratko の人工知能のためのプロローグ プログラミング、第 5 章: バックトラッキングの制御。最初は、カットは他のプログラミング言語で知られている if-else 句を模倣する簡単な方法のように見えました。
# Find the largest number
max(X,Y,Y):- X =< Y,!.
max(X,Y,X).
false
ただし、行の下に記載されているように、このコードは、期待している場合でもすべての変数がインスタンス化される場合に失敗します。
?- max(2,3,2).
true.
理由は明らかです。最初のルールは失敗し、2 番目のルールにはもう条件が関連付けられていないため、成功します。私はそれを理解していますが、解決策が提案されています(ここではスウィッシュです):
max(X,Y,Z):- X =< Y,!, Y = Z.
max(X,Y,X).
そして、これをどう読むべきか、私は混乱している。私は、「これより前に来るすべてが真である場合、同じ述語を持つ他のルールを含めて終了を停止!
する」という意味だと思いました。!
ただし、これは正しくありません。これは、 のインスタンス化がY = Z
失敗した場合にのみ発生することを意味し、そのルールでは役に立たないからです。
では、カットは「人間的」な方法でどのように読み取られるべきでしょうか? そして、拡張として、max/3
上記の提案されたソリューションをどのように読むべきですか?