2026/07/01

Illustration

記事イメージ
※画像はイメージです。本文と直接の関係はありません

Illustration

Illustration

Prolog入門:事実と規則で論理を体験

序章 Prologが初心者に適している理由

Prologは次の3点で初心者に取り組みやすい言語です。 1. 構文がシンプル 「事実」「規則」「クエリ」の3要素だけで基本的なプログラムが書けます。たとえば ?- hi. と1行入力すればすぐに実行結果が得られます。再帰やカットといった高度な構文は、後の章で段階的に学習します。 2. 対話実行環境(対話モード)で試せる 対話モードでクエリを入力すれば、結果が即座に返ります。エラーが出た場合もその場で修正でき、試行錯誤がしやすいです。 3. 結果が明示的に表示される 変数への束縛(例:X = coffee)や true. / false. が直接表示されるため、論理が正しく機能しているかをすぐに確認できます。

これらの特徴により、プログラミング未経験者でも最初のクエリを書いて実行できるハードルが低くなります。次の章以降で、実際に使える基本構文と、次に学ぶべき概念(単一化・バックトラッキング)を紹介します。

第1部 事実・規則・クエリの基本

事実like(taro, coffee).規則buy(taro, X) :- like(taro, X), cheap(X).クエリ?- like(taro, X).

第2部 項・変数・単一化

  • は次の3種類に分かれます。
    1. 定数:小文字で始まるアトムや数値(例:coffeeapple100
    2. 変数:大文字で始める(例:XY
    3. 構造:述語と項を組み合わせた形(例:parent(john, mary)
  • 変数は「単一化(パターンマッチングのようなもの)」のためのプレースホルダーだと考えてください。未束縛の変数は任意の項と一致し、その項が変数に代入されます。すでに値が入っている変数と照合し、一致しなければ失敗(false.)になります。 単一化の例
?- like(taro, X).
X = coffee ;   % 1 番目の解
X = cocoa.     % バックトラッキングで得られる別解

第3部 バックトラッキングによる探索

Prologは バックトラッキング 機構を備えており、ある選択肢が失敗すると自動的に直前の選択肢に戻り、別の候補を試します。たとえば次の事実が定義されているとします。 like(taro, coffee). like(taro, cocoa). このときクエリ ?- like(taro, X). を実行すると、バックトラッキングにより X = coffee ; X = cocoa. と、すべての解が順に列挙されます。事実が存在しない場合は失敗が続くだけで列挙は行われません。Prologは「定義されていないことは偽(false)になる」という 閉世界仮説(Closed World Assumption) に基づいて動作します。したがって、?- unknown_predicate. のように事実が無い述語は false. と返ります。 バックトラッキングは小規模データでは高速に探索できますが、データが増えると探索時間が急激に増大することがあります。特に「効率の悪い書き方」―― 条件の順序が不適切だったり、不要な選択肢を多数用意したりすると、組み合わせが爆発して実行が終わらなくなることがあります。実務で大量データを扱う際は、プログラムの書き方やインデックスの利用などで工夫が必要です。 探索を制御する手段として カット(!) があります。カットはバックトラッキングを途中で止め、以降の選択肢を試さないように指示します。詳細は次章以降で取り上げます。

第4部 ファイルと対話モードの使い方

まずはインストール不要の環境で体験しよう

ブラウザだけで動作する SWISH(https://swish.swi-prolog.org/)は、インストール作業が不要で手軽に Prolog を試すことができる公式のオンライン実行環境です。初心者はまずここで「事実」「規則」「クエリ」の流れを体感すると良いでしょう。

ローカルにインストールする場合

  • macOSbrew install swi-prolog(Homebrew が未インストールの場合は公式サイトの手順をご参照ください)
  • Ubuntu 系sudo apt install swi-prolog
  • その他の OS:公式サイトからインストーラを入手すれば導入できます。

    ファイル作成例(hello_world.pl

% hello_world.pl hi :- write('Hello World!'), nl.

実行例

```bash $ swipl hello_world.pl ?- hi. Hello World! true. 上記のようにクエリを入力すれば、定義した事実や規則からすべての解が得られます。

第5部 主な組み込み述語とリスト構文

  • member/2(メンバー):リストに要素が含まれるかを判定し、変数が入っていれば単一化で値を決定する。
    • member(a, [a,b,c]).true. を返す。
    • member(X, [a,b,c]).X = a ; X = b ; X = c. と順に解を返す。
  • append/3(アペンド):2 つのリストを連結し、結果のリストを第 3 引数に束縛する。 ?- append([a,b], [c,d], L). L = [a,b,c,d].
  • リスト構文[要素1, 要素2, …] の形で書き、先頭と残りは [Head | Tail] と表現できる。 [X | L] = [a,b,c,d]. % X = a, L = [b,c,d] [a,b,c,d] = [X | L]. % X = a, L = [b,c,d] [X, Y | L] = [a,b,c,d].% X = a, Y = b, L = [c,d]
  • 空リスト [] はリストの終端を表し、再帰的な規則を書く際の基底ケースとして頻繁に用いられる。たとえばリストの全要素を表示する規則は次のように記述できる。 printlist([]) :- nl. printlist([H|T]) :- write(H), write(' '), print_list(T).

    第6部 Prologが活躍する分野(例)

  • 人工知能:エキスパートシステムやロボット(例:ソフトバンクの Pepper の会話処理)で利用されることがあります。

  • 推理パズル:ゼブラパズルなど、条件付き問題を neighbor/3member/2 と組み合わせて解く例が多数あります。 > これらは 一例 であり、すべてのケースで Prolog が採用されているわけではありません。

    まとめ

Prologは「事実」「規則」「クエリ」の3要素を基本として、宣言的に論理プログラムを書ける言語です。 - 初心者が比較的容易に体験できること:シンプルな事実と規則を書き、1行のクエリで結果を確認できる。たとえば ?- hi. だけで「Hello World!」が表示されます。 - 次に学ぶべきステップ:単一化とバックトラッキングの基本概念、リスト操作や再帰的規則の書き方を学び、より複雑な問題へ挑戦します。 公式サイト(https://www.swi-prolog.org)から無料で入手できるので、まずは好きな事実をいくつか書いてクエリを試し、論理的思考の楽しさを実感してください。インストールが難しい場合は、ブラウザだけで動作する SWISH(https://swish.swi-prolog.org)を活用すると、手軽に Prolog を体験できます。