論理プログラミングとは、
数理論理学(記号論理学)を基礎とした
プログラミングパラダイム、あるいは
数理論理学のコンピュータプログラミングへの応用です。プログラムは、事実と規則を論理式で表現し、それらから結論を導き出すことで問題を解決します。このアプローチは、数学的な厳密さと明確さを持ち、問題解決のプロセスを論理的に追跡できるという利点があります。
歴史
論理プログラミングの起源は、1950年代から盛んになった自動定理証明の研究にまで遡ります。1958年、
ジョン・マッカーシーは「Advice taker」という
常識推論に関する仮説を発表しました。これは、論理プログラミングの概念的な先駆けと言えるでしょう。その後、1960年代には、
スタンフォード大学やMITを中心に、宣言的知識表現と手続き的知識表現をめぐる議論が活発に行われました。
1969年には、MITでカール・ヒューイットが設計した論理型言語「Planner」が開発されました。Plannerは、手続き的な要素も取り入れており、後の論理
プログラミング言語に大きな影響を与えました。一方、1972年にはマルセイユ大学のアラン・カルメラウアーらが、ロバート・コワルスキーらの助言を得て、「
Prolog」を開発しました。
Prologは、ホーン節とSLD導出という効率的な推論機構を採用し、論理プログラミングの代表的な言語として広く普及しました。
1980年代には、日本において
第五世代コンピュータ計画が推進され、
Prologが中心的な役割を果たしました。この計画は、並列処理可能な論理
プログラミング言語の開発を目指したものでした。
特徴:論理と制御
論理プログラミングでは、プログラムは「論理(ロジック)+制御(コントロール)=
アルゴリズム」という構造を持っています。論理の部分は、事実と規則を記述する論理式で表現されます。制御の部分は、これらの論理式を用いて問題を解くための手順を指定します。
Prologでは、ホーン節と呼ばれる特殊な形式の論理式が用いられ、SLD導出と呼ばれる推論規則によって問題が解決されます。SLD導出は、ゴール(目標)から出発して、規則を適用することでゴールを証明する、あるいはゴールを満たす解を見つけるための手続きです。
問題解決:前向き連鎖と後向き連鎖
論理プログラミングにおける問題解決は、大きく分けて前向き連鎖と後向き連鎖の二つの方法があります。前向き連鎖は、既知の事実から新しい事実を導き出す方法です。後向き連鎖は、目標となる事実から、それを証明するために必要な事実を逆向きに追っていく方法です。
Prologは、主に後向き連鎖を用いて問題を解決します。
失敗による否定
論理プログラミングでは、「失敗による否定(negation-as-failure)」という推論規則が用いられることがあります。これは、ある事実を証明できない場合、その否定を真であると仮定する規則です。この規則は、古典論理とは異なる性質を持つため、論理的な問題を引き起こす可能性がありますが、
Prologなどの多くの言語で実装されています。
知識表現:宣言的知識と手続き的知識
論理プログラミングは、宣言的知識と手続き的知識の両方を扱うことができます。宣言的知識は、「事実」として記述され、手続き的知識は、「規則」として記述されます。
Prologは、この二種類の知識を統合することで、柔軟性と表現力を備えています。
Prologは、論理プログラミングの代表的な言語であり、一階述語論理に基づいて設計されています。
Prologプログラムは、ホーン節と呼ばれる論理式の集合として表現されます。
Prologは、宣言的な側面と手続き的な側面の両方を持ち合わせており、そのバランスが特徴です。
派生分野
論理プログラミングは、様々な分野へと派生・発展しています。
並行論理プログラミング: 並列処理を効率的に行うための言語。
制約論理プログラミング: 制約条件を満たす解を求める言語。
高階論理プログラミング: 高階述語(述語を項に持つ述語)を扱う言語。
関数論理プログラミング: 関数と述語の両方を扱う言語。
オブジェクト指向論理プログラミング: オブジェクト指向の概念を取り入れた言語。
線形論理プログラミング: 線形論理に基づいた言語。
帰納論理プログラミング: データから規則を学習する言語。
仮説論理プログラミング: 仮説に基づいて推論する言語。
適用分野
論理プログラミングは、様々な分野で応用されています。
エキスパートシステム: 専門家の知識をコンピュータに組み込み、問題解決を支援するシステム。
自動定理証明: 数学的な定理を自動的に証明するシステム。
論理プログラミングは、その数学的な厳密さと表現力から、今後も様々な分野で活用されていくでしょう。