Japanese GP M.Schumacher 7th
(ToT)
画面にはたくさん映りましたねぇ... 抜かれる役で.無念だ.
ともあれ (JW),レースは楽しめました.
Raikkonen と Alonso すごすぎ.
たっくん... もうダメポ.
Juventus 2 - 0 Inter
(ToT)
ようやく試合を見ました...
結果以上に完敗という戦評を散々見たせいか,思った以上に善戦していたというか,そんなに圧倒されたという感じではなかったような.
とはいえ,もう一度やれば勝てるって思えるほど強気にもなれませんが...
まぁ,シーズン始まったばかりだし,J.Zanetti の復帰も近いようだし,まだまだこれからですよ.たぶん...
出演予定 TV 番組
情報なしですぅ...
Prolog 写経記 その 61 counter_set/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
そんなわけで (どんなわけで?),今日からは「5章 カウンタ」へ進みます.
まずは
counter_set/2
を写経します.Prolog の変数は述語 (の節) に閉じたスコープを持つ,いわばローカル変数のみで,しかも一度値が具体化されると破壊的代入はできないわけですが,この章ではグローバル変数のようなスコープを持ち,値を増減することのできるカウンタを実装するようです.
なんかいやな感じ...
昨日の random/2
同様,えぐい方法を使う... んだろうなぁ.
解説
counter_set(Count, I)
はカウンタCount
の値を望む数I
にセットする.
ふむ.
モード
counter_set(+, +).
ふむ.
定義
では,こいつの定義を写経しませう.
counter_set(Count, I) :- integer(I), counter_remove(Count), recorda(counter, counter(Count, I), _), !. counter_remove(Count) :- recorded(counter, counter(Count, _), Ref), !, erase(Ref). counter_remove(_).
下請けの述語 counter_remove/1
を使っています.
まずは本体から.
第 2 引数が整数かチェックした後,下請け述語 counter_remove/1
でカウンタをリセットして,recorda/3
でカウンタの値を設定しています.
この recorda/3
,ISO 標準には含まれていないらしく,「Programming in Prolog (isbn:3540006788)」や「Prolog Programming for Artificial Intelligence (isbn:0201403757)」には解説されていません.
でもでも,SWI-Prolog はこれをサポートしていて,ドキュメントにも説明がありました.
- recorda(+Key, +Term, -Reference)
- Assert Term in the recorded database under key Key. Key is an integer, atom or term. Reference is unified with a unique reference to the record (see erase/1).
要するに第 1 引数をキーとして第 2 引数で指定された項を Prolog データベースに登録してくれるわけですね.
下請けの counter_remove/1
は二つの節を持ち,最初の節では recorded/3
と erase/1
を使っています.
recorded/3
は,第 1 引数で指定されたキーに対応する項 (recorda/3
で Prolog データベースに登録されたもの) とその「参照」を返します.
erase/1
は「参照」で示されたキーと項のマッピングを Prolog データベースから取り除いてくれます.
二つめの節はキーがまだ登録されていなかった場合でも述語が成功するようにするためのものですね.
counter_set/2
では,キーとして counter
というアトムを使っています.
counter_set/2
の第 1 引数で指定されたカウンタの名前は Prolog データベースのキーそのものとしては使っておらず,登録される述語の引数として使われています.
例
では使用例を写経しませう.
counter_dec
とcounter_inc
参照.
...
counter_dec
と counter_inc
に続く...
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
ふむ.
Prolog 写経記 その 63 counter_inc/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
counter_inc/2
を写経します.解説
counter_inc(Count, I)
はカウンタCount
の値を 1 増やし,増やす前の値I
を返す.
ふむ.
モード
counter_inc(+, +).
ふむ.
定義
では,こいつの定義を写経しませう.
counter_inc(Count, I) :- recorded(counter, counter(Count, I), Ref), erase(Ref), I1 is I + 1, recorda(counter, counter(Count, I1), _), !.
基本的に counter_dec/2
と同じ.以上.
注記
カウンタには
counter_set/2
によって初期値が与えられている必要がある.そうでなければcounter_inc
は失敗する.
ふむ.
例
では使用例を写経しませう.
test_increment :- counter_set(i, 1), repeat, counter_inc(i, N), write(N), tab(1), N == 7.
またまたテスト用の述語が登場.
今度のカウンタの名前は i
.デクリメントの counter11
とは違って,随分手抜きな名前だなぁ.
さっそく動かしてみませう.
5 ?- test_increment. 1 2 3 4 5 6 7 Yes
ふむ.
Prolog 写経記 その 64 counter_is/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
counter_is/2
を写経します.解説
counter_is(Count, I)
はカウンタCount
の現在値I
を返す.
ふむ.
モード
counter_is(+, -).
ふむ.
定義
では,こいつの定義を写経しませう.
counter_is(Count, I) :- recorded(counter, counter(Count, I), _), !.
recorded/3
で Prolog データベースからマッチする項を選んでいます.
注記
カウンタには
counter_set/2
によって初期値が与えられている必要がある.そうでなければcounter_is
は失敗する.
ふむ.
例
では使用例を写経しませう.
check_counter(Cname) :- counter_is(Cname, N), !, write(Cname), write('is set to'), write(N), nl. check_counter(Cname) :- write(Cname), write('is not initialized'), nl.
またまたテスト用の述語が登場.
ちなみに書籍では 2 番目の節の引数名が Coname
となっていますが,おそらく Cname
の間違いです.あるいはその後の write/1
の引数目が Coname
の間違いです.どうでもいいか.
さっそく動かしてみませう.
12 ?- check_counter(count11). count11is set to-3 Yes 13 ?- check_counter(i). iis set to8 Yes
ふむ.
空白がないので見づらいよ...
まぁいいか.
そんなわけで (どんなわけで?),「5 章 カウンタ」も終了♪
なんかあっさり.