論理プログラミングは、形式論理に基づいたプログラミング、データベース、および知識表現のパラダイムです。論理プログラムは、ある問題領域に関する知識を表す論理形式の文の集合です。計算は、その知識に論理的推論を適用して、その領域内の問題を解決することによって実行されます。主要な論理プログラミング言語ファミリーには、Prolog、Answer Set Programming (ASP)、およびDatalogがあります。これらの言語すべてにおいて、ルールは節の形式で記述されます。
A :- B1, ..., Bn.そして、論理形式の平叙文として読まれる。
A if B1 and ... and Bn.Aはルールのヘッドと呼ばれ、 、 ... はボディと呼ばれ、 はリテラルまたは条件と呼ばれます。 n = 0 の場合、ルールは事実と呼ばれ、次の簡略化された形式で記述されます。B1BnBi
A.クエリ(またはゴール)はルールの本体と同じ構文を持ち、一般的に次の形式で記述されます。
?- B1, ..., Bn.ホーン節(または「確定」節)の最も単純なケースでは、A、B 1、...、B nはすべて p(t 1、...、t m )の形式の原子式であり、p は「母性」などの関係を表す述語記号で、t i は対象(または個人)を表す項です。項には、「チャールズ」などの定数記号と、大文字で始まる X などの変数が含まれます。
例えば、以下のホーン節プログラムを考えてみましょう。
mother_child ( elizabeth , charles ). father_child ( charles , william ). father_child ( charles , harry ). parent_child ( X , Y ) :- mother_child ( X , Y ). parent_child ( X , Y ) :- father_child ( X , Y ). grandparent_child ( X , Y ) :- parent_child ( X , Z ), parent_child ( Z , Y ).クエリが与えられると、プログラムは回答を生成します。たとえば、クエリの場合 ?- parent_child(X, william)、単一の回答は
X =チャールズ様々なクエリを実行できます。例えば、祖父母と孫を生成するようにプログラムにクエリを実行できます。さらに、孫と祖父母のすべてのペアを生成したり、特定のペアがそのようなペアであるかどうかを確認したりすることもできます。
grandparent_child ( X , william ). X = elizabeth?- grandparent_child ( elizabeth , Y ). Y = william ; Y = harry .?- grandparent_child ( X , Y ). X = elizabeth Y = william ; X = elizabeth Y = harry .?- grandparent_child ( william , harry ). no ?- grandparent_child ( elizabeth , harry ). yesホーン節論理プログラムはチューリング完全であるが、[ 1 ] [ 2 ]ほとんどの実用的なアプリケーションでは、ホーン節プログラムを否定条件を持つ「通常の」論理プログラムに拡張する必要がある。たとえば、兄弟の定義では否定条件が使用され、述語= は節によって定義される X = X 。
兄弟( X , Y ) :-親子( Z , X ),親子( Z , Y ), not ( X = Y ) 。否定条件を含む論理プログラミング言語は、非単調論理の知識表現能力を持つ。
ASPとDatalogでは、論理プログラムは宣言的な解釈のみを持ち、その実行は証明手続きまたはモデル生成器によって行われ、その動作はプログラマによって制御されることを意図していません。しかし、Prologファミリーの言語では、論理プログラムは目標還元手続きとして手続き的な解釈も持ちます。この観点から、節A :- B 1 ,...,B nは次のように理解されます。
A、解決する、そして...解決する。B1Bn節の本体における否定条件にも手続き的な解釈があり、これは「失敗としての否定」として知られています。つまり、否定リテラルは、肯定リテラルが成り立たない not B場合に限り、成り立つとみなされます。 B
論理プログラミングの分野における研究の多くは、失敗としての否定の論理意味論を開発すること、および否定のための他の意味論や実装を開発することに関心を寄せてきた。これらの発展は、論理に基づくプログラム検証やプログラム変換のための形式手法の開発を支える上で重要な役割を果たしてきた。
数理論理を用いてコンピュータプログラムを表現および実行することは、 1930年代にアロンゾ・チャーチによって開発されたラムダ計算の特徴でもある。しかし、論理の節形式をコンピュータプログラムの表現に用いることを最初に提案したのはコーデル・グリーンである。[ 3 ]これは、 LISPの部分集合の公理化と入出力関係の表現を用いて、LISP でのプログラムの実行をシミュレートすることで関係を計算するものである。一方、フォスターとエルコックのAbsys は、演算の順序に制約を設けないアサーション型プログラミング言語において、方程式とラムダ計算の組み合わせを採用している。 [ 4 ]
事実と規則の現在の構文を持つ論理プログラミングは、1960年代後半から1970年代初頭にかけての人工知能における知識の宣言的表現と手続き的表現に関する議論に遡ることができます。宣言的表現の支持者は、特にスタンフォード大学でジョン・マッカーシー、バートラム・ラファエル、コーデル・グリーンらと、エディンバラ大学でジョン・アラン・ロビンソン(シラキュース大学からの客員研究員)、パット・ヘイズ、ロバート・コワルスキーらと活動していました。手続き的表現の支持者は主にMITに集まり、マービン・ミンスキーとシーモア・パパートが指導していました。[ 5 ]
MIT のCarl Hewittによって開発されたPlanner は、論理の証明方法に基づいていましたが、この手続き型パラダイムの中で最初に登場した言語でした。 [ 6 ] Planner は、目標 (つまり、目標削減または後方連鎖) およびアサーション (つまり、前方連鎖)からの手続き型プランのパターン指向呼び出しを特徴としていました。Planner の最も影響力のある実装は、 Gerry Sussman、Eugene Charniak、およびTerry Winogradによって実装された、Micro-Planner と呼ばれる Planner のサブセットでした。Winograd は Micro-Planner を使用して、画期的な自然言語理解プログラムSHRDLUを実装しました。[ 7 ]効率性のために、Planner はバックトラッキング制御構造を使用して、一度に 1 つの可能な計算パスのみを保存する必要があるようにしました。 Planner は、プログラミング言語QA4 [ 8 ] Popler [ 9 ] Conniver [ 10 ] QLISP [ 11 ]および並行言語 Ether [ 12 ]を生み出した。
エジンバラのヘイズとコワルスキーは、知識表現に対する論理ベースの宣言的アプローチとプランナーの手続き的アプローチを調和させようと試みた。ヘイズ(1973)は、定理証明器の動作を変更することで異なる手続きが得られる等式言語Goluxを開発した。[ 13 ]
一方、マルセイユのアラン・コルメラウアーは、論理を用いて意味論を表現し、解決を用いて質問応答を行うという自然言語理解の研究に取り組んでいた。1971年の夏、コルメラウアーはコワルスキーをマルセイユに招き、二人は論理の節形式を用いて形式文法を表現できること、そして解決定理証明器を用いて構文解析を行うことができることを発見した。彼らは、ハイパーレゾリューション[ 14 ]のような定理証明器はボトムアップ構文解析器として動作し、 SLレゾリューション(1971) [ 15 ]のような定理証明器はトップダウン構文解析器として動作することに注目した。
1972年の夏、コワルスキーは再びコルメラウアーと共同で、節形式の含意の手続き的解釈を開発した。また、そのような節は確定節またはホーン節に限定できること、SL解決はSLD解決に限定(および一般化)できることも明らかになった。コワルスキーの手続き的解釈とSLDは、1973年のメモで説明され、1974年に出版された。[ 16 ]
コルメラウアーはフィリップ・ルーセルと共に、手続き的解釈を基盤としてPrologを開発し、1972年の夏から秋にかけて実装した。最初のPrologプログラムも1972年に作成され、マルセイユで実装されたフランス語の質問応答システムだった。実用的なプログラミング言語としてのPrologの使用は、1977年にエジンバラのデイビッド・HD・ウォーレンがコンパイラを開発したことで大きく加速した。実験により、エジンバラPrologはLispなどの他の記号プログラミング言語の処理速度に匹敵することが実証された。[ 17 ]エジンバラPrologは事実上の標準となり、 ISO標準Prologの定義に大きな影響を与えた。
論理プログラミングは、1980年代に日本の 通商産業省が第5世代コンピュータシステム(FGCS)プロジェクトのソフトウェア開発に採用したことで、国際的な注目を集めるようになりました。FGCSプロジェクトは、論理プログラミングを用いて大規模並列コンピュータ上で高度な人工知能アプリケーションを開発することを目的としていました。プロジェクト当初はPrologの利用も検討されましたが、後にFGCSのコンピュータアーキテクチャにより近い並行論理プログラミングを採用することになりました。
しかし、並行論理プログラミングのコミット選択機能は、言語の論理意味論[ 18 ]や知識表現および問題解決アプリケーションへの適合性を阻害した。さらに、このプロジェクトで開発された並列コンピュータシステムは、より従来型の汎用コンピュータの開発における進歩に対抗できなかった。これら2つの問題が相まって、FGCSプロジェクトは目標を達成できなかった。論理プログラミングとAIの両方に対する関心は世界的に低下した。[ 19 ]
その一方で、Prolog の使用に基づくものを含む、より宣言的な論理プログラミング手法は、FGCS プロジェクトとは独立して進歩を続けました。特に、Prolog は知識の宣言的表現と手続き的表現を組み合わせるために開発されましたが、論理プログラムの純粋に宣言的な解釈が、演繹的データベースの分野でのアプリケーションの焦点となりました。この分野の研究は、1977 年頃、エルヴェ・ガレールとジャック・ミンカーがトゥールーズで論理とデータベースに関するワークショップを組織した際に注目を集めました。 [ 20 ]この分野は最終的にDatalogと改名されました。
論理プログラムの論理的かつ宣言的な読み取りに重点を置くことは、1980年代の制約論理プログラミングと1990年代の解答集合プログラミングの開発によってさらに推進されました。また、最近のPrologの応用においても再び重視されています[ 21 ]。
論理プログラミング協会(ALP)は、論理プログラミングの普及を目的として1986年に設立されました。2000年までは、公式ジャーナルは『The Journal of Logic Programming』でした。創刊編集長はJ. Alan Robinson氏でした。[ 22 ] 2001年に、このジャーナルは『The Journal of Logic and Algebraic Programming』 と改名され、ALPの公式ジャーナルはケンブリッジ大学出版局から出版される『Theory and Practice of Logic Programming 』となりました。
論理プログラムは、多様な意味論と問題解決手法を備えているだけでなく、プログラミング、データベース、知識表現、問題解決など、幅広い分野で応用されている。
論理プログラムの手続き的解釈は、目標を部分目標に還元するために逆推論を使用するものであり、アルゴリズムの動作を得るために知識の宣言的論理表現の使用を制御する問題解決戦略の使用の特殊なケースである。より一般的には、異なる問題解決戦略を同じ論理表現に適用して、異なるアルゴリズムを得ることができる。あるいは、与えられた問題解決戦略で異なる論理表現を使用することで、異なるアルゴリズムを得ることができる。[ 23 ]
問題解決における主な戦略は、逆算推論(目標の絞り込み)と順算推論の2つであり、それぞれトップダウン推論とボトムアップ推論とも呼ばれる。
命題ホーン節プログラムと最上位の原子目標という単純なケースでは、後方推論によってAND-ORツリーが決定され、これが目標解決のための探索空間を構成します。最上位目標はツリーのルートです。ツリー内の任意のノードと、そのノードと一致するヘッドを持つ任意の節が与えられた場合、節の本体内のサブ目標に対応する子ノードの集合が存在します。これらの子ノードは「AND」でグループ化されます。ノードを解決する別の方法に対応する子ノードの代替集合は「OR」でグループ化されます。
この空間を探索するには、どんな探索戦略でも使用できます。Prolog は、逐次的な後入れ先出しのバックトラッキング戦略を使用しており、一度に 1 つの選択肢と 1 つのサブゴールのみが考慮されます。たとえば、サブゴールは並列に解決でき、節も並列に試行できます。最初の戦略は、並列処理と2番目の戦略は、または並列。インテリジェントバックトラッキング[ 24 ]や最適解を見つけるためのベストファーストサーチ[ 25 ]などの他の探索戦略も可能です。
より一般的な、命題論理ではないケースでは、サブゴールが変数を共有できるため、最もインスタンス化されているサブゴールを選択するか、1つの手続きのみが適用されるほど十分にインスタンス化されているサブゴールを選択するなど、他の戦略を使用できます。[ 26 ]このような戦略は、たとえば並行論理プログラミングで使用されます。
ほとんどの場合、クエリや目標からの逆推論は順推論よりも効率的です。しかし、DatalogやAnswer Set Programmingでは、クエリが全体の節セットから分離されていない場合があり、その場合は節から導き出せるすべての事実を生成することが賢明な問題解決戦略となります。ここでは、より一般的な計算タスクにおいて、順推論が逆推論よりも優れている別の例を示します。このタスクの目標は、 n番目の?- fibonacci(n, Result)フィボナッチ数を見つけることです。
フィボナッチ( 0 , 0 )。フィボナッチ( 1 , 1 )。fibonacci ( N , Result ) :- N > 1 、N1はN - 1 、N2はN - 2 、fibonacci ( N1 、F1 )、fibonacci ( N2 、F2 )、ResultはF1 + F2です。ここで、関係はfibonacci(N, M)関数を表しfibonacci(N) = M、述語はN is Expression変数Nをの値にインスタンス化する述語の Prolog 記法ですExpression。
のフィボナッチ数を計算するという目標が与えられた場合n、後方推論は、目標を n-1 と n-2 のフィボナッチ数を計算するという 2 つのサブ目標に縮小します。n-1 のフィボナッチ数を計算するというサブ目標は、n-2 と n-3 のフィボナッチ数を計算するという 2 つのサブ目標に縮小され、n-2 のフィボナッチ数は冗長に計算されます。1 つのフィボナッチサブ目標を 2 つのフィボナッチサブ目標に縮小するこのプロセスは、0 と 1 に到達するまで続きます。その複雑さは 2 nのオーダーです。対照的に、前方推論は、再計算なしで 0 と 1 から始まるフィボナッチ数列を生成し、その複雑さは n に対して線形です。
Prolog は直接的に順方向推論を行うことはできません。しかし、テーブル化によって逆方向推論のコンテキスト内で順方向推論の効果を実現できます。サブゴールは、その解決策とともにテーブルに保持されます。サブゴールが再び出現した場合、サブゴールを冗長に再解決するのではなく、テーブルに既に存在する解決策を使用して直接解決されます。[ 27 ]
論理プログラミングは、関数が関係の特殊なケースである関数プログラミングの一般化と見なすことができます。[ 28 ]例えば、関数 mother(X) = Y (すべての X にはただ 1 つの母 Y がある) は、関係 mother(X, Y) で表すことができます。この点で、論理プログラムは、関数を関係として表現する関係データベース に似ています。
関係構文と比較すると、関数構文はネストされた関数に対してより簡潔です。例えば、関数構文では、母方の祖母の定義はネストされた形式で次のように記述できます。
maternal_grandmother ( X ) = mother ( mother ( X ))。関係表記における同じ定義を、入れ子構造のない平坦な形式で記述する必要がある。
maternal_grandmother ( X , Y ) :- mother ( X , Z ), mother ( Z , Y ).しかし、ネストされた構文は、ネストされていない構文の構文糖衣とみなすことができます。たとえば、 Ciao Prolog は、関数構文を関係形式に変換し、結果として得られる論理プログラムを標準の Prolog 実行戦略を使用して実行します。[ 29 ]さらに、同じ変換を使用して、関数ではないネストされた関係を実行することもできます。たとえば、次のようになります。
grandparent ( X ) := parent ( parent ( X )). parent ( X ) := mother ( X ). parent ( X ) := father ( X ).母(チャールズ) :=エリザベス。父(チャールズ) :=フィリップ。母(ハリー) :=ダイアナ。父(ハリー) :=チャールズ。?-祖父母( X 、Y )。X =ハリー、Y =エリザベス。X =ハリー、Y =フィリップ。関係プログラミングという用語は、関数を関係の特殊なケースとして扱うさまざまなプログラミング言語を包括するために使用されてきました。これらの言語の中には、miniKanren [ 28 ] や関係線形プログラミング[ 30 ]のように 、本稿の意味での論理プログラミング言語であるものもあります。
しかし、関係言語RMLは命令型プログラミング言語 [ 31 ]であり、その中核となる構成要素は関係式であり、これは一階述語論理の式に似ています。
他の関係プログラミング言語は、関係計算[ 32 ]または関係代数[ 33 ]に基づいています。
純粋に論理的な観点から見ると、ホーン節論理プログラムの宣言的意味論には 2 つのアプローチがあります。 1 つのアプローチは、本来の論理的帰結意味論であり、目標を解決することを、その目標がプログラムのすべてのモデルで真である定理であることを示すことだと理解します。
このアプローチでは、計算は一階述語論理における定理証明であり、 SLD解決における後方推論とハイパーレゾリューションにおける前方推論の両方が、正しく完全な定理証明手法である。こうした定理証明手法は、論理プログラムのための独立した証明論的(あるいは操作的)意味論を提供するものとみなされることもある。しかし、論理的な観点から言えば、それらは意味論ではなく証明手法である。
ホーン節プログラムの宣言的意味論に対するもう一つのアプローチは充足可能性意味論であり、これは目標の解決を、プログラムの意図された(または標準の)モデルにおいて目標が真である(または満たされている)ことを示すことと理解する。ホーン節プログラムの場合、そのような標準モデルは常に存在する。それはプログラムの唯一の最小モデルである。
非公式に言えば、最小モデルとは、モデル内で真であるすべての(変数を含まない)事実の集合として見た場合、プログラムのモデルとなるような、より小さな事実の集合を含まないモデルのことである。
例えば、以下の事実は、この記事の序論で述べた家族関係の例の最小モデルを表しています。このモデルでは、その他の変数を含まない事実はすべて偽です。
mother_child ( elizabeth , charles ). father_child ( charles , william ). father_child ( charles , harry ). parent_child ( elizabeth , charles ). parent_child ( charles , william ). parent_child ( charles , harry ). grandparent_child ( elizabeth , william ). grandparent_child ( elizabeth , harry ).充足可能性意味論には、プログラム内の規則を用いて既存の事実から新たな事実を推論の1段階で導き出す関数の最小不動点として特徴づけられる、より数学的な別の表現方法もある。
驚くべきことに、もともと論理的帰結意味論のために開発された順方向推論と逆方向推論という同じ問題解決手法は、充足可能性意味論にも同様に適用できます。順方向推論は、既存の事実から新しい事実を導き出し、新しい追加の事実が生成できなくなるまで、ホーン節プログラムの最小モデルを生成します。逆方向推論は、すべてのサブゴールが事実によって解決されるまで目標をサブゴールに縮小することで成功し、モデルを明示的に生成することなく、最小モデルで目標が真であることを保証します。[ 34 ]
2 つの宣言的意味論の違いは、自然数をの形式の項の列として表す後継演算における加算と乗算の定義で確認できます。一般に、項は の後継、すなわちを表します。以下に、関数表記における加算と乗算の標準的な定義を示します。0, 1, 2, ...0, s(0), s(s(0)), ...s(X)X,X + 1.
X + 0 = X。 X + s(Y) = s(X + Y)。 つまり、X + (Y + 1) = (X + Y) + 1 X × 0 = 0。 X × s(Y) = X + (X × Y)。 つまり、X × (Y + 1) = X + (X × Y) となります。
以下に、論理プログラムと同じ定義を示します。add(X, Y, Z)は を表しX + Y = Z,、multiply(X, Y, Z)は を表しますX × Y = Z。
add ( X , 0 , X ). add ( X , s ( Y ), s ( Z )) :- add ( X , Y , Z ).multiply ( X , 0 , 0 ). multiply ( X , s ( Y ), W ) :- multiply ( X , Y , Z ), add ( X , Z , W ).2 つの宣言的意味論は、同じ存在量化された加算と乗算の目標の連言に対して、どちらも同じ答えを与えます。たとえば、 は の2 × 2 = X解を持ちX = 4、 は とのX × X = X + X2 つの解を持ちます。X = 0X = 2
?-乗算( s ( s ( 0 )), s ( s ( 0 )), X )。X = s ( s ( s ( s ( 0 ) )))。?-乗算( X , X , Y ) 、加算( X , X , Y ) 。X = 0 、Y = 0。X = s ( s ( 0 ))、Y = s ( s ( s ( s ( 0 ))))。しかし、論理的帰結意味論では、例えばadd(s(s(0)), s(s(0)), s(s(s(s(s(0)))))),ie が2 + 2 = 5真となるような、プログラムの非標準モデルが存在する。一方、充足可能性意味論では、 は偽となる算術の標準モデルという、ただ一つのモデルしか存在しない2 + 2 = 5。
どちらの意味論においても、目標は満たされない。充足可能性意味論では、目標の失敗は目標の真偽値が偽であることを意味する。しかし、論理的帰結意味論では、失敗は目標の真偽値が不明であることを意味する。?-add(s(s(0)),s(s(0)),s(s(s(s(s(0))))))
否定条件が成り立つことを、肯定条件が成り立たないことをnot p示すことによって結論付ける方法としての「否定を失敗として示す(NAF)」は、初期のPrologシステムの特徴でした。その結果として生まれたSLD解決の拡張はSLDNFと呼ばれています。同様の構造は「thnot」と呼ばれ、 Micro-Plannerにも存在していました。p
NAFの論理意味論は、キース・クラーク[ 35 ]が、特定の自然な条件下では、NAFが一階述語論理の論理プログラムの完成を用いて論理的帰結意味論で推論する効率的で正しい(そして時には完全な)方法であることを示すまで未解決であった。
完了とは、おおよそ、ヘッドに同じ述語を持つすべてのプログラム節の集合を対象とすることに相当します。
A :- Body1. ...A :- Bodyk.述語の定義として:
A iff (Body1 or ... or Bodyk)ここで、は「かつその場合に限る」という意味です。この完全性には、単一化iffに対応する等号公理も含まれています。クラークは、SLDNFによって生成された証明は、プログラムの完全性を備えた自然演繹スタイルの推論によって生成された証明と構造的に類似していることを示しました。
例えば、次のプログラムを考えてみましょう。
should_receive_sanction ( X , punishment ) :- is_a_thief ( X ), not should_receive_sanction ( X , rehabilitation ).should_receive_sanction ( X 、rehabilitation ) :- is_a_thief ( X ) 、is_a_minor ( X ) 、not is_violent ( X ) 。is_a_thief (トム)。トムが制裁を受けるべきかどうかを判断するという目的においては、最初のルールはトムが罰せられるべきであることを示すことに成功している。
?- should_receive_sanction ( tom , Sanction ). Sanction = punishment .これは、トムが泥棒であり、トムが更生すべきであると証明できないためです。トムが未成年者であると証明できないため、トムが更生すべきであると証明できません。
しかし、トムが未成年者であるという新たな情報が得られた場合、トムを罰するべきだという以前の結論は、トムを更生させるべきだという新たな結論に置き換えられる。
is_a_minor (トム)。?- should_receive_sanction ( tom , Sanction ). Sanction = rehabilitation 。新しい情報が追加されたときに結論を撤回するというこの性質は非単調性と呼ばれ、論理プログラミングを非単調論理にしています。
しかし、もしトムが暴力的だと知らされたら、トムは罰せられるべきだという結論が再び支持されるだろう。
is_violent (トム)?- should_receive_sanction ( tom , Sanction ). Sanction = punishment .このプログラムの修了条件は以下のとおりです。
should_receive_sanction ( X , Sanction ) iff Sanction = punishment , is_a_thief ( X ), not should_receive_sanction ( X , rehabilitation ) or Sanction = rehabilitation , is_a_thief ( X ), is_a_minor ( X ), not is_violent ( X ).is_a_thief ( X ) iff X = tom . is_a_minor ( X ) iff X = tom . is_violent ( X ) iff X = tom .完了の概念は、ジョン・マッカーシーの デフォルト推論の限定意味論[ 36 ]やレイ・ライターの閉世界仮定[ 37 ]と密接に関連している。
否定の完了意味論は論理的帰結意味論であり、SLDNFは証明論的な実装を提供している。しかし、1980年代には、否定を含む論理プログラムにおいて充足可能性意味論がより普及した。充足可能性意味論では、否定は論理プログラムの意図されたモデルまたは標準モデルにおける真理の古典的な定義に従って解釈される。
否定条件を持つ論理プログラムの場合、充足可能性意味論には主に 2 つのバリアントがあります。整礎意味論では、論理プログラムの意図されたモデルは、常に存在する一意の 3 値最小モデルです。 整礎意味論は、数理論理学における帰納的定義の概念を一般化したものです。 [ 38 ] XSB Prolog [ 39 ]は、SLG 解決を使用して整礎意味論を実装しています。[ 40 ]
代替安定モデルセマンティクスでは、意図されたモデルが存在しない場合もあれば、複数の意図されたモデルが存在する場合もあり、それらはすべて最小限かつ2値である。安定モデルセマンティクスは、解答集合プログラミング(ASP)の基盤となっている。
健全なモデル意味論と安定モデル意味論は、いずれも否定を含む任意の論理プログラムに適用できます。ただし、階層化された論理プログラムの場合、両方の意味論は一致します。例えば、泥棒を制裁するプログラムは(局所的に)階層化されており、このプログラムに対する3つの意味論はすべて同じ意図されたモデルを決定します。
should_receive_sanction ( tom , punishment ). is_a_thief ( tom ). is_a_minor ( tom ). is_violent ( tom ).論理プログラミングにおける否定の理解の試みは、抽象的な議論フレームワークの開発にも貢献している。[ 41 ]否定の議論解釈では、トムは泥棒だから罰せられるべきだという最初の議論は、トムは未成年だから更生させるべきだという議論によって攻撃される。しかし、トムが暴力的であるという事実は、トムは更生させるべきだという議論を弱め、トムは罰せられるべきだという議論を復活させる。
プログラムをデータとして扱うメタプログラミングは、初期の Prolog 実装の特徴でした。 [ 42 ] [ 43 ]例えば、Prolog の Edinburgh DEC10 実装には、「Prolog 自体で書かれたインタプリタとコンパイラ」が含まれていました。[ 43 ]最も単純なメタプログラムは、いわゆる「バニラ」メタインタプリタです。
solve ( true ) .solve (( B , C )):- solve ( B ), solve ( C ) .solve ( A ):- clause ( A , B ), solve ( B ).ここで、true は空の論理積を表し、(B,C) は B と C の論理積を表す複合項です。述語節 (A,B) は、A :- Bの形式の節が存在することを意味します。
メタプログラミングとは、メタロジックまたはメタ言語をより一般的に使用して、オブジェクト言語 と呼ばれる別の言語を記述および推論する応用である。
メタ論理プログラミングでは、自然言語と同様に、オブジェクトレベル表現とメタレベル表現を組み合わせることができます。たとえば、次のプログラムでは、原子式はattends(Person, Meeting)オブジェクトレベル式として、またメタ述語の引数として現れますprohibited。approved.
禁止(出席(人物、会議)):-承認されていない(出席(人物、会議))。should_receive_sanction ( Person , scolding ) :- attends ( Person , Meeting ), lofty ( Person ), prohibited ( attends ( Person , Meeting )). should_receive_sanction ( Person , banishment ) :- attends ( Person , Meeting ), lowly ( Person ), prohibited ( attends ( Person , Meeting )).承認済み(アリス、ティーパーティーに出席)。マッドハッター、ティーパーティーに出席)。ヤマネ、ティーパーティーに出席)。高尚な(マッドハッター)。卑しい(ヤマネ)。?- should_receive_sanction ( X , Y ). Person = mad_hatter , Sanction = scolding . Person = dormouse , Sanction = banishment .ポール・サガードは、人気の高い著書『認知科学入門』[ 44 ] の中で、人間の思考をモデル化する代替アプローチとして論理とルールを取り上げています。彼は、条件が「ならば、行動」という形式のルールは論理条件文と「非常によく似ている」が、ルールの方が単純で、心理的に妥当性が高いと主張しています(51ページ)。論理とルールのその他の違いとして、論理は演繹を用いるが、ルールは探索を用いる(45ページ)こと、そしてルールは順方向または逆方向の推論に使用できる(47ページ)ことを挙げています。論理の文は「普遍的に真であると解釈されなければならない」が、ルールは例外を許容するデフォルトになり得る(44ページ)。
彼は、「論理とは異なり、ルールベースのシステムは、何をすべきかという戦略的な情報も容易に表現できる」と述べている(45ページ)。例えば、「週末に家に帰りたい場合、バス代があれば、バスに乗ることができる」といった具合だ。しかし彼は、目標をサブ目標に分解するという同じ戦略が、論理プログラミングの手法で、論理条件文に逆向き推論を適用することとして解釈できることには気づいていない。
can_go ( you , home ) :- have ( you , bus_fare ), catch ( you , bus ).ルールベースシステムのこれらの特性(探索、順方向および逆方向推論、デフォルト推論、目標削減)はすべて、論理プログラミングの定義特性でもある。このことから、Thagardの結論(56ページ)は次のようになる。
人間の知識の多くは、自然と規則という観点から説明され、計画立案などの多くの種類の思考は、規則に基づくシステムによってモデル化することができる。
論理プログラミングにも適用される。
論理プログラミングが人間の思考の側面をモデル化するためにどのように使用できるかを示す他の議論は、キース・ステニングとミヒール・ファン・ランバルゲンが著書『人間の推論と認知科学』の中で提示している。[ 45 ]彼らは、論理プログラムの非単調性を利用して、さまざまな心理的課題における人間のパフォーマンスを説明できることを示している。また、彼らは(237ページで)「論理プログラミングという形での閉世界推論は、古典論理とは異なり、魅力的な神経実装を持っている」ことも示している。
『イベントの適切な扱い』[ 46 ]では 、ミヒール・ファン・ランバルゲンとフリッツ・ハムが、制約論理プログラミングを用いて「人間が時間を構築する方法に着目し、自然言語で時間の概念をコード化する」ことを研究している。
手続き的知識や戦略情報を論理を用いて表現することは、論理プログラミングの初期開発に貢献した主要な目標の一つでした。さらに、それは今日でもPrologファミリーの論理プログラミング言語の重要な特徴であり続けています。しかし、Prologアプリケーションを含む多くの論理プログラミングアプリケーションは、純粋に宣言的な知識を表現するために論理を用いることにますます重点を置いています。これらのアプリケーションには、一般的な常識知識の表現と、ドメイン固有の専門知識の表現の両方が含まれます。
常識には、例えば状況計算、イベント計算、アクション言語などで形式化された、因果関係に関する知識が含まれます。以下に、こうした形式体系の主な特徴を示す簡略化された例を示します。最初の節は、ある事実がイベントによって開始(または引き起こされる)直後に成立することを示しています。2番目の節はフレーム公理であり、ある時点で成立する事実は、その時点で発生するイベントによって終了されない限り、次の時点でも成立し続けることを示しています。この定式化では、複数のイベントが同時に発生することが可能です。
holds ( Fact , Time2 ) :- happens ( Event , Time1 ), Time2 is Time1 + 1 , initiates ( Event , Fact ).holds ( Fact , Time2 ) :- happens ( Event , Time1 ), Time2 is Time1 + 1 , holds ( Fact , Time1 ), not ( terminated ( Fact , Time1 )).terminated ( Fact , Time ) :- happens ( Event , Time ), terminates ( Event , Fact ).ここに、上記holdsと同様のメタ述語がありますsolve。ただし、 はsolve一般節に適用される引数が 1 つだけであるのに対し、 の最初の引数はholds事実であり、2 番目の引数は時間 (または状態) です。 原子式は、が で成立するholds(Fact, Time)ことを表します。このような時間とともに変化する事実は、流暢とも呼ばれます。 原子式は、イベントが で発生することを表します。FactTimehappens(Event, Time)Time
次の例は、これらの節が積み木の世界における因果関係の推論にどのように使用できるかを示しています。ここでは、時刻 0 の初期状態では、緑色のブロックがテーブルの上にあり、その上に赤色のブロックが積み重ねられています (信号機のように)。時刻 0 で、赤色のブロックがテーブルに移動されます。時刻 1 で、緑色のブロックが赤色のブロックの上に移動されます。オブジェクトをある場所に移動すると、そのオブジェクトがどの場所にも存在していたという事実が終了し、移動先の場所にオブジェクトが存在するという事実が開始されます。
holds ( on ( green_block , table ), 0 ). holds ( on ( red_block , green_block ), 0 ).happens ( move ( red_block , table ), 0 ). happens ( move ( green_block , red_block ), 1 ).(オブジェクト、場所の移動) を開始し、(オブジェクト、場所)上で移動します。終了(オブジェクト、場所2の移動)を(オブジェクト、場所1 )上で行います。?- は(事実、時間)を保持します。Fact = on ( green_block , table ), Time = 0. Fact = on ( red_block , green_block ), Time = 0. Fact = on ( green_block , table ), Time = 1. Fact = on ( red_block , table ), Time = 1. Fact = on ( green_block , red_block ), Time = 2. Fact = on ( red_block , table ), Time = 2.順推論と逆推論は、目標に対して同じ答えを生成しますholds(Fact, Time)。しかし、順推論は時間的に順調に流暢さを生成し、逆推論は状況計算における回帰の領域固有の使用のように、逆方向に流暢さを生成します。[ 47 ]
論理プログラミングは、エキスパートシステムにおけるドメイン固有の専門知識を表現するのにも役立つことが証明されている。[ 48 ]しかし、一般的な常識と同様に、人間の専門知識はほとんどが暗黙的で暗示的であり、そのような暗黙の知識を明示的なルールで表現することはしばしば困難である。ただし、論理プログラムがビジネス組織や法執行機関の既存の明示的なルールを表現するために使用される場合は、この困難は生じない。
例えば、以下は英国国籍法の最初の文を簡略化した表現です。この文では、英国で生まれた人は、その親が出生時に英国市民である場合、出生時に英国市民となる、と規定されています。
開始(出生(Person )、市民(Person 、uk )):-出生(Person )、時間、場所(出生(Person )、uk )、親子(Another_Person 、Person )、保持(市民(Another_Person 、uk )、時間)。歴史的に、1980年代に英国国籍法の大部分を論理プログラムとして表現したこと[ 49 ]は、「法律の計算表現の開発に非常に大きな影響を与え、論理プログラミングがいかに直感的に魅力的な表現を可能にし、それが直接展開されて自動推論を生成することができるかを示した」[ 50 ] 。
さらに最近では、2009年に開始され、日本の民法および最高裁判所の判例規則の約2500の規則と例外から構成されるPROLEGシステム[ 51 ]が、おそらく世界最大の法規則ベースとなっている[ 52 ] 。
SLD推論解決規則は、節本体内のサブゴールを解決対象として選択する順序に関して中立です。効率性を考慮して、Prologはこの順序をサブゴールが記述された順序に制限します。SLDは、SLD証明空間を探索する戦略に関しても中立です。Prologはこの空間をトップダウン、深さ優先で探索し、同じ(サブ)ゴールを解決するために異なる節を、節が記述された順序で試行します。
この探索戦略の利点は、ツリーの現在のブランチをスタックで効率的に表現できることです。スタックの最上位にある目標節が新しい目標節に縮小されると、新しい目標節がスタックの最上位にプッシュされます。スタックの最上位にある目標節で選択されたサブゴールが解決できない場合、探索戦略はバックトラックし、スタックの最上位から目標節を削除し、選択されたサブゴールに一致する次の節を使用して、前の目標節で試みたサブゴールの解決を再試行します。
バックトラッキングは、常に成功するがバックトラッキングできないサブゴールであるcut (! と表記)を使用することで制限できます 。cut は効率を向上させるために使用できますが、節の論理的な意味を損なう可能性もあります。多くの場合、cut の使用は、失敗としての否定に置き換えることができます。実際、Prolog では、cut と、どの節のヘッドとも統一する任意のリテラル (例えばfail)を組み合わせることで、失敗としての否定を定義できます。
( P )ではない:- P 、!、失敗。( P )ではない。Prologには、cut以外にも論理的な解釈を持たない機能がいくつか用意されている。例えば、プログラム実行中にプログラムの状態を破壊的に更新するための組み込み述語、assertとretractなどが挙げられる。
例えば、上記の積み木の世界の例は、フレーム公理を用いずに、破壊的な状態変化によって実装することができる。
on ( green_block , table ). on ( red_block , green_block ).move ( Object , Place2 ) :- retract ( on ( Object , Place1 )), assert ( on ( Object , Place2 ).移動イベントのシーケンスと、それによって生じるブロックの位置は、以下のクエリを実行することで計算できます。
?- move ( red_block , table ), move ( green_block , red_block ), on ( Object , Place ).オブジェクト= red_block 、場所= table 。オブジェクト= green_block 、場所= red_block 。このような破壊的な状態変化のための論理的枠組みを提供するために、論理プログラミングのさまざまな拡張が開発されてきた。[ 53 ] [ 54 ] [ 55 ]
Prologの幅広い応用範囲は、単独でも他の言語との組み合わせでも、2022年のProlog誕生50周年を記念する書籍「Year of Prolog」 [ 21 ]で強調されています。
Prologは、 ALF、Fril、Gödel、Mercury、Oz、Ciao、Visual Prolog、XSB、λPrologなど、他のプログラミング言語の開発にも貢献している。
制約論理プログラミング(CLP)は、ホーン節論理プログラミングと制約解決を組み合わせたものです。制約述語として宣言された一部の述語を節の本体内でリテラルとして使用できることで、ホーン節を拡張します。制約述語は、プログラム内の事実や規則によって定義されるのではなく、ドメイン固有のモデル理論的な構造または理論によって事前に定義されます。
手続き的には、プログラムによって述語が定義されたサブゴールは、通常の論理プログラミングと同様にゴール縮約によって解決されますが、制約はドメイン固有の制約ソルバーによって簡略化され、充足可能性がチェックされます。この制約ソルバーは、制約述語の意味論を実装します。初期問題は、それを充足可能な制約の論理積に縮約することによって解決されます。
興味深いことに、Prolog の最初のバージョンには、フィリップ・ルーセルの 1972 年の博士論文から、制約述語 dif(term1, term2) がすでに含まれており、その引数の両方が異なる項であれば成功しますが、いずれかの項に変数が含まれている場合は遅延します。[ 52 ]
以下の制約論理プログラムは、john's教師としての歴史に関するおもちゃのような時系列データベースを表現しています。
teaches ( john , hardware , T ) :- 1990 ≤ T , T < 1999. teaches ( john , software , T ) :- 1999 ≤ T , T < 2005. teaches ( john , logic , T ) :- 2005 ≤ T , T ≤ 2012. rank ( john , instructor , T ) :- 1990 ≤ T , T < 2010. rank ( john , professor , T ) :- 2010 ≤ T , T < 2014.ここで≤、と は制約述語であり、通常の意図された意味を持ちます。次の目標節はデータベースにクエリを実行して、との両方がいつ を教えたか<を調べます。johnlogicprofessor
?-教える( john 、logic 、T ) 、ランク( john 、professor 、T ) 。 2010 ≤ T, T ≤ 2012 制約条件を単純化することで 解 が得られる。 2005 ≤ T, T ≤ 2012, 2010 ≤ T, T < 2014.
制約論理プログラミングは、土木工学、機械工学、デジタル回路検証、自動時刻表作成、航空交通管制、金融などの分野における問題解決に用いられてきた。これは、アブダクション論理プログラミングと密接に関連している。
Datalogはデータベース定義言語であり、リレーショナルデータベースにおけるデータの関係的視点と、論理プログラミングにおける論理的視点を組み合わせたものです。
関係データベースは、関係演算(和集合、積集合、差集合、直積など)を用いて、データベースにアクセスするクエリを指定する関係計算または関係代数を使用します。Datalogでは、ルール本体内で論理結合子(例えば、または、および、および)を使用して、データベース自体の一部として関係を定義します。
関係データベースの開発初期段階で、再帰クエリは関係代数や関係計算では表現できないこと、そしてこの欠点は最小不動点演算子を導入することで解消できることが認識されていました。[ 56 ] [ 57 ]対照的に、再帰関係は、新しい論理結合子や演算子を必要とせずに、論理プログラムのルールによって自然に定義できます。
Datalogは、定数と変数のみを項として扱う点で、より一般的な論理プログラミングとは異なります。さらに、すべての事実は変数を含まず、ルールは制限されているため、ボトムアップで実行される場合、派生する事実も変数を含まなくなります。
例えば、家族データベースを考えてみましょう。
mother_child ( elizabeth , charles ) . father_child ( charles , william ) . father_child ( charles , harry ). parent_child ( X , Y ) :- mother_child ( X , Y ). parent_child ( X , Y ) :- father_child ( X , Y ) . ancestor_descendant ( X , Y ) : - parent_child ( X , X ) . ancestor_descendant ( X , Z ) , ancestor_descendant ( Z , Y ) .ボトムアップ実行では、以下の追加事実のセットが導き出され、終了します。
parent_child ( elizabeth , charles ). parent_child ( charles , william ). parent_child ( charles , harry ).ancestor_descendant ( elizabeth , charles ). ancestor_descendant ( charles , william ). ancestor_descendant ( charles , harry ).ancestor_descendant ( elizabeth , william ). ancestor_descendant ( elizabeth , harry ).トップダウン実行では、クエリに対して同じ回答が得られます。
?-祖先子孫( X , Y ) 。しかし、その後無限ループに陥ってしまう。一方、タブリングを用いたトップダウン実行では同じ結果が得られ、ループすることなく終了する。
Datalogと同様に、回答集合プログラミング(ASP)はチューリング完全ではありません。さらに、ASPは目標(またはクエリ)を目標解決に使用するプログラムから分離するのではなく、プログラム全体を目標として扱い、目標を真にする安定モデルを生成することで目標を達成します。この目的のために、ASPは安定モデル意味論を使用します。これによれば、論理プログラムは、意図されたモデルをゼロ個、1個、または複数持つことができます。たとえば、次のプログラムは、2つの国を赤または緑に塗り分ける地図彩色問題の退化した変種を表しています。
country ( oz ). country ( iz ). adjacent ( oz , iz ). colour ( C , red ) :- country ( C ), not ( colour ( C , green )). colour ( C , green ) :- country ( C ), not ( colour ( C , red )).この問題には、4つの安定モデルで表される4つの解が存在する。
国( oz ).国( iz ).隣接( oz , iz ).色( oz , red ).色( iz , red ).国( oz ).国( iz ).隣接( oz , iz ).色( oz ,緑).色( iz ,緑).国( oz ).国( iz ).隣接( oz , iz ).色( oz ,赤).色( iz ,緑).国( oz ).国( iz ).隣接( oz , iz ).色( oz ,緑).色( iz ,赤).標準的な地図彩色問題を表現するには、隣接する2つの国を同じ色で彩色してはならないという制約を追加する必要があります。ASPでは、この制約は次の形式の句として記述できます。
:-国( C1 ),国( C2 ),隣接( C1 , C2 ),色( C1 , X ),色( C2 , X ).この制約条件が加わったことで、この問題には解が2つしか存在しなくなった。
国( oz ).国( iz ).隣接( oz , iz ).色( oz ,赤).色( iz ,緑).国( oz ).国( iz ).隣接( oz , iz ).色( oz ,緑).色( iz ,赤).という形式の制約を追加すると、が真となる:- Body.モデルが排除されますBody。
紛らわしいことに、ASPにおける制約はCLPにおける制約とは異なります。CLPにおける制約は、クエリへの回答(および目標の解決)を規定する述語です。一方、ASPにおける制約は、本来であれば目標を満たすはずのモデルを排除する節です。ASPにおける制約は、データベースにおける整合性制約に似ています。
この通常の論理プログラミング句と制約句の組み合わせは、ASP における問題解決の生成とテストの方法論を示しています。通常の句は可能な解の探索空間を定義し、制約は不要な解を除外します。[ 58 ]
ASP の実装のほとんどは 2 つのステップで進みます。まず、プログラムを考えられるすべての方法でインスタンス化し、命題論理プログラムに還元します (グラウンディングとして知られています)。次に、 DPLL アルゴリズムやブール SAT ソルバーなどの命題論理問題ソルバーを適用します。ただし、s(CASP) [ 59 ]などの一部の実装では、グラウンディングなしで目標指向のトップダウンの SLD 解決のような手順を使用します。
アブダクティブ論理プログラミング[ 60 ](ALP)は、CLPと同様に、節の本体に述語が節によって定義されていないリテラルを含めることができるようにすることで、通常の論理プログラミングを拡張します。ALPでは、これらの述語はアブダクティブ(または仮定可能)として宣言され、アブダクティブ推論と同様に、観察を説明するため、またはより一般的には、プログラムに新しい事実(仮定として)を追加して目標を達成するために使用されます。
例えば、時刻0において、テーブル上の緑のブロックの上に赤いブロックが置かれているという初期状態が与えられたとします。
holds ( on ( green_block , table ), 0 ). holds ( on ( red_block , green_block ), 0 ).さらに、次のような目標も与えられたとしましょう。
?-は( ( green_block 、red_block ) 3を保持し、( ( red_block 、table ) 3を保持します。目標は観察結果を表す場合があり、その場合、解決策はその観察結果の説明となる。あるいは、目標は望ましい将来の状態を表す場合があり、その場合、解決策はその目標を達成するための計画となる。[ 61 ]
先に述べた因果関係のルールを用いて、happens述語を推論可能なものとして扱うことで、この目標を達成することができる。
holds ( Fact , Time2 ) :- happens ( Event , Time1 ), Time2 is Time1 + 1 , initiates ( Event , Fact ).holds ( Fact , Time2 ) :- happens ( Event , Time1 ), Time2 is Time1 + 1 , holds ( Fact , Time1 ), not ( terminated ( Fact , Time1 )).terminated ( Fact , Time ) :- happens ( Event , Time ), terminates ( Event , Fact ).(オブジェクト、場所の移動) を開始し、(オブジェクト、場所)上で移動します。終了(オブジェクト、場所2の移動)を(オブジェクト、場所1 )上で行います。ALPは、逆算的に推論し、プログラムに仮定を追加することで、推論可能なサブゴールを解決し、目標を達成します。この場合、以下のような多くの代替ソリューションが存在します。
happens ( move ( red_block , table ), 0 ). happens ( tick , 1 ). happens ( move ( green_block , red_block ), 2 ).happens ( tick , 0 ). happens ( move ( red_block , table ), 1 ). happens ( move ( green_block , red_block ), 2 ).happens ( move ( red_block , table ), 0 ). happens ( move ( green_block , red_block ), 1 ). happens ( tick , 2 ).これはtick、いかなる流暢性も開始または終了させることなく、時間の経過を示すイベントです。
moveまた、2つの事象が同時に発生する解決策もあります。例えば:
happens ( move ( red_block , table ), 0 ). happens ( move ( green_block , red_block ), 0 ). happens ( tick , 1 ). happens ( tick , 2 ).このような解決策が不要な場合は、ASPの制約句のような整合性制約を追加することで削除できます。
:- happens ( move ( Block1 , Place ), Time ), happens ( move ( Block2 , Block1 ), Time ).アブダクション論理プログラミングは、故障診断、計画、自然言語処理、機械学習に使用されてきました。また、アブダクション推論の一形態として、否定を失敗として解釈するためにも使用されています。[ 62 ]
帰納的論理プログラミング(ILP)は、機械学習の手法の一つであり、正例と負例の仮説的な一般化として論理プログラムを導出します。背景知識を表す論理プログラムと正例、そして負例を表す制約が与えられると、ILPシステムは負例を除外しつつ正例を一般化する論理プログラムを導出します。
ILPはALPと似ており、どちらも観測結果を説明する仮説を生成し、望ましくない仮説を排除するために制約を用いると見なすことができる。しかし、ALPでは仮説は変数を含まない事実であり、ILPでは仮説は一般的な規則である。[ 63 ] [ 64 ]
例えば、母子関係と父子関係の背景知識と、祖父母子関係の適切な例だけを与えられた場合、現在のILPシステムは、補助述語を発明して祖父母子関係の定義を生成し、それを親子関係として解釈することができます。[ 65 ]
grandparent_child ( X , Y ):- auxiliary ( X , Z ), auxiliary ( Z , Y ). auxiliary ( X , Y ):- mother_child ( X , Y ). auxiliary ( X , Y ):- father_child ( X , Y ).スチュアート・ラッセル[ 66 ]は、このような新しい概念の発明を、人間レベルのAIに到達するために必要な最も重要なステップと呼んでいます。
論理プログラミング、学習、確率を組み合わせたILPにおける最近の研究は、統計的関係学習と確率的帰納論理プログラミングという分野を生み出した。
並行論理プログラミングは、論理プログラミングの概念と並行プログラミングの概念を統合したものです。その開発は、1980年代に日本の第5世代プロジェクト(FGCS)のシステムプログラミング言語として採用されたことで大きな推進力を得ました。[ 67 ]
並行論理プログラムは、次の形式のガード付きホーン節の集合である。
H :- G1, ..., Gn | B1, ..., Bn.論理積は節のガードと呼ばれ、 |はコミットメント演算子です。宣言的には、ガード付きホーン節は通常の論理的含意として解釈されます。G1, ... , Gn
H if G1 and ... and Gn and B1 and ... and Bn.しかし、手続き的には、与えられた目標に一致するヘッドを持つ節が複数ある場合H、すべての節が並列に実行され、それぞれのガード条件が満たされているかどうかがチェックされます。複数の節のガード条件が満たされている場合、いずれかの節が選択され、選択された節のサブゴールが実行されていきます。これらのサブゴールも並列に実行できます。このように、並行論理プログラミングは、「知らない非決定性」ではなく、「気にしない非決定性」の一形態を実装しています。G1, ... , GnB1, ..., Bn
例えば、次の並行論理プログラムは述語を定義しておりshuffle(Left, Right, Merge)、これを用いて2つのリストとをシャッフルし、2つのリストLeftとそれぞれの順序を保持したままRight、それらを1つのリストに結合することができます。MergeLeftRight
shuffle ([], [], []). shuffle ( Left , Right , Merge ) :- Left = [ First | Rest ] | Merge = [ First | ShortMerge ], shuffle ( Rest , Right , ShortMerge ). shuffle ( Left , Right , Merge ) :- Right = [ First | Rest ] | Merge = [ First | ShortMerge ], shuffle ( Left , Rest , ShortMerge ).ここで、[]は空のリストを表し、 はProlog と同様に、最初の要素の後にリスト が続く[Head | Tail]リストを表します。(2 番目と 3 番目の節の最初の|はリストコンストラクタであり、2 回目の|はコミットメント演算子であることに注意してください。)このプログラムは、たとえば、目標節を呼び出すことでリストと をシャッフルするために使用できます。HeadTail[ace, queen, king][1, 4, 2]
shuffle ([ ace , queen , king ], [ 1 , 4 , 2 ], Merge )。このプログラムは、例えば、単一の解を非決定的に生成しますMerge = [ace, queen, 1, king, 4, 2]。
Carl Hewitt は[ 68 ] 、並行計算の不確定性のため、並行論理プログラミングでは一般的な並行性を実装できないと主張している。しかし、論理意味論によれば、すべての論理的帰結を導出できるわけではないとしても、並行論理プログラムの計算結果はすべてプログラムの論理的帰結である。
並行制約論理プログラミング[ 69 ]は、並行論理プログラミングと制約論理プログラミングを組み合わせ、制約を使用して並行性を制御します。節にはガードを含めることができ、ガードとは、節の適用をブロックする可能性のある制約のセットです。複数の節のガードが満たされると、並行制約論理プログラミングは、そのうちの1つだけを使用するという確固たる選択を行います。
いくつかの研究者は、述語変数などの高階論理から派生した高階プログラミング機能を用いて論理プログラミングを拡張しました。そのような言語には、Prolog の拡張であるHiLog [ 70 ]とλProlog [ 71 ]があります。
線形論理に基づいて論理プログラミングを行うことで、古典論理に基づくものよりもはるかに表現力豊かな論理プログラミング言語が設計されました。ホーン節プログラムでは、述語への引数の変更によってのみ状態変化を表現できます。線形論理プログラミングでは、周囲の線形論理を使用して状態変化をサポートできます。線形論理に基づく論理プログラミング言語の初期の設計には、LO [ 72 ]、Lolli [ 73 ]、ACL [ 74 ] 、および Forum [ 75 ]などがあります。Forum は、すべての線形論理の目標指向解釈を提供します。
F-logic [ 76 ]は、オブジェクトとフレーム構文を使用して論理プログラミングを拡張します。
Logtalk [ 77 ]は、オブジェクト、プロトコル、その他の OOP 概念のサポートを追加して Prolog プログラミング言語を拡張します。バックエンドコンパイラとして、ほとんどの標準準拠 Prolog システムをサポートしています。
トランザクションロジック[ 53 ]は、状態変更更新の論理理論を備えた論理プログラミングの拡張です。モデル理論的意味論と手続き的意味論の両方を備えています。トランザクションロジックのサブセットの実装は、Flora-2 [ 78 ]システムで利用可能です。他のプロトタイプも利用可能です。