コンテンツにスキップ

「論理プログラミング」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m 外部リンクの修正 http:// -> https:// (hdl.handle.net) (Botによる編集)
編集の要約なし
(同じ利用者による、間の3版が非表示)
1行目: 1行目:
[[ファイル:Logical connectives Hasse diagram.svg|代替文=|境界|右|フレームなし|226x226ピクセル]]
'''論理プログラミング'''(Logic Programming)とは、広い意味では、コンピュータプログラミングでの[[数理論理学]]の使用である。この観点での論理プログラミングは、[[ジョン・マッカーシー]][1958]の''advice taker''の提案にまでさかのぼることができる。
{{Template:プログラミング・パラダイム}}
より一般的に受け入られている狭い意味での論理プログラミングは、述語論理式を非決定的なプログラミング言語とみなすもので、述語論理式は宣言的であると同時に手続き的にも解釈される。


'''論理型プログラミング'''(''Logic Programming'')は、[[古典論理学]]の[[述語論理]]をベースにした[[宣言型プログラミング]]の一形態である。あらゆる[[アルゴリズム]]を述語論理にある[[否定]]、[[論理積]]、[[論理和]]、[[論理包含|論理含意]]、[[同値]]といった[[論理演算]]の組み合わせで宣言的に表現し、形式化された操作で手続き的に解釈しようとする考え方が根底にある。この[[プログラミングパラダイム|パラダイム]]を扱う論理型言語の代表は、1972年に初公開された「[[Prolog]]」である。Prologでは[[論理式 (数学)|論理式]]をプログラム用の形態に特化した[[ホーン節]]を基本構文にしてプログラムは組み立てられる。論理型プログラミングは更に幾つかのサブパラダイムに分類されるが、このホーン節を土台にしたものが大半を占めている。なお、Prolog以外の論理型言語は限りなくマイナー扱いされているのが現状である。Prologを中心にした論理型プログラミングの基礎は、論理学者{{仮リンク|ロバート・コワルスキ|en|Robert Kowalski|label=}}が1979年に上梓した「''Logic for Problem Solving''」などでほぼ完成され現在に到るまで引き継がれている。
論理をベースにしたプログラミング言語として1971年に [[Planner]] のサブセットである Micro-Planner が開発された。表明とゴールからパターンによる手続き的計画を呼び出す機能を備えていたが、十分に形式化されていなかった<ref>Alain Colmerauer and Philippe Roussel, '''The birth of Prolog'''</ref>。Plannerと独立してより論理を重視した [[Prolog]] が開発され、コワルスキーにより述語論理式([[ホーン節]])のプログラム的解釈の考え方と結び付き、論理プログラミングの基本的な考え方が確立した<ref>Robert Kowalski. '''The Early Years of Logic Programming'''</ref>。
Planner からの派生でプログラミング言語 Poplerが開発された。Prolog からの派生言語としては、Mercury、Visual Prolog、[[Oz (プログラミング言語)|Oz]]、Fril などがある。バックトラッキングを使用しない[[並行論理プログラミング]]言語としてProlog からの派生した[[Concurrent Prolog]]、[[PARLOG]]、[[Guarded Horn Clauses|GHC]]、[[KL1]]などの各種言語(Shapiro [1989] に調査結果がある)がある。

==数理論理学的基礎==
論理プログラミングの基本は[[数理論理学]]のスタイルをコンピュータのプログラミングに持ち込むことにある。数学者や哲学者は論理を理論構築のツールとして選んだ。多くの問題は理論として自然に表現される。解決すべき問題とは、新たな仮説が既存の理論で説明できるかどうかを問うことと等しい。論理は問題が真か偽かを証明する方法を提供する。証明構築過程は明確であり、論理は問題に答える信頼できる方法と見なされている。論理プログラミングシステムはこの過程を自動化する。[[人工知能]]は論理プログラミングの開発に重要な影響を与えた。


==Prolog==
==Prolog==
{{ main|Prolog }}
{{ main|Prolog }}


