merged
authorhaftmann
Tue, 23 Jun 2009 14:33:35 +0200
changeset 31777 f897fe880f9d
parent 31767 b4c8d615bf5d (diff)
parent 31776 151c3f5f28f9 (current diff)
child 31778 eb174cfdef1a
child 31782 2b041d16cc13
child 31907 9d4a03e008c0
merged
src/HOL/Tools/datatype_package/datatype.ML
src/HOL/Tools/datatype_package/datatype_abs_proofs.ML
src/HOL/Tools/datatype_package/datatype_aux.ML
src/HOL/Tools/datatype_package/datatype_case.ML
src/HOL/Tools/datatype_package/datatype_codegen.ML
src/HOL/Tools/datatype_package/datatype_prop.ML
src/HOL/Tools/datatype_package/datatype_realizer.ML
src/HOL/Tools/datatype_package/datatype_rep_proofs.ML
src/HOL/Tools/function_package/auto_term.ML
src/HOL/Tools/function_package/context_tree.ML
src/HOL/Tools/function_package/decompose.ML
src/HOL/Tools/function_package/descent.ML
src/HOL/Tools/function_package/fundef.ML
src/HOL/Tools/function_package/fundef_common.ML
src/HOL/Tools/function_package/fundef_core.ML
src/HOL/Tools/function_package/fundef_datatype.ML
src/HOL/Tools/function_package/fundef_lib.ML
src/HOL/Tools/function_package/induction_scheme.ML
src/HOL/Tools/function_package/inductive_wrap.ML
src/HOL/Tools/function_package/lexicographic_order.ML
src/HOL/Tools/function_package/measure_functions.ML
src/HOL/Tools/function_package/mutual.ML
src/HOL/Tools/function_package/pattern_split.ML
src/HOL/Tools/function_package/scnp_reconstruct.ML
src/HOL/Tools/function_package/scnp_solve.ML
src/HOL/Tools/function_package/size.ML
src/HOL/Tools/function_package/sum_tree.ML
src/HOL/Tools/function_package/termination.ML
src/HOLCF/IOA/meta_theory/ioa.ML
src/Tools/code/code_haskell.ML
src/Tools/code/code_ml.ML
src/Tools/code/code_preproc.ML
src/Tools/code/code_printer.ML
src/Tools/code/code_target.ML
src/Tools/code/code_thingol.ML
--- a/src/HOL/GCD.thy	Tue Jun 23 14:24:58 2009 +0200
+++ b/src/HOL/GCD.thy	Tue Jun 23 14:33:35 2009 +0200
@@ -353,17 +353,11 @@
 lemma int_gcd_assoc: "gcd (gcd (k::int) m) n = gcd k (gcd m n)"
   by (auto simp add: gcd_int_def nat_gcd_assoc)
 
-lemma nat_gcd_left_commute: "gcd (k::nat) (gcd m n) = gcd m (gcd k n)"
-  apply (rule nat_gcd_commute [THEN trans])
-  apply (rule nat_gcd_assoc [THEN trans])
-  apply (rule nat_gcd_commute [THEN arg_cong])
-done
+lemmas nat_gcd_left_commute =
+  mk_left_commute[of gcd, OF nat_gcd_assoc nat_gcd_commute]
 
-lemma int_gcd_left_commute: "gcd (k::int) (gcd m n) = gcd m (gcd k n)"
-  apply (rule int_gcd_commute [THEN trans])
-  apply (rule int_gcd_assoc [THEN trans])
-  apply (rule int_gcd_commute [THEN arg_cong])
-done
+lemmas int_gcd_left_commute =
+  mk_left_commute[of gcd, OF int_gcd_assoc int_gcd_commute]
 
 lemmas nat_gcd_ac = nat_gcd_assoc nat_gcd_commute nat_gcd_left_commute
   -- {* gcd is an AC-operator *}
@@ -1352,7 +1346,6 @@
 lemma int_lcm_commute: "lcm (m::int) n = lcm n m"
   unfolding lcm_int_def by (subst nat_lcm_commute, rule refl)
 
-(* to do: show lcm is associative, and then declare ac simps *)
 
 lemma nat_lcm_pos:
   assumes mpos: "(m::nat) > 0"
@@ -1507,6 +1500,25 @@
   by (subst int_lcm_commute, erule (1) int_lcm_dvd_eq)
 
 
+lemma lcm_assoc_nat: "lcm (lcm n m) (p::nat) = lcm n (lcm m p)"
+apply(rule nat_lcm_unique[THEN iffD1])
+apply (metis dvd.order_trans nat_lcm_unique)
+done
+
+lemma lcm_assoc_int: "lcm (lcm n m) (p::int) = lcm n (lcm m p)"
+apply(rule int_lcm_unique[THEN iffD1])
+apply (metis dvd_trans int_lcm_unique)
+done
+
+lemmas lcm_left_commute_nat =
+  mk_left_commute[of lcm, OF lcm_assoc_nat nat_lcm_commute]
+
+lemmas lcm_left_commute_int =
+  mk_left_commute[of lcm, OF lcm_assoc_int int_lcm_commute]
+
+lemmas lcm_ac_nat = lcm_assoc_nat nat_lcm_commute lcm_left_commute_nat
+lemmas lcm_ac_int = lcm_assoc_int int_lcm_commute lcm_left_commute_int
+
 
 subsection {* Primes *}