Example (18.2)
さらに計算系のproverの利用を控えるなら
let lemma01=MESON[real_div; REAL_INV_0; REAL_MUL_RZERO] `x / y = z /\ y = &0 ==> z = &0`;; let lemma02=MESON[REAL_DIV_RMUL] `x / y = z /\ ~(y = &0) ==> x = z * y`;; (* let lemma02=REAL_FIELD `x / y = z /\ ~(y = &0) ==> x = z * y`;; *) let lemma03=MESON[lemma01; lemma02] `~(z = &0) ==> (x / y = z ==> x = z * y /\ ~(y = &0))`;; let lemma04=MESON[ARITH_RULE`&0< &2`; SQRT_POS_LT; REAL_POS_NZ] `~(sqrt(&2) = &0)`;; (* let lemma04=MESON[LT_0; TWO; REAL_LT; SQRT_POS_LT; REAL_POS_NZ] `~(sqrt(&2) = &0)`;; *) let lemma05=MATCH_MP lemma03 lemma04;; (* let lemma05=MESON[lemma03; lemma04] `x / y = sqrt(&2) ==> x = sqrt(&2) * y /\ ~(y = &0)`;; *) g`x = sqrt(&2) * y /\ ~(y = &0) ==> x * x = sqrt(&2) pow 2 * y * y /\ ~(y = &0)`;; e(REPEAT STRIP_TAC);; e(ASM_SIMP_TAC[REAL_MUL_AC; POW_2]);; e(ASM_MESON_TAC[]);; let lemma06=top_thm();; (* MESON[REAL_MUL_AC; POW_2]`x = sqrt(&2) * y /\ ~(y = &0) ==> x * x = sqrt(&2) pow 2 * y * y /\ ~(y = &0)`;; でも行けるが... let lemma06=REAL_RING `x = sqrt(&2) * y /\ ~(y = &0) ==> x * x = sqrt(&2) pow 2 * y * y /\ ~(y = &0)`;; *) let lemma07=MESON[REAL_POS; SQRT_POW_2]`sqrt(&2) pow 2 = &2`;; (* let lemma07=MESON[ARITH_RULE`&0<= &2`; SQRT_POW_2] `sqrt(&2) pow 2 = &2`;; *) let lemma08=CONV_RULE(REWRITE_CONV[lemma07])(IMP_TRANS lemma05 lemma06);; (* let lemma08=MESON[lemma05; lemma06; lemma07]`x / y = sqrt(&2) ==> x * x = &2 * y * y`;; *) g`~(?x y. &x / &y = sqrt (&2) )`;; e(REPEAT STRIP_TAC);; e(FIRST_X_ASSUM(MP_TAC o (MATCH_MP lemma08)) THEN SIMP_TAC[REAL_MUL; REAL_INJ]);; e(MESON_TAC[thm20120110_2]);; let thm20120112=top_thm();;