=== 基本形式 ===
[[Prolog]] は 1972年にマルセイユのカルメラウアーが考案し、1974年にコワルスキーがさらに形式的に定義し、数理論理学に基づいた言語として発表した。Prolog のプログラムは[[一階述語論理]]のサブセットの論理式の集まりとして読むことができ、一階述語論理のモデル理論と証明理論を継承している。プログラムの節は次のように書かれる:
[[Prolog]] は 1972年にマルセイユのカルメラウアーが考案し、1974年にコワルスキーがさらに形式的に定義し、数理論理学に基づいた言語として発表した。Prolog のプログラムは[[一階述語論理]]のサブセットの論理式の集まりとして読むことができ、一階述語論理のモデル理論と証明理論を継承している。プログラムの節は次のように書かれる:


21行目: 18行目:
ここで、節内の全変数(変項)は[[全称記号|全称量化]]されている。手続き的な後方連鎖規則として見れば、<tt>H</tt> を証明するには、<tt>B<sub>1</sub></tt> から <tt>B<sub>n</sub></tt> までを証明できれば十分であることがわかる。手続き的意味は線形導出法(LUSH または SLD導出法)による反駁証明によっても定式化できる。宣言的意味と手続き的意味の密接な関係は論理プログラミング言語の際立った特徴であるが、否定や論理和といった他の量化子をプログラム内に許すようになると関係は複雑になる。
ここで、節内の全変数(変項)は[[全称記号|全称量化]]されている。手続き的な後方連鎖規則として見れば、<tt>H</tt> を証明するには、<tt>B<sub>1</sub></tt> から <tt>B<sub>n</sub></tt> までを証明できれば十分であることがわかる。手続き的意味は線形導出法(LUSH または SLD導出法)による反駁証明によっても定式化できる。宣言的意味と手続き的意味の密接な関係は論理プログラミング言語の際立った特徴であるが、否定や論理和といった他の量化子をプログラム内に許すようになると関係は複雑になる。


===論理プログラミングおける否定===
===失敗る否定===
論理プログラムが節 H :- B<sub>1</sub>, ..., B<sub>n</sub> から構成され、H, B<sub>1</sub>, ..., B<sub>n</sub> が全てアトミックな述語論理式であれば、このプログラムは確定(definite)していると呼ばれ、[[ホーン節]]プログラムであるともいう。確定した論理プログラムの手続き的意味と宣言的意味は、そのまま述語論理的に解釈できる。否定を含めると、古典的論理との関係はそれほど直接的ではなくなる。「[[失敗による否定]]; negation-as-failure」推論規則によれば、ゴール Q がプログラムによって証明できない場合、その否定 not(Q) は証明されたと見なされる。これは古典的論理学では全く正しくない。公理から Q も not(Q) も導けない可能性がある。結果として、この規則は論理的例外と実用的困難さをもたらした。後方連鎖証明規則に「失敗による否定」を加えても完全ではない。その場合、プログラムを宣言的に読んで得られる論理的結果の全てを証明することができない。しかし、ほとんどの Prolog 系言語は「失敗による否定」を '''\+''' という文字列を使って実装している。
論理プログラムが節 H :- B<sub>1</sub>, ..., B<sub>n</sub> から構成され、H, B<sub>1</sub>, ..., B<sub>n</sub> が全てアトミックな述語論理式であれば、このプログラムは確定(definite)していると呼ばれ、[[ホーン節]]プログラムであるともいう。確定した論理プログラムの手続き的意味と宣言的意味は、そのまま述語論理的に解釈できる。否定を含めると、古典的論理との関係はそれほど直接的ではなくなる。「[[失敗による否定]]; negation-as-failure」推論規則によれば、ゴール Q がプログラムによって証明できない場合、その否定 not(Q) は証明されたと見なされる。これは古典的論理学では全く正しくない。公理から Q も not(Q) も導けない可能性がある。結果として、この規則は論理的例外と実用的困難さをもたらした。後方連鎖証明規則に「失敗による否定」を加えても完全ではない。その場合、プログラムを宣言的に読んで得られる論理的結果の全てを証明することができない。しかし、ほとんどの Prolog 系言語は「失敗による否定」を '''\+''' という文字列を使って実装している。


