Prolog 写経記 その 87 retractall/1

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

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

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

今日は retractall/1 を写経します.

解説

retractall(X) は頭部 X を持つすべての節をデータベースから削除する.

ふむ.

モード

retractall(+)

ふむ.

定義

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

retract_all(X) :-
	retract(X),
	fail.
retract_all(X) :-
	retract((X :- _)),
	fail.
retract_all(_).

...
こらこら,タイトルは retractall なのに勝手に retract_all にするってどういうことよ?
まぁ,どうせ組み込みの retractall とかぶるから名前変えないといけなかったわけですが.


ともあれ (JW),定義自体はたいしたことなし.
fail/0 を使って事実 (頭部のみ) とルール (頭部と本体) のそれぞれの削除が成功しようが失敗しようが 3 つの節を全部実行して成功裡に終わるというのが目新しいくらいでしょうか.

注意

組み込み述語 retractretractall の引数の間には相違がある.retract(X) は節 X をデータベースから削除するが,retractall(X) は頭部 X を持つ節のすべてを削除する.

ほいほい.

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

2 ?- assert(employee(john)),
assert(employee(tom)),
assert(employee(paul)),
listing(employee).
:- dynamic employee/1. employee(john). employee(tom). employee(paul). Yes 3 ?- retract_all(employee(_)), listing(employee). :- dynamic employee/1. Yes

ふむ.
登録した述語がきれいさっぱりまるっと消えていますね.


そんなわけで (どんなわけで?),「9 章 標準述語の導入」は終了です.
次回からは「10 章 手続き的構造の導入」です.
うーみゅ,あまり興味ないテーマが続きますな.
手続き的な思考しかできない脳を宣言的に鍛えるために Prolog 始めたんだけどなぁ.
分かってないなぁ.
っていうか,読む本を間違えているってことですかそうですか.
無念だ.


でも大丈夫です.
読んでる Prolog 本はこれだけではありません.
最近はもっぱら「The Art of Prolog 2ed (isbn:0262193388)」かな.
Prolog 本というより,たまたま Prolog を使っている論理プログラミング本という気配が漂っていてちょっとしんどいですけど.
あとは「The Craft of Prolog (isbn:0262150395)」も.こちらは「Effective Prolog」みたいなのりでよさげ.