めざましテレビ

今日の早耳ムスメは JESSICA ちゃん,おだいは「ワイド&ひざ丈が人気!! おしゃれパンツスタイル」.
こちらも撮りだめですか,そうですか.
ともあれ (JW),ワイドパンツを強調したかったのかもしれないけれど,なんか広角気味の画角がなんか変.特に最初のヤツ.
個人的には膝上はタイトな方が好きだなぁ.
ひざ丈は... うーみゅ,あまり好きじゃないかもぉ〜.


ともあれ (JW),これでスタジオへ行っていたらどうなるのか,思わず想像してしまいました.
ごめんちゃい>三人ムスメ

Prolog 写経記 その 89 case/1

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

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

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

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

解説

2 つの異なった case の定義がある.
case X of [X1: Q1, X2: Q2, ..., Xn: Qn] は,もし XX1 に合致すれば Q1 を実行し,そうでなくもし XX2 に合致すれば Q2 を実行するというふうになる.もし X に合致する Xi がなければ case は成功する.
case X of [X1: Q1, X2: Q2, ..., Xn: Qn otherwise R] は,もし X と合致する Xi があれば,上と同じである.もし X に合致する Xi がなければ R が実行される.

ふむ.
Xn: Qnotherwise の間にはカンマがないのね.

モード

case(+)

ふむ.

定義

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

:- op(900, fx, case).
:- op(850, xfx, of).
:- op(800, xfx, otherwise).
:- op(750, xfx, ':').
case X of [Xn: Q otherwise R] :-
	if X = Xn then Q else R, !.
case X of [Xn: Q] :-
	if X = Xn then Q, !.
case X of [Xi: Q | Others] :-
	if X = Xi then Q else (case X of Others).

昨日の if/1 のおかげでなんとなく見ただけで分かる,かな.
3 つある節のうち,はじめの 2 つの節はリストの最後の条件 Xn を処理するためのもの.
それより前の X1Xn-1 は最後の節によって再帰的に処理されます.

注意

上の定義では X と合致する値が複数ある場合を考慮していない.これには,可能な値をリストに表し,X = Xi の代わりにリストの要素であるか否かのテストを行えばよい.

ほいほい.

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

menu_selection :-
	write('Selection?'),
	get0(Answer),
	case Answer of [
		a:
			menu_action1,
		b:
			menu_action2,
		h:
			(help, menu_selection),
		x:
			halt
		otherwise (
			write('Illegal answer'), nl,
			menu_selection
		)
	].

対話的ですね.
これの使用例はないので適当に試すべし.
その前に,上で使われているけど未定義のやつらを適当に.

menu_action1 :-
	write('action1').
menu_action2 :-
	write('action2').
help :-
	write('a: menu_action1'), nl,
	write('b: menu_action2'), nl,
	write('h: help'), nl,
	write('x: halt'), nl.

お試し.

2 ?- menu_selection.
Selection?a
Illegal answer
Selection?
Illegal answer
Selection?b
Illegal answer
Selection?
Illegal answer
Selection?h
Illegal answer
Selection?
Illegal answer
Selection?x
Illegal answer
Selection?
Illegal answer
Selection?

はぁ??
なんか,全然うまくいっていませんね...
どうやら原因は menu_selection/0

	get0(Answer),

と思われ.
get0/1 は標準入力から 1 文字読み込んでくれますが,それは文字コードを表す整数値.
それなのに,比較で使っている a とか b は項なので,一致しようがない,とみた.
せっかくさぁ,「6 章 入力ユーティリティ」で read_line/1 を定義してるんだから,それを使おうよ?

	read_line(Answer),

そんなわけで (どんなわけで?),修正して再実行♪

3 ?- menu_selection.
Selection?a
action1

Yes
4 ?- menu_selection.
Selection?b
action2

Yes
5 ?- menu_selection.
Selection?h
a: menu_action1
b: menu_action2
h: help
x: halt
Selection?x

ばっちり!! \(^o^)/


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

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

CanCam から,お気に入りの蛯原友里ちゃんを紹介しようというこのコーナー.
今日はこの日はフェラガモとのタイアップ「最愛 BAG でスペシャルな冬が始まる...♥」から P160 の友里ちゃん.
これまたカッコいいめの友里ちゃん.おでこ出さなくても格好いいときはカッコいいのだ.
そんなわけで (どんなわけで?),やっぱり CanCam 買うしか!!