AZ-Prolog Version 6は、この度、本格的な64ビット・マルチコアCPUに対応したバージョンを提供します。


[掲示板に戻る]


2 Re: Emcas等でのPrologの使用について
ゲスト

稲葉輝 2011-2-21 19:08  [返信] [編集]

ご質問ありがとうございます。

AZ-Prologパッケージにはインタプリタ上でヒストリ機能、カーソル移動などをサポートする
ウインドウアプリケーションインタプリタ(prolog.exe)と標準入出力版のコンソールインタプリタ(prolog_c.exe)が含まれて
います。

後者の標準入出力を使った(コンパイル)サンプルが%az-prolog%\sample\HDPにありますのでご参照ください。

>type queens.file | mapQueen | reduceQueen

このprolog_c.exe をprolog.exeにリネームしてemacsから呼び出せばよいはずですが、
Linux版(centOS 64bitで検証)では問題なく動作しますが、windows版ですと
出力バッファのクリア(組み込み述語: s_flush/0)を毎度行わないと結果の表示がされない
という不具合があります。

>emacs
emacs: M-x run-prolog
|?- write(aaaa),s_flush.
aaaa
yes

とりあえず、次のような簡単なトップレベルをコンパイルしてprolog.exeを生成し呼び出したところとりあえずは動きます。

>type etop.pl

%%%
top_level:- write('test-AZ-Prolog'),prompt(_,''),repeat,nl,write('?-'),s_flush,read_call,fail.

read_call:- errorset((read(X),call(X)),succ),!,write(X).
read_call:-write(no).
%%%%

>azpc -p etop.pl /e prolog /i /dcurses

>prolog.exe を %AZ-Prolog%\bin へコピーする

>emacs
emacs: M-x run-prolog
-----------------------
test-AZ-Prolog

?-assert(a([],L,L)).
assert(a([],L_8,L_8))

?-assert((a([A|L],C,[A|CL]):-a(L,C,CL))).
assert((a([A_19|L_21],C_23,[A_19|CL_25]):-a(L_21,C_23,CL_25)))

?-a([1,2,3,4],[5,6],L).
a([1,2,3,4],[5,6],[1,2,3,4,5,6])

?-halt.

この不具合はAZ-PrologのWin版をbuildしたMS−Cコンパイラが子プロセスからの出力の場合にはバッファのフラッシュが必要である仕様のためでありました。

AZ-Prologでも並列処理の子プロセスと親プロセスのやりとりでは子側のアプリケーション(mlt_child.pl)でflushをおこなっておりましたが、インタプリタを直接別の親(この場合はemacs)から呼び出だされることを想定して同様な処理が必要でした。

次期バージョンで対処します。

よろしくお願いします。


Emcas等でのPrologの使用について sasagawa888 2011-2-19 13:01
Re: Emcas等でのPrologの使用について 稲葉輝 2011-2-21 19:08
Re: Emcas等でのPrologの使用について sasagawa888 2011-2-22 22:50
管理者ログインサイト利用条件SOFNEC ホームページ
ソフネック株式会社