36行目: 33行目:
ここで、''iff'' は[[同値]](if and only if)を意味する。完全性を主張するには、等号と等号に関する公理を明確にする必要もある。完全性は非単調推論のためのマッカーシーの[[サーカムスクリプション]]や[[閉世界仮説]]に密接に関連する。
ここで、''iff'' は[[同値]](if and only if)を意味する。完全性を主張するには、等号と等号に関する公理を明確にする必要もある。完全性は非単調推論のためのマッカーシーの[[サーカムスクリプション]]や[[閉世界仮説]]に密接に関連する。


===Prolog の実装===
===処理系実装の数々===
最初に実装された [[Prolog]]処理系は1972年に開発された Marseille Prolog である。Prolog が実用的なプログラミング言語として使われるきっかけとなったのは 1977年にエジンバラで David Warren がコンパイラ処理系を開発したことであった。Edinburgh Prolog は他の記号処理言語(Lispなど)と処理速度を比較して遜色ない性能であることを世に示した。Edinburgh Prolog はデファクトスタンダードとなり、後の ISO での Prolog 標準化に影響を与えた。
最初に実装された [[Prolog]]処理系は1972年に開発された Marseille Prolog である。Prolog が実用的なプログラミング言語として使われるきっかけとなったのは 1977年にエジンバラで David Warren がコンパイラ処理系を開発したことであった。Edinburgh Prolog は他の記号処理言語(Lispなど)と処理速度を比較して遜色ない性能であることを世に示した。Edinburgh Prolog はデファクトスタンダードとなり、後の ISO での Prolog 標準化に影響を与えた。


==歴史==
==数理論理学のプログラミングへの利用の限界==
論理型プログラミングのルーツは、人工知能研究の権威であり[[LISP]]言語の開発者でもある[[ジョン・マッカーシー]]が1958年に発表していたプログラミング言語仮説「''advice taker」''にまでさかのぼることができる。論理型プログラミングは[[人工知能]]の研究から生まれた[[プログラミングパラダイム|パラダイム]]であり、マッカーシーは次のように言及している。
ジョン・マッカーシーは数理論理学をコンピュータシステムの認識論の基礎として利用することを提案した。[[マサチューセッツ工科大学|MIT]]では[[マービン・ミンスキー]]と[[シーモア・パパート]]が主導して、マッカーシーとは異なる手続き的手法が開発された。[[Planner]] が開発されたとき、これら2つの手法の関係に関する疑問が生まれた。Robert Kowalski は「計算は推論に包含される」という命題を生み出した。彼はこれを 1988年の Pat Hayes の論文にあった言葉「計算は制御された推論である」が元になっているとしている。Kowalski や Hayes とは逆に、[[カール・ヒューイット]]は「論理的推論はオープンシステムの並行計算を実行することが不可能だ」という命題を生み出した。<!-- [[計算の不確定性]]参照 -->


{{quote|適切な形式言語(おそらく述語計算の一部)を処理するプログラムは共通の手段となる。基本プログラムは前提から直ちに結論を導き出す。その結論は宣言的かもしれないし命令的かもしれない。命令的な結論が導かれるなら、そのプログラムはその結論に対応した動作をする}}
論理的手法と手続き的手法の関係という問題の答えは、手続き的手法の数学的意味([[表示的意味論]])と論理の数学的意味([[モデル理論]])は異なる、ということである。


{{quote|我々が ''advice taker'' に期待する主な利点は、その記号環境と探しているものについてセンテンスを入力するだけでシステムの動作が改良される点である。そのようなセンテンスを入力するにあたって、プログラムや advice taker に関する事前知識はほとんど必要としないだろう。advice taker は事前に教え込まれた知識から論理的に導き出される広範囲な能力を有していると仮定することができる。したがって、次のように言うことができるだろう。『事前知識を豊富に与えられ、自動演繹を行うプログラムは、常識を備えている』|}}
==並行論理プログラミング==
{{ main|並行論理プログラミング }}


