4

SWI-Prologには、常に失敗し、マシンがバックトラックするのを防ぐ組み込みの述語がありますか?プログラムの実行をすぐに停止します(これは何をfail/0しませんか)?カットは使えますが、好きではありません。

そのようなこと!, failをすることは私にとって問題ではありませんが、私が望むことを達成するために、私はより多くの場所でカットを使用する必要があり、これは私が好きではないことです。

4

4 に答える 4

7

例外を使用できます。あなたの質問に基づいて-それは役立つはずです。リンクを参照

于 2010-05-23T22:02:56.833 に答える
4

何かを達成するために明示的に設計されたメカニズムを使用できますが、それが気に入らないのですか?

カットフェイルのシンタックスシュガーであるnotをいつでも使用できます

于 2010-05-23T15:58:20.007 に答える
3

2つの選択肢が思い浮かびます。

  1. backtrack(true)制御するコードにまたは用語を渡しbacktrack(false)、作成している述語の定義でそれを解釈して、に設定されている場合はすぐに失敗し、に設定されている場合はbacktrack(false)続行しますbacktrack(true)。これは実際にはバックトラックを防ぐものではないことに注意してください。高速障害を有効にするだけです。プルーフツリーが深い場合でも、これにより、バックトラックで特定のコードが実行されないようにするための迅速な方法が提供されます。
  2. @Xonix(+1)で提案されているように、例外を使用します。例外をスローすると、プルーフツリーの構築がすぐに終了し、例外を介して任意の用語データをハンドラーに渡して、それ以上の実行をバイパスできます。おそらく最初のオプションよりも高速ですが、移植性が低い場合があります。

個人的には、以前は両方の方法を使用していました。最初の方法はコードを書く前に必要性を予測したもので、後者はまだ使用していません。

于 2010-05-24T00:38:33.450 に答える
2

残念ながら、それがカットの目的です。

于 2010-05-23T15:57:04.490 に答える