7.4 Rewriting (1)
このREWR_CONV(: thm -> term -> thm =
例えば
# let tm = `(a + b) + ((c + d) + e) + f + g + h` ;;
val tm : term = `(a + b) + ((c + d) + e) + f + g + h`
の括弧を整理するには
# NUM_REDUCE_CONV tm;;
val it : thm =
|- (a + b) + ((c + d) + e) + f + g + h =
(a + b) + ((c + d) + e) + f + g + h
としても上手く行きませんので
# ADD_ASSOC;;
val it : thm = |- !m n p. m + n + p = (m + n) + p
というtheoremを繰り返し適用すれば
# TOP_DEPTH_CONV (REWR_CONV ADD_ASSOC) tm;;
val it : thm =
|- (a + b) + ((c + d) + e) + f + g + h =
((((((a + b) + c) + d) + e) + f) + g) + h
といった具合になり,括弧を消去したいなら
# GSYM ADD_ASSOC;;
val it : thm = |- !m n p. (m + n) + p = m + n + p
# TOP_DEPTH_CONV (REWR_CONV (GSYM ADD_ASSOC) ) tm;;
val it : thm =
|- (a + b) + ((c + d) + e) + f + g + h = a + b + c + d + e + f + g + h
とすればよいでしょう.ちなみに
# get_infix_status "+";;
val it : int * string = (16, "right")
ですから,右寄りの括弧は無視できます.
# `a + (b + ((c + d) + e) + f) + (g + h)` ;;
val it : term = `a + (b + ((c + d) + e) + f) + g + h`
# TOP_DEPTH_CONV (REWR_CONV (GSYM ADD_ASSOC) ) it;;
val it : thm =
|- a + (b + ((c + d) + e) + f) + g + h = a + b + c + d + e + f + g + h
ここで用いたgeneralized symmetry GSYM(: thm -> thm =