なぜロジックプログラミングが普及していないのですか? [閉まっている]

StackOverflow https://stackoverflow.com/questions/630007

質問

時間が経つにつれて、関数型プログラミングが他のプログラミング言語により多くの影響を与えるようになります。 AIクラスでPrologを開始していますが、AI以外の分野でのプログラミングを容易にするものがいくつかあるようです。私の質問はこれです:なぜロジックプログラミングが同じように受け入れられなかったのですか?

このトピックでは、一般的な論理プログラミングは有用ですが、そのように証明されなければならないというコンセンサスに達しました。有用と見なされない理由はありますか?

更新:おそらくもう少し明確にする必要があります。私は本当にPrologについて尋ねていません。ほとんどの実際のアプリケーションでPrologを選択するのが良い考えではない理由がわかります。

私が話していることのより多くの例を与えるために、Pythonのリスト内包/マップ/フィルターを検討してください。これらは明らかに関数型言語の影響を受けます。なぜPythonなどの言語も、関数型言語のような論理プログラミング言語からこれらの種類のものを取り上げていないのですか?

役に立ちましたか?

解決

Prologを使用してコンピューターサイエンスクラスのロジックプログラミングについて学習するとき、主なポイントは、Prologの熟練したプログラマーになることではなく、プログラミング技術(データ構造/アルゴリズム)の別の形式に心を開くことですあなたが以前に考慮していなかったこと。

コンピューターサイエンスの勉強を始めたときの私のポイントを説明するために、私の工学学校では、すべての生徒がソフトウェアをPascalで書く必要がありましたが、卒業してからPascalを一度も使用したことがありません。しかし、私がまだ毎日使っている正しいデータ構造とアルゴリズムを選ぶことで学んだスキル。

Pascalは私の履歴書に私の知っている言語としては表示されませんが、ソフトウェアエンジニアとしてのトレーニングには役立ちました。その有用性は、現在生産中のPascalコードの行数だけで測定することはできません。

ソフトウェアを開発するとき、Prologコードを1行も書いていなくても、これらの「役に立たない」で最初に学んだテクニックを再利用していることに気付くでしょう。参加したプロローグまたはAIクラス。

テクノロジー(特定のプログラミング言語、特定のソフトウェアツール/アプリケーション)の有用性を評価することは、単に実際の使用レベルを評価することではなく、その影響を評価することです。

ロジックプログラミングがエキスパートシステム、コンピューターゲームAI、航空交通管制、その他の多くの分野の分野に及ぼした影響を見ると(おそらく誰もが示唆していますか?)ロジックプログラミングが成功していないと言いました...

他のヒント

私はプログラミングのキャリアの約4年をルールベースの「エキスパートシステム」に費やしました。顧客の要件に基づいて電話交換用のハードウェアをプロビジョニングおよび構成します。

これは非常に成功し、私が知る限り、10年以上経ってもまだ日常的に使用されています。しかし、それがどのように機能するかを理解できるプログラマを見つけることは、システム自体を開発することよりも大きな仕事でした。

これは、手続き型および関数型プログラミングの概念を理解できる人の数と比較して、ロジックベースのプログラミングに必要な考え方を持っている人が少ないため、アプローチが始まっていない理由だと思います。

論理プログラミング言語は、事実と推論のルールを「推論エンジン」に供給するメカニズムを提供します。次に、新しいファクトを生成するために、指定されたファクトにルールを適用するように動きます。特定の論理言語は、その特定の推論エンジンの強さに依存するか、それに依存します。

Prologの推論エンジンは非常に単純な実装であり、非常に非効率的です。同じ問題は、ループ内に多数のifステートメントを記述するだけで、ほとんどの手続き型言語でより効率的に解決できます。

"コンフィギュレータ"に選択した言語DECのRuleWorksは、より広く知られているOPS5言語の改良版です。これには、 Reteアルゴリズムに基づいた推論エンジンがあり、手続き型アプローチよりもはるかに効率的です。

DECはHPに飲み込まれたCompaqに飲み込まれたので、RuleWorksはオープンソースになり、このWebからを入手しました。ページ

このようなテクニックは、他の方法では手に負えないさまざまな問題を解決するのに非常に効果的である可能性があるため、これ以上の関心はないのは残念です。

