一般に、使用されているすべての言語は、その利点のために使用されています。
Prologの利点は何ですか?
Prolog を他のどの言語よりも効率的に使用できる一般的な状況/問題のカテゴリは何ですか?
正確には何と比較して?Prologは実際には論理プログラミングの卓越した実装にすぎないので、あなたの質問がプログラミングパラダイムの比較について本当によくある場合、それは確かに非常に広範であり、ここを見る必要があります。
あなたの質問がより具体的にプロローグとより一般的に見られるオブジェクト指向言語に関するものである場合、あなたは実際にリンゴとオレンジを比較していると私は主張します-「利点」(それがそうであるように)は世界についての単なる異なる考え方です、そして質問の仕方を変えることで、問題を解決するためのより良いツールが提供されることがあります。
基本的に、プログラムを宣言的な正式な論理ステートメントとして簡単に記述できる場合、Prolog(またはそのファミリーの別の言語)は最速の開発時間を提供します。優れたPrologコンパイラを使用すると、エンジンに多くの設計と開発の労力がかかるため、最高のパフォーマンスと信頼性も得られます。
この種のことを別の言語で実装しようとすると、混乱する傾向があります。最もクリーンで最も一般的なソリューションには、おそらく独自の統合エンジンの実装が含まれます。ナイーブな実装でさえ、正確に些細なことではありません。ウォーレン抽象マシンには、それについて書かれた1、2冊の本があります。
もちろん、現実の世界では、プログラムの重要な部分がPrologの恩恵を受ける可能性がありますが、他の多くのものは別の言語を使用してより適切に処理されます。そのため、多くのPrologコンパイラがCなどとインターフェイスできます。
Prolog に固有のもの:
Paul Graham は Lisp の人ですが、Prolog は問題の 2% に本当に適していると主張しています。
「より良い」言語に対する彼の主張は、「少ないコードでより強力に」です。Prolog は間違いなく「より少ないコード」であり、後者のフレーバー (型付きのもの) を使用すると、より強力になります。Prolog を使用するときに私を悩ませた唯一のことは、リスト (配列なし) にランダム アクセスがないことです。
Prolog を使用する最適なタイミングの 1 つは、バックトラッキングで解決するのに適した問題がある場合です。それは、問題に対して考えられる解決策がたくさんあり、状況に応じてそれらを含めたり除外したりしたい場合です。これは、多くのあいまいさを示唆しています...自然言語処理のように。
すべての潜在的な回答を Prolog 句として記述する方が、はるかに整頓されていることは確かです。命令型言語では、巨大な (本当に巨大な) CASE ステートメントを書くことしかできないと思いますが、これはあまり楽しくありません。
Prolog は非常に高度なプログラミング言語です。アナロジーは (Prolog : C) as (C : Assembler) です。
では、なぜそれほど使われていないのでしょうか。それは私たちが使用する機械に関係していると思います。それらはチューリングマシンに基づいています。C は自動的にバイト コードにコンパイルできますが、Prolog は Abstract Warren Machine のエミュレーションで実行するようにコンパイルされるため、それほど効率的ではありません。
また、プロローグは、解決可能なすべての問題を宣言的な方法で解決できるわけではない一次ロジックに基づいているため、ある時点で、命令型のコードに依存する必要があります。
プロローグは、知識ベースがソリューションの重要な部分を形成する問題にうまく機能すると思います。特に、知識構造が論理ルールとしてエンコードされるのに適している場合。
たとえば、特定の問題ドメインの自然言語通訳者を作成するには、そのドメインに関する多くの知識が必要になります。エキスパートシステムもこの知識主導型のカテゴリーに分類されます。
論理パズルの解決策を探るのにもいい言語です;-)
私は Swi-Prolog で 1 年以上 (楽しみのために) プログラミングをしています。Prolog の利点の 1 つは、Prolog には副作用がないことだと思います。Prolog は、(ローカルまたはクラス メンバー) 変数を使用しない言語であり、プログラマーに変数を使用しないように強制します。Prolog オブジェクトには状態がありません。おもう。私はコマンド ライン Prolog を書いています (いくつかの XPCE テストを除いて GUI はありません)。