Prolog 写経記 その 62 counter_dec/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
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/3
は counter_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
ふむ.