有理整数の性質 by EXPAND_CASES_CONV.
# map(fun t-> MATCH_MP t (ARITH_RULE `~(5=0)`))[MOD_MOD_REFL; MOD_ADD_MO D; MOD_MULT_MOD2];; val it : thm list = [|- !m. m MOD 5 MOD 5 = m MOD 5; |- !a b. (a MOD 5 + b MOD 5) MOD 5 = (a + b) MOD 5; |- !m p. (m MOD 5 * p MOD 5) MOD 5 = (m * p) MOD 5] # PV9 ([MATCH_MP (CONV_RULE NUM_REDUCE_CONV(EXPAND_CASES_CONV`!n.n<5==> ~((n EXP 2 + n + 1)MOD 5=0)`)) (ARITH_RULE `n MOD 5<5` ) ; EXP_2;] @ it) `!n. ~((n EXP 2 + n + 1) MOD 5 = 0)`;; -------- Proof 1 -------- THEOREM PROVED ------ process 7788 exit (max_proofs) ------ CPU time (user): 0.479999999996 val it : thm = |- !n. ~((n EXP 2 + n + 1) MOD 5 = 0)
ヒントなしでも...
# [ARITH_RULE `~(5=0)`; MOD_MOD_REFL; MOD_ADD_MOD; MOD_MULT_MOD2];; val it : thm list = [|- ~(5 = 0); |- !m n. ~(n = 0) ==> m MOD n MOD n = m MOD n; |- !a b n. ~(n = 0) ==> (a MOD n + b MOD n) MOD n = (a + b) MOD n; |- !m n p. ~(n = 0) ==> (m MOD n * p MOD n) MOD n = (m * p) MOD n] # PV9 ([CONV_RULE NUM_REDUCE_CONV(EXPAND_CASES_CONV`!n.n<5==> ~((n EXP 2 + n + 1)MOD 5=0)`); ARITH_RULE `!n.n MOD 5<5`; EXP_2;] @ it) `!n. ~((n EXP 2 + n + 1) MOD 5 = 0)`;; -------- Proof 1 -------- THEOREM PROVED ------ process 8412 exit (max_proofs) ------ CPU time (user): 357.666 val it : thm = |- !n. ~((n EXP 2 + n + 1) MOD 5 = 0) # [ARITH_RULE `~(5=0)`; MOD_MOD_REFL; MOD_ADD_MOD; M||< << となります.そして仮定を替えると >> >|| # map(REWRITE_RULE[ARITH_RULE`~(n=0)<=>0<n`])[MOD_MOD_REFL; MOD_ADD_MOD; MOD_MULT_MOD2];; val it : thm list = [|- !m n. 0 < n ==> m MOD n MOD n = m MOD n; |- !a b n. 0 < n ==> (a MOD n + b MOD n) MOD n = (a + b) MOD n; |- !m n p. 0 < n ==> (m MOD n * p MOD n) MOD n = (m * p) MOD n] # PV9 ([CONV_RULE NUM_REDUCE_CONV(EXPAND_CASES_CONV`!n.n<5==> ~((n EXP 2 + n + 1)MOD 5=0)`); ARITH_RULE `!n.n MOD 5<5`; EXP_2;] @ it) `!n. ~((n EXP 2 + n + 1) MOD 5 = 0)`;; -------- Proof 1 -------- THEOREM PROVED ------ process 10064 exit (max_proofs) ------ CPU time (user): 0.717999999993 val it : thm = |- !n. ~((n EXP 2 + n + 1) MOD 5 = 0)
のように高速化しますが,仮定の前件に用いる `0 < 5` の証明がないにも拘らず,結論が得られている訳で,一見不可解です.
実は前件の `0 < n` に対して古典論理では `0 < 5 \/ ~(0 < 5)` が定理となり,`0 < 5` の場合は仮定の MOD の性質が適用でき,`~(0 < 5)` の場合には,`!n. n MOD 5<5` と併せて `\n. ~(n MOD 5 = 0)` が得られ,その n として n EXP 2 + n + 1 を用いれば直ちに結論となるという仕組みです.
# PV9 [] `~(0 < 5) /\ (!n. n MOD 5<5) ==> !n. ~((n EXP 2 + n + 1) MOD 5 = 0)` ;; -------- Proof 1 -------- THEOREM PROVED ------ process 7948 exit (max_proofs) ------ CPU time (user): 0.224000000002 val it : thm = |- ~(0 < 5) /\ (!n. n MOD 5 < 5) ==> (!n. ~((n EXP 2 + n + 1) MOD 5 = 0))