質問

次のコードを使用して、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 .

使用する必要はありません !

簡単に書く:

abs2(X,Y) :- Y is abs(X).
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top