Juventus 2 - 0 Inter

(ToT)
ようやく試合を見ました...
結果以上に完敗という戦評を散々見たせいか,思った以上に善戦していたというか,そんなに圧倒されたという感じではなかったような.
とはいえ,もう一度やれば勝てるって思えるほど強気にもなれませんが...
まぁ,シーズン始まったばかりだし,J.Zanetti の復帰も近いようだし,まだまだこれからですよ.たぶん...


CanCam 11 月号 エビちゃんベストセレクション 16

CanCam2005年11月号の蛯原友里ちゃん

CanCam から,お気に入りの蛯原友里ちゃんを紹介しようというこのコーナー.
今日はサマンサティアラとのタイアップ「お呼ばれジュエリーできました!」から P281 の友里ちゃん.
なんと魅惑的なこの瞳...
その透明感は大人げない!!
そんなわけで (どんなわけで?),やっぱり CanCam 買うしか!!


Prolog 写経記 その 61 counter_set/2

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

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

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

昨日で「4章 算術演算」は終了してました.
そんなわけで (どんなわけで?),今日からは「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/3erase/1 を使っています.
recorded/3 は,第 1 引数で指定されたキーに対応する項 (recorda/3Prolog データベースに登録されたもの) とその「参照」を返します.
erase/1 は「参照」で示されたキーと項のマッピングProlog データベースから取り除いてくれます.
二つめの節はキーがまだ登録されていなかった場合でも述語が成功するようにするためのものですね.


counter_set/2 では,キーとして counter というアトムを使っています.
counter_set/2 の第 1 引数で指定されたカウンタの名前は Prolog データベースのキーそのものとしては使っておらず,登録される述語の引数として使われています.

注記

Prolog 定数ならどれでもカウンタの名前として用いることができる.カウンタの値としては整数がとられる.

ふむ.

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

counter_deccounter_inc 参照.

...
counter_deccounter_inc に続く...

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

ふむ.


Prolog 写経記 その 63 counter_inc/2

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

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

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

続けて 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 を写経します.元ネタはこちら.

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

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

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

解説

counter_is(Count, I) はカウンタ Count の現在値 I を返す.

ふむ.

モード

counter_is(+, -).

ふむ.

定義

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

counter_is(Count, I) :-
	recorded(counter, counter(Count, I), _), !.

recorded/3Prolog データベースからマッチする項を選んでいます.

注記

カウンタには 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 章 カウンタ」も終了♪
なんかあっさり.