Example (18.1)
前回の結果をより簡明に表すなら
g`~(?x y:num. &x / &y = sqrt (&2) )`;;
let lemma01=MESON[real_div; REAL_INV_0; REAL_MUL_RZERO]`x / y = z /\ y = &0 ==> z = &0`;;
let lemma02=REAL_FIELD`x / y = z /\ ~(y = &0) ==> x = y * z`;;
let lemma012=MESON[lemma01; lemma02]`!x y z. ~(z = &0) ==> (x / y = z ==> x = y * z)`;;
let lemma03=MESON[ARITH_RULE`&0< &2`; SQRT_POS_LT; REAL_POS_NZ]`~(sqrt(&2) = &0)`;;
let lemma0123=MESON[lemma012; lemma03]`!x y. x / y = sqrt(&2) ==> x = y * sqrt(&2)`;;
let lemma04=REAL_RING`x=y*z:real==>x*x=(z*z)*y*y`;;
let lemma05=MESON[ARITH_RULE`&0<= &2`; SQRT_POW_2; POW_2]`sqrt(&2) * sqrt(&2) = &2`;;e(MESON_TAC[
lemma0123; lemma04; lemma05; REAL_MUL; REAL_INJ;
lemma01; lemma03; thm20120110_2] );;0..0..1..2..8..18..43..102..209..415..828..1522..2863..5177..9204..16018..29216.
.solved at 29476
val it : goalstack = No subgoals
となります.
tacticsを使うまでもなくMESONでOKですが,流れは
# g`~(?x y:num. &x / &y = sqrt (&2) )`;;
val it : goalstack = 1 subgoal (1 total)`~(?x y. &x / &y = sqrt (&2))`
# e(REPEAT STRIP_TAC);;
val it : goalstack = 1 subgoal (1 total)0 [`&x / &y = sqrt (&2)`]
`F`
# e(MP_TAC (MESON[lemma0123; lemma04; lemma05]`&x / &y = sqrt(&2) ==> &x * &x =
&2 * &y * &y`) THEN ASM_SIMP_TAC[REAL_MUL; REAL_INJ]);;
0..0..1..2..6..11..19..29..39..50..solved at 79
val it : goalstack = 1 subgoal (1 total)0 [`&x / &y = sqrt (&2)`]
`~(x * x = 2 * y * y)`
# e(ASM_MESON_TAC[lemma01; lemma03; thm20120110_2]);;
0..0..1..2..8..17..solved at 23
val it : goalstack = No subgoals
と書いたほうが見やすいでしょう.
どちらにせよ,分母を払う処理に手間が掛かります.すなわち,HOL Lightは
# REAL_INV_0;;
val it : thm = |- inv (&0) = &0
のような体系なので,例えば
`!x y z:real. x / y = z ==> x = z * y`
はthmではない(x=&1,y=z=&0)ことに注意せねばなりません.