論理プログラミングは、 DatalogやPrologなど、形式論理に基づいた言語を含むプログラミングパラダイムです。この記事では、これらの言語のうち、純粋に宣言的なサブセットの構文と意味論について説明します。紛らわしいことに、「論理プログラミング」という名称は、 Prologの宣言的なサブセットにほぼ相当する特定のプログラミング言語も指します。残念ながら、この記事ではこの用語を両方の意味で使用する必要があります。
宣言的論理プログラムは、すべて次の形式のルールで構成されています。
H :- B1 、...、BN 。それぞれの規則は、次のような含意として解釈できる。
「各そうだとすれば論理プログラムは、その規則によって導かれる事実の集合を計算します。
Datalog、Prolog、および関連言語の多くの実装では、Prologのカット演算子などの手続き型機能や、外部関数インターフェースなどの論理以外の機能が追加されています。これらの拡張機能の形式意味論は、この記事の範囲外です。
Datalogは、最も単純で広く研究されている論理プログラミング言語です。Datalogのセマンティクスには3つの主要な定義があり、それらはすべて同等です。他の論理プログラミング言語の構文とセマンティクスは、Datalogのそれらを拡張および一般化したものです。
Datalog プログラムは、規則のリスト(ホーン節) で構成されます。[ 1 ]定数と変数がそれぞれ定数と変数の2 つの可算集合であり、関係が述語記号の可算集合である場合、次のBNF 文法はDatalog プログラムの構造を表します。
<プログラム> ::= <ルール> <プログラム> | "" <ルール> ::= <アトム> ":-" <アトムリスト> "." <アトム> ::= <関係> "(" <用語リスト> ")" <アトムリスト> ::= <アトム> | <アトム> "," <アトムリスト> | "" <用語> ::= <定数> | <変数> <用語リスト> ::= <用語> | <用語> "," <用語リスト> | "" アトムはリテラルとも呼ばれます。シンボルの左側のアトムはルールのヘッド:-と呼ばれ、右側のアトムはボディと呼ばれます。すべての Datalog プログラムは、ルールのヘッドに現れるすべての変数がボディにも現れるという条件を満たす必要があります (この条件は、範囲制限と呼ばれることもあります)。[ 1 ] [ 2 ]
本体が空のルールは事実と呼ばれます。例えば、次のルールは事実です。
r ( x ) :- .論理プログラミングの多くの実装では、上記の文法を拡張して:-、次のようにカンマなしで事実を記述できるようにしています。
r ( x )また、多くのライブラリでは、次のように括弧なしで0項関係を記述することもできます。
p :- q 。これらは単なる省略形(構文糖衣)であり、プログラムの意味には何の影響もありません。
以下のプログラムは、関係 の推移閉包pathである関係 を計算します。edge
edge ( x , y ). edge ( y , z ). path ( A , B ) :- edge ( A , B ). path ( A , C ) :- path ( A , B ), edge ( B , C ).Datalog プログラムのセマンティクスには、モデル理論的、固定点、証明理論的という3 つの広く使われているアプローチがあります。これら 3 つのアプローチは同等であることが証明できます。[ 3 ]
原子は、その下位項のいずれも変数でない場合、基底と呼ばれます。直感的に言えば、各意味論は、プログラムの意味を、事実から出発してプログラムの規則から推論できるすべての基底原子の集合として定義します。

e ( x , y ). e ( y , z ). p ( A , B ) :- e ( A , B ). p ( A , C ) :- p ( A , B ), e ( B , C ).ルールは、そのすべての原子(ヘッドとボディ)がグラウンドである場合にグラウンドと呼ばれます。グラウンドルールR 2は、R 1のすべての変数を定数で置換した結果である場合に、別のルールR 1のグラウンドインスタンスとなります。
Datalog プログラムのHerbrand 基底とは、プログラムに現れる定数を用いて作成できるすべての基本アトムの集合です。解釈(データベース インスタンスとも呼ばれる) は、Herbrand 基底のサブセットです。基本アトムは、解釈Iの要素である場合に、解釈Iにおいて真となります。ルールは、そのルールの各基本インスタンスについて、本体内のすべてのアトムがIにおいて真であれば、ルールのヘッドも I において真である場合に、解釈 I において真となります。
Datalog プログラムPのHerbrand モデルとは、 Pのすべての基本事実を含み、 Pのすべての規則をIで真にするPの解釈I のことである。モデル理論的意味論では、Datalog プログラムの意味は、その最小 Herbrand モデル (同等に、すべての Herbrand モデルの共通部分) であると述べている。[ 4 ]
例えば、このプログラム:
edge ( x , y ). edge ( y , z ). path ( A , B ) :- edge ( A , B ). path ( A , C ) :- path ( A , B ), edge ( B , C ).ハーブランドの世界はこうだ: x、y、z
そしてこのハーブランドベース: edge(x, x)、edge(x, y)、 ...、edge(z, z)、path(x, x)、 ...、path(z, z)
そしてこの最小限のハーブランドモデル: edge(x, y), edge(y, z), path(x, y), path(y, z),path(x, z)
DatalogプログラムPの解釈の集合をIとする。すなわち、I = P ( H )であり、HはPのヘルブランド基底、Pは冪集合演算子である。Pの直接帰結演算子は、IからIへの次の写像Tである。Pの各ルールの各基底インスタンスについて、本体のすべての節が入力解釈に含まれている場合、基底インスタンスの先頭を出力解釈に追加する。この写像Tは、 T上の部分集合包含によって与えられる半順序に関して単調である。クナスター・タルスキーの定理により、この写像は最小不動点を持つ。クリーネの不動点定理により、不動点は連鎖の上限である。Mの最小不動点は、プログラムの最小ヘルブランドモデルと一致する。[ 5 ]
不動点意味論は、最小ヘルブランドモデルを計算するためのアルゴリズムを示唆している。プログラム内の基本事実の集合から始め、不動点に到達するまで規則の帰結を繰り返し追加していく。このアルゴリズムは、ナイーブ評価と呼ばれる。