最近、ゲームデザインAIの研究プロジェクトで多数のロジックプログラミングを使用しました(ティーザービデオ!)、ただし、ロジックを多用するプロジェクトの少なくとも半分は、基本的なゲームエンジンを実装する機能的または必須のScalaコードでした。 プログラミングのポイント、私がそのようなことを主張するかもしれない場合、あなたが望むもののマシンの理解をあなた自身のものと同期させることです-そして、ほとんどの同期は< em> requires 何らかのレベルで、あなたが何かをしたい方法の命令的詳細を与える。これらの愚かなマシンは常に文字通りです...

論理プログラミングは、伝統的、演ductive的、プロローグスタイルのものでも、よりエキゾチックな帰納的論理プログラミングまたは回答セットプログラミングフレーバーでも、簡単に命令を伝えることができるという犠牲を払って、いくつかのフレーバーの問題に大きな影響を与えます知識(実際のアプリでは常にどこかで必要です)。対話型アプリケーションの懸念により、命令型の知識を表現する際の生産性へのわずかな打撃さえも受け入れられない場合があります。ロジックプログラミングスタイルでゲームエンジン全体を記述することは、常に悪い考えです(同様の計算能力を持つperl互換の正規表現を使用して試してみるのと同様)。ハイブリッド言語(またはロジックインタープリターを簡単に埋め込むことができる言語)では、両方の長所を利用できます( jTrolog を使用して、PrologをScalaエンジンに埋め込み、マルチパラダイムボルトロンを形成します。

ロジックプログラミングの方が確かに人気があり、よく理解されていると思いますが、ある意味で、純粋なロジックプログラミングは、SQLや正規表現よりも「キャッチする」という点で優れているとは言えません。その魔法は、あなたの命令的な表現力を取り除くことから来るからです(理想的には、重要でない詳細に迷子にならないようにする)。この説明は、関数型プログラミングにもほぼ同じように当てはまります。ロジックプログラミングが大好きですが、いつ使用するかを選択できるからです。最善の方法は、一貫した、適切に設計された方法でその選択を提示するハイブリッド言語のようです。

単純なPrologの私の印象は、それがおもちゃの言語だということです。論理プログラミングが役に立たないというわけではありません。たとえば、 Twelf では、単純なプログラミング言語のセマンティクスを非常に簡単に宣言し、宣言を次のように機能させることができます。通訳者。 &#955; Prolog

ロジックプログラミング言語を汎用言語として使用しようとする際に私が考える問題は、一部のタスクが概念に非常にうまく適合しないことです。ロジックプログラミング機能は、命令型および機能型の構成要素を持つ言語に組み込む必要があると思います。そのような言語が少なくとも1つあります。 Oz ですが、まだ試していないそれを。

編集:しばらく試してみたいアイデアが1つあります。リレーショナルデータベースを原子としてPrologにフィードし、それを使用してSQLの代わりにクエリを実行します。 SQLを大幅に改善できると思います。

私たちがプロローグを学んだとき(プログラミング言語のクラスでほんの数週間なので、私はほとんど専門家ではありません)、教授はまた、あなたの定義によっては、ロジックプログラミングは実際にはまったくプログラミングされていないかもしれないと指摘しました。

プログラミングと言うとき、通常は「一連のタスクまたは命令をコンピューターに発行する」などのことを指します。それが命令型または関数型プログラミング言語が行うことです。それがすべての「本物」ですプログラミング言語はそうです。プロローグ、またはロジックプログラミングは、実際にはそうしません。 SQLに似ています。コンピューターに多くの質問をすることができます。以前に入力したデータに基づいて、最大限の能力を発揮しますが、他のプログラミングパラダイムとは異なり、コンピューターに何をすべきかを実際に伝えているわけではありません。

これは非常に特殊化されており、汎用プログラミングには適していません。また、専用に特化したものは必要ありません。

一方、関数型プログラミングは間違いなく汎用プログラミングであり、何の問題にも使用でき、大きな問題はありません。後者が流行しているのはそのためであり、論理プログラミングはそうではありません。私は思う...:)

私がPrologで最初に抱えた問題は、それが論理プログラミング言語ではないということです。 「真」、「偽」、「わからない」という3つの値を持つ標準ロジックが欠けており、後者の2つを統合しています。言い換えれば、2つの真理値は実際には「表示可能」です。および「表示できません」。これにより、論理的推論の基本である「しない」という考え方でPrologに実際の問題が生じます。

