Prolog のインストール(Windows) と Emacs の設定
今回は Prolog の Windows へのインストール方法と Emacs の prolog-mode 設定に関する記事です。
Prolog は論理型のプログラミング言語です。論理型といえば Prolog という感じだったので、 プログラミングパラダイムの話などではよく目にしました。 しかし、実際どんな言語かはよく知りません。 『7つの言語 7つの世界』 に載っていたのを機に、ちょっと試してみようと思い、インストールしてみました。
7つの言語 7つの世界 (2011/07/23) Bruce A. Tate 商品詳細を見る |
Prolog のインストール
処理系の選択
Prolog には多くの処理系があります。Windows では SWI-Prolog や GNU 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) をダウンロードします。ダウンロードしたインストーラーを実行して、ウィザードに従っていけば、インストールは完了します。
私の場合は一箇所変更したのは拡張子のところです。
Prolog では pl または pro がよく使われる拡張子のようです。
しかし、 pl は Perl の拡張子とかぶっています。 Prolog の方が歴史が古いので、 Prolog は悪くないのですが、ちょっと困ります。
pro の方も何かのプロジェクトファイルで使いそうな名前です。 実際、 Qt のプロジェクトファイルが pro です。
仕方がないので、 私は Prolog の拡張子を prl にしました。
使い方
Prolog は他のプログラミング言語と比べると使い方が特殊です。大まかな使用手順は次のような感じになっています。
- Prolog を起動 (対話モードとなる)
- 知識ベース(事実とルール)を登録
- 質問をして答えをもらう
知識ベースファイル
知識ベースはファイルに記述し、読み込ませることが多いでしょう。 これが他の言語のソースファイルにあたります。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 は Emacs との連携などで使用します。
[スタート] メニューから Prolog を起動すると swipl-win.exe が実行されます。
ここで、 メニューか、次のようなコマンドでファイルを読み込みます。
パス区切りは \\(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 を実行できるようになります。- prolog-mode にする
- M-x customize-mode で prolog-mode の カスタマイズ画面を開く
- [Prolog System] の変数を SWI Prolog に設定
- Set, Save
Prolog System の設定で他の変数も SWI Prolog 用のものが使われるようになります。 ただし、 Prolog の実行ファイルパスは指定しておく必要があります。
- [Prolog Inferor] を選択して、 ページを移動
- [Prolog Program Name] 変数の
(swi "pl")
の部分をインストール先の swipl.exe に変更 - Set, Save
使う場合は、 C-c C-f で Prolog を起動し、対象ファイルを読み込みます。(consult)
起動だけの場合は C-c [Retun] です。
"1 ?- " といったプロンプトは表示されませんが、 なくても動作に問題はありません。
ファイル以外にも、バッファー、選択領域などを読み込ませることができます。
[Prolog] のメニューから操作することもできるので、キーバインドなどはそちらで確認して下さい。
- 関連記事
-
- 多重継承禁止とインターフェース, Mix-in の許可
- Io 言語のインストール(Windows)と Emacs モードの設定
- Prolog のインストール(Windows) と Emacs の設定
- JDKのインストール(Windows)と Java 関連用語の説明
- Scala のインストール(Windows)と Emacs モードの設定
Facebook コメント
コメント
No title
hello.pl
main :-
write('Hello World!!'),nil,halt.
>swipl -o hello -g main -c hello.pl
>./hello
>Hello World!!