お仕事スタイル
- 黒いハラコのライダーズブルゾン (TOM FORD FOR GUCCI 04-05AW)
- グレイでウールシルクのタートルネックニット (TOM FORD FOR GUCCI 04-05AW)
- 黒いベルベットのパンツ (JIL SANDER 03-04AW)
- 黒いポインテッドトゥのブーツ (JIL SANDER 03-04AW)
Prolog 写経記 その 89 case/1
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
case/1
を写経します.解説
2 つの異なった
case
の定義がある.
case X of [X1: Q1, X2: Q2, ..., Xn: Qn]
は,もしX
がX1
に合致すればQ1
を実行し,そうでなくもしX
がX2
に合致すればQ2
を実行するというふうになる.もしX
に合致するXi
がなければcase
は成功する.
case X of [X1: Q1, X2: Q2, ..., Xn: Qn otherwise R]
は,もしX
と合致するXi
があれば,上と同じである.もしX
に合致するXi
がなければR
が実行される.
ふむ.
Xn: Qn
と otherwise
の間にはカンマがないのね.
モード
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
を処理するためのもの.
それより前の X1
〜Xn-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^)/