導入
Prolog は、 INSEAで発明された主要な論理プログラミング言語の 1 つです。プロローグという名前は、LOGIC PROGRAMING の頭字語です。これは、1972 年頃にアラン・コルメラウアーとフィリップ・ルーセルによって作成されました。目標は、コンピューターが実行する必要がある一連の命令を段階的に定義するのではなく、ロジックの表現力を使用できるようにするプログラミング 言語を作成することでした。
Prolog は、多くの人工知能プログラムやコンピューター言語処理 (特に自然言語を含むプログラム) で使用されています。その構文と意味論は非常に単純かつ明確であると考えられています (当初の目的は、コンピューター サイエンスに不慣れな言語学者にツールを提供することでした)。 Prolog の現在の実装につながった研究の多くは、基礎としてバリアントを使用した第 5 世代コンピュータのプロジェクトの影響から生まれました。
Prolog は、一次述語の計算に基づいています。ただし、初期バージョンでは Horn 節のみを受け入れるように制限されています (Prolog の最新バージョンでは、特に失敗による否定の処理など、より複雑な述語を受け入れます)。 Prolog プログラムの実行は、事実上、一次解決によって証明される定理の応用です。基本的な概念は、統合、再帰、バックトラッキングです。 Prolog 解決アルゴリズムは、SLD 解決の拡張に基づいています。
Prolog の特徴の 1 つは、不定の順序で知識ベースを構築できることです。 Prolog は、そのような知識ベース (演繹的データベース概念) に関連する一連の論理問題を解決できます。

さまざまな種類の用語
Prolog は、プログラミング言語が行う通常の方法でデータ型を使用しません。これは主に、Prolog ではプログラム データとプログラム自体の間に実際の区別がないという事実によるものです (宣言的プログラミングの原則)。これに関連して、以下のタイプを含む用語と呼ばれる語彙要素について話す必要があります。
原子
定数テキストはアトムの形式で導入されます。アトムは、小文字で始まる文字、数字、およびサブダッシュで構成されるシーケンスです。通常、英数字以外のアトムが必要な場合は、アポストロフィで囲みます (例: ‘+’ はアトム、+ は演算子)。

数字
ほとんどの Prolog 実装では、整数と浮動小数点数が区別されません。
変数
変数は、大文字で始まる文字、数字、アンダースコアのセットを使用して指定します。
たとえば、「X3」と「Unit_Price」は変数名です。
Prolog 環境では、手続き型プログラミング言語とは異なり、変数は値を割り当てることができるコンテナーではありません。その動作は、最初は未定義の形式に近いものですが、 unificationによってますます明確になります。変数が統合されると、その値は同じ評価ブランチ内で変更できなくなります (ただし、トレースバックすると、この統合に戻ることができます)。
匿名変数はアンダースコア (_) で記述されます。名前がアンダースコアで始まる変数も匿名変数です。
複合用語
複合項は、Prolog が複雑なデータを表現できる唯一の方法です。複合項は、ファンクターとも呼ばれるヘッド (アトムである必要があります) とパラメーター (型の制限なし) で構成されます。パラメータの数は用語のアリティとも呼ばれ、重要です。複合項はその頭部とアリティによって識別され、通常はファンクター/アリティとして記述されます。
複合用語の例:
- 愛(ロミオ、ジュリエット)
- 関手はaimsとアリティ2で、複合項は
aime/2と書かれます。
- 関手はaimsとアリティ2で、複合項は
- f(g(X),h(Y))
- 関手はf 、アリティは 2 で、複合項は
f/2と書きます。
- 関手はf 、アリティは 2 で、複合項は
- 初期化
- 関手は初期化とアリティ 0 で、複合項は
initialisation/0と書かれます。したがって、アトムはアリティ 0 の複合項です。
- 関手は初期化とアリティ 0 で、複合項は

リスト
リストは再帰的な構造 (アリティ 2 の関手.を使用するため、内部表現レベルでは複合項) によって定義されるため、独立したデータ型ではありません。
- アトム [] は空のリストです。
- TがリストでHが要素の場合、用語 ‘.'( H , T ) はリストです。
head と呼ばれる最初の要素はHで、その後にTまたは tail として示されるリストの残りの内容が続きます。リスト[1, 2, 3]は、内部的には ‘.'( 1 , ‘.'( 2 , ‘.'( 3 , []))) として表されます。 構文のショートカットは [ H | 3 ] です。 T ]、主にルールを構築するために使用されます。リスト全体は、最初の要素に作用し、次にリストの残りの要素に作用することによって再帰的に処理できます。
プログラマが簡単にできるように、リストはさまざまな方法で構築および分解できます。
- 要素の列挙: [abc, 1, f(x), Y , g( A , rst)]
- head 要素の抽出: [abc | L1 ]
- いくつかの head 要素の抽出: [abc, 1, f(x) | L2 ]
- 用語展開: ‘.'(abc, ‘.'(1, ‘.'(f(x), ‘.'( Y , ‘.'(g( A , rst), []))))
文字列
文字列は通常、アポストロフィで囲まれた一連の文字として記述されます。これらは多くの場合、内部的には ASCII コードのリストによって表されます。