path(x, z)プログラムから 基底原子を導出する過程を示す証明ツリーedge ( x , y ). edge ( y , z ). path ( A , B ) :- edge ( A , B ). path ( A , C ) :- path ( A , B ), edge ( B , C ).プログラムPが与えられたとき、基底原子Aの証明木は、根にAというラベルが付けられ、葉にはPの事実のヘッドからの基底原子というラベルが付けられ、枝には子を持つ木である。基底原子Gによってラベル付けされ、基底インスタンスが存在する
G :- A1, ..., An.Pのルールの。証明論的意味論では、Datalog プログラムの意味は、そのような木から導出できる基底原子の集合であると定義される。この集合は最小の Herbrand モデルと一致する。[ 6 ]
Datalog プログラムの最小 Herbrand モデルに特定の基底原子が現れるかどうかを知りたい場合、モデルの残りの部分についてはあまり気にしなくてもよいかもしれません。上記で説明した証明ツリーを上から下へ読み解くと、そのようなクエリの結果を計算するアルゴリズムが示唆され、この読み解がSLD 解決アルゴリズムに情報を提供し、それがPrologの評価の基礎となります。
Datalog のセマンティクスは、より一般的な半環上の不動点の文脈でも研究されている。[ 7 ]
「論理プログラミング」という名称は、DatalogやPrologを含むプログラミング言語のパラダイム全体を指すのに用いられるが、形式意味論を論じる際には、一般的に関数記号を用いたDatalogの拡張を指す。論理プログラムはホーン節プログラムとも呼ばれる。本稿で論じる論理プログラミングは、 Prologの「純粋な」または宣言的な部分集合と密接に関連している。
論理プログラミングの構文は、関数シンボルを使用して Datalog の構文を拡張したものです。論理プログラミングでは範囲の制限がなくなり、ルール本体には出現しない変数をルールの先頭に出現させることができます。[ 8 ]
関数記号が存在するため、論理プログラムの Herbrand モデルは無限になる可能性があります。ただし、論理プログラムのセマンティクスは、依然としてその最小 Herbrand モデルとして定義されます。関連して、即時結果演算子の不動点は、有限ステップ数(または有限集合)で収束しない可能性があります。ただし、最小 Herbrand モデルの任意の基底アトムは、有限の証明木を持ちます。これが Prolog がトップダウンで評価される理由です。[ 8 ] Datalog と同様に、3 つのセマンティクスは同等であることが証明できます。
論理プログラミングには、論理プログラムの意味論に関する3つの主要な定義すべてが一致するという望ましい特性がある。対照的に、否定を含む論理プログラムの意味論については、多くの矛盾する提案が存在する。この不一致の原因は、論理プログラムには一意の最小ヘルブランドモデルが存在するが、一般的に、否定を含む論理プログラミング(あるいはDatalog)プログラムにはそれが存在しないことにある。
否定は と表記されnot、ルール本体内の任意のアトムの前に出現することができます。
<atom-list> :: = <atom> | " not " <atom> | <atom> " , " <atom-list> | " "否定を含む論理プログラムは、各関係を何らかの階層に割り当てることが可能であり、関係Rが関係Sの本体で否定されている場合、RはSよりも低い階層にある、という場合に階層化されている。[ 9 ] Datalog のモデル理論的意味論と固定点意味論は、階層化された否定を扱うように拡張でき、そのような拡張は同等であることが証明できる。
Datalogの多くの実装では、固定小数点セマンティクスにヒントを得たボトムアップ評価モデルが採用されています。このセマンティクスは階層的否定を扱うことができるため、Datalogのいくつかの実装では階層的否定が実装されています。
階層化否定は Datalog の一般的な拡張ですが、階層化できない妥当なプログラムも存在します。次のプログラムは、相手に手番がない場合にプレイヤーが勝利する 2 対 2 のゲームを記述しています。[ 10 ]
move ( a , b ). win ( X ) :- move ( X , Y ), not win ( Y ).aこのプログラムは階層化されていないが、それが試合に勝つための妥当な選択肢であると考えるのは妥当だろう。
安定モデルの意味論は、プログラムの特定のヘルブランドモデルを安定と呼ぶための条件を定義します。直感的に言えば、安定モデルとは、「(プログラム)が与えられた場合に、合理的なエージェントが持ちうる信念の可能な集合」です。[ 11 ]
否定を含むプログラムには、安定モデルが多数存在する場合もあれば、安定モデルが全く存在しない場合もある。例えば、プログラム
p :- qではない。q :- pではない。2つの安定モデルがあります、1つのルールに基づくプログラム
p :- pではありません。安定したモデルがありません。
すべての安定モデルは最小ヘルブランドモデルです。否定を含まないデータログプログラムには、その最小ヘルブランドモデルと全く同じ安定モデルが1つだけ存在します。安定モデルの意味論では、否定を含む論理プログラムの意味は、安定モデルがちょうど1つ存在する場合に、その安定モデルであると定義されます。しかし、プログラムのすべての(または少なくともいくつかの)安定モデルを調査することは有用な場合があります。これが解答集合プログラミングの目的です。
Datalog の他のいくつかの拡張が提案され、研究されており、整数定数と関数をサポートするバリアント( DatalogZを含む)、[ 12 ] [ 13 ] ルール本体内の不等式制約、および集約関数などが含まれます。
制約論理プログラミングでは、実数や整数などの領域に対する制約をルール本体に記述することが可能です。