読者です 読者をやめる 読者になる 読者になる

prologをやるぞー

prolog

なんかprologをやることになった。

環境

とりあえず、環境を作らなければ話にならないので処理系をインストール。
ubuntu 7.10でprologを検索すると、これだけ出てくる。

UBUNTU-VM [0]% sudo apt-cache search prolog
texlive-lang-polish - TeX Live: Polish
gpp - a general-purpose preprocessor with customizable syntax
gprolog - GNU Prolog compiler
gprolog-doc - documentation for the GNU Prolog compiler
klic - KL1 to C compiler system
prolog-el - Emacs major mode for editing Prolog code
source-highlight - convert source code to syntax highlighted document
swi-prolog - Prolog interpreter
swi-prolog-clib - Interface to system library for SWI Prolog
swi-prolog-doc - Documentation for SWI-Prolog interpreter and XPCE
swi-prolog-http - Interface to system library for SWI Prolog
swi-prolog-semweb - Interface to system library for SWI Prolog
swi-prolog-sgml - SGML/XML/HTML parser for SWI Prolog
swi-prolog-table - Managing external tables for SWI Prolog
swi-prolog-xpce - GUI library for SWI Prolog

とりあえず、GNU Prologが良いと聞いたのでインストール

UBUNTU-VM [0]% sudo apt-get install gprolog gprolog-doc prolog-el

.emacsには以下を追加。prologのファイルは.plらしいけど、perlとかぶる。なので、auto-mode-alistには追加しないで、-*- mode: prolog -*-でやり過ごす。

;; prolog
(require 'prolog)
;(add-to-list 'auto-mode-alist '("\\.pl$" . prolog-mode))
(setq prolog-program-name "/usr/bin/gprolog")
(setq prolog-consult-string "[user].\n")

これで、M-x run-prologでgprologが起動する。prolog-modeのコマンドは

C-c C-l 現在のbufferのファイルをprologに読み込ませる
C-c C-z prologのbufferに移動
C-M-x 指定した範囲のコードを評価する

の三つだけらしい。

prologの終了方法

とりあえず終了させるにはhalt.を使う

prologのプログラム

最初のプログラム

%% -*- mode: prolog -*-
like(troter, prolog).

インタプリタにC-M-xで入力させると

GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- [user].
compiling user for byte code...
like(trotlike(troter, prolog).
end_of_fiend_of_file.
user compiled, 2 lines read - 257 bytes written, 157 ms

yes
| ?- 

そのあと色々入力すると

| ?- like(troter, prolog).

yes
| ?- like(troter, php).

no
| ?- like(troter, ruby).

no
| ?- 

これを見るに、prologに定義するのと、質問するのは違うらしい。

チュートリアル道理にいくと次はこれ。

%% -*- mode: prolog -*-
like(troter, prolog).
like(troter, ruby).

C-c C-lでプログラムを読む込ませて、

GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- ['like-prolog.pl'].
compiling /home/takumi/work/hatena-diary/like-prolog.pl for byte code...
/home/takumi/work/hatena-diary/like-prolog.pl compiled, 3 lines read - 431 bytes written, 379 ms

yes
| ?- like(troter, X).

X = prolog ? ;

X = ruby

yes
| ?- 

GNU PrologとSWI Prologは少し挙動が違うが、;で別解を求めにいく。