GnuEmacsでPrologを使う

たけおか@AXE (ex.山本ナヲミ)

%% これは、筆者が
技術評論社 刊 ソフトウェアデザイン誌
「つこてなんぼのFreeBSD」
1998年11月
に掲載した原稿をもとにしたものです %%


2007/FEB/12更新

Prolog処理系を動かして、右も左もわからない時は、 「 Prologを使う(動作確認 程度のProlog入門)」 を見てください。



Gnu EmacsとPrologを一緒に使う


Prologは、対話的に使用しますが、そのトップレベルは一般的に貧弱です。
対話的に使用する言語は、Gnu Emacsから使うのが常道です。

Prologもemacs(mule)から起動すると非常に便利です。


1) .emacs設定

emacsに標準のprolog.elは、そもそも元富士通研究所の梅田さんが書かれたものなの ですが、C-PrologとQuintus Prolog用のもので、今のPrologにはLisp変数の初期値 が不適当です。
そこで、.emacsなどに以下のような記述を行います。
処理系ごとに、異なる設定が必要です。



--- MacOS X版 SWI-Prolog
(古いprolog.el)

; for SWI-Prolog
(setq auto-mode-alist
      (append '(("\\.pl" . prolog-mode))
       auto-mode-alist))
(setq prolog-program-name "/usr/local/bin/swipl")
(setq prolog-consult-string "[user].\n")
 
--- end


--- Windows版 SWI-Prolog
(古いprolog.el)

; for SWI-Prolog
(setq auto-mode-alist
      (append '(("\\.pl" . prolog-mode))
       auto-mode-alist))
(setq prolog-program-name "C:/Progra~1/pl/bin/plcon")
(setq prolog-consult-string "[user].\n")
 
--- end

--- FreeBSD版 SWI-Prolog
(GNU Emacs 21.3.1 / prolog.elの prolog-mode-version が "1.9")

; for SWI-Prolog
(setq prolog-system 'swi)
(setq auto-mode-alist
      (append '(("\\.pl" . prolog-mode))
       auto-mode-alist))
(setq prolog-program-name "/usr/local/bin/pl")
 
--- end


--- UNIX版 SB-Prolog
(古いprolog.el)

; for SB-Prolog
(setq prolog-consult-string "consult(user).\n")
(setq prolog-eof-string nil)
 
--- end

と記述します。



2)使い方

そしてemacsを起動したのち、M-x run-prologとして、prologを起動します。
その後、M-x 2 で窓を2つに分割し、片方でソースを編集すると非常に便利です。



そして、ソースを編集している窓から、簡単なキー操作で、Prolog処理系へソー スを読み込ませることができます。
その方法は、


古いEmacsの時
(GNU Emacs 21.2.1とか, prolog.elが古い)
  1. 送り込みたい節の頭でマーキング(C-space)を行う
  2. 送り込みたい部分の最後にカーソルを移動
  3. M-C-x (ESC,C-x)を押下
最近のEmacsの時
(GNU Emacs 21.3.1 / prolog.elの prolog-mode-version が "1.9")
  1. 送り込みたい節の頭でマーキング(C-space)を行う
  2. 送り込みたい部分の最後にカーソルを移動
  3. C-C,C-Rを押下

すると、指定したリージョンが自動的にconsultされます。
これで、もう、Prologマシンは不用になりましたね。:-)

emacsのprologモードでは、インデントを自動的につけてくれます。
Prologのコメントは「%」で開始した行です。
emacsのprologモードの場合、%%がパラグラフの開始で、%は通常のコメントです。



3) prolog.el 1.9版のキーマップ

共通
C-c,?
述語(predicate)のヘルプ
C-c,/
ヘルプ(アプロポス(入力した単語を含む節のヘルプを表示))
C-c,C-d
デバッグ On
C-c,C-t
トレース On
C-c,r
Prolog起動
編集
M-a
節(clause)の始まりへ移動
M-e
節(clause)の終わりへ移動
C-M-a
述語(predicate)定義の始まりへ移動
C-M-e
述語(predicate)定義の終わりへ移動
M-C-c
節(clause)にマーク
M-C-h
述語(predicate)にマーク
M-C-n
リストを進む
M-C-p
リストを戻る
C-c,C-n
述語(predicate)のテンプレートを挿入
C-c,C-s
述語(predicate)のスペックを挿入
M-r
次の節(clause)を挿入
C-c,C-v,a
変数をアノニマス('_')に置き換える
C-c,C-v,C-s
述語(predicate)のスペックを見る
C-m (通常は[Enter])
改行して、インデント
C-c,C-p
述語(predicate)をコンサルトする
C-c,C-r
リージョンをコンサルトする
C-c,C-b
バッファをコンサルトする
C-c,C-f
ファイルをコンサルトする
C-c,C-c,p
述語(predicate)をコンパイルする
C-c,C-c,r
リージョンをコンパイルする
C-c,C-c,b
バッファをコンパイルする
C-c,C-c,f
ファイルをコンパイルする

4) 参考にならない、僕のページ

たけおかのPrologページ 目次

Prologの入門文書に飽きた人に

Prologを使う(動作確認 程度のProlog入門)

実際にProlog処理系を使ったときの、あれこれ

Prologで記述した、StarTrek(1976年頃流行した古いゲーム)

たけおか(竹岡尚三)のホームページ
--- EOF