| パラダイム | 論理 |
|---|---|
| デザイン: | アラン・コルメロー |
| 初登場 | 1972年 |
| 安定リリース | パート 1: 一般的なコア - エディション 1 (1995 年 6 月)パート 2: モジュール - エディション 1 (2000 年 6 月)
|
| タイピングの規律 | 型なし(単一のデータ型は「用語」です) |
| ファイル名拡張子 | .pl、、.pro.P |
| Webサイト | パート 1: www.iso.org/standard/21413.html パート 2: www.iso.org/standard/20775.html |
| 主な実装 | |
| Amzi! Prolog、B-Prolog、Ciao、ECLiPSe、GNU Prolog、 LPA Prolog、Poplog、P#、Quintus Prolog、Scryer Prolog、SICStus、Strawberry、SWI-Prolog、Tau Prolog、tuProlog、WIN-PROLOG XSB、YAP。 | |
| 方言 | |
| ISO Prolog、エディンバラ Prolog | |
| 影響を受けた | |
| プランナー | |
| 影響を受けた | |
| CHR、Clojure、Datalog、Erlang、 Epilog 、KL0、KL1、Logtalk、Mercury、Oz、Strand、Visual Prolog | |
Prologは、人工知能、自動定理証明、計算言語学に起源を持つ論理プログラミング言語です。[1] [2] [3]
Prologは一階述語論理、つまり形式論理にルーツを持ち、他の多くのプログラミング言語とは異なり、主に宣言型プログラミング言語として意図されています。プログラムは、関係を定義する一連の事実と規則です。計算は、プログラムに対してクエリを実行することによって開始されます。 [4]
Prologは最初の論理型プログラミング言語の一つであり[5]、今日でも最も人気のある言語であり、無料および商用の実装がいくつか利用可能である。この言語は、定理証明[6] 、エキスパートシステム[7] 、項書き換え[8] 、型システム[9]、自動計画[10]、および本来の使用目的である自然言語処理[11]に使用されている。[12]
Prolog はチューリング完全な汎用プログラミング言語であり、インテリジェントな知識処理アプリケーションに適しています。
構文と意味
Prolog では、プログラム ロジックは関係で表現され、これらの関係に対してクエリを実行することによって計算が開始されます。関係とクエリは、Prolog の単一のデータ型である項を使用して構築されます。[4]関係は節で定義されます。クエリが与えられると、Prolog エンジンは否定されたクエリの解決 反証を見つけようとします。否定されたクエリが反証できる場合、つまり、節の和集合と否定されたクエリで構成されるシングルトン セットを偽にするすべての自由変数のインスタンス化が見つかった場合、見つかったインスタンス化を適用した元のクエリは、プログラムの論理的な帰結であることがわかります。これにより、Prolog (および他の論理型プログラミング言語) は、データベース、記号数学、言語解析アプリケーションに特に役立ちます。Prolog は不純な述語を許可しているため、特定の特別な述語の真理値を確認すると、値を画面に表示するなどの意図的な副作用が発生する可能性があります。このため、論理パラダイムが不便な場合、プログラマーは従来の命令型プログラミングをある程度使用できます。このプログラミング言語には、「純粋な Prolog」と呼ばれる純粋に論理的なサブセットと、いくつかの非論理的な機能があります。
データ型
Prologの唯一のデータ型は項です。項はアトム、数値、変数、複合項のいずれかです。[注 1]
- アトムは、小文字で始まるか引用符で囲まれたシンボル名です。アトムの例には、、、、、
xなどがあります。red'Taco''some atom''p(a)' - 数値は浮動小数点数または整数になります。主要な Prolog システムのほとんどは、任意の長さの整数をサポートしています。
- 変数は、文字、数字、アンダースコア文字で構成され、大文字またはアンダースコアで始まる文字列で表されます。変数は、任意の用語のプレースホルダーであるという点で、ロジックの変数によく似ています。
- 複合項は、「関数」と呼ばれるアトムと、これも項であるいくつかの「引数」で構成されます。複合項は通常、関数の後に括弧で囲まれたコンマで区切られた引数項のリストが続く形で記述されます。引数の数は項のアリティと呼ばれます。アトムは、アリティが 0 の複合項と見なすことができます。複合項の例は です
person_friends(zelda,[tom,jim])。
複合語の特殊なケース:
- リストは、順序付けられた用語の集合です。リストは、用語をカンマで区切った角括弧で示されます。空のリストの場合は、 で示されます
[]。たとえば、[1,2,3,4]または です[red,green,blue]。 - 文字列: 引用符で囲まれた文字列は、Prologフラグの値に応じて、(数値)文字コードのリスト、文字のリスト(長さ1のアトム)、またはアトムのいずれかに相当します
double_quotes。たとえば、"to be, or not to be"。[13]
ルールと事実
Prologプログラムは、節によって定義された関係を記述します。純粋なPrologはホーン節に制限されています。Prologプログラムを定義するには、ルールとファクトの2種類のホーン節が使用されます。ルールは次の形式です。
頭 :- 体。
は、「本体が true の場合、ヘッドは true です」と読みます。ルールの本体は述語の呼び出しで構成され、これはルールの目標と呼ばれます。組み込みの論理演算子 (名前を持つ,/2アリティ 2 の演算子) は目標の結合,を表し、 は選言を表します。結合と選言はルールの本体にのみ表示でき、ヘッドには表示できません。
;/2
空の本体を持つ節は、ファクトと呼ばれます。ファクトの例は次のとおりです。
人間(ソクラテス)。
これは次の規則と同等です:
人間(ソクラテス) :- 本当です。
組み込み述語はtrue/0常に true です。
上記の事実を踏まえると、次のような疑問が湧きます。
ソクラテスは人間ですか?
?- 人間(ソクラテス)。
はい
人間とは何か?
?- 人間( X )
。X = ソクラテス
本文のある節はルールと呼ばれます。ルールの例は次のとおりです。
死すべき者(X ) : 人間(X )。
そのルールを追加して、死すべきものとは何なのかを問うてみましょう。
?- 死すべき者( X )。X
=ソクラテス
述語とプログラム
述語(または手続き定義)は、同じ名前とアリティを持つヘッドを持つ節の集合です。述語を参照するには、名前/アリティという表記法を使用します。論理プログラムは述語のセットです。たとえば、いくつかの家族関係を定義する次の Prolog プログラムには、4 つの述語があります。
mother_child ( trude 、 sally )。
父の子(トム、 サリー)。
父の子(トム、 エリカ)。
父の子(マイク、 トム)。
兄弟( X 、 Y ) :- 親の子( Z 、 X )、 親の子( Z 、 Y )。
親の子( X , Y ) :- 父の子( X , Y )。
親の子( X , Y ) :- 母の子( X , Y )。
述語にfather_child/2は 3 つの節があり、それらはすべて事実です。また、述語にはparent_child/22 つの節があり、それらはすべて規則です。
多くの組み込み述語は関係的な性質を持っているため、通常は複数の方向で使用できます。たとえば、length/2を使用してリストの長さを決定したり ( length(List, L)、リスト が与えられた場合List)、指定された長さのリスト スケルトンを生成したり ( length(X, 5))、両方のリスト スケルトンとその長さを一緒に生成したりできます ( length(X, L))。同様に、append/3を使用して 2 つのリストを追加したり (リストと がappend(ListA, ListB, X)与えられた場合)、指定されたリストを部分に分割したりできます ( 、リスト が与えられた場合)。このため、多くの Prolog プログラムでは、比較的小さなライブラリ述語セットで十分です。
ListAListBappend(X, Y, List)List
汎用言語である Prolog には、入出力、グラフィックスの使用、オペレーティング システムとの通信などの日常的なアクティビティを実行するためのさまざまな組み込み述語も用意されています。これらの述語には関係的な意味は与えられておらず、システムに対して示す副作用に対してのみ役立ちます。たとえば、述語はwrite/1画面に用語を表示します。
ループと再帰
反復アルゴリズムは再帰述語によって実装することができる。[14]
parent_child/2上記の家族関係プログラムで定義された述語
を考えてみましょう。次の Prolog プログラムは祖先関係を定義します。
祖先( X , Y ) :- 親の子( X , Y )。
祖先( X , Y ) :- 親の子( X , Z )、 祖先( Z , Y )。
これは、X が Y の親であるか、X が Y の祖先の親である場合に、X が Y の祖先であることを表します。これは、それ自体に関して定義されているため再帰的です ( ancestor/22 番目の節の本体に述語の呼び出しがあります)。
実行
Prolog プログラムの実行は、ユーザーがクエリと呼ばれる単一の目標を投稿することで開始されます。論理的には、Prolog エンジンは否定されたクエリの解決反駁を見つけようとします。Prolog が使用する解決方法はSLD 解決と呼ばれます。否定されたクエリを反駁できる場合、適切な変数バインディングが配置されたクエリはプログラムの論理的帰結であることがわかります。その場合、生成されたすべての変数バインディングがユーザーに報告され、クエリは成功したとみなされます。操作上、Prolog の実行戦略は他の言語の関数呼び出しの一般化と考えることができますが、1 つの違いは、複数の節の先頭が特定の呼び出しに一致できることです。その場合、システムは選択ポイントを作成し、目標を最初の選択肢の節の先頭と統合し、その最初の選択肢の目標を続行します。プログラムの実行中にいずれかの目標が失敗した場合、最新の選択ポイントが作成されてから行われたすべての変数バインディングが元に戻され、その選択ポイントの次の選択肢から実行が続行されます。この実行戦略は、時系列バックトラッキングと呼ばれます。たとえば、上で定義した家族関係プログラムの場合、次のクエリは true と評価されます。
?- 兄弟(サリー、 エリカ)。
はい
これは次のようにして得られます。最初は、クエリに一致する節ヘッドはsibling(sally, erica)最初のものだけなので、クエリを証明することは、適切な変数バインディングが配置されたその節の本体、つまり結合 を証明することと同じです(parent_child(Z,sally), parent_child(Z,erica))。証明する次の目標は、この結合の一番左のもの、つまり ですparent_child(Z, sally)。2 つの節ヘッドがこの目標と一致します。システムは選択ポイントを作成し、本体が である最初の選択肢を試しますfather_child(Z, sally)。この目標は、事実 を使って証明できるfather_child(tom, sally)ため、バインディングZ = tomが生成され、証明する次の目標は、上記の結合の 2 番目の部分 です。parent_child(tom, erica)これも、対応する事実によって証明できます。すべての目標を証明できたので、クエリは成功します。クエリには変数が含まれていないため、バインディングはユーザーに報告されません。次のような変数を含むクエリ:
?- father_child (父、 子)。
バックトラック時に有効な回答をすべて列挙します。
上記のコードでは、クエリ?- sibling(sally, sally).も成功することに注目してください。必要に応じて、関連する制限を記述する追加の目標を挿入します。
否定
組み込みのProlog述語は、否定を失敗として\+/1提供し、非単調な推論を可能にします。ルールの
目標は\+ illegal(X)
合法( X ) :- \+ 違法( X )。
は次のように評価されます。Prolog は を証明しようとしますillegal(X)。その目標の証明が見つかる場合、元の目標 (つまり\+ illegal(X)) は失敗します。証明が見つからない場合、元の目標は成功します。したがって、クエリはGoal が証明可能でない場合成功する\+/1ので、プレフィックス演算子は「証明不可能」演算子と呼ばれます。この種の否定は、その引数が「根拠」である場合 (つまり、変数を含まない場合) は有効です。引数に変数が含まれ、証明手順が完了している場合は有効性が失われます。特に、クエリを使用して、合法なものすべてを列挙することはできません。
?- \+ Goal.?- legal(X).
Prologでのプログラミング
Prologでは、コードをロードすることをコンサルティングと呼びます。Prologは、Prologプロンプトにクエリを入力することで対話的に使用できます?-。解決策がない場合、Prologは と書き込みますno。解決策が存在する場合は、それが印刷されます。クエリに対して複数の解決策がある場合は、セミコロンを入力してそれらを要求できます;。コードの効率、可読性、保守性を向上させるための優れたプログラミングプラクティスに関するガイドラインがあります。[15]
以下は Prolog で書かれたいくつかのサンプルプログラムです。
こんにちは世界
いくつかの一般的な Prolog 方言での基本的なクエリの例:
この比較は、プロンプト ("?-" と "| ?-") および解決ステータス ("true." と "yes"、"false." と "no") が Prolog 実装ごとに異なる可能性があることを示しています。
コンパイラの最適化
あらゆる計算は、状態遷移のシーケンスとして宣言的に表現できます。たとえば、 3 つの最適化パスを持つ最適化コンパイラは、初期プログラムとその最適化された形式との関係として実装できます。
program_optimized ( Prog0 、 Prog ) :-
optimize_pass_1 ( Prog0 、 Prog1 )、
optimization_pass_2 ( Prog1 、 Prog2 )、
optimization_pass_3 ( Prog2 、 Prog )。
またはDCG表記法を使用して同等の表現をします。
program_optimized --> 最適化パス1 、 最適化パス2 、 最適化パス3 。
クイックソート
リストをソートされたバージョンに関連付けるクイックソート ソート アルゴリズム:
パーティション([], _ 、 [], [])。
パーティション([ X | Xs ], Pivot 、 Smalls 、 Bigs ) :-
( X @< Pivot ->
Smalls = [ X | Rest ],
パーティション( Xs 、 Pivot 、 Rest 、 Bigs )
; Bigs = [ X | Rest ],
パーティション( Xs 、 Pivot 、 Smalls 、 Rest )
)。
クイックソート([]) --> []。
クイックソート([ X | Xs ]) -->
{ パーティション( Xs 、 X 、 Smaller 、 Bigger ) }、
クイックソート( Smaller )、 [ X ]、 クイックソート( Bigger )。
Prologのデザインパターン
デザインパターンは、ソフトウェア設計でよく発生する問題に対する一般的な再利用可能な解決策です。Prologのデザインパターンには、スケルトン、テクニック、[16] [17]クリシェ、[18]プログラムスキーマ、[19]ロジック記述スキーマ、[20]高階プログラミングなどがあります。[21]
高階プログラミング
高階述語は、1つ以上の他の述語を引数として取る述語です。高階プログラミングのサポートにより、Prologは述語の量化を許可しない第一階述語の領域から外れますが、[ 22]call/1 ISO Prologには現在、、、、、、、などcall/2の組み込みの高階述語がありますcall/3。[23]findall/3さらに、任意のPrologゴールを構築して実行時に評価できるため、任意の述語を指定されたリストの各メンバーに適用するや、指定された述語を満たす要素をフィルタリングし、カリー化も可能にするなどの高階述語を簡単に記述できます。[21]setof/3bagof/3maplist/2sublist/3
ソリューションを時間的表現(バックトラック時の回答の置換)から空間的表現(項)に変換するために、Prolog には、指定されたクエリのすべての回答の置換をリストに収集するさまざまな全ソリューション述語があります。これは、リストの理解に使用できます。たとえば、完全数は、その真約数の合計に等しくなります。
perfect ( N ) :-
between ( 1 , inf , N )、 U is N // 2 、
findall ( D 、 ( between ( 1 , U , D )、 N mod D =:= 0 、 Ds )、
sumlist ( Ds 、 N )。
これを使用して、完全数を列挙し、数が完全かどうかを確認できます。
別の例として、述語はリストのペア内のすべての対応する位置に
maplist述語を適用します。P
maplist ( _ , [], []).
maplist ( P , [ X | Xs ], [ Y | Ys ]) :-
call ( P , X , Y ),
maplist ( P , Xs , Ys ).
が、すべての に対して単一の一意の値で統一されるP述語である場合、関数型プログラミングでmap関数を として適用することと同等です。
XP(X,Y)Ymaplist(P, Xs, Ys)Ys = map(Function, Xs)
Prolog の高階プログラミング スタイルは、HiLogとλPrologで先駆的に導入されました。
モジュール
大規模なプログラミングのために、PrologはISO標準のモジュールシステムを提供しています。[24] しかし、ほとんどのPrologシステムはコードをモジュールに構造化することをサポートしていますが、事実上、ISO標準のモジュール部分に準拠した実装はありません。代わりに、ほとんどのPrologシステムは、事実上のモジュール標準としてQuintus / SICStusモジュールシステムをサポートすることを決定しました。ただし、モジュールに関するさらなる便利な述語は、一部の実装でのみ提供されており、その意味に微妙な違いがあることがよくあります。[25]
いくつかのシステムでは、 Logtalkの場合のように、モジュールの概念をソースからソースへのコンパイルとしてベース ISO Prolog に実装することを選択しました。[26] GNU Prolog は当初 ISO モジュールから逸脱し、代わりにユニット (モジュール) のロードとアンロードを動的に行うことができるコンテキスト ロジック プログラミングを選択しました。[27] Ciao は、他の Prolog システムで使用される事実上の標準と基本的に互換性がありながら、正確な静的解析に適しており、項の隠蔽をサポートし、大規模なプログラミングを容易にする厳密なモジュール システムを設計しました。 [28] XSB は異なるアプローチを採用し、アトム ベースのモジュール システムを提供します。[29]後者の 2 つの Prolog システムでは、述語の可視性に加えて項の可視性を制御できます。 [25]
解析
確定節文法(DCG)と呼ばれる特別な表記法があります。-->/2の代わりに を介して定義された規則は、:-/2プリプロセッサ ( expand_term/2、他の言語のマクロに類似した機能) によって、いくつかの簡単な書き換え規則に従って展開され、通常の Prolog 節になります。最も注目すべきは、書き換えによって述語に 2 つの追加引数が装備され、他の言語のモナドと同様に、暗黙的に状態をスレッド化するために使用できることです[明確化が必要]。 DCG は、差分リストへの便利なインターフェイスも提供するため、パーサーやリスト ジェネレーターの作成によく使用されます。
メタ通訳と反省
Prolog は同図像言語であり、リフレクション プログラミング(リフレクション)のための多くの機能を備えています。暗黙的な実行戦略により、純粋な Prolog コードに対して簡潔なメタ循環評価子(メタ インタープリタとも呼ばれる) を記述できます。
解決します( true )。
解決します((サブゴール1 、サブゴール2 )) :-
解決します(サブゴール1 )、
解決します(サブゴール2 ) 。
解決します(ヘッド) :-
句(ヘッド、 本文)、
解決します(本文)。
ここで、 はtrue空の論理積を表し、clause(Head, Body)という形式のデータベース内の節と統合されますHead :- Body。
Prologプログラムはそれ自体がProlog用語の列(:-/2は挿入演算子)であり、組み込みのメカニズム( などread/1)を使用して簡単に読み取りおよび検査できるため、ドメイン固有の機能でPrologを拡張するカスタマイズされたインタープリタを作成することができます。たとえば、スターリングとシャピロは不確実性を伴う推論を実行するメタインタープリタを提示しており、ここではわずかな変更を加えて再現します。[30] : 330
solve ( true , 1 ) :- !
.solve (( Subgoal1 , Subgoal2 ), Certainty ) :-
!,
solve ( Subgoal1 , Certainty1 ),
solve ( Subgoal2 , Certainty2 ),
Certainty は min ( Certainty1 , Certainty2 ) です。solve
( Goal , 1 ) : - builtin ( Goal ) , ! , Goal.solve ( Head , Certainty ) : -clause_cf ( Head , Body , Certainty1 ), solve ( Body , Certainty2 ), CertaintyはCertainty1 * Certainty2です。
このインタプリタは、次の形式の組み込みProlog述語表を使用する[30] :327
組み込み( A は B )。
組み込み(読み取り( X ))。
% など。
および として表される節。これらが与えられた場合、 を実行して結果についての確実性の尺度を取得することを と
clause_cf(Head, Body, Certainty)呼ぶことができます。solve(Goal, Certainty)Goal
チューリング完全性
純粋な Prolog は、一階述語論理のサブセットであるホーン節に基づいており、チューリング完全です。Prolog のチューリング完全性は、Prolog を使用してチューリング マシンをシミュレートすることで示されます。
turing ( Tape0 、 Tape ) :-
perform ( q0 、 []、 Ls 、 Tape0 、 Rs )、
reverse ( Ls 、 Ls1 )、
append ( Ls1 、 Rs 、 Tape )。
実行( qf , Ls , Ls , Rs , Rs ) :- !.
実行( Q0 , Ls0 , Ls , Rs0 , Rs ) :-
シンボル( Rs0 , Sym , RsRest )、
1 回(ルール( Q0 , Sym , Q1 , NewSym , Action ))、
アクション( Action , Ls0 , Ls1 , [ NewSym | RsRest ], Rs1 )、
実行( Q1 , Ls1 , Ls , Rs1 , Rs )。
シンボル([], b 、 [])。
シンボル([ Sym | Rs ], Sym 、 Rs )。
アクション(左、 Ls0 、 Ls 、 Rs0 、 Rs ) :- 左( Ls0 、 Ls 、 Rs0 、 Rs )。
アクション(滞在、 Ls 、 Ls 、 Rs 、 Rs )。
アクション(右、 Ls0 、 [ Sym | Ls0 ]、 [ Sym | Rs ]、 Rs )。
左([], [], Rs0 , [ b | Rs0 ])。
左([ L | Ls ], Ls , Rs , [ L | Rs ])。
簡単な例のチューリング マシンは、次の事実によって指定されます。
ルール( q0 , 1 , q0 , 1 , right )。
ルール( q0 , b , qf , 1 , stay )。
このマシンは、単項エンコードの数値の 1 つずつ増分を実行します。つまり、任意の数の「1」セルをループし、最後に「1」を追加します。クエリと結果の例:
?- チューリング([ 1 , 1 , 1 ], Ts ).
Ts = [ 1 , 1 , 1 , 1 ] ;
これは、任意の計算を状態遷移のシーケンスとして宣言的に表現し、Prolog で連続する関心状態間の関係として実装する方法を示しています。
実装
ISOプロローグ
国際標準化機構(ISO) の Prolog技術標準は 2 つの部分から構成されています。1995 年に発行された ISO/IEC 13211-1 [23] [31]は、Prolog のコア要素の多くの実装の既存のプラクティスを標準化することを目的としています。これにより、以前は曖昧だった言語の側面が明確になり、移植可能なプログラムが実現しました。Cor.1:2007、[32] Cor.2:2012、[33] Cor.3:2017 の 3 つの正誤表があります。[34] 2000 年に発行されたISO/IEC 13211-2 [23]は、標準にモジュールのサポートを追加します。この標準は、 ISO/IEC JTC1 / SC22 /WG17 [35]ワーキング グループによって保守されています。ANSI X3J17 は、この標準の米国技術諮問グループです。[36]
コンパイル
効率を上げるため、Prolog コードは通常、レジスタベースのWarren Abstract Machine (WAM) 命令セットの影響を受け、抽象マシンコードにコンパイルされます。[37]一部の実装では、抽象解釈を使用してコンパイル時に述語の型とモード情報を導出するか、高性能のために実際のマシンコードにコンパイルします。[38] Prolog コードの効率的な実装方法を考案することは、論理プログラミングコミュニティで活発に研究されている分野であり、一部の実装ではさまざまな他の実行方法が採用されています。これらには、節のバイナリ化やスタックベースの仮想マシンが含まれます。[要出典]
末尾再帰
Prolog システムは通常、末尾再帰、またはより一般的には末尾呼び出しを示す決定論的述語に対して、末尾呼び出し最適化(TCO)と呼ばれるよく知られた最適化手法を実装します。末尾位置で呼び出しを実行する前に、節のスタック フレームが破棄されます。したがって、決定論的末尾再帰述語は、他の言語のループのように、一定のスタック スペースで実行されます。
用語のインデックス作成
クエリ内の用語とユニファイ可能な節の検索は、節の数に比例します。用語のインデックス作成では、サブ線形時間の検索を可能にするデータ構造を使用します。 [39]インデックス作成はプログラムのパフォーマンスにのみ影響し、セマンティクスには影響しません。ほとんどのPrologは、すべての用語のインデックス作成はコストがかかるため、最初の用語のインデックス作成のみを使用しますが、フィールドエンコードされた単語または重ね合わせられたコードワードに基づく手法では、クエリ全体とヘッド全体で高速なインデックス作成が可能です。[40] [41]
ハッシュ
WIN-PROLOGや SWI-Prologなどの一部の Prolog システムでは、大規模なデータセットをより効率的に処理するためにハッシュが実装されています。これにより、 WordNetなどの大規模なコーパスを扱うときにパフォーマンスが大幅に向上する傾向があります。
テーブル
いくつかのPrologシステム(B-Prolog、XSB、SWI-Prolog、YAP、Ciao)は、タブリングと呼ばれるメモ化手法を実装しており、これによりユーザーは中間結果を手動で保存する必要がなくなります。タブリングは空間と時間のトレードオフであり、中間結果を格納するためにより多くのメモリを使用することで実行時間を短縮できます。[42] [43]
クエリ評価で遭遇したサブゴールは、これらのサブゴールに対する回答とともにテーブルに保持されます。サブゴールが再び遭遇した場合、評価ではプログラム節に対する解決を再実行するのではなく、テーブルからの情報を再利用します。[44]
テーブル化はさまざまな方向に拡張できます。SLG解決または線形テーブル化を通じて再帰述語をサポートできます。マルチスレッド Prolog システムでは、テーブル化の結果をスレッド専用にすることも、すべてのスレッド間で共有することもできます。また、増分テーブル化では、テーブル化が変更に反応する場合があります。
ハードウェアでの実装
第五世代コンピュータシステムプロジェクトでは、専用アーキテクチャでより高速な実行を実現することを目的として、Prologをハードウェアに実装する試みがありました。[45] [46] [47]さらに、Prologには並列実行による高速化を可能にするいくつかの特性があります。[48]より最近のアプローチは、制限されたPrologプログラムをフィールドプログラマブルゲートアレイにコンパイルすることです。[49]しかし、汎用ハードウェアの急速な進歩は、より特殊なアーキテクチャを常に追い越してきました。
セガは1986年に日本市場向けに発売されたセガAIコンピュータで使用するためにPrologを実装した。Prologはタッチパッドを介して日本語の自然言語入力を読み取るために使用された。[50]
制限
Prologは研究や教育の分野で広く使われているが[51]、 Prologや他の論理プログラミング言語はコンピュータ業界全般に大きな影響を与えていない。[52]ほとんどのアプリケーションは業界標準からすると小さく、コード行数が10万行を超えるものはほとんどない。[52] [53] 大規模なプログラミングは複雑だと考えられているが、それはすべてのPrologコンパイラがモジュールをサポートしているわけではなく、主要なPrologコンパイラのモジュールシステム間に互換性の問題があるからである。[26]実装間でのPrologコードの移植性も問題となっていたが、2007年以降の開発により「Edinburgh/Quintus由来のProlog実装ファミリ内での移植性は、移植可能な実世界のアプリケーションを維持するのに十分である」とされている。[54]
Prolog で開発されたソフトウェアは、従来のプログラミング言語に比べてパフォーマンスの面で大きなペナルティがあると批判されてきた。特に、Prolog の非決定論的評価戦略は、決定論的計算をプログラミングする場合、または「don't care non-determinism」(すべての可能性をバックトラックするのではなく、単一の選択を行う)を使用する場合にさえ問題となる可能性がある。望ましいパフォーマンスを達成するには、カットやその他の言語構造を使用しなければならない場合があり、Prolog の主な魅力の 1 つであるプログラムを「前後に」実行できる能力が損なわれる。[55]
Prologは純粋に宣言的ではありません。カット演算子のような構造があるため、Prologプログラムを理解するには手続き的に読む必要があります。[56] Prologプログラム内の節の順序は重要です。言語の実行戦略はそれに依存するからです。[57] Datalogなどの他の論理プログラミング言語は真に宣言的ですが、言語を制限しています。その結果、多くの実用的なPrologプログラムは、純粋に宣言的な論理プログラムとしてではなく、Prologの深さ優先探索順序に準拠するように書かれています。[55]
拡張機能
Prolog からさまざまな実装が開発され、さまざまな方向に論理プログラミング機能を拡張しています。これには、型、モード、制約論理プログラミング(CLP)、オブジェクト指向論理プログラミング (OOLP)、並行性、線形論理(LLP)、関数型および高階論理プログラミング機能、さらに知識ベースとの相互運用性が含まれます。
種類
Prologは型付けのない言語です。Prologに型を導入し拡張する試みは1980年代に始まり、[58] [59] 2008年現在も続いています[アップデート]。[60]型情報は型の安全性だけでなく、Prologプログラムの推論にも役立ちます。 [61]
モード
Prologの構文では、述語のどの引数が入力で、どの引数が出力であるかは指定されていません。[62]しかし、この情報は重要なので、コメントに含めることが推奨されます。[63]モードは、Prologプログラムを推論する際に貴重な情報を提供し、 [61]実行を高速化するためにも使用できます。[64]
制約
制約論理プログラミングは、Prologを拡張して制約充足の概念を取り入れます。[65] [66]制約論理プログラムでは、節の本体に次のような制約を使用できます。これはA(X,Y) :- X+Y>0.大規模な組み合わせ最適化問題に適しており[67] 、自動化されたタイムテーブル作成や生産スケジューリングなどの産業環境でのアプリケーションに役立ちます。ほとんどのPrologシステムには、有限領域用の制約ソルバーが少なくとも1つ付属しており、有理数などの他の領域用のソルバーも付属していることがよくあります。
オブジェクト指向
Flora-2 は、 F ロジックに基づくオブジェクト指向の知識表現および推論システムであり、HiLog、トランザクション ロジック、および無効推論を組み込んでいます。
Logtalk は、ほとんどの Prolog 実装をバックエンド コンパイラとして使用できるオブジェクト指向の論理プログラミング言語です。マルチパラダイム言語として、プロトタイプとクラスの両方をサポートしています。
Oblog は、エディンバラ大学 EdCAAD の Margaret McDougall による、Prolog の小型で移植可能なオブジェクト指向拡張機能です。
Objlog は、フランスのマルセイユにある CNRS のオブジェクトと Prolog II を組み合わせたフレームベースの言語です。
Prolog++はLogic Programming Associatesによって開発され、1989 年に MS-DOS PC 向けに最初にリリースされました。他のプラットフォームのサポートが追加され、2 番目のバージョンが 1995 年にリリースされました。Chris Moss による Prolog++ に関する本は、1994 年に Addison-Wesley から出版されました。
Visual Prolog は、インターフェース、クラス、実装、オブジェクト式を備えたマルチパラダイム言語です。
グラフィックス
グラフィックスライブラリを提供するPrologシステムには、SWI-Prolog、[68] Visual Prolog、WIN-PROLOG、B-Prologなどがある。
同時実行性
Prolog-MPIは、メッセージパッシングインターフェースを介した分散コンピューティングのためのオープンソースのSWI-Prolog拡張です。[69]また、さまざまな並行Prologプログラミング言語があります。[70]
ウェブプログラミング
Visual Prolog、SWI-Prolog、Ciaoなどの一部のProlog実装は、 Webプロトコル、 HTML、XMLをサポートしたサーバー側 Webプログラミングをサポートしています。[71]また、リソース記述フレームワーク(RDF)やWebオントロジー言語(OWL)などのセマンティックWeb形式をサポートするための拡張機能もあります。[72] [73] Prologはクライアント側言語としても提案されています。[74]さらに、Visual PrologはJSON-RPCとWebsocketsをサポートしています。
アドビフラッシュ
Cedar Archived 2010-10-19 at the Wayback Machineは、無料の基本的な Prolog インタープリタです。バージョン 4 以降では、Cedar は FCA (Flash Cedar App) をサポートしています。これにより、 ActionScriptを通じて Prolog でプログラミングするための新しいプラットフォームが提供されます。
他の
- F-logic は、知識表現のためのフレーム/オブジェクトを追加して Prolog を拡張します。
- トランザクション ロジックは、状態を変更する更新演算子の論理理論を使用して Prolog を拡張します。モデル理論と手続き型セマンティクスの両方を備えています。
- OW Prolog は、Prolog のグラフィックスとインターフェースの不足を補うために作成されました。
他の言語へのインターフェース
Prolog と他の言語をつなぐことができるフレームワークが存在します。
- LPAインテリジェンスサーバーは、C、C++、C#、Java、Visual Basic(VB)、Delphi、.NET、Lua、Pythonなどの他のプログラミング言語にLPA Prolog for Windowsを埋め込むことを可能にします。LPA Prologが提供する専用の文字列データ型を活用します。
- Logic Server アプリケーション プログラミング インターフェイス ( API ) を使用すると、 C、C++、Java、Visual Basic (VB)、Delphi、.NET、および .dll または .so を呼び出すことができる任意の言語または環境で、 Prolog を拡張および埋め込むことができます。 これは Amzi! Prolog + Logic Server 用に実装されていますが、 API 仕様は任意の実装で使用できます。
- JPL は双方向の Java Prolog ブリッジで、デフォルトで SWI-Prolog に同梱されており、Java と Prolog が相互に (再帰的に) 呼び出すことができます。優れた並行性サポートを備えていることで知られており、現在活発に開発が進められています。
- InterProlog は、 Javaと Prolog間のプログラミングライブラリブリッジであり、両言語間の双方向述語/メソッド呼び出しを実装します。Java オブジェクトは Prolog 用語にマッピングでき、その逆も可能です。Prologレイヤーでロジック処理を行いながら、Java でグラフィカル ユーザー インターフェイス(GUI) やその他の機能を開発できます。XSBおよびSWI -Prologをサポートします。
- Prova は、 Java、エージェント メッセージング、および反応ルールとのネイティブ構文統合を提供します。Prova は、ミドルウェア用のルールベース スクリプト (RBS) システムとして位置付けられています。この言語は、命令型プログラミングと宣言型プログラミングを組み合わせるという新境地を切り開きます。
- PROL Java 用の埋め込み可能な Prolog エンジン。小さな IDE といくつかのライブラリが含まれています。
- GNU Prolog for Java は、ISO Prolog を Java ライブラリとして実装したものです (gnu.prolog)
- Ciao は、C、C++、Java、リレーショナル データベースへのインターフェイスを提供します。
- C#-Prolog は、(マネージド) C# で記述された Prolog インタープリタです。C# プログラムに簡単に統合できます。特徴: 信頼性が高く、かなり高速なインタープリタ、コマンド ライン インターフェイス、Windows インターフェイス、組み込み DCG、XML 述語、SQL 述語、拡張可能。特別な目的の拡張機能を追加するために使用できるパーサー ジェネレーターを含む完全なソース コードが利用可能です。
- PHP 用の Warren 抽象マシン。PHP 5.3 の Prolog コンパイラおよびインタープリタ。スタンドアロンまたは Symfony2.1 フレームワーク内で使用できるライブラリ。これは、Stephan Buettcher の Java の成果から翻訳されたもので、[こちらstefan.buettcher.org/cs/wam/ ]で見つかります。
- tuProlog は、分散アプリケーションおよびインフラストラクチャ用の軽量 Prolog システムです。最小限のコアを中心に意図的に設計されており、述語のライブラリをロード/アンロードすることで静的または動的に構成できます。tuProlog は、マルチパラダイム プログラミングをネイティブにサポートし、Prolog と主流のオブジェクト指向言語 (tuProlog Java バージョンの場合は Java、tuProlog .NET バージョンの場合は任意の .NET ベースの言語 (C#、F# など)) 間のクリーンかつシームレスな統合モデルを提供します。
- Janusは、移植可能な低レベルプリミティブを使用したPrologとPython間の双方向インターフェースです。当初はAndersonとSwiftによってXSB用に開発されましたが、[75] XSB、Ciao、SWI-Prologチームの共同イニシアチブとして採用されました。
歴史

Prologという名前は、フィリップ・ルーセルが妻の提案でprogrammation en logique(フランス語で論理的プログラミング)の略語として選んだものである。[76]これは、ロバート・コワルスキーのホーン節の手続き的解釈に基づいて、アラン・コルメローとフィリップ・ルーセルによって1972年頃に作成された。これは、宣言的知識表現言語としての論理の使用と、1960年代後半から1970年代前半に北米で人気があった知識の手続き的表現を調和させたいという願望によって部分的に動機付けられた。ロバート・コワルスキーによると、最初のPrologシステムは1972年にコルメローとフィリップ・ルーセルによって開発された。[77] [78] [79] Prologの最初の実装は、ジェラール・バッターニとアンリ・メロニによってFortranで書かれたインタープリタであった。David HD Warren はこのインタープリタをエディンバラ大学に持ち込み、そこで代替フロントエンドを実装しました。これは、ほとんどの現代の実装で使用される「Edinburgh Prolog」構文を定義するようになりました。Warren はまた、Prolog の最初のコンパイラを実装し、Fernando Pereira と共同で影響力のある DEC-10 Prolog を作成しました。Warren は後に DEC-10 Prolog の背後にあるアイデアを一般化して、Warren Abstract Machineを作成しました。
ヨーロッパのAI研究者はPrologを好み、アメリカ人はLispを好んだため、それぞれの言語の長所について多くの国家主義的な議論が巻き起こったと伝えられている。[80] Prologの現代的な開発の多くは、第5世代コンピュータシステムプロジェクト(FGCS)の推進力によるもので、同プロジェクトでは最初のオペレーティングシステム用にカーネル言語と呼ばれるPrologの変種が開発された。
純粋な Prolog はもともと、次の形式の ホーン節を持つ解決定理証明器の使用に制限されていました。
H :- B 1、...、 B n。
定理証明器の適用では、このような節を手順として扱います。
H を表示/解決するには、B 1と ... および B n を表示/解決します。
しかし、純粋な Prolog はすぐに拡張され、否定を失敗として含めるようになりました。この場合、形式 not(B i ) の否定条件は、対応する肯定条件 B i を解決しようとして失敗することによって示されます。
元のチームによる Prolog のその後の拡張により、実装に 制約論理プログラミング機能が導入されました。
産業での使用
PrologはWatsonで使用されている。WatsonはIBMのDeepQAソフトウェアとApache UIMA(非構造化情報管理アーキテクチャ)フレームワークを使用している。このシステムはJava、C++、Prologなどさまざまな言語で書かれており、分散コンピューティングを提供するためにApache Hadoopフレームワークを使用してSUSE Linux Enterprise Server 11オペレーティングシステム上で稼働している。Prologは自然言語解析ツリーのパターンマッチングに使用されている。開発者は「解析ツリーやその他の注釈(名前付きエンティティの認識結果など)に対するパターンマッチングルールを便利に表現できる言語と、これらのルールを非常に効率的に実行できるテクノロジーが必要でした。Prologはシンプルで表現力に優れているため、この言語には理想的な選択であることがわかりました。」と述べている。 [12] Prologは、AIを中心としたローコード開発プラットフォームGeneXusで使用されている。 [要出典]オープンソースのグラフデータベースTerminusDBはPrologで実装されている。[81] TerminusDBはナレッジグラフを共同で構築およびキュレーションするために設計されている。
参照
- Prolog実装の比較
- 論理言語モデリング。Prolog を使用した知識ベースシステムを構築する手法。
- 回答セットプログラミング。論理プログラミングに対する完全に宣言的なアプローチ。
- 論理プログラミング協会
関連言語
- Gödel言語は、並行制約論理プログラミングの厳密に型付けされた実装です。SICStus Prolog上に構築されています。
- Visual Prolog は、以前は PDC Prolog および Turbo Prolog と呼ばれていましたが、標準の Prolog とは大きく異なる、厳密に型指定された オブジェクト指向の Prolog 方言です。Turbo Prolog として Borland によって販売されていましたが、現在は、元々この言語を開発したデンマークの企業 Prolog Development Center (PDC) によって開発および販売されています。
- Datalog はProlog のサブセットです。階層化できる関係に限定されており、複合項は許可されません。Prolog とは対照的に、Datalog はチューリング完全ではありません。
- Mercury は、静的で多態的な型システム、およびモードと決定論のシステムを備えた、大規模なソフトウェア エンジニアリング向けの Prolog の派生です。
- GraphTalk は、オブジェクト指向のプロパティを追加した、Warren の抽象マシンの独自の実装です。
- いくつかの点では[どの点ですか? ] Prolog はPlannerのサブセットです。 Planner のアイデアは、後にScientific Community Metaphorでさらに発展しました。
- AgentSpeak は、マルチエージェント システムでエージェントの動作をプログラミングするための Prolog のバリエーションです。
- Erlang はProlog ベースの実装から始まり、Prolog の統一ベースの構文の多くを維持しています。
- Pilog はPicoLisp上に構築された宣言型言語で、Prolog のセマンティクスを持ちながら Lisp の構文を使用します。
- λPrologは、多態的型付け、モジュールプログラミング、高階プログラミングを特徴とするコア Prolog の拡張であり、いわゆる λ ツリー構文と高階パターンの統一による変数バインディング演算子を含む項の直接サポートが含まれます。
注記
参考文献
- ^ Clocksin, William F.; Mellish, Christopher S. (2003). Programming in Prolog . ベルリン; ニューヨーク: Springer-Verlag. ISBN 978-3-540-00678-7。
- ^ Bratko, Ivan (2012). Prolog programming for artificial intelligence (第4版). イギリス、ハーロー; ニューヨーク: Addison Wesley. ISBN 978-0-321-41746-6。
- ^ Covington, Michael A. (1994). Prolog プログラマのための自然言語処理。イングルウッドクリフス、ニュージャージー: Prentice Hall。ISBN 978-0-13-629213-5。
- ^ ab Lloyd, JW (1984).論理プログラミングの基礎. ベルリン: Springer-Verlag. ISBN 978-3-540-13299-8。
- ^ 論理プログラミング § 歴史 を参照してください。
- ^ Stickel, ME (1988). 「Prolog テクノロジ定理証明器: 拡張 Prolog コンパイラによる実装」. Journal of Automated Reasoning . 4 (4): 353–380. CiteSeerX 10.1.1.47.3057 . doi :10.1007/BF00297245. S2CID 14621218.
- ^ メリット、デニス (1989)。Prologによるエキスパートシステムの構築。ベルリン: Springer- Verlag。ISBN 978-0-387-97016-5。
- ^ Felty, Amy. 「高階項書き換えを実装するための論理プログラミングアプローチ」 論理プログラミングの拡張 (1992): 135-161。
- ^ Kent D. Lee (2015年1月19日). プログラミング言語の基礎. Springer. pp. 298–. ISBN 978-3-319-13314-0。
- ^ Ute Schmid (2003 年 8 月 21 日)。関数プログラムの帰納的合成: ユニバーサル プランニング、有限プログラムの折りたたみ、類推によるスキーマの抽象化。Springer Science & Business Media。ISBN 978-3-540-40174-2。
- ^ Fernando CN Pereira ; Stuart M. Shieber (2005). Prolog と自然言語解析. Microtome.
- ^ Adam Lally、Paul Fodor (2011年3月31日)。「IBM WatsonシステムにおけるPrologによる自然言語処理」。論理プログラミング協会。2014年9月3日時点のオリジナルよりアーカイブ。 2014年6月13日閲覧。「Watson (コンピュータ)」も参照。
- ^ ISO/IEC 13211-1:1995 Prolog、6.3.7 用語 - 二重引用符で囲まれたリスト表記。国際標準化機構、ジュネーブ。
- ^ Carlsson, Mats (2014 年 5 月 27 日). SICStus Prolog ユーザーズ マニュアル 4.3: コア リファレンス ドキュメント。BoD – Books on Demand。ISBN 978-3-7357-3744-1– Google ブックス経由。
- ^ Covington, Michael A.; Bagnara, Roberto; O'Keefe, Richard A .; Wielemaker, Jan; Price, Simon (2011). 「Prolog のコーディングガイドライン」.論理プログラミングの理論と実践. 12 (6): 889–927. arXiv : 0911.2899 . doi :10.1017/S1471068411000391. S2CID 438363.
- ^ Kirschenbaum, M.; Sterling, LS (1993). 「スケルトンへのテクニックの適用 - Prolog プログラミングのパターン」。論理プログラムの構築 (JMJ Jacquet 編)。コンピュータサイエンスの講義ノート / 人工知能の講義ノート: 27–140。CiteSeerX 10.1.1.56.7278。
- ^ スターリング、レオン (2002)。計算論理:論理プログラミングとその先。第2407巻。pp. 17–26。doi : 10.1007 /3-540-45628-7_15。ISBN 978-3-540-43959-2。
- ^ D. Barker-Plummer. Prolog でのクリシェプログラミング。M. Bruynooghe 編著、論理におけるメタプログラミングに関する第 2 回ワークショップ論文集、247 ~ 256 ページ。ルーヴェン カトリック大学コンピューター科学部、1990 年。
- ^ Gegg-harrison, TS (1995). Prolog での論理プログラムスキーマの表現。Procs 第 12 回国際論理プログラミング会議。pp. 467–481。
- ^ Deville, Yves (1990).論理プログラミング: 体系的なプログラム開発. ウォキンガム、イギリス: Addison-Wesley. ISBN 978-0-201-17576-9。
- ^ ab Naish, Lee (1996). Prolog での高階論理プログラミング (レポート).メルボルン大学コンピュータサイエンス学部. CiteSeerX 10.1.1.35.4505 .
- ^ 「Prolog 変数に関しては、ヘッド内の変数のみが暗黙的に全称量化され、ボディ内の変数のみが暗黙的に存在量化される」 。2013年 5 月 4 日閲覧。
- ^ abc ISO/IEC 13211: 情報技術 – プログラミング言語 – Prolog。国際標準化機構、ジュネーブ。
- ^ ISO/IEC 13211-2: モジュール。
- ^ フィリップ・ケルナー氏;マイケル・ロイシェル;ジョアン・バルボーサ。ビトール・サントス・コスタ。ヴェロニカ・ダール。マヌエル・V・エルメネジルド。ホセ・F・モラレス。ヤン・ヴィーレメーカー;ダニエル・ディアス;サルバドール・アブレウ。 Giovanni Ciatto (2022 年 11 月)、「Fifty Years of Prolog and Beyond」、論理プログラミングの理論と実践、22 (6): 776–858、doi : 10.1017/S1471068422000102、hdl : 10174/33387
- ^ ab Moura, Paulo (2004年8月)、「Logtalk」、Association of Logic Programming、17 (3)、2010年4月12日時点のオリジナルよりアーカイブ、 2010年2月16日取得
- ^ Abreu、Nogueira (2005)、「永続性とコンテキストを備えた論理プログラミング言語の使用」、人工知能の講義ノート、4369
- ^ Cabeza、Hermenegildo (2000)、「Prolog の新しいモジュール システム」、Lecture Notes in Computer Science、vol. 1861
- ^ Sagonas、Swift、Warren (1994)、「効率的な演繹データベースエンジンとしてのXSB」、SIGMOD
- ^ ab Shapiro, Ehud Y.; Sterling, Leon (1994). The Art of Prolog: Advanced Programming Techniques . マサチューセッツ州ケンブリッジ: MIT Press. ISBN 978-0-262-19338-2。
- ^ Ed-Dbali, A.; Deransart, Pierre; Cervoni, L. (1996). Prolog: 標準: リファレンスマニュアル。ベルリン: Springer。ISBN 978-3-540-59304-1。
- ^ 「ISO/IEC 13211-1:1995/Cor 1:2007」。ISO。
- ^ 「ISO/IEC 13211-1:1995/Cor 2:2012」。ISO。
- ^ 「ISO/IEC 13211-1:1995/Cor 3:2017」。ISO。
- ^ 「ISO/IEC JTC1 SC22 WG17」.[永久リンク切れ]
- ^ 「X3J17 と Prolog 標準」。2009 年 8 月 23 日時点のオリジナルよりアーカイブ。2009年 10 月 2 日閲覧。
- ^ David HD Warren. 「抽象 Prolog 命令セット」。テクニカル ノート 309、SRI International、メンロ パーク、カリフォルニア州、1983 年 10 月。
- ^ Van Roy, P.; Despain, AM (1992). 「Aquarius Prolog コンパイラを使用した高性能ロジックプログラミング」. Computer . 25 : 54–68. doi :10.1109/2.108055. S2CID 16447071.
- ^ Graf, Peter (1995).用語索引. Springer. ISBN 978-3-540-61040-3。
- ^ Wise, Michael J.; Powers, David MW (1986).重ね合わせたコードワードとフィールドエンコードされたワードによる Prolog 節のインデックス作成。国際論理プログラミングシンポジウム。pp. 203–210。
- ^ Colomb, Robert M. (1991). 「節インデックスによる PROLOG の統一性の強化」. The Journal of Logic Programming . 10 : 23–44. doi :10.1016/0743-1066(91)90004-9.
- ^ Swift, T. (1999). 「非単調プログラミングのためのテーブル化」. Annals of Mathematics and Artificial Intelligence . 25 (3/4): 201–240. doi :10.1023/A:1018990308362. S2CID 16695800.
- ^ Zhou, Neng-Fa; Sato, Taisuke (2003). 「線形テーブル化における効率的な固定点計算」(PDF)。宣言型プログラミングの原理と実践に関する第 5 回 ACM SIGPLAN 国際会議の議事録: 275–283。
- ^ Swift, T.; Warren, DS (2011). 「XSB: テーブル型ロジックプログラミングによる Prolog の拡張」.ロジックプログラミングの理論と実践. 12 (1–2): 157–187. arXiv : 1012.5123 . doi :10.1017/S1471068411000500. S2CID 6153112.
- ^ Abe, S.; Bandoh, T.; Yamaguchi, S.; Kurosawa, K.; Kiriyama, K. (1987). 「高性能統合 Prolog プロセッサ IPP」。第 14 回国際コンピュータ アーキテクチャ シンポジウム - ISCA '87 の議事録。p. 100。doi : 10.1145/30350.30362。ISBN 978-0-8186-0776-9. S2CID 10283148。
- ^ Robinson, Ian (1986).パターンマッチングメモリデバイスに基づく Prolog プロセッサ。第 3 回国際論理プログラミング会議。コンピュータサイエンスの講義ノート。第 225 巻。Springer。pp. 172–179。doi : 10.1007 /3-540-16492-8_73。ISBN 978-3-540-16492-0。
- ^ Taki, K.; Nakajima, K.; Nakashima, H.; Ikeda, M. (1987). 「PSIマシンのパフォーマンスとアーキテクチャ評価」ACM SIGPLAN Notices . 22 (10): 128. doi : 10.1145/36205.36195 .
- ^ Gupta, G.; Pontelli, E.; Ali, KAM; Carlsson, M.; Hermenegildo, MV (2001). 「Prolog プログラムの並列実行: 調査」. ACM Transactions on Programming Languages and Systems . 23 (4): 472. doi : 10.1145/504083.504085 . S2CID 2978041.
- ^ 「静的に割り当てられたシステム」。
- ^ 「ゲームを真剣に考えるソフトウェア」。New Scientist。Reed Business Information。1987年 3 月 26 日。p. 34 – Google Books経由。[永久リンク切れ]
- ^ 「コンピュータサイエンス - プログラミング言語、構文、アルゴリズム | ブリタニカ」。www.britannica.com 。 2023年7月12日閲覧。
- ^ ab 現実世界のための論理プログラミング。Zoltan Somogyi、Fergus Henderson、Thomas Conway、Richard O'Keefe。論理プログラミングの将来のビジョンに関する ILPS'95 ポストカンファレンス ワークショップの議事録。
- ^ 「FAQ: Prolog リソース ガイド 1/2 [月次投稿]セクション - [1-8] Prolog 1000 データベース」。Faqs.org。
- ^ Jan Wielemaker と Vıtor Santos Costa: Prolog プログラムの移植性: 理論とケーススタディ。CICLOPS-WLPE ワークショップ 2010、Wayback Machineに 2010-07-16 にアーカイブ。
- ^ ab Kiselyov, Oleg; 亀山幸義 (2014). Re-thinking Prolog. 日本ソフトウェア科学会第31回学術講演会論文集.
- ^ フランゼン、トルケル (1994)、「宣言型と手続き型」、論理プログラミング協会、7 (3)
- ^ Dantsin, Evgeny; Eiter, Thomas; Gottlob, Georg; Voronkov, Andrei (2001). 「論理プログラミングの複雑性と表現力」. ACM Computing Surveys . 33 (3): 374–425. CiteSeerX 10.1.1.616.6372 . doi :10.1145/502807.502810. S2CID 518049.
- ^ Mycroft, A.; O'Keefe, RA (1984). 「Prolog の多態型システム」.人工知能. 23 (3): 295. doi :10.1016/0004-3702(84)90017-1.
- ^ Pfenning, Frank (1992).論理プログラミングにおける型. マサチューセッツ州ケンブリッジ: MIT プレス. ISBN 978-0-262-16131-2。
- ^ Schrijvers, Tom; Santos Costa, Vitor; Wielemaker, Jan; Demoen, Bart (2008). 「型付き Prolog に向けて」。María García de la Banda ; Enrico Pontelli (編)。論理プログラミング: 第 24 回国際会議、ICLP 2008、イタリア、ウディネ、2008 年 12 月 9 ~ 13 日: 議事録。コンピュータ サイエンスの講義ノート。第 5366 巻。pp. 693 ~ 697。doi : 10.1007 / 978-3-540-89982-2_59。ISBN 978-3-540-89982-2。
- ^ ab Apt, KR; Marchiori, E. (1994). 「Prolog プログラムの推論: モードから型、アサーションまで」. Formal Aspects of Computing . 6 (S1): 743. CiteSeerX 10.1.1.57.395 . doi :10.1007/BF01213601. S2CID 12235465.
- ^ O'Keefe, Richard A. (1990). The craft of Prolog . マサチューセッツ州ケンブリッジ: MIT Press. ISBN 978-0-262-15039-2。
- ^ Covington, Michael; Bagnara, Roberto; et al. (2010). 「Prolog のコーディングガイドライン」. arXiv : 0911.2899 [cs.PL].
- ^ Roy, P.; Demoen, B.; Willems, YD (1987). 「モード、節選択、決定論によるコンパイル済み Prolog の実行速度の向上」。Tapsoft '87。コンピュータ サイエンスの講義ノート。第 250 巻。pp. 111。doi : 10.1007 /BFb0014976。ISBN 978-3-540-17611-4。
- ^ Jaffar, J. (1994). 「制約論理プログラミング:概要」. The Journal of Logic Programming . 19–20: 503–581. doi : 10.1016/0743-1066(94)90033-7 .
- ^ Colmerauer, Alain (1987). 「Opening the Prolog III Universe」. Byte 8月.
- ^ Wallace, M. (2002). 「制約論理プログラミング」。計算論理: 論理プログラミングとその先。 コンピュータサイエンスの講義ノート。 第 2407 巻。 pp. 512–556。doi :10.1007/3-540-45628-7_19。ISBN 978-3-540-45628-5。
- ^ 「XPCE: SWI-Prolog ネイティブ GUI ライブラリ」. swi-prolog.org .
- ^ "prolog-mpi". Apps.lumii.lv . 2010年9月16日閲覧。
- ^ Ehud Shapiro.並行論理プログラミング言語ファミリー ACM Computing Surveys 1989年9月。
- ^ Wielemaker, J.; Huang, Z.; Van Der Meij, L. (2008). 「SWI-Prolog と Web」(PDF) .論理プログラミングの理論と実践. 8 (3): 363. doi :10.1017/S1471068407003237. S2CID 5404048.
- ^ Wielemaker, Jan; Hildebrand, Michiel; van Ossenbruggen, Jacco (2007)、Heymans, S.; Polleres, A.; Ruckhaus, E.; Pearse, D.; Gupta, G. (編)、「セマンティック ウェブ上のアプリケーションの基礎として {Prolog} を使用する」(PDF)、第 2 回ロジック プログラミングと Web へのアプリケーションに関するワークショップの議事録、セマンティック ウェブとセマンティック ウェブ サービス、CEUR ワークショップ議事録、第 287 巻、ポルトガル、ポルト: CEUR-WS.org、pp. 84–98
- ^ Thea を使用した OWL2 オントロジーの処理: 論理プログラミングのアプリケーション。Vangelis Vassiliadis、Jan Wielemaker、Chris Mungall。第 5 回 OWL 国際ワークショップの議事録: 経験と方向性 (OWLED 2009)、バージニア州シャンティリー、米国、2009 年 10 月 23 ~ 24 日
- ^ Loke, SW; Davison, A. (2001). 「セキュアな Prolog ベースのモバイル コード」.論理プログラミングの理論と実践. 1 (3): 321. arXiv : cs/0406012 . CiteSeerX 10.1.1.58.6610 . doi :10.1017/S1471068401001211. S2CID 11754347.
- ^ Andersen, C. および Swift, T.、2023。「Janus システム: 新しい Prolog アプリケーションへの架け橋」。Prolog: The Next 50 Years (pp. 93-104)。Cham: Springer Nature Switzerland。
- ^ Colmerauer, A. および Roussel, P.、1996 年。Prolog の誕生。プログラミング言語の歴史---II (pp. 331-367)。
- ^ Kowalski, RA (1988). 「論理プログラミングの初期の時代」(PDF) . Communications of the ACM . 31 : 38. doi :10.1145/35043.35046. S2CID 12259230.
- ^ Colmerauer, A.; Roussel, P. (1993). 「Prolog の誕生」(PDF) . ACM SIGPLAN Notices . 28 (3): 37. doi :10.1145/155360.155362.
- ^ 「Prolog: a Brief History」 . 2021年11月21日閲覧。
- ^ Pountain, Dick (1984年10月). 「POP and SNAP」. Byte . p. 381. 2013年10月23日閲覧。
- ^ terminusdb / terminusdb、TerminusDB、2020-12-13、2020-12-15取得
さらに読む
- ブラックバーン、パトリック、ボス、ヨハン、ストリグニッツ、クリスティーナ (2006)。今すぐ Prolog を学ぼう!。大学出版。ISBN 978-1-904987-17-8. 2007年8月26日時点のオリジナルよりアーカイブ。2008年12月2日閲覧。
- Ivan Bratko著『Prolog Programming for Artificial Intelligence』第 4 版、2012 年、ISBN 978-0-321-41746-6。書籍の補足資料とソース コード[永久リンク切れ]
- William F. Clocksin、Christopher S. Mellish: Programming in Prolog: Using the ISO Standard。Springer、第 5 版、2003 年、ISBN 978-3-540-00678-7。(この版は ISO Prolog 用に更新されています。以前の版では Edinburgh Prolog について説明していました。)
- William F. Clocksin: Clause and Effect。Prolog Programming for the Working Programmer。Springer、2003、ISBN 978-3-540-62971-9。
- Michael A. Covington、Donald Nute、Andre Vellino、『Prolog Programming in Depth』、1996 年、ISBN 0-13-138645-X。
- マイケル A. コヴィントン、Prolog プログラマのための自然言語処理、1994 年、ISBN 978-0-13-629213-5
- MS Dawe と CMDawe、「Prolog for Computer Sciences」、Springer Verlag 1992 年。
- ISO/IEC 13211: 情報技術 – プログラミング言語 – Prolog国際標準化機構、ジュネーブ。
- Feliks Kluźniak および Stanisław Szpakowicz (Janusz S. Bień の協力あり)。Prolog for Programmers。Academic Press Inc. (ロンドン)、1985 年、1987 年 (Creative Commons ライセンスに基づきsites.google.com/site/prologforprogrammers/ [ permanent dead link ]から入手可能)。ISBN 0-12-416521-4。
- リチャード・オキーフ著『The Craft of Prolog』、ISBN 0-262-15039-5。
- Robert Smith、John Gibson、Aaron Sloman:「対話型言語のための POPLOG の 2 レベル仮想マシン サポート」、Research Directions in Cognitive Science Volume 5: Artificial Intelligence 、 D. Sleemanおよび N. Bernsen編、Lawrence Erlbaum Associates、pp 203–231、1992 年。
- Leon SterlingとEhud Shapiro 著、『The Art of Prolog: Advanced Programming Techniques』、1994 年、ISBN 0-262-19338-8。
- David HD Warren、Luis M. Pereira、Fernando Pereira、「Prolog - 言語とその実装と Lisp との比較」。ACM SIGART Bulletin アーカイブ、第 64 号。1977 年の人工知能とプログラミング言語に関するシンポジウムの議事録、pp 109–115。