これに対して、当時[[マサチューセッツ工科大学|MIT]]に在籍していた[[マービン・ミンスキー]]と[[シーモア・パパート]]は、彼とは異なる手続き的手法の開発を主導した。より一般的に受け入られている狭い意味での論理プログラミングは、述語論理式を非決定的なプログラミング言語とみなすもので、述語論理式は宣言的であると同時に手続き的にも解釈される。論理をベースにしたプログラミング言語として1971年に [[Planner]] のサブセットである Micro-Planner が開発された。表明とゴールからパターンによる手続き的計画を呼び出す機能を備えていたが、十分に形式化されていなかった<ref>Alain Colmerauer and Philippe Roussel, '''The birth of Prolog'''</ref>。[[Planner]] が開発されたとき、これら2つの手法の関係に関する疑問が生まれていた。Robert Kowalski は「計算は推論に包含される」という命題を生み出した。彼はこれを 1988年の Pat Hayes の論文にあった言葉「計算は制御された推論である」が元になっているとしている。Plannerと独立してより論理を重視した [[Prolog]] が開発され、コワルスキーにより述語論理式([[ホーン節]])のプログラム的解釈の考え方と結び付き、論理プログラミングの基本的な考え方が確立した<ref>Robert Kowalski. '''The Early Years of Logic Programming'''</ref>。
Keith Clark、Hervé Gallaire、Steve Gregory、Vijay Saraswat、Udi Shapiro、Kazunori Ueda(上田和紀)らは、共有変数の[[ユニフィケーション]]機能とメッセージのためのデータ構造ストリーム機能を備えた[[並行論理プログラミング]]言語を開発した。数理論理学に基づく[[並行プログラミング]]の基礎を築くための研究であるが、これが[[第五世代コンピュータ]]の基盤ともなった。


他方でコワルスキやヘイズとは逆に、[[カール・ヒューイット]]は「論理的推論はオープンシステムの並行計算を実行することが不可能だ」という命題を生み出した。<!-- [[計算の不確定性]]参照 -->論理的手法と手続き的手法の関係という問題の答えは、手続き的手法の数学的意味([[表示的意味論]])と論理の数学的意味([[モデル理論]])は異なる、ということである。また、Planner からの派生でプログラミング言語 Poplerが開発された。Prolog からの派生言語としては、Mercury、Visual Prolog、[[Oz (プログラミング言語)|Oz]]、Fril などがある。バックトラッキングを使用しない[[並行論理プログラミング]]言語としてProlog からの派生した[[Concurrent Prolog]]、[[PARLOG]]、[[Guarded Horn Clauses|GHC]]、[[KL1]]などの各種言語(Shapiro [1989] に調査結果がある)がある。
並行論理プログラミングは[[制約論理プログラミング]]と結び付き、制約で並行実行を制御する[[並行制約プログラミング]]として統合され、 Saraswatらにより理論化が行われた。KahnとSaraswatは並行制約プログラミングの枠内での制約の設定で[[アクターモデル]]が実現できることから、アクターモデルは並行制約プログラミングの特別なケースだと主張した<ref>Kenneth Kahn, and Viyaj Saraswat, '''Actors as a Special Case of Concurrent Constraint Programming'''</ref>。


==高階論理プログラミング==
==論理プログラミングの派生==
=== 並行論理プログラミング ===
{{main|並行論理プログラミング }}Keith Clark、Hervé Gallaire、Steve Gregory、Vijay Saraswat、Udi Shapiro、Kazunori Ueda(上田和紀)らは、共有変数の[[ユニフィケーション]]機能とメッセージのためのデータ構造ストリーム機能を備えた[[並行論理プログラミング]]言語を開発した。数理論理学に基づく[[並行プログラミング]]の基礎を築くための研究であるが、これが[[第五世代コンピュータ]]の基盤ともなった。

