見出し画像

SWI-Prolog 実行ファイルの作成方法など

SWI-Prologのマニュアルがあまり親切ではないようなのでよく使うやり方などメモ程度に書き残しておく。普段は AZ-Prologを使っているので互換性というかそちらだとどう書くか、についても説明する。
prologソースをコンパイルして実行ファイルを作成し、それをpythonやシェルスクリプトから実行させるケースがあると思う。そのときには、以下のように書く。ソースは test.pl とし、実行ファイル名を test.out とする。-g オプションで Goal の述語を指定する(ここではtoplevel)。

$ swipl -o test.out -g toplevel -c test.pl
$ cat test.pl
toplevel :- 
    write('Hello World'),nl,
    current_prolog_flag(argv,ArgvList),
    ArgvList = [P1,P2], write(P1),nl,write(P2),nl,halt.

test.out を実行させる( ./test.out param1 param2 のように2つ引数を渡す)と、 Hello World に続いて、 param1, param2 が出力される。このように、current_prolog_flag(argv,List) を使うと実行時に引数を渡すことができる。
AZ-Prologの場合、 get_parameter/1 を用いて、さらに実行時に -p オプションで test.out -p param1 param2 のように実行すると ['param1','param2'] のようにアトムのリストを取得できる。

AZ-Prologの例
prolog -p 123 param2
?- get_parameter(L).
['123', param2]
yes


なお、toplevel でエラーがあった場合、catchしたいときには、以下のように catch/3 を使ってエラー時には何もしない(write('') の部分を変更すればエラー時に実行される述語になる)ようにできる。toplevel_tryにソース本体のプログラムを記述する。

toplevel :- catch( toplevel_try, Error, write('') ), !, halt.
toplevel_try :- 
        ...
        ...
        halt.


いいなと思ったら応援しよう!