2015-11-05 3 views
8

私は、SICPとThe Art of Prolog(AoP)を含むさまざまな指示に基づいて、おもちゃ論理プログラミング言語を書こうとしています。私はちょうど統一アルゴリズム(AOPによると、「論理プログラミングの計算モデルの心臓部」)の私の最初のスケッチを動作するように始めています、とAOPは正確には「論理変数」とは何か、そしてその言語機能を実装するための一般的なアプローチは何ですか?

がために統一アルゴリズムを実装する場合と指摘します特定の論理プログラミング言語では、スタック上の方程式とユニファイアの両方における明示的な置換が回避される。代わりに、論理変数および他の用語は、異なる値を有するメモリセルによって表され、変数バインディングは、変数がバインドされる用語の表現を含むセルへの参照を論理変数を表すメモリセルに割り当てることによって実現される。 (第1版では、P。71)これを読ん

は、私が唯一の仕組み論理変数のラフで実用的な把握を持っていることを実感しましたが、私は本当に彼らが実装されているかを理解していません。宣言的プログラミングのパラダイムの他の領域で機能する不変変数と論理変数を区別する、正確で正式な特性は何であるかもわかりません。私はすべての説明と教示の参考に感謝します。

+0

多分、cs.stackexchange.comがより良い場所です。 –

+1

@tobyodaviesが正しければ、SATソルバーはPrologのようなプログラミング言語の中心ではありません。ロジックプログラミングにはさまざまなスタイルがありますが、それらはおそらくあなたが後になったものではありません。 –

+0

実装言語はどのようになりますか? – repeat

答えて

4

Prologコンパイラとインタプリタの実装方法を理解したい場合は、Warren Abstract Machineを参照してください。

論理変数の基本的な考え方は、論理変数に異なる論理変数に自由であるか、別名にバインドされていることです。

+0

私は文脈を提供しようとしていることが混乱を招いているのではないかと心配しています。私は本当にタイトルに掲げられた質問のみを求めています。私はPrologコンパイラまたはインタプリタを実装する方法を尋ねていません。論理変数はProlog-ish環境のコンテキスト内でのみ意味がありますか?私はそうは思わないが、もしそうなら、なぜその理由を知るのに役立つでしょう。いずれにしても、WAMには私が研究できる論理変数の実装が必要であると思いますか? –

+1

論理変数は、ロジックプログラミング言語でのみ意味があります.WAMなどは、標準準標準中間言語です。論理変数を使って何かをしている場合は、論理var自体(ある関数言語を使用している場合)は3つの状態を持つ代数的データ型です:bound(適切なterm型のある用語に)、alias別のロジック変数に)変換し、フリーにします。統一はこの状態を変え、バックトレース(トレイルのポップ)はこれらの状態変化を元に戻します。 – tobyodavies

+0

これは私が探していた情報の種類です。ありがとう!ロジック変数のためのLP言語の必要性についてのあなたの発言を考えれば、あなたは次のような仕事に関する考えを持っていますか:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.48.1931? LP言語ベースで構築されたFP言語として見えますか?私が理解していることから、リニアロジック基盤は従来のLPパラダイムとは明らかに異なるようです... –

1

部分的な回答については、という論理変数という概念のみに関するものです。

論理変数が数学変数のように働くということは、最初に近似することができます。論理値が学習されると、変化しません。これはassign-once変数の概念につながります。これは、命令型プログラミング言語における変数の概念と対照的であり、それらが記号的にメモリ位置を特定し、破壊的(したがって、複数の)割り当てを可能にする。しかし、論理変数に戻って、それは良くなる。論理変数は、の用語で統一されたでもかまいませんが、その用語自体に変数が含まれている可能性があります。次に、これらの変数は後で他の用語とさらに統一することができます。 Prologで以下の例を考える:

?- V = a(Y). 
V = a(Y). 

?- V = a(Y), V = a(1). 
V = a(1), 
Y = 1. 

を2番目のクエリでは、可変V整数1で、統一それは、Yを含む変数によってインスタンスさらにあります。 =/2演算子は、Prolog 統一演算子です。統一とは、2つの用語を同義にすることができ、おそらくによってという変数を一方の用語のサブ用語を他方の用語に束縛することができる論理的な操作です。

1

実装上の主な違いは、structure sharingstructure copyingです。これを求めるグーグルは注目に値する多くのリソースをもたらします...私のPrologのインタプリタで

、私は構造の共有を選択した、unifyにそれが必要な詳細な取り扱いの種類見かけますので(まあ、それは非常にシンプルな心のアプローチです):実装のほとんどがサービスに残し、そこにありますデータ構造BindStackとTrailStackはちょうど格納しています...私の選択の結果として、インスタンス化されたTermは環境と一緒に参照される必要があります。

+0

Prologインタプリタでガベージコレクションをどのようにしますか? – repeat

+0

@repeat:何もありません、私はたいていfindallを使用していましたので、用語は '生産中'コピーされました... – CapelliC

+0

https://en.m.wikipedia.org/wiki/Boehm_garbage_collectorはどうですか? – repeat

関連する問題