7.1 Conversionals
conversionsによる処理の優位性は,それらを制御して,より複雑なconversionを生成するconversionalと呼ばれる関数(: conv -> conv =
今回はその中でも,複数のconversionsを組み合わせるものを紹介します.
■ まず,次に定義するTHENC関数
let (THENC) =
fun conv1 conv2 t ->
let th1 = conv1 t in
let th2 = conv2 (rand(concl th1)) in
TRANS th1 th2;;
は3変数関数ですが,curryingにより,第1,2引数に対する
conv1 THENC conv2 THENC conv3 ...;;
の書式が可能な2項演算子となり,例えば
# (BETA_CONV THENC NUM_REDUCE_CONV) `(\x.x+5*x)7`;;
val it : thm = |- (\x. x + 5 * x) 7 = 42
のようにconversionsを合成します.
当然,合成されたconvの何れかが失敗すると,合成全体のconvも失敗します.
# (NUM_MULT_CONV THENC NUM_ADD_CONV) `1+2`;;
Exception: Failure "term_pmatch".
■ 一方,conv1が失敗した時にconv2を実行,以下繰り返すようなconvを作るのが
conv1 ORELSEC conv2 ORELSEC conv3 ...;;
の書式が可能な2項演算子 ORELSEC です.
# (NUM_MULT_CONV ORELSEC NUM_ADD_CONV) `1+2`;;
val it : thm = |- 1 + 2 = 3
■ そして,TRY_CONV conv tは,convが成功したときはその結果を,失敗したときは|- t ==> t を返し,CHANGED_CONV conv t は,convが|- t ==> tを返したときに失敗し,その他のときはその結果を返す,ようなconvを作るconversionalです.
# TRY_CONV NUM_MULT_CONV `1*2`;;
val it : thm = |- 1 * 2 = 2
# NUM_MULT_CONV `1+2`;;
Exception: Failure "term_pmatch".
# TRY_CONV NUM_MULT_CONV `1+2`;;
val it : thm = |- 1 + 2 = 1 + 2
# NUM_REDUCE_CONV `x+1`;;
val it : thm = |- x + 1 = x + 1
# CHANGED_CONV NUM_REDUCE_CONV `x+1`;;
Exception: Failure "CHANGED_CONV".
# CHANGED_CONV NUM_REDUCE_CONV `2+1`;;
val it : thm = |- 2 + 1 = 3
■ REPEATC conv t は失敗するまで,convで得られた結果にconvを繰り返し適用します.
# BETA_CONV `(\x. (\y. x + y) 2) 1`;;
val it : thm = |- (\x. (\y. x + y) 2) 1 = (\y. 1 + y) 2
# REPEATC BETA_CONV `(\x. (\y. x + y) 2) 1`;;
val it : thm = |- (\x. (\y. x + y) 2) 1 = 1 + 2
# ( (REPEATC BETA_CONV) THENC NUM_ADD_CONV ) `(\x. (\y. x + y) 2) 1`;;
val it : thm = |- (\x. (\y. x + y) 2) 1 = 3