論理プログラミング

PrologEdit

主な記事:Prolog

プログラミング言語Prologは1972年にAlain Colmerauerによって開発されました。 マルセイユのコルメラウアーとエディンバラのロバート-コワルスキーのコラボレーションから生まれた。 Colmerauerは意味論を表現するために論理を使用し、質問応答のために解決を使用して、自然言語理解に取り組んでいました。 1971年の夏、コルメラウアーとコワルスキーは、論理のclausal形式が形式的な文法を表現するために使用できることを発見し、解決定理証明者が解析に使用できることを発見した。 彼らは、hyper-resolutionのようないくつかの定理証明者はボトムアップパーサーとして動作し、SL-resolution(1971)のような他のものはトップダウンパーサーとして動作することを観察した。

1972年の夏、コワルスキーは再びコルメラウアーと協力して、意味の手続き的解釈を開発しました。 この二重の宣言的/手続き的解釈は、後にProlog記法

H:-B1,…,Bnで形式化されました。 これは、宣言的にも手続き的にも読み取ることができます(および使用することができます)。 また、このような節は、明確な節またはホーン節に限定することができることが明らかになりました,ここで、H,B1,…,Bnはすべて原子述語論理式であり、SL分解能はLUSHまたはSLD分解能に制限される(そして一般化される)ことができる。 コワルスキーの手続き的解釈とLUSHは、1973年に発表された1974年のメモに記載されている。

Colmerauerは、Philippe Rousselとともに、1972年の夏と秋に実装されたPrologの基礎として、この句の二重解釈を使用しました。 1972年に書かれ、マルセイユで実装された最初のPrologプログラムは、フランスの質問応答システムでした。 実用的なプログラミング言語としてのPrologの使用は、1977年にエディンバラのDavid Warrenによるコンパイラの開発によって大きな勢いを与えられました。 実験は、Edinburgh PrologがLispのような他の記号プログラミング言語の処理速度と競合することを示した。 Edinburgh Prologは事実上の標準となり、ISO標準Prologの定義に強く影響を与えました。

Abductive logic programmingEdit

Abductive logic programmingは、abductible述語として宣言されたいくつかの述語を”オープン”または未定義にすることを可能にする通常の論理プログラミングの拡張で アブダクション論理プログラムの句は、次の形式を持ちます。

H:-B1,…,Bn,A1,…,An。

ここで、Hは外転可能ではない原子式であり、すべてのBiは述語が外転可能ではないリテラルであり、Aiは述語が外転可能な原子式である。 拉致可能な述語は、整合性制約によって制約することができ、これは次の形式を持つことができます。

false:-L1,…,Ln。

ここで、Liは任意のリテラル(定義されているか外転可能であり、原子または否定されている)です。 たとえば、

canfly(X) :- bird(X), normal(X).false :- normal(X), wounded(X).bird(john).bird(mary).wounded(john).

ここで、述語normalは拉致可能です。

問題解決は、解決すべき問題の解決策として、拉致可能な述語で表現された仮説を導出することによって達成される。 これらの問題は、説明する必要がある観察(古典的な拉致推論のように)または解決すべき目標(通常の論理プログラミングのように)のいずれかです。 例えば、”normal(mary)”という仮説は、観測を”canfly(mary)”と説明する。 さらに、同じ仮説は、飛ぶことができるものを見つけるという目標の唯一の解決策X=maryを伴います:

:- canfly(X).

アブダクションロジックプログラミングは、故障診断、計画、自然言語処理、機械学習に使用されています。 また、否定を拉致推論の一形態として失敗として解釈するためにも使用されてきました。

Metalogic programmingEdit

数学論理にはオブジェクト言語とメタ言語を区別する長い伝統があるため、論理プログラミングではmetalevelプログラミングも可能です。 最も単純なmetalogicプログラムは、いわゆる”バニラ”メタインタプリタです。

 solve(true). solve((A,B)):- solve(A),solve(B). solve(A):- clause(A,B),solve(B).

ここで、trueは空の接続詞を表し、clause(A,B)はformA:-Bのオブジェクトレベルの節があることを意味します。

Metalogicプログラミングは、自然言語のように、オブジェクトレベルとmetalevel表現を組み合わせることができます。 また、推論規則として指定されている任意のロジックを実装するために使用することもできます。 Metalogicは、他のプログラム、データベース、知識ベース、または公理理論をデータとして操作するメタプログラムを実装するために論理プログラミングで使用され

制約論理プログラミング編集

メイン記事:制約論理プログラミング

制約論理プログラミングは、ホーン節論理プログラミングと制約解 Horn句を拡張するには、制約述語として宣言されたいくつかの述語を句の本体内でリテラルとして使用できるようにします。 制約論理プログラムは、次の形式の句のセットです。

H:-C1,…,Cn≤B1,…,Bn。 ここで、HとすべてのBiは原子式であり、Ciは制約です。 宣言的には、このような句は通常の論理的意味として読み取られます。H If C1and…and Cn and B1and…and Bn。

しかし、句の先頭の述語は制約論理プログラムによって定義されるのに対し、制約の述語はいくつかのドメイン固有のモデル理論構造または理論に

手続き的には、述語がプログラムによって定義されているサブゴールは、通常の論理プログラミングのように目標削減によって解決されますが、制約 最初の問題は、それを制約の充足可能な結合に減らすことによって解決されます。

