質問
次のコードを使用して、Prologで次の関数を実装しました。
abs2(X, Y) :- X < 0, Y is -X.
abs2(X, X) :- X >= 0, !.
カット( "!")を使用せずにこの関数を実装するにはどうすればよいですか?
解決
プロログのif-then-else構成には「隠された」カットがあります。
abs2(X,Y) :- X < 0 -> Y is -X ; Y = X.
それは癖のようなものですが、Prologは、if-thenまたはif-then-else構造の「前提」を形成するサブゴールをバックトラックしません。ここで、x <0が最初の試みに成功した場合、「then "over" else "句の選択がコミットされます(したがって、この動作の「隠された」カットとしての説明)。
カットにはより多くの役割があります 最初 述語の条項 ABS2/2 質問で書かれているように。ニコラスが指摘しているように、2番目の句の終わりのカットには何の効果もありません(そこに着いたときに選択肢が残っていません)。しかし、Kaarelが指摘しているように、最初の条項が成功した場合、選択ポイントが開かれています。
それで、私が書いていたもの、カットの使用を許可します、これは次のとおりです。
abs2(X,X) :- X >= 0, !.
abs2(X,Y) :- Y is -X.
ニコラスのコメントは、(ロジック定義を使用するのではなく)絶対値を「算術」し、そのように「カット」を避ける方法を示唆しています。
他のヒント
私のプロログは少し錆びていますが、なぜカットが必要なのですか?述語を適切に書くと、バックトラッキングが成功することはできないため、カットは不要です。
abs(X, Y) :- number(X) , X < 0 , Y is -X .
abs(X, X) :- number(X) , X >= 0 .
所属していません StackOverflow