web-dev-qa-db-ja.com

HaskellとPrologの比較

どのような問題がHaskellよりもPrologで解決されますか?これら2つの言語の主な違いは何ですか?


編集

Prologの機能を模倣できるHaskellライブラリ(一種の論理ソルバー)はありますか?

49
danatel

Prologは主に論理的な問題を対象とした言語であり、特にAIおよび言語学の分野からのものです。 Haskellは、より汎用的な言語です。

Prologは宣言型(論理)言語であり、その中で論理的な問題を記述しやすくします。 Haskellは関数型言語であるため、計算上の問題により適しています。

宣言型プログラミングに関するウィキペディア:

コンピュータサイエンスでは、宣言型プログラミングは、制御フローを記述せずに計算のロジックを表現するプログラミングパラダイムです。プログラムの達成方法を説明するのではなく、プログラムが達成すべきことを説明することで、副作用を最小限に抑えたり排除したりしようとします。これは、実行するアルゴリズムの詳細な説明を必要とする命令型プログラミングとは対照的です。

宣言型プログラミングでは、プログラムを正式な論理の理論と見なし、計算をその論理空間での演繹と見なします。宣言型プログラミングは、並列プログラムの記述を大幅に簡略化する可能性があるため、最近特に注目されています。

関数型プログラミングに関するウィキペディア:

コンピュータサイエンスでは、関数型プログラミングは、計算を数学関数の評価として扱い、状態や可変データを回避するプログラミングパラダイムです。状態の変化を強調する命令型プログラミングスタイルとは対照的に、関数の適用を強調します。関数型プログラミングは、関数定義、関数適用、および再帰を調査するために1930年代に開発された正式なシステムであるラムダ計算にルーツがあります。多くの関数型プログラミング言語は、ラムダ計算の装飾と見なすことができます。

つまり、宣言型言語は、どの入力からどのような出力が得られるかに関する一連のルールを宣言し、それらのルールを使用して入力から出力を推測します。一方、関数型言語は、入力を出力に変換する方法を定義する数学または論理関数のセットを宣言します。


追加された質問については:私が知っていることはありませんが、あなたは translate Haskell to Prolog、または implement Prolog in Haskell :)

31

ロジックライブラリの質問について:存在しない場合は、さまざまな方法で構築できるはずです。 Reasoned Schemerは、Schemeに論理推論機能を構築します。 [〜#〜] plai [〜#〜]の第33〜34章では、PrologおよびPrologの実装について説明しています。これらの作者は、SchemeとPrologの間に橋をかけています。 PLT Scheme の作成者は、Haskellの遅延評価機能の後に、言語の1つとして Lazy Scheme を作成しました。オレグ・キセリョフの LogicT 論文はいつものように素晴らしい-彼は多くの言語で可能なことの境界を押し広げている。 Haskell Wikiには 論理プログラミングの例 もあります。

37
gknauth

プロローグは論理プログラミング言語ですが、ハスケルは関数型言語です。関数型言語は、functionの概念に基づいており、多数の引数を取り、値を計算します。

一方、Prologには機能がありません。代わりに、predicatesを使用して「定理」を証明します。 Prolog述語は値を計算せず、「yes」または「no」と答え、オプションで入力変数を値にバインドできます。

機能プログラミングと論理プログラミングの有用性はしばしば重複します。最近、関数型プログラミングはかなりの牽引力を獲得していますが、Prologは、主流の関数とメソッドの一般的な概念とははるかに異なるため、依然としてニッチ言語です。OOP =関数型プログラミングよりも、しばしば(非常に)学ぶのが難しいと考えられています。

特定の問題は、特に 制約ソルバー と組み合わせると、Prologに実装するのがほとんど簡単になります。

Wikipedia で論理プログラミングの詳細を読むことができます。

31
JesperE

あなたは、紙 Zurgからの脱出:論理プログラミングの練習問題 の興味深い読み物を見つけるかもしれません。これは、PrologとHaskellでの単純な検索問題の実装を並べて比較し、検索問題をより一般的に表すための小さな型クラスフレームワークを示しています。著者が結論付けた結論は、Haskellでこれらのタイプの問題の少なくともいくつかを表現することは、Prologよりも簡単であるということです。これは、主にHaskell型システムにより、検索状態のニース表現が容易になり、状態から状態へと移行するためです。 。

11
Ian Ross