=== 制約論理プログラミング ===
{{main|制約論理プログラミング }}

=== 並行制約論理プログラミング ===
{{main|並行制約プログラミング }}並行論理プログラミングは[[制約論理プログラミング]]と結び付き、制約で並行実行を制御する[[並行制約プログラミング]]として統合され、 Saraswatらにより理論化が行われた。KahnとSaraswatは並行制約プログラミングの枠内での制約の設定で[[アクターモデル]]が実現できることから、アクターモデルは並行制約プログラミングの特別なケースだと主張した<ref>Kenneth Kahn, and Viyaj Saraswat, '''Actors as a Special Case of Concurrent Constraint Programming'''</ref>。

=== 仮説論理プログラミング ===
=== 高階論理プログラミング ===
一部の研究者は[[高階述語論理]]に基づいた高階論理プログラミングへと拡張を行った(述語の変項化など)。そのような言語としては Prolog の拡張である HiLog や {{仮リンク|λProlog|en|ΛProlog}}がある。
一部の研究者は[[高階述語論理]]に基づいた高階論理プログラミングへと拡張を行った(述語の変項化など)。そのような言語としては Prolog の拡張である HiLog や {{仮リンク|λProlog|en|ΛProlog}}がある。

=== 帰納論理プログラミング ===


==適用分野==
==適用分野==
60行目: 69行目:
: 既存の理論から新たな定理を生成するプログラム
: 既存の理論から新たな定理を生成するプログラム


==歴史==
==関連項目==
論理プログラミングは人工知能の研究から生まれた考えであり、[[ジョン・マッカーシー]] [1958] の次の引用が確認されている最初の言明である。

{{quote|適切な形式言語(おそらく述語計算の一部)を処理するプログラムは共通の手段となる。基本プログラムは前提から直ちに結論を導き出す。その結論は宣言的かもしれないし命令的かもしれない。命令的な結論が導かれるなら、そのプログラムはその結論に対応した動作をする}}

[[ジョン・マッカーシー]]は彼の提案を以下のように補足した。

{{quote|我々が ''advice taker'' に期待する主な利点は、その記号環境と探しているものについてセンテンスを入力するだけでシステムの動作が改良される点である。そのようなセンテンスを入力するにあたって、プログラムや advice taker に関する事前知識はほとんど必要としないだろう。advice taker は事前に教え込まれた知識から論理的に導き出される広範囲な能力を有していると仮定することができる。したがって、次のように言うことができるだろう。『事前知識を豊富に与えられ、自動演繹を行うプログラムは、常識を備えている』|}}

==関連項目==
*[[形式手法]]
*[[形式手法]]
*[[宣言型言語|宣言型プログラミング]]
*[[コンピュータ言語]]
**[[プログラミング言語]]
*[[関数型言語|関数型プログラミング]]
***[[宣言型言語]]
****[[関数型言語]]
****[[論理型言語]]
*****[[制約論理プログラミング言語]]
*****[[解集合プログラミング]]
*****[[並行論理プログラミング言語]]
*****[[並行制約プログラミング言語]]


== 脚注 ==
== 脚注 ==

2020年8月1日 (土) 12:26時点における版

論理型プログラミングLogic Programming)は、古典論理学述語論理をベースにした宣言型プログラミングの一形態である。あらゆるアルゴリズムを述語論理にある否定論理積論理和論理含意同値といった論理演算の組み合わせで宣言的に表現し、形式化された操作で手続き的に解釈しようとする考え方が根底にある。このパラダイムを扱う論理型言語の代表は、1972年に初公開された「Prolog」である。Prologでは論理式をプログラム用の形態に特化したホーン節を基本構文にしてプログラムは組み立てられる。論理型プログラミングは更に幾つかのサブパラダイムに分類されるが、このホーン節を土台にしたものが大半を占めている。なお、Prolog以外の論理型言語は限りなくマイナー扱いされているのが現状である。Prologを中心にした論理型プログラミングの基礎は、論理学者ロバート・コワルスキ英語版が1979年に上梓した「Logic for Problem Solving」などでほぼ完成され現在に到るまで引き継がれている。

