lemma"x #+ y = x #+ z"apply simp oops lemma"y #+ x = x #+ z"apply simp oops lemma"x #+ y #+ z = x #+ z"apply simp oops lemma"y #+ (z #+ x) = z #+ x"apply simp oops lemma"x #+ y #+ z = (z #+ y) #+ (x #+ w)"apply simp oops lemma"x#*y #+ z = (z #+ y) #+ (y#*x #+ w)"apply simp oops
(*use of typing information*) lemma"x : nat ==> x #+ y = x"apply simp oops lemma"x : nat --> x #+ y = x"apply simp oops lemma"x : nat ==> x #+ y < x"apply simp oops lemma"x : nat ==> x < y#+x"apply simp oops lemma"x : nat ==> x \ succ(x)" apply simp oops
(*fails: no typing information isn't visible*) lemma"x #+ y = x"apply simp? oops
lemma"x #+ y < x #+ z"apply simp oops lemma"y #+ x < x #+ z"apply simp oops lemma"x #+ y #+ z < x #+ z"apply simp oops lemma"y #+ z #+ x < x #+ z"apply simp oops lemma"y #+ (z #+ x) < z #+ x"apply simp oops lemma"x #+ y #+ z < (z #+ y) #+ (x #+ w)"apply simp oops lemma"x#*y #+ z < (z #+ y) #+ (y#*x #+ w)"apply simp oops
(*We need m:nat even if we replace the RHS by natify(m), for consider e.g.
n=2, m=omega; then n + (m-n) = 2 + (0-2) = 2 \<noteq> 0 = natify(m).*) lemma add_diff_inverse: "\n \ m; m:nat\ \ n #+ (m#-n) = m" apply (frule lt_nat_in_nat, erule nat_succI) apply (erule rev_mp) apply (rule_tac m = m and n = n in diff_induct, auto) done
(*Proof is IDENTICAL to that of add_diff_inverse*) lemma diff_succ: "\n \ m; m:nat\ \ succ(m) #- n = succ(m#-n)" apply (frule lt_nat_in_nat, erule nat_succI) apply (erule rev_mp) apply (rule_tac m = m and n = n in diff_induct) apply (simp_all (no_asm_simp)) done
lemma zero_less_diff [simp]: "\m: nat; n: nat\ \ 0 < (n #- m) \ m apply (rule_tac m = m and n = n in diff_induct) apply (simp_all (no_asm_simp)) done
(** Difference distributes over multiplication **)
(*We need m:nat even with natify*) lemma div_termination: "\0 m; m:nat\ \ m #- n < m" apply (frule lt_nat_in_nat, erule nat_succI) apply (erule rev_mp) apply (erule rev_mp) apply (rule_tac m = m and n = n in diff_induct) apply (simp_all (no_asm_simp) add: diff_le_self) done
(*for mod and div*) lemmas div_rls =
nat_typechecks Ord_transrec_type apply_funtype
div_termination [THEN ltD]
nat_into_Ord not_lt_iff_le [THEN iffD1]
lemma mod_type [TC,iff]: "m mod n \ nat" unfolding mod_def apply (simp (no_asm) add: mod_def raw_mod_type) done
(** Aribtrary definitions for division by zero. Useful to simplify
certain equations **)
lemma DIVISION_BY_ZERO_DIV: "a div 0 = 0" unfolding div_def apply (rule raw_div_def [THEN def_transrec, THEN trans]) apply (simp (no_asm_simp)) done(*NOT for adding to default simpset*)
lemma DIVISION_BY_ZERO_MOD: "a mod 0 = natify(a)" unfolding mod_def apply (rule raw_mod_def [THEN def_transrec, THEN trans]) apply (simp (no_asm_simp)) done(*NOT for adding to default simpset*)
lemma mod_succ: "n:nat \ succ(m) mod n = (if succ(m mod n) = n then 0 else succ(m mod n))" apply (case_tac "n=0") apply (simp (no_asm_simp) add: natify_succ DIVISION_BY_ZERO_MOD) apply (subgoal_tac "natify (succ (m)) mod n = (if succ (natify (m) mod n) = n then 0 else succ (natify (m) mod n))") prefer 2 apply (subst natify_succ) apply (rule mod_succ_lemma) apply (auto simp del: natify_succ simp add: nat_into_Ord [THEN Ord_0_lt_iff]) done
lemma mod_less_divisor: "\0 \ m mod n < n" apply (subgoal_tac "natify (m) mod n < n") apply (rule_tac [2] i = "natify (m) "in complete_induct) apply (case_tac [3] "x, auto) txt\<open>case \<^term>\<open>n \<le> x\<close>\<close> apply (simp add: mod_geq not_lt_iff_le div_termination [THEN ltD]) done
lemma mod_1_eq [simp]: "m mod 1 = 0" by (cut_tac n = 1 in mod_less_divisor, auto)
lemma mod2_cases: "b<2 \ k mod 2 = b | k mod 2 = (if b=1 then 0 else 1)" apply (subgoal_tac "k mod 2: 2") prefer 2 apply (simp add: mod_less_divisor [THEN ltD]) apply (drule ltD, auto) done
lemma mod2_succ_succ [simp]: "succ(succ(m)) mod 2 = m mod 2" apply (subgoal_tac "m mod 2: 2") prefer 2 apply (simp add: mod_less_divisor [THEN ltD]) apply (auto simp add: mod_succ) done
lemma mod2_add_more [simp]: "(m#+m#+n) mod 2 = n mod 2" apply (subgoal_tac " (natify (m) #+natify (m) #+n) mod 2 = n mod 2") apply (rule_tac [2] n = "natify (m) "in nat_induct) apply auto done
lemma mod2_add_self [simp]: "(m#+m) mod 2 = 0" by (cut_tac n = 0 in mod2_add_more, auto)
subsection\<open>Additional theorems about \<open>\<le>\<close>\<close>
(*strict, in 1st argument; proof is by induction on k>0.
I can't see how to relax the typing conditions.*) lemma mult_lt_mono2: "\i \ k#*i < k#*j" apply (erule zero_lt_natE) apply (frule_tac [2] lt_nat_in_nat) apply (simp_all (no_asm_simp)) apply (induct_tac "x") apply (simp_all (no_asm_simp) add: add_lt_mono) done
lemma div_cancel_raw: "\0 \ (k#*m) div (k#*n) = m div n" apply (erule_tac i = m in complete_induct) apply (case_tac "x) apply (simp add: div_less zero_lt_mult_iff mult_lt_mono2) apply (simp add: not_lt_iff_le zero_lt_mult_iff le_refl [THEN mult_le_mono]
div_geq diff_mult_distrib2 [symmetric] div_termination [THEN ltD]) done
lemma div_cancel: "\0 < natify(n); 0 < natify(k)\ \ (k#*m) div (k#*n) = m div n" apply (cut_tac k = "natify (k) "and m = "natify (m)"and n = "natify (n)" in div_cancel_raw) apply auto done
subsection\<open>More Lemmas about Remainder\<close>
lemma mod_mult_distrib2: "k #* (m mod n) = (k#*m) mod (k#*n)" apply (cut_tac k = "natify (k) "and m = "natify (m)"and n = "natify (n)" in mult_mod_distrib_raw) apply auto done
lemma mult_mod_distrib: "(m mod n) #* k = (m#*k) mod (n#*k)" apply (simp (no_asm) add: mult_commute mod_mult_distrib2) done
lemma mod_add_self2_raw: "n \ nat \ (m #+ n) mod n = m mod n" apply (subgoal_tac " (n #+ m) mod n = (n #+ m #- n) mod n") apply (simp add: add_commute) apply (subst mod_geq [symmetric], auto) done
lemma mod_add_self2 [simp]: "(m #+ n) mod n = m mod n" apply (cut_tac n = "natify (n) "in mod_add_self2_raw) apply auto done
lemma mod_add_self1 [simp]: "(n#+m) mod n = m mod n" apply (simp (no_asm_simp) add: add_commute mod_add_self2) done
lemma mod_mult_self1_raw: "k \ nat \ (m #+ k#*n) mod n = m mod n" apply (erule nat_induct) apply (simp_all (no_asm_simp) add: add_left_commute [of _ n]) done
lemma mod_mult_self1 [simp]: "(m #+ k#*n) mod n = m mod n" apply (cut_tac k = "natify (k) "in mod_mult_self1_raw) apply auto done
lemma mod_mult_self2 [simp]: "(m #+ n#*k) mod n = m mod n" apply (simp (no_asm) add: mult_commute mod_mult_self1) done
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.18Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.