Prologにおけるカットは、と記述されるゴールであり、常に成功しますが、バックトラックすることはできません。カットにより、クエリに不要なソリューションやスペース/時間のオーバーヘッドを追加する可能性のある、
不要なバックトラックを防ぐことができます。!
カットは控えめに使用してください。カットはエラーを含むコードに挿入できますが、カットによって真であることが保証されているためテストが不要である場合は、適切な場所にコメントでその旨を記載するのが良い方法です。[1]
一部のプログラマーは、カットは効率性のみを目的として追加されたものであり、論理的な式ではないため、物議を醸す制御機能[2]と呼んでいます。
種類
グリーンカット
効率のみを向上させるカットの使用は、グリーン カットと呼ばれます。グリーン カットは、プログラムの出力を変更せずにプログラムをより効率的にするために使用されます。例:
gamble ( X ) :- gotmoney ( X )、!。
gamble ( X ) :- gotcredit ( X )、 \+ gotmoney ( X )。
これはグリーン カット演算子と呼ばれます。! はインタープリタに代替の検索を停止するように指示します。ただし、 がgotmoney(X)失敗した場合は 2 番目のルールをチェックします。Prologの外観は前の失敗にgotmoney(X)依存するため、2 番目のルールでの のチェックは冗長に見えるかもしれませんが、そうでなければ 2 番目のルールはそもそも評価されません。 を追加すると、最初のルールが誤って削除されたり、変更されたり、2 番目のルールの後に移動されたりした場合でも、2 番目のルールが常に機能することが保証されます。
gotmoney(X)\+ gotmoney(X)
レッドカット
グリーンカットではないカットはレッドカットと呼ばれます。例:
ギャンブル( X ) :- gotmoney ( X )、!。
ギャンブル( X ) :- gotcredit ( X )。
カット演算子の適切な配置とルールの順序は、ルールの論理的な意味を決定するために必要です。何らかの理由で最初のルールが削除されたり (カット アンド ペーストの事故など)、2 番目のルールの後に移動すると、2 番目のルールは破られ、ルールが保証されなくなります\+ gotmoney(X)。
有害なカット
プログラムの正確性に影響を与えるカットは有害なカットです。例:
min ( X , Y , X ) :- !, X =< Y . % ! は有害です。なぜなら、 Y<X
min ( X , Y , Y ) :- Y < X . % の場合、2番目のルールに進めず、失敗するからです。
参考文献
- ^ Dyckhoff, Roy (1994-05-20). 論理プログラミングの拡張: 第 4 回国際ワークショップ、ELP '93 、セントアンドリュース、英国、1993 年 3 月 29 日 - 4 月 1 日。議事録。Springer Science & Business Media。ISBN 978-3-540-58025-6。
- ^ 論理プログラミングの基礎、Springer (2012)。