Prolog

基本形式

Prolog は 1972年にマルセイユのカルメラウアーが考案し、1974年にコワルスキーがさらに形式的に定義し、数理論理学に基づいた言語として発表した。Prolog のプログラムは一階述語論理のサブセットの論理式の集まりとして読むことができ、一階述語論理のモデル理論と証明理論を継承している。プログラムの節は次のように書かれる:

   H :-  B1, ..., Bn.

これを宣言として読めば、以下の論理的含意に等しい:

   B1 and ... and Bn implies H

ここで、節内の全変数(変項)は全称量化されている。手続き的な後方連鎖規則として見れば、H を証明するには、B1 から Bn までを証明できれば十分であることがわかる。手続き的意味は線形導出法(LUSH または SLD導出法)による反駁証明によっても定式化できる。宣言的意味と手続き的意味の密接な関係は論理プログラミング言語の際立った特徴であるが、否定や論理和といった他の量化子をプログラム内に許すようになると関係は複雑になる。

失敗による否定

論理プログラムが節 H :- B1, ..., Bn から構成され、H, B1, ..., Bn が全てアトミックな述語論理式であれば、このプログラムは確定(definite)していると呼ばれ、ホーン節プログラムであるともいう。確定した論理プログラムの手続き的意味と宣言的意味は、そのまま述語論理的に解釈できる。否定を含めると、古典的論理との関係はそれほど直接的ではなくなる。「失敗による否定; negation-as-failure」推論規則によれば、ゴール Q がプログラムによって証明できない場合、その否定 not(Q) は証明されたと見なされる。これは古典的論理学では全く正しくない。公理から Q も not(Q) も導けない可能性がある。結果として、この規則は論理的例外と実用的困難さをもたらした。後方連鎖証明規則に「失敗による否定」を加えても完全ではない。その場合、プログラムを宣言的に読んで得られる論理的結果の全てを証明することができない。しかし、ほとんどの Prolog 系言語は「失敗による否定」を \+ という文字列を使って実装している。

完全ではないものの、プログラムとしての完全性(completion)という意味では「失敗による否定」規則は(ある制限下で)健全な推論規則であると言える。論理プログラムの完全性は Keith Clark が最初に定義した。おおまかに言えば、それはプログラム内の左辺に同じ述語のある全節の集合である。例えば、以下のようなものである:

     H :-  Body1.
     ....
     H :-  Bodyk.

これらは次の1つの論理式と等価である。

     H iff (Body1 or ... or Bodyk)

ここで、iff同値(if and only if)を意味する。完全性を主張するには、等号と等号に関する公理を明確にする必要もある。完全性は非単調推論のためのマッカーシーのサーカムスクリプション閉世界仮説に密接に関連する。

処理系実装の数々

最初に実装された Prolog処理系は1972年に開発された Marseille Prolog である。Prolog が実用的なプログラミング言語として使われるきっかけとなったのは 1977年にエジンバラで David Warren がコンパイラ処理系を開発したことであった。Edinburgh Prolog は他の記号処理言語(Lispなど)と処理速度を比較して遜色ない性能であることを世に示した。Edinburgh Prolog はデファクトスタンダードとなり、後の ISO での Prolog 標準化に影響を与えた。

歴史

論理型プログラミングのルーツは、人工知能研究の権威でありLISP言語の開発者でもあるジョン・マッカーシーが1958年に発表していたプログラミング言語仮説「advice taker」にまでさかのぼることができる。論理型プログラミングは人工知能の研究から生まれたパラダイムであり、マッカーシーは次のように言及している。