通常の論理では、否定を反証することによって命題を証明することは完全に合理的です。これは「reductio ad absurdum」と呼ばれます。 (はい、数学を使わずに再構築しようとした人もいますが、少し難解になっています。)これはPrologではうまくいきません。証明された偽りと証明されていないものの区別がないからです。

したがって、Prologでクラスプロジェクトを行ったとき、それをプログラミングロジックと考えるたびにトラブルに巻き込まれました。私はいつも実際の否定を必要とする何かをすることになります。おそらく他の人はそれをしないかもしれませんが、私はそれをパターンマッチング言語と考えてしまい、プロジェクトを完了するのにほとんど苦労しませんでした。

プログラマーが物事を書き、その結果に本当に依存できる真の論理ベースの言語を持つことは不可能です。 1次述語計算(つまり、変数、真または偽の関数、「and」、「or」、「not」、「for all」、および「exists are」が含まれるロジック)は明確に決定できません。 (結局、可能な限りすべての定理を機械的に生成するのではなく、数学者にコーヒーを注いでいる理由があります。)真か偽か。

編集:句を適切に順序付けることの重要な必要性も忘れていました。論理的には、物事をどの順序で書き留めてもかまいません。 Prologでは、論理ベースの言語として扱うのをやめるまで、無限ループに入り続けました。繰り返しになりますが、パターンマッチング言語としていくつかの優れた機能がありますが、それはロジックではなく、言語のワントリックポニーのように思えました。 YMMV、しかし他の何人かは私に同意するようです。

関数型プログラミングは、マルチスレッドプログラミングに適用するといくつかの重要な利点があり、マルチコアプロセッサへの移行が進むにつれて、マルチヘッドプログラミングがますます重要になるため、人気が高まっています。

Prologでの私自身の経験から、特定のタスクには非常に優れていますが、汎用プログラミング言語としては、私の意見では他の多くの言語ほど柔軟性がありません。

Prologは、大学のAIクラスでPrologを使用したときに非常に魅力的でしたが、今日AI以外で使用する状況はほんの少ししかありません。そして、そのような状況でも、私はむしろそれを使いたくない。最終的に「取得」するのに長い時間がかかりましたプロローグ、そして私がやったとき、私はそれが素晴らしいと思ったが、すぐに有用性の限られた範囲を見た。

それでも、別の方法でプログラミングに取り組むことを学ぶ以外の理由がない場合は、それを学ぶことを強くお勧めします。多くの異なる視点から問題を見ることができることは、あなたをより良いプログラマにします。

Prologは特定のタスクに非常に適しているのは事実ですが、11年間の実務経験では、Prologが最良のソリューションになるという問題は一度もありませんでした。 Prologが理想的であるような問題が非常にまれであることは、ただの問題です。

これは、ジョブに適切なツールを使用する標準的なケースです。特定の状況でロジックプログラミングが表示されます。通常、ルールベースまたはエキスパートシステムのようなものと呼ばれます。

計算可能性理論コースでは、すべてのこれらの汎用言語の(数学的な観点から)実質的に同等です。ただし、プロトタイピングと長期開発は非常に異なる領域です。そのため、ルールベースのシステムでは、Prologなどのルールセットを使用してルールセットを作成し(適切に機能する場合)、後で配信プラットフォーム(Javaなど)に最終システムを実装することは完全に可能です。

ところで、私はいつも、ほとんどすべてに対するPrologの答えが「いいえ」だという方法が大好きでした

AI クラスでPrologを開始しているという事実がヒントになるはずです。 AIもあまりうまくいっていません。

80年に教授がAIの重要な使用法を実証するように挑戦したことを覚えています(わかりました、「スコッフィング」はより正確な用語ですが、私はそれより若かったです)。彼はそれができなかったし、今日、彼は当時彼が熱望していたAIのアプリケーションの約1/10を教えているのではないかと思う。

おそらくPrologにも同じことが当てはまります。私がPrologの経験を探している会社を最後に見たときのことは覚えていません。たぶん決して、あるいは私はそれを見て無視したかもしれません。

このディスカッションスレッドには、真に宣言的であり(ステートメントは任意の順序で作成できます)、SQLの代わりとしてデータベースのクエリに使用できる論理プログラミング言語の呼び出しがあります。

データログが探しています。たとえば、データ統合、セキュリティアプリケーション、プログラム分析で使用されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top