純粋に機能的な言語でプロローグインタープリターを実装する方法


25

純粋に関数型の言語でPrologインタープリターを実装する方法について、擬似コードに関する明確なリファレンスがありますか?私がこれまでに発見したのは、命令型言語のみを扱っているようで、Prolog自体の実装にすぎないか、解釈に使用する具体的なアルゴリズムを提供していません。私は答えにとても感謝しています。


4
Patrice BoizumaultによるProlog(Princeton Series in Computer Science)の実装には、Lispが実装されています。
ウィルネス

比較的新しいアプローチについては、この回答をご覧ください。

回答:


24

以来プロローグ = 統語統一 + 後向き連鎖 + REPL

人工知能の 3つの部分はすべて、George F. Lugerによる複雑な問題解決のための構造と戦略です。本の第4版では、セクション15.8、LISPの論理プログラミングで、3つの部分すべてがLISPに実装されています。彼は他の本にも同じコードを書いていますが、ここで注意するためのすべてを持っているわけではありません。彼の本のコードはここにあります

3つの部分すべてを備えた別のソースは、人工知能プログラミングのパラダイムにあります。PeterNorvigによるCommon Lispのケーススタディです。第11章「ロジックプログラミング」および第12章「ロジックプログラムのコンパイル」を参照してください。彼の本のコードはここにあります

別のソースは、Hal Abelson、Jerry Sussman、Julie Sussmanによるコンピュータープログラムの構造と解釈です。セクション4.4ロジックプログラミングを参照してください。本のサイトはこちらで、本のコードはこちらです。

見どころがわかっている場合、多くのアプリケーションで実装されているバックチェーンを備えた統合アルゴリズムを見つけることは珍しくありません。関数型コンパイラの型推論では特に一般的です。キーワードの統一または発生を使用すると、機能を見つけるのに役立ちます。また、ほとんどの実装では、統合関数の名前にunifを使用します。

OCamlで行われるREPLを除くPrologのバージョンについては、「実用的なロジックと自動推論のハンドブック」のコードとリソースを参照してください-prolog.ml

ブックコードのF#への翻訳はこちらにあります。書籍コードのHaskellへの翻訳はこちらにあります

コードを見つけるという点では、統合アルゴリズムを見つけるのが最も簡単であり、その後、アプリケーションに埋め込まれたバックチェーンを備えた実装です。REPLを使用して関数型言語でPrologの完全に機能する実装を見つけることが最も困難です。ほとんどの場合、コードはPROLOG内で直接使用できる形式ではありません。パフォーマンスを向上させるために大幅にカスタマイズされているため、コードを見つけることはできますが、必要な部分をいじるのに値する価値はありません。私のアドバイスは、LISPをインストールして学習し、翻訳を行うことを意味する場合でも、選択した言語でLugerの本を読んでゼロから作成することです。

編集

これはStackOverflowからの重複した質問であり、OPは新しく、コメントに次のように記載されているためです。

より多くのコンテキストを与えるために、私は型推論を実装しようとしていますが、私の言語の型システムの複雑な機能(依存型、洗練型、あまり一般的でないいくつかの名前を付けるための線形型付け)によって、非常に一般的なアルゴリズムを取得するために、Prologを駆動するアルゴリズムに基づいて型推論を行うのに役立ちます 私は完全に独学であることに気付くので、広い分野で知識が不足しています。

ここでこれを拡張しますが、OPが新しい質問をする必要があることを理解します。

いくつかのイントロについては、型推論の実装を参照してください。

私がこれについて知っている最高の本は、Benjamin C. Pierceによる型とプログラミング言語です。本のサイトはこちらです。OCamlコードへのリンクがあるリソースはこちらです。そして最近開始されましたが、これのほとんどF#への翻訳はこちらです。

依存型:pg。462絞り込みタイプ:pg。207線形論理と型システム:pg。109


1
ガイ・コーダー、あなたは紳士であり学者です!あなたの支援が最も有用であり、この質問に答えるのに実際に時間を割いてくれたことに感謝できません。= D - Jimsterの共同研究や研究-疲れフレンド
Shenzao

ありがとう
ジムスター

@Jimster Norvigのコードは素晴らしく、明確で、ページIIRCに適合しています。それが純粋かどうかを覚えてはいけません。
ウィルネス

:別のものが見つかり型推論と統一:講義26
ガイCoderの

対象:割り当て2の一部であるunify_P3.py
Guy Coder

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.