適切な形式言語(おそらく述語計算の一部)を処理するプログラムは共通の手段となる。基本プログラムは前提から直ちに結論を導き出す。その結論は宣言的かもしれないし命令的かもしれない。命令的な結論が導かれるなら、そのプログラムはその結論に対応した動作をする
我々が advice taker に期待する主な利点は、その記号環境と探しているものについてセンテンスを入力するだけでシステムの動作が改良される点である。そのようなセンテンスを入力するにあたって、プログラムや advice taker に関する事前知識はほとんど必要としないだろう。advice taker は事前に教え込まれた知識から論理的に導き出される広範囲な能力を有していると仮定することができる。したがって、次のように言うことができるだろう。『事前知識を豊富に与えられ、自動演繹を行うプログラムは、常識を備えている』

これに対して、当時MITに在籍していたマービン・ミンスキーシーモア・パパートは、彼とは異なる手続き的手法の開発を主導した。より一般的に受け入られている狭い意味での論理プログラミングは、述語論理式を非決定的なプログラミング言語とみなすもので、述語論理式は宣言的であると同時に手続き的にも解釈される。論理をベースにしたプログラミング言語として1971年に Planner のサブセットである Micro-Planner が開発された。表明とゴールからパターンによる手続き的計画を呼び出す機能を備えていたが、十分に形式化されていなかった[1]Planner が開発されたとき、これら2つの手法の関係に関する疑問が生まれていた。Robert Kowalski は「計算は推論に包含される」という命題を生み出した。彼はこれを 1988年の Pat Hayes の論文にあった言葉「計算は制御された推論である」が元になっているとしている。Plannerと独立してより論理を重視した Prolog が開発され、コワルスキーにより述語論理式(ホーン節)のプログラム的解釈の考え方と結び付き、論理プログラミングの基本的な考え方が確立した[2]

他方でコワルスキやヘイズとは逆に、カール・ヒューイットは「論理的推論はオープンシステムの並行計算を実行することが不可能だ」という命題を生み出した。論理的手法と手続き的手法の関係という問題の答えは、手続き的手法の数学的意味(表示的意味論)と論理の数学的意味(モデル理論)は異なる、ということである。また、Planner からの派生でプログラミング言語 Poplerが開発された。Prolog からの派生言語としては、Mercury、Visual Prolog、Oz、Fril などがある。バックトラッキングを使用しない並行論理プログラミング言語としてProlog からの派生したConcurrent PrologPARLOGGHCKL1などの各種言語(Shapiro [1989] に調査結果がある)がある。

論理型プログラミングの派生

並行論理プログラミング

Keith Clark、Hervé Gallaire、Steve Gregory、Vijay Saraswat、Udi Shapiro、Kazunori Ueda(上田和紀)らは、共有変数のユニフィケーション機能とメッセージのためのデータ構造ストリーム機能を備えた並行論理プログラミング言語を開発した。数理論理学に基づく並行プログラミングの基礎を築くための研究であるが、これが第五世代コンピュータの基盤ともなった。

制約論理プログラミング

並行制約論理プログラミング

並行論理プログラミングは制約論理プログラミングと結び付き、制約で並行実行を制御する並行制約プログラミングとして統合され、 Saraswatらにより理論化が行われた。KahnとSaraswatは並行制約プログラミングの枠内での制約の設定でアクターモデルが実現できることから、アクターモデルは並行制約プログラミングの特別なケースだと主張した[3]

仮説論理プログラミング

高階論理プログラミング

一部の研究者は高階述語論理に基づいた高階論理プログラミングへと拡張を行った(述語の変項化など)。そのような言語としては Prolog の拡張である HiLog や λProlog英語版がある。

帰納論理プログラミング

適用分野

エキスパートシステム
特定応用分野の巨大なモデルから、推奨や回答を生成するプログラム
自動定理証明
既存の理論から新たな定理を生成するプログラム

関連項目

脚注

  1. ^ Alain Colmerauer and Philippe Roussel, The birth of Prolog
  2. ^ Robert Kowalski. The Early Years of Logic Programming
  3. ^ Kenneth Kahn, and Viyaj Saraswat, Actors as a Special Case of Concurrent Constraint Programming

