Prolog 写経記 その 93 edit/0

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

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

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

続けて edit/0 を写経します.

解説

editedit/1 によって作られた Prolog ソースファイルを編集するために,ユーザが定義したテキストプロセッサを呼び出す.テキストプロセッサの処理が終了した後,ファイルはリコンサルトされる.

ふむ.
これ,直前に edit/1 で編集したファイルを再度編集するためのもの,ですね.

定義

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

edit :-
	editing(File), !,
	name(File, Ascii),
	conc("vi", Ascii, CommandL),
	name(Command, CommandL),
	unix(system(Command)),
	reconsult(File).
edit :-
	write('File not specified, use edit/1'),
	nl.

ココでの数少ないポイントは初っぱなの

	editing(File), !,

ですね.
これ,先ほどの edit/1 で出てくる下請け述語

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

ココで asserta/1 によって動的に登録されている述語です.
edit/1 を実行するたびに,その時のファイル名を Prolog データベースに登録しているわけね.


ともあれ (JW),例によって reconsult/1 はないので consult/1 に変更しておきます.
それから,使用するエディタが vi になっているので edlin にします.

注記

edit/1 の注記を参照のこと.

らじゃあ.

では使用例を写経しませう.
...
が,例が掲載されていない...
まぁいいや.これくらい書いてなくても使えます.

23 ?- edit.

No

むぅ?
どういうことよっ!?
...
調べたところ,以下の問題だと判明.

	conc("vi", Ascii, CommandL),

conc/1 の第 1 引数なんですが,コマンド名の後ろにスペースがないのでファイル名とくっついちゃいます.(^^;
そんなわけで (どんなわけで?),空白を加えて再度お試し.

30 ?- edit.
% dl.swi compiled 0.00 sec, 0 bytes

Yes

\(^o^)/
ちなみに,SWI-Prolog を再起動していきなり edit/0 を実行すると...

2 ?- edit.
ERROR: Undefined procedure: editing/1
   Exception: (7) edit ? creep

...
昔の Prolog は述語が登録されていない場合でも普通に失敗してバックトラックしていたのでしょうか?
今時のというか SWI-Prolog では例外が飛んでバックトラックしないので,2 番目の節は役に立ちませんね.
まぁいいや.


ともあれ (JW).


そんなわけで (どんなわけで?).


ついについに,「Prolog ユーティリティライブラリ」の写経完了です!! \(^o^)/
予定よりも早かったなぁ.何度かまとめて一気に消化したりしたからなぁ.
これで Prolog に慣れたかというと微妙ですが,ほぼ毎日 Prolog する動機にはなりましたね.
問題は,これで日記のレギュラーコーナーが終わってしまうこと.
また技術ネタのない日記に逆戻りだぜ (苦笑).