Prolog 写経記 その 62 counter_dec/2

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

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

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

続けて counter_dec/2 を写経します.

解説

counter_dec(Count, I) はカウンタ Count の値を 1 減らし,減らす前の値 I を返す.

ふむ.

モード

counter_dec(+, +).

ふむ.

定義

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

counter_dec(Count, I) :-
	recorded(counter, counter(Count, I), Ref),
	erase(Ref),
	I1 is I - 1,
	recorda(counter, counter(Count, I1), _), !.

recorded/3counter_set/2 でも出てきたヤツですが,これの第3引数として取得した参照した「参照」を erase/1 に渡すことにより,登録済みの述語 (っていうか第 1 引数が Count にマッチする節ですね) を削除して,カウンタの値を 1 減じた値を持つ節を recorda/3 で登録する,と.
うーみゅ,なんで counter_set/2 を使わないのだろう?
...
そうか,デクリメントする前の値を返せないからか.うーみゅ...

注記

カウンタには counter_set/2 によって初期値が与えられている必要がある.そうでなければ counter_dec は失敗する.

ふむ.

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

test_decrement :-
	counter_set(count11, 10),
	repeat,
	counter_dec(count11, N),
	write(N), tab(1),
	N == -2.

おっと,テスト用の述語が初登場.
count11 という名前で初期値を 10 のカウンタを作成して,-2 になるまでデクリメントする,と.
さっそく動かしてみませう.

4 ?- test_decrement.
10 9 8 7 6 5 4 3 2 1 0 -1 -2 

Yes

ふむ.