次の制約論理プログラムは、教師としてのジョンの歴史のおもちゃの時間的なデータベースを表します:ここで≤と<は、通常の意図されたセマンティクスを持つ制約述語です。 次のgoal句は、johnが論理を教えていて教授だった時期をデータベースに照会します。

:-teaches(john,logic,T),rank(john,professor,T)。

解は2010≤T、T≤2012です。

制約論理プログラミングは、土木工学、機械工学、デジタル回路検証、自動時刻表作成、航空管制、金融などの分野の問題を解決するために使用されてい これはアブダクション論理プログラミングと密接に関連している。

並行論理プログラミング編集

主な記事:並行論理プログラミング

並行論理プログラミングは、論理プログラミングの概念を並行プログ その開発は、1980年代に日本の第五世代プロジェクト(FGCS)のシステムプログラミング言語のためのその選択によって大きな刺激を与えられました。並列論理プログラムは、

H:-G1,…,Gn|B1,…,Bnの形式の保護されたホーン節のセットです。

接続詞G1,… 、Gnは節のガードと呼ばれ、|はコミットメント演算子です。 宣言的には、ガードされたホーン句は、通常の論理的含意として読み取られます。

h If G1and…and gn and B1and…and Bn。 しかし、手続き的には、ヘッドHが与えられた目標に一致する複数の句がある場合、すべての句が並列に実行され、ガードG1かどうかをチェックします。.. 、Gnホールド。 複数の節のガードが保持されている場合、その節のいずれかに対してコミットされた選択が行われ、実行はサブゴールB1,で進行する。..、選択された句のBn。 これらのサブゴールは並行して実行することもできます。 したがって、並行論理プログラミングは、”非決定性を知らない”ではなく、”非決定性を気にしない”という形式を実装しています。

たとえば、次の並行論理プログラムは述語shuffle(Left,Right,Merge)を定義します。:ここで、空のリストを表し、Prologのように、最初の要素Headの後にリストTailが続くリストを表します。 (2番目と3番目の句の|の最初の出現はリストコンストラクタであり、|の2番目の出現はコミットメント演算子であることに注意してください。)プログラムは、たとえば、リストをシャッフルし、goal句を呼び出すために使用できます。

shuffle(, , Merge).

プログラムは、Merge=などの単一の解を非決定

間違いなく、並行論理プログラミングはメッセージパッシングに基づいているため、アクターなどの他の並行メッセージパッシングシステムと同じ不確定性の対象となります(同時計算における不確定性を参照)。 カール・ヒューイットは、並列論理プログラミングは、計算ステップを論理的に推論することはできないという彼の意味で論理に基づいていないと主張している。 しかし、並列論理プログラミングでは、終了する計算の結果はプログラムの論理的結果であり、部分的な計算の部分的な結果はプログラムと残差目標(プロセスネットワーク)の論理的結果である。 したがって、計算の不確定性は、プログラムのすべての論理的な結果を推論できるわけではないことを意味します。

同時制約ロジックprogrammingEdit

メイン記事: 並行制約論理プログラミング

並行制約論理プログラミングは、並行論理プログラミングと制約論理プログラミングを組み合わせたもので、制約を使用して並行性を制御します。 句には、句の適用をブロックする可能性のある制約のセットであるguardを含めることができます。 いくつかの節のガードが満たされると、並行制約論理プログラミングは一つだけを使用することをコミットした選択をする。

帰納論理プログラミング編集

主な記事: 帰納論理プログラミング

帰納論理プログラミングは、論理プログラムの機械学習:背景知識の文脈で正と負の例を一般化することに関係してい この分野での最近の研究は、論理プログラミング、学習と確率を組み合わせて、統計的関係学習と確率的帰納論理プログラミングの新しい分野を

高次論理プログラミング編集

いくつかの研究者は、述語変数などの高次論理から派生した高次プログラミング機能を持つ論理プログラミングを拡張している。 そのような言語には、Prolog拡張HiLogとšprologが含まれます。

Linear logic programmingEdit

線形論理内の論理プログラミングをベースにすることで、古典論理に基づくものよりもかなり表現力のある論理プログラミング言語の設計が行われた。 Horn句プログラムは、述語への引数の変更によってのみ状態の変化を表すことができます。 線形論理プログラミングでは、状態変化をサポートするために周囲線形論理を使用することができます。 線形論理をベースとした論理プログラミング言語の初期の設計には、LO、Lolli、ACL、Forumなどがある。 フォーラムは、線形論理のすべての目標指向の解釈を提供します。

オブジェクト指向ロジックprogrammingEdit

F-logicは、オブジェクトとフレーム構文を使用したロジックプログラミングを拡張します。

Logtalkは、オブジェクト、プロトコル、およびその他のOOP概念をサポートするPrologプログラミング言語を拡張します。 バックエンドコンパイラとして、ほとんどの標準準拠のPrologシステムをサポートしています。

Transaction logic programmingEdit

Transaction logicは、状態変更更新の論理理論を持つ論理プログラミングの拡張です。 それはモデル理論的意味論と手続き的意味論の両方を持っています。 トランザクションロジックのサブセットの実装は、Flora-2システムで使用できます。 他のプロトタイプも利用可能です。

コメントを残す

メールアドレスが公開されることはありません。