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種類に分かれます。
- 定数:小文字で始まるアトムや数値(例:
coffee、apple、100) - 変数:大文字で始める(例:
X、Y) - 構造:述語と項を組み合わせた形(例:
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 を試すことができる公式のオンライン実行環境です。初心者はまずここで「事実」「規則」「クエリ」の流れを体感すると良いでしょう。
ローカルにインストールする場合
- macOS:
brew 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/3やmember/2と組み合わせて解く例が多数あります。 > これらは 一例 であり、すべてのケースで Prolog が採用されているわけではありません。まとめ
Prologは「事実」「規則」「クエリ」の3要素を基本として、宣言的に論理プログラムを書ける言語です。
- 初心者が比較的容易に体験できること:シンプルな事実と規則を書き、1行のクエリで結果を確認できる。たとえば ?- hi. だけで「Hello World!」が表示されます。
- 次に学ぶべきステップ:単一化とバックトラッキングの基本概念、リスト操作や再帰的規則の書き方を学び、より複雑な問題へ挑戦します。
公式サイト(https://www.swi-prolog.org)から無料で入手できるので、まずは好きな事実をいくつか書いてクエリを試し、論理的思考の楽しさを実感してください。インストールが難しい場合は、ブラウザだけで動作する SWISH(https://swish.swi-prolog.org)を活用すると、手軽に Prolog を体験できます。