プロログ、失敗し、バックトラックしないでください
-
04-10-2019 - |
質問
Swi-Prologのビルドイン述語は常に失敗し、マシンがバックトラッキングを防ぐことができます - プログラムがすぐに実行されるのを止めます(これは何ではありませんか fail/0
?)?カットを使用できますが、私はそれらが好きではありません。
のようなことをしています !, fail
私にとっては問題ではありませんが、私が望むことを達成するためには、より多くの場所でカットを使用する必要があります。これは私が好きではないものです。
解決
例外を使用できます。あなたの質問に基づいて - それは助けになるはずです。参照 リンク
他のヒント
何かを達成するために明示的に設計されたメカニズムを使用できますが、気に入らないのですか?
あなたはいつでもNOTを使用できます、それはカットフェイルのための構文砂糖です
2つの選択肢が思い浮かびます:
- aを渡します
backtrack(true)
またbacktrack(false)
あなたが制御したいコードを介して用語、それが設定されている場合、あなたが書いている述語の定義の定義で迅速に失敗するように解釈しますbacktrack(false)
, 、または継続する場合backtrack(true)
. 。これは実際にはバックトラッキングを妨げないことに注意してください。有効にする必要があります ファストフェイル. 。証明ツリーが深い場合でも、バックトラッキングで特定のコードの実行を防ぐための高速な方法を提供するはずです。 - @xonix(+1)で示唆されているように、例外を使用します。例外をスローすると、プルーフツリーの構造がすぐに終了し、任意の用語データを例外を介してハンドラーに渡すことができ、実行をさらにバイパスできます。おそらく最初のオプションよりも速くなりますが、ポータブルではない場合があります。
個人的には両方の方法を使用しました - コードを書く前に必要性を予想していた最初の場所、後者は私が持っていない場所です。
残念ながら、それがカットの目的です。
所属していません StackOverflow