私は今学期、Prolog を学習している AI コースを受講しています。私たちの講師は、私たちの課題でカットを使用するのを避けるように努めるように私たちに言いました. ただ気になるのは、なぜカットが罪とみなされるのか(講師の言葉)?私はそれが一種の近道であることを理解していますが、それらが私のプログラムにどのように影響するかを正確に知って使用しています.
2 に答える
@dasblinkenlight と @mbratch に同意します。また、緑のカットと赤のカットの観点から考えると参考になると思います。
グリーン カットは、プログラムの論理的な動作に影響を与えず、パフォーマンスのみに影響を与えるものです。これらは、Prolog に、このまま続けていれば何の成果も得られないことがわかっていることを伝える方法です。グリーン カットは決して必要ではありません。パフォーマンスが向上するだけです。Prolog を初めて学習するときは、理解しなければならないことが他にもたくさんあります。それは、わずかなメリットのために複雑さを追加しているように思えます。
レッド カットは、プログラムの動作に影響を与えます。@mbratch が言ったように、新しいユーザーは、出力を「整理」するためにカットを投げかけることがよくあります。新しいユーザーは、Prolog クエリ プロンプトを自分のプログラムのユーザー インターフェイスとして扱うことがよくあります。これらのカットにより、述語の一般性が低下し、出力をより適切にするプロセスでの有用性が低下します。once/1
単一の結果が得られるなど、より明確な代替手段もいくつかあります。専門家はレッド カットを非常に繊細に使用します。論理的なアプローチよりもはるかに効率的な場合もありますが、純粋に論理的な定式化にアクセスできる場合は、レッド カットの方が適しています。カットの使用にエラーがある述語には、後で他の述語の一部として述語に依存しているときに発生する「後方の正確性」に関する問題があることがよくあります。これらは、デバッグと修正が難しい場合があります。
それらを「罪」と呼ぶかどうかはわかりませんが、初心者向けの教授にほぼ同意します。カットを使わずに論理的に問題を解決する経験を積むのが最善です。そうすれば、何が簡単で何が難しいかをよりよく理解できたときに、後でカットを導入できます。早い段階で使いすぎると、手続き型プログラミングの松葉杖として依存するようになります。
最初は、単純な理由から、Prolog の純粋な宣言部分に焦点を当てるようにしてください。Prolog を他のプログラミング言語と区別するのは、その部分です。言語の純粋で単調な部分に焦点を当て、カットを完全に避けます。このプログラミング パラダイムにどっぷりと浸かることが他に期待できるでしょうか。
ただし、特定の課題に直面することは間違いありません。特に、if-then-else コンストラクトと一般的な否定をエンコードしようとする場合。そのような構造の条件が if 部分で成功する必要があり、then 部分で失敗する必要がある場合、非単調コードになります。ただし、Prolog はそのようなコードをクリーンな方法で処理するように構築されたことはありません。
代わりに、Prolog は if-then ルールのみを認識します。したがって、基本的に、ある部分には 1 つのルールがあり、別の部分には別のルールがあります。最初は非常に奇妙に見えるかもしれませんが、非常に純粋なコードを体験することができます。
純粋なコードの例については、私のページを参照してください。
参照:優れた Prolog コードの特徴? 興味深い質問が常に SO でクローズされるのはおかしいです。
緑や赤のカットについては、緑のカットがほとんどないことを当然のことと考えてください。安全な方法でカットを使用したい場合は、他の方法では意味をなさない追加の条件 (「ガード」) を追加する必要があります。これは、オプティマイザー、コンパイラー作成者などにとって本当に重要です。
私の答えをもう少しバランスよく保つために、カットで効率を改善するクリーンな方法の例を次に示します。