Prolog 写経記 その 92 edit/1

(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.

Prologユーティリティライブラリ

Prologユーティリティライブラリ

続けて「11 章 Prolog インタプリタからのプログラム編集」へ進みます.
まずは edit/1 を写経します.

解説

edit(File) は特定の Prolog ソースファイルを編集するためにテキストプロセッサを呼び出す.テキストプロセッサの処理が終了した後,ファイルはリコンサルトされる.

ふむ.
今時のマルチタスクというかマルチウィンドウな環境で必要かは疑問ですが...
っていうか,Windoes 上の SWI-Prolog でちゃんと動くのかも疑問ですが...

モード

edit(+)

ふむ.

定義

では,こいつの定義を写経しませう.

edit(File) :-
	update_filename(File),
	name(File, Ascii),
	conc("EDT ", Ascii, CommandL),
	name(Command, CommandL),
	unix(system(Command)),
	reconsult(File), !.

update_filename(File) :-
	retract(editing(_)),
	!,
	asserta(editing(File)).
update_filename(File) :-
	asserta(editing(File)).

うーみゅ...
やってることはコマンドライン文字列を組み立てて,組み込み述語を使ってそれを実行してるだけ.
しかし... Windows で動くのか?

注記

edit/1オペレーティングシステムとのインタフェースを提供する,多くの Prolog インタープリタで利用できる.上記の定義においてはオペレーティングシステムのコマンドは system/1 によって実行されるが,Prolog システムによっては shell/1 となっている.
オペレーティングシステムのコマンドはエディタの呼び出しとファイル名を結合した (1 章 conc/3 参照) 文字列 'EDT file_name' である.EDT のところに通常使用しているテキストプロセッサの名前を代入すればよい.ただし,名前の後にファイル名との区切りとして空白を加えておくこと.

そうですか,その辺を調整すればエディタが動くはずですか...
そんなわけで (どんなわけで?),次のように修正しました.

	conc("edlin ", Ascii, CommandL),

Windows っていうか DOS 時代の標準エディタですが,他に思いつかなかったので.心より恥じる.

では使用例を写経しませう.

15 ?- edit('dl.swi').
ERROR: Undefined procedure: reconsult/1

おぉっ!?
コマンドプロンプトが開きましたよ!!
でもでも,エディタを閉じたら上記のエラー.
どうやら,SWI-Prolog には reconsult/1 がないらしい.
っていうか,今時の Prolog にはないらしい.
古い本によると,consult/1reconsult/1 の違いは,Prolog データベースにすでに存在する述語について,consult/1 が節を単に追加するのに対して,reconsult/1 は既存の節を削除して新たに追加する,つまり述語単位で上書きをするところが違っていたようです.
しかし,今時の Prolog はファイルが異なると述語単位で置き換えるのが普通っぽい?
SWI-Prolog はそんな感じ.
そんなわけで (どんなわけで?),

	consult(File), !.

に変更して実行.

17 ?- edit('dl.swi').
% dl.swi compiled 0.00 sec, 1,724 bytes

Yes

\(^o^)/