参考文献

  • Alain Colmerauer and Philippe Roussel, ’The birth of Prolog', in The second ACM SIGPLAN conference on History of programming languages, p. 37-52, 1992.
  • John McCarthy. Programs with common sense Symposium on Mechanization of Thought Processes. National Physical Laboratory. Teddington, England. 1958.
  • Fisher Black. A deductive question answering system Harvard University. Thesis. 1964.
  • James Slagle. Experiments with a Deductive Question-Answering Program CACM. December, 1965.
  • Cordell Green. Application of Theorem Proving to Problem Solving IJCAI 1969.
  • Carl Hewitt. Planner: A Language for Proving Theorems in Robots IJCAI 1969.
  • Gerry Sussman and Terry Winograd. Micro-planner Reference Manual AI Memo No, 203, MIT Project MAC, July 1970.
  • Carl Hewitt. Procedural Embedding of Knowledge In Planner IJCAI 1971.
  • Terry Winograd. Procedures as a Representation for Data in a Computer Program for Understanding Natural Language MIT AI TR-235. January 1971.
  • Bruce Anderson. Documentation for LIB PICO-PLANNER School of Artificial Intelligence, Edinburgh University. 1972
  • Bruce Baumgart. Micro-Planner Alternate Reference Manual Stanford AI Lab Operating Note No. 67, April 1972.
  • Julian Davies. Popler 1.6 Reference Manual University of Edinburgh, TPU Report No. 1, May 1973.
  • Jeff Rulifson, Jan Derksen, and Richard Waldinger. QA4, A Procedural Calculus for Intuitive Reasoning SRI AI Center Technical Note 73, November 1973.
  • Robert Kowalski Predicate Logic as a Programming Language Memo 70, Department of Artificial Intelligence, Edinburgh University. 1973.
  • Drew McDermott and Gerry Sussman. The Conniver Reference Manual MIT AI Memo 259A. January 1974.
  • Earl Sacerdoti, et al. QLISP: A Language for the Interactive Development of Complex Systems AFIPS National Computer Conference. 1976.
  • Bill Kornfeld and Carl Hewitt. The Scientific Community Metaphor IEEE Transactions on Systems, Man, and Cybernetics. January 1981.
  • Bill Kornfeld. The Use of Parallelism to Implement a Heuristic Search IJCAI 1981.
  • Bill Kornfeld. Parallelism in Problem Solving MIT EECS Doctoral Dissertation. August 1981.
  • Bill Kornfeld. Combinatorially Implosive Algorithms CACM. 1982
  • Carl Hewitt. The Challenge of Open Systems Byte Magazine. April 1985.
  • Robert Kowalski. The limitation of logic Proceedings of the 1986 ACM fourteenth annual conference on Computer science.
  • Ehud Shapiro (Editor). Concurrent Prolog MIT Press. 1987.
  • Robert Kowalski. The Early Years of Logic Programming CACM. January 1988.
  • Ehud Shapiro. The family of concurrent logic programming languages ACM Computing Surveys. September 1989.
  • Carl Hewitt and Gul Agha. Guarded Horn clause languages: are they deductive and Logical? International Conference on Fifth Generation Computer Systems, Ohmsha 1988. Tokyo. Also in Artificial Intelligence at MIT, Vol. 2. MIT Press 1991.
  • Shunichi Uchida and Kazuhiro Fuchi Proceedings of the FGCS Project Evaluation Workshop Institute for New Generation Computer Technology (ICOT). 1992.
  • Carl Hewitt. The repeated demise of logic programming and why it will be reincarnated What Went Wrong and Why: Lessons from AI Research and Applications. Technical Report SS-06-08. AAAI Press. March 2006.
  • J. W. Lloyd. Foundations of Logic Programming (2nd edition). Springer-Verlag 1987.
  • Kenneth Kahn, and Viyaj Saraswat, Actors as a Special Case of Concurrent Constraint Programming, Xerox Technical Report, 1990.

外部リンク