Prolog のインストール(Windows) と Emacs の設定

今回は Prolog の Windows へのインストール方法と Emacs の prolog-mode 設定に関する記事です。

Prolog は論理型のプログラミング言語です。
論理型といえば Prolog という感じだったので、 プログラミングパラダイムの話などではよく目にしました。 しかし、実際どんな言語かはよく知りません。 『7つの言語 7つの世界』 に載っていたのを機に、ちょっと試してみようと思い、インストールしてみました。

7つの言語 7つの世界7つの言語 7つの世界
(2011/07/23)
Bruce A. Tate

商品詳細を見る

Prolog のインストール

処理系の選択

Prolog には多くの処理系があります。
Windows では SWI-PrologGNU Prolog あたりがメジャーなようです。
『7つの言語 7つの世界』 では GNU Prolog で説明されていましたが、 ともに ISO 準拠 なので、どちらでも構わないでしょう。


GNU Prolog では MinGW または MSVC++(Visual Studio) が必要みたいです。 SWI-Prolog はなくても使うことができます。
C コンパイラーは 実行ファイル(exe) を作成するのに使われます。 ドキュメントよれば、 SWI-Prolog はなくても動作しますが、 MinGW か VS を使って exe を作ることもできるらしいです。 SWI-Prolog の方が手軽に始められますし、本格的に使うようになったら、 C コンパイラーを使うことにすればいいので、 SWI-Prolog を使う ことにします。

ダウンロードとインストール

インストール用のバイナリーパッケージは以下のページから w32plXXX.exe (w64plXXX.exe) をダウンロードします。 lang_prolog_dl.png

ダウンロードしたインストーラーを実行して、ウィザードに従っていけば、インストールは完了します。

私の場合は一箇所変更したのは拡張子のところです。
lang_prolog_inst.png
Prolog では pl または pro がよく使われる拡張子のようです。
しかし、 pl は Perl の拡張子とかぶっています。 Prolog の方が歴史が古いので、 Prolog は悪くないのですが、ちょっと困ります。
pro の方も何かのプロジェクトファイルで使いそうな名前です。 実際、 Qt のプロジェクトファイルが pro です。
仕方がないので、 私は Prolog の拡張子を prl にしました。

使い方

Prolog は他のプログラミング言語と比べると使い方が特殊です。
大まかな使用手順は次のような感じになっています。
  1. Prolog を起動 (対話モードとなる)
  2. 知識ベース(事実とルール)を登録
  3. 質問をして答えをもらう

知識ベースファイル

知識ベースはファイルに記述し、読み込ませることが多いでしょう。 これが他の言語のソースファイルにあたります。

syllogism.prl :
% 三段論法

% 事実 : ソクラテスは人間である
human(socrates).
% ルール : 人間は死ぬ
die(X) :- human(X).
Prolog では名前の付け方でアトム(固有値)か変数を判断します。 サンプルでは socrates などがアトムで、 X が変数となります。

名前の付け方のルールは次のようになっています。
種別 ルール
アトム 小文字, ' で囲まれた文字 socrates, 'Socrates', 'ソクラテス'
変数 大文字, _ で始まる文字 X, _x, _何
例のように書けば、一応、日本語は使えます。
コメント以外で日本語を使う場合は BOM 付きの UTF-8 で保存します。

ただし、質問等の対話入力で表示がおかしくなったり、 後述する Emacs からの使用で正常に動作しなかったりします。

起動と知識ベースファイルの読み込み

実際に使う場合には、 (インストールフォルダー)/bin 以下にある次の 2 つのどちらかを使用します。
  • swipl-win.exe
  • swipl.exe
swipl.exe はコンソール版なので、 通常 swpl-win.exe を使います。
swipl.exe は Emacs との連携などで使用します。

[スタート] メニューから Prolog を起動すると swipl-win.exe が実行されます。
lang_prolog_exe.png

ここで、 メニューか、次のようなコマンドでファイルを読み込みます。
パス区切りは \\(2 回重ねる) または / です。
  ['ファイルパス'].
また、インストール時に関連付けた拡張子のファイルを実行すると、 Prolog の起動とそのファイルの読み込みが行われます。 おそらく、こちらの方が簡単でしょう。

質問

知識ベースのファイルを読み取った後、 対話的に質問やコマンドを入力します。
質問すると答えが返ってきて、次のプロンプトが出ます。
1 ?- die(socrates). % ソクラテスは死ぬ ? 
true.

2 ?- die(What).     % 何(What)が死ぬ ? 
What = socrates.

知識ベースを変えて、複数の答えが返ってくるようにしてみます。
human(socrates).
human(plato).
human(aristotle).
die(X) :- human(X).
答えが複数ある場合、 一つだけ答えを出して止まります。
ここで、 ; のキーを入力すると次の答えが出ます。
; により順に答えを出していき、すべての答えを出すと、次のプロンプトにいきます。
1 ?- die(What).
What = socrates ;
What = plato ;
What = aristotle.
; ではなく、 a を入力すると途中でやめて、すぐ次のプロンプトにいきます。
GNU Prolog では a で、 すべての答えを出してから、次のプロンプトです。 GNU Prolog と a の動作が違うので、注意して下さい。

他のキーは ?h を入力するとヘルプが表示されるので、そちらで確認してください。

終了

終了する場合にはメニューや [X] ボタンで終了するか、 halt. と入力します。

Emacs の設定

知識ベースのファイルを記述するための Emacs 用のモードのインストール方法について紹介します。

また、 Emacs から Prolog を使えるようにすれば、 ウィンドウを切り替える必要も無いですし、補完もできて非常に便利です。 その設定についても説明しておきます。

Emacs 用モードのインストール

Prolog 用のモード prolog-mode はパッケージが用意されているので、 簡単にインストールすることができます。

[Option] -> [Manage Emacs Packages] メニューでパッケージのモードを開き、 prolog のパッケージをインストールします。

パッケージをインストールすれば、 prolog-mode の auto-load の設定はされます。 ただし、 拡張子との対応付けまではしてくれないようです。
*.prl のファイルを開くと prolog-mode になるように ~/emacs.d/init.el に以下の記述を追加します。 拡張子の部分は自分が使っているものに変えておいてください。
;; Prolog
(add-to-list 'auto-mode-alist '("\\.prl$" . prolog-mode))

Emacs からの Prolog の実行

prolog-mode の設定をすれば、 Prolog を実行できるようになります。
  1. prolog-mode にする
  2. M-x customize-mode で prolog-mode の カスタマイズ画面を開く
  3. [Prolog System] の変数を SWI Prolog に設定
  4. Set, Save
lang_prolog_emacs_type.png

Prolog System の設定で他の変数も SWI Prolog 用のものが使われるようになります。 ただし、 Prolog の実行ファイルパスは指定しておく必要があります。
  1. [Prolog Inferor] を選択して、 ページを移動
  2. [Prolog Program Name] 変数の (swi "pl")の部分をインストール先の swipl.exe に変更
  3. Set, Save
lang_prolog_emacs_progpath.png




使う場合は、 C-c C-f で Prolog を起動し、対象ファイルを読み込みます。(consult)
起動だけの場合は C-c [Retun] です。
lang_prolog_exe_emacs.png

"1 ?- " といったプロンプトは表示されませんが、 なくても動作に問題はありません。

ファイル以外にも、バッファー、選択領域などを読み込ませることができます。
[Prolog] のメニューから操作することもできるので、キーバインドなどはそちらで確認して下さい。


関連記事
Prev.    Category    Next 

Facebook コメント


コメント

No title

Linuxならgccあるし、実行ファイル出力どうするのかリンカのオプション調べたら-g でゴールを設定するっぽい。

hello.pl
main :-
write('Hello World!!'),nil,halt.

>swipl -o hello -g main -c hello.pl
>./hello
>Hello World!!

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
114位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
15位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

12月 | 2025年01月 | 02月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。