# HG changeset patch # User hoelzl # Date 1273598499 -7200 # Node ID d778c64fc35d2668faf9bc7b621eafac88740d58 # Parent 5f9385ecc1a7958f5a35624b5f5cd5d0cb86fe44 Add rules directly to the corresponding class locales instead. diff -r 5f9385ecc1a7 -r d778c64fc35d src/HOL/Semiring_Normalization.thy --- a/src/HOL/Semiring_Normalization.thy Tue May 11 19:21:05 2010 +0200 +++ b/src/HOL/Semiring_Normalization.thy Tue May 11 19:21:39 2010 +0200 @@ -52,286 +52,155 @@ setup Semiring_Normalizer.setup -locale normalizing_semiring = - fixes add mul pwr r0 r1 - assumes add_a:"(add x (add y z) = add (add x y) z)" - and add_c: "add x y = add y x" and add_0:"add r0 x = x" - and mul_a:"mul x (mul y z) = mul (mul x y) z" and mul_c:"mul x y = mul y x" - and mul_1:"mul r1 x = x" and mul_0:"mul r0 x = r0" - and mul_d:"mul x (add y z) = add (mul x y) (mul x z)" - and pwr_0:"pwr x 0 = r1" and pwr_Suc:"pwr x (Suc n) = mul x (pwr x n)" -begin - -lemma mul_pwr:"mul (pwr x p) (pwr x q) = pwr x (p + q)" -proof (induct p) - case 0 - then show ?case by (auto simp add: pwr_0 mul_1) -next - case Suc - from this [symmetric] show ?case - by (auto simp add: pwr_Suc mul_1 mul_a) -qed - -lemma pwr_mul: "pwr (mul x y) q = mul (pwr x q) (pwr y q)" -proof (induct q arbitrary: x y, auto simp add:pwr_0 pwr_Suc mul_1) - fix q x y - assume "\x y. pwr (mul x y) q = mul (pwr x q) (pwr y q)" - have "mul (mul x y) (mul (pwr x q) (pwr y q)) = mul x (mul y (mul (pwr x q) (pwr y q)))" - by (simp add: mul_a) - also have "\ = (mul (mul y (mul (pwr y q) (pwr x q))) x)" by (simp add: mul_c) - also have "\ = (mul (mul y (pwr y q)) (mul (pwr x q) x))" by (simp add: mul_a) - finally show "mul (mul x y) (mul (pwr x q) (pwr y q)) = - mul (mul x (pwr x q)) (mul y (pwr y q))" by (simp add: mul_c) -qed - -lemma pwr_pwr: "pwr (pwr x p) q = pwr x (p * q)" -proof (induct p arbitrary: q) - case 0 - show ?case using pwr_Suc mul_1 pwr_0 by (induct q) auto -next - case Suc - thus ?case by (auto simp add: mul_pwr [symmetric] pwr_mul pwr_Suc) -qed - -lemma semiring_ops: - shows "TERM (add x y)" and "TERM (mul x y)" and "TERM (pwr x n)" - and "TERM r0" and "TERM r1" . +lemma (in comm_semiring_1) semiring_ops: + shows "TERM (x + y)" and "TERM (x * y)" and "TERM (x ^ n)" + and "TERM 0" and "TERM 1" . -lemma semiring_rules: - "add (mul a m) (mul b m) = mul (add a b) m" - "add (mul a m) m = mul (add a r1) m" - "add m (mul a m) = mul (add a r1) m" - "add m m = mul (add r1 r1) m" - "add r0 a = a" - "add a r0 = a" - "mul a b = mul b a" - "mul (add a b) c = add (mul a c) (mul b c)" - "mul r0 a = r0" - "mul a r0 = r0" - "mul r1 a = a" - "mul a r1 = a" - "mul (mul lx ly) (mul rx ry) = mul (mul lx rx) (mul ly ry)" - "mul (mul lx ly) (mul rx ry) = mul lx (mul ly (mul rx ry))" - "mul (mul lx ly) (mul rx ry) = mul rx (mul (mul lx ly) ry)" - "mul (mul lx ly) rx = mul (mul lx rx) ly" - "mul (mul lx ly) rx = mul lx (mul ly rx)" - "mul lx (mul rx ry) = mul (mul lx rx) ry" - "mul lx (mul rx ry) = mul rx (mul lx ry)" - "add (add a b) (add c d) = add (add a c) (add b d)" - "add (add a b) c = add a (add b c)" - "add a (add c d) = add c (add a d)" - "add (add a b) c = add (add a c) b" - "add a c = add c a" - "add a (add c d) = add (add a c) d" - "mul (pwr x p) (pwr x q) = pwr x (p + q)" - "mul x (pwr x q) = pwr x (Suc q)" - "mul (pwr x q) x = pwr x (Suc q)" - "mul x x = pwr x 2" - "pwr (mul x y) q = mul (pwr x q) (pwr y q)" - "pwr (pwr x p) q = pwr x (p * q)" - "pwr x 0 = r1" - "pwr x 1 = x" - "mul x (add y z) = add (mul x y) (mul x z)" - "pwr x (Suc q) = mul x (pwr x q)" - "pwr x (2*n) = mul (pwr x n) (pwr x n)" - "pwr x (Suc (2*n)) = mul x (mul (pwr x n) (pwr x n))" -proof - - show "add (mul a m) (mul b m) = mul (add a b) m" using mul_d mul_c by simp -next show"add (mul a m) m = mul (add a r1) m" using mul_d mul_c mul_1 by simp -next show "add m (mul a m) = mul (add a r1) m" using mul_c mul_d mul_1 add_c by simp -next show "add m m = mul (add r1 r1) m" using mul_c mul_d mul_1 by simp -next show "add r0 a = a" using add_0 by simp -next show "add a r0 = a" using add_0 add_c by simp -next show "mul a b = mul b a" using mul_c by simp -next show "mul (add a b) c = add (mul a c) (mul b c)" using mul_c mul_d by simp -next show "mul r0 a = r0" using mul_0 by simp -next show "mul a r0 = r0" using mul_0 mul_c by simp -next show "mul r1 a = a" using mul_1 by simp -next show "mul a r1 = a" using mul_1 mul_c by simp -next show "mul (mul lx ly) (mul rx ry) = mul (mul lx rx) (mul ly ry)" - using mul_c mul_a by simp -next show "mul (mul lx ly) (mul rx ry) = mul lx (mul ly (mul rx ry))" - using mul_a by simp -next - have "mul (mul lx ly) (mul rx ry) = mul (mul rx ry) (mul lx ly)" by (rule mul_c) - also have "\ = mul rx (mul ry (mul lx ly))" using mul_a by simp - finally - show "mul (mul lx ly) (mul rx ry) = mul rx (mul (mul lx ly) ry)" - using mul_c by simp -next show "mul (mul lx ly) rx = mul (mul lx rx) ly" using mul_c mul_a by simp -next - show "mul (mul lx ly) rx = mul lx (mul ly rx)" by (simp add: mul_a) -next show "mul lx (mul rx ry) = mul (mul lx rx) ry" by (simp add: mul_a ) -next show "mul lx (mul rx ry) = mul rx (mul lx ry)" by (simp add: mul_a,simp add: mul_c) -next show "add (add a b) (add c d) = add (add a c) (add b d)" - using add_c add_a by simp -next show "add (add a b) c = add a (add b c)" using add_a by simp -next show "add a (add c d) = add c (add a d)" - apply (simp add: add_a) by (simp only: add_c) -next show "add (add a b) c = add (add a c) b" using add_a add_c by simp -next show "add a c = add c a" by (rule add_c) -next show "add a (add c d) = add (add a c) d" using add_a by simp -next show "mul (pwr x p) (pwr x q) = pwr x (p + q)" by (rule mul_pwr) -next show "mul x (pwr x q) = pwr x (Suc q)" using pwr_Suc by simp -next show "mul (pwr x q) x = pwr x (Suc q)" using pwr_Suc mul_c by simp -next show "mul x x = pwr x 2" by (simp add: nat_number' pwr_Suc pwr_0 mul_1 mul_c) -next show "pwr (mul x y) q = mul (pwr x q) (pwr y q)" by (rule pwr_mul) -next show "pwr (pwr x p) q = pwr x (p * q)" by (rule pwr_pwr) -next show "pwr x 0 = r1" using pwr_0 . -next show "pwr x 1 = x" unfolding One_nat_def by (simp add: nat_number' pwr_Suc pwr_0 mul_1 mul_c) -next show "mul x (add y z) = add (mul x y) (mul x z)" using mul_d by simp -next show "pwr x (Suc q) = mul x (pwr x q)" using pwr_Suc by simp -next show "pwr x (2 * n) = mul (pwr x n) (pwr x n)" by (simp add: nat_number' mul_pwr) -next show "pwr x (Suc (2 * n)) = mul x (mul (pwr x n) (pwr x n))" - by (simp add: nat_number' pwr_Suc mul_pwr) -qed - -end - -sublocale comm_semiring_1 - < normalizing!: normalizing_semiring plus times power zero one -proof -qed (simp_all add: algebra_simps) +lemma (in comm_semiring_1) semiring_rules: + "(a * m) + (b * m) = (a + b) * m" + "(a * m) + m = (a + 1) * m" + "m + (a * m) = (a + 1) * m" + "m + m = (1 + 1) * m" + "0 + a = a" + "a + 0 = a" + "a * b = b * a" + "(a + b) * c = (a * c) + (b * c)" + "0 * a = 0" + "a * 0 = 0" + "1 * a = a" + "a * 1 = a" + "(lx * ly) * (rx * ry) = (lx * rx) * (ly * ry)" + "(lx * ly) * (rx * ry) = lx * (ly * (rx * ry))" + "(lx * ly) * (rx * ry) = rx * ((lx * ly) * ry)" + "(lx * ly) * rx = (lx * rx) * ly" + "(lx * ly) * rx = lx * (ly * rx)" + "lx * (rx * ry) = (lx * rx) * ry" + "lx * (rx * ry) = rx * (lx * ry)" + "(a + b) + (c + d) = (a + c) + (b + d)" + "(a + b) + c = a + (b + c)" + "a + (c + d) = c + (a + d)" + "(a + b) + c = (a + c) + b" + "a + c = c + a" + "a + (c + d) = (a + c) + d" + "(x ^ p) * (x ^ q) = x ^ (p + q)" + "x * (x ^ q) = x ^ (Suc q)" + "(x ^ q) * x = x ^ (Suc q)" + "x * x = x ^ 2" + "(x * y) ^ q = (x ^ q) * (y ^ q)" + "(x ^ p) ^ q = x ^ (p * q)" + "x ^ 0 = 1" + "x ^ 1 = x" + "x * (y + z) = (x * y) + (x * z)" + "x ^ (Suc q) = x * (x ^ q)" + "x ^ (2*n) = (x ^ n) * (x ^ n)" + "x ^ (Suc (2*n)) = x * ((x ^ n) * (x ^ n))" + by (simp_all add: algebra_simps power_add power2_eq_square power_mult_distrib power_mult) lemmas (in comm_semiring_1) normalizing_comm_semiring_1_axioms = comm_semiring_1_axioms [normalizer - semiring ops: normalizing.semiring_ops - semiring rules: normalizing.semiring_rules] + semiring ops: semiring_ops + semiring rules: semiring_rules] declaration (in comm_semiring_1) {* Semiring_Normalizer.semiring_funs @{thm normalizing_comm_semiring_1_axioms} *} -locale normalizing_ring = normalizing_semiring + - fixes sub :: "'a \ 'a \ 'a" - and neg :: "'a \ 'a" - assumes neg_mul: "neg x = mul (neg r1) x" - and sub_add: "sub x y = add x (neg y)" -begin - -lemma ring_ops: shows "TERM (sub x y)" and "TERM (neg x)" . +lemma (in comm_ring_1) ring_ops: shows "TERM (x- y)" and "TERM (- x)" . -lemmas ring_rules = neg_mul sub_add - -end - -sublocale comm_ring_1 - < normalizing!: normalizing_ring plus times power zero one minus uminus -proof -qed (simp_all add: diff_minus) +lemma (in comm_ring_1) ring_rules: + "- x = (- 1) * x" + "x - y = x + (- y)" + by (simp_all add: diff_minus) lemmas (in comm_ring_1) normalizing_comm_ring_1_axioms = comm_ring_1_axioms [normalizer - semiring ops: normalizing.semiring_ops - semiring rules: normalizing.semiring_rules - ring ops: normalizing.ring_ops - ring rules: normalizing.ring_rules] + semiring ops: semiring_ops + semiring rules: semiring_rules + ring ops: ring_ops + ring rules: ring_rules] declaration (in comm_ring_1) {* Semiring_Normalizer.semiring_funs @{thm normalizing_comm_ring_1_axioms} *} -locale normalizing_semiring_cancel = normalizing_semiring + - assumes add_cancel: "add (x::'a) y = add x z \ y = z" - and add_mul_solve: "add (mul w y) (mul x z) = - add (mul w z) (mul x y) \ w = x \ y = z" -begin - -lemma noteq_reduce: "a \ b \ c \ d \ add (mul a c) (mul b d) \ add (mul a d) (mul b c)" +lemma (in comm_semiring_1_cancel_norm) noteq_reduce: + "a \ b \ c \ d \ (a * c) + (b * d) \ (a * d) + (b * c)" proof- have "a \ b \ c \ d \ \ (a = b \ c = d)" by simp - also have "\ \ add (mul a c) (mul b d) \ add (mul a d) (mul b c)" - using add_mul_solve by blast - finally show "a \ b \ c \ d \ add (mul a c) (mul b d) \ add (mul a d) (mul b c)" + also have "\ \ (a * c) + (b * d) \ (a * d) + (b * c)" + using add_mult_solve by blast + finally show "a \ b \ c \ d \ (a * c) + (b * d) \ (a * d) + (b * c)" by simp qed -lemma add_scale_eq_noteq: "\r \ r0 ; (a = b) \ ~(c = d)\ - \ add a (mul r c) \ add b (mul r d)" +lemma (in comm_semiring_1_cancel_norm) add_scale_eq_noteq: + "\r \ 0 ; a = b \ c \ d\ \ a + (r * c) \ b + (r * d)" proof(clarify) - assume nz: "r\ r0" and cnd: "c\d" - and eq: "add b (mul r c) = add b (mul r d)" - hence "mul r c = mul r d" using cnd add_cancel by simp - hence "add (mul r0 d) (mul r c) = add (mul r0 c) (mul r d)" - using mul_0 add_cancel by simp - thus "False" using add_mul_solve nz cnd by simp + assume nz: "r\ 0" and cnd: "c\d" + and eq: "b + (r * c) = b + (r * d)" + have "(0 * d) + (r * c) = (0 * c) + (r * d)" + using add_imp_eq eq mult_zero_left by simp + thus "False" using add_mult_solve[of 0 d] nz cnd by simp qed -lemma add_r0_iff: " x = add x a \ a = r0" +lemma (in comm_semiring_1_cancel_norm) add_0_iff: + "x = x + a \ a = 0" proof- - have "a = r0 \ add x a = add x r0" by (simp add: add_cancel) - thus "x = add x a \ a = r0" by (auto simp add: add_c add_0) + have "a = 0 \ x + a = x + 0" using add_imp_eq[of x a 0] by auto + thus "x = x + a \ a = 0" by (auto simp add: add_commute) qed -end - -sublocale comm_semiring_1_cancel_norm - < normalizing!: normalizing_semiring_cancel plus times power zero one -proof -qed (simp_all add: add_mult_solve) - declare (in comm_semiring_1_cancel_norm) normalizing_comm_semiring_1_axioms [normalizer del] lemmas (in comm_semiring_1_cancel_norm) normalizing_comm_semiring_1_cancel_norm_axioms = comm_semiring_1_cancel_norm_axioms [normalizer - semiring ops: normalizing.semiring_ops - semiring rules: normalizing.semiring_rules - idom rules: normalizing.noteq_reduce normalizing.add_scale_eq_noteq] + semiring ops: semiring_ops + semiring rules: semiring_rules + idom rules: noteq_reduce add_scale_eq_noteq] declaration (in comm_semiring_1_cancel_norm) {* Semiring_Normalizer.semiring_funs @{thm normalizing_comm_semiring_1_cancel_norm_axioms} *} -locale normalizing_ring_cancel = normalizing_semiring_cancel + normalizing_ring + - assumes subr0_iff: "sub x y = r0 \ x = y" - -sublocale idom - < normalizing!: normalizing_ring_cancel plus times power zero one minus uminus -proof -qed simp - declare (in idom) normalizing_comm_ring_1_axioms [normalizer del] lemmas (in idom) normalizing_idom_axioms = idom_axioms [normalizer - semiring ops: normalizing.semiring_ops - semiring rules: normalizing.semiring_rules - ring ops: normalizing.ring_ops - ring rules: normalizing.ring_rules - idom rules: normalizing.noteq_reduce normalizing.add_scale_eq_noteq - ideal rules: normalizing.subr0_iff normalizing.add_r0_iff] + semiring ops: semiring_ops + semiring rules: semiring_rules + ring ops: ring_ops + ring rules: ring_rules + idom rules: noteq_reduce add_scale_eq_noteq + ideal rules: right_minus_eq add_0_iff] declaration (in idom) {* Semiring_Normalizer.semiring_funs @{thm normalizing_idom_axioms} *} -locale normalizing_field = normalizing_ring_cancel + - fixes divide :: "'a \ 'a \ 'a" - and inverse:: "'a \ 'a" - assumes divide_inverse: "divide x y = mul x (inverse y)" - and inverse_divide: "inverse x = divide r1 x" -begin - -lemma field_ops: shows "TERM (divide x y)" and "TERM (inverse x)" . +lemma (in field) field_ops: + shows "TERM (x / y)" and "TERM (inverse x)" . -lemmas field_rules = divide_inverse inverse_divide - -end - -sublocale field - < normalizing!: normalizing_field plus times power zero one minus uminus divide inverse -proof -qed (simp_all add: divide_inverse) +lemmas (in field) field_rules = divide_inverse inverse_eq_divide lemmas (in field) normalizing_field_axioms = field_axioms [normalizer - semiring ops: normalizing.semiring_ops - semiring rules: normalizing.semiring_rules - ring ops: normalizing.ring_ops - ring rules: normalizing.ring_rules - field ops: normalizing.field_ops - field rules: normalizing.field_rules - idom rules: normalizing.noteq_reduce normalizing.add_scale_eq_noteq - ideal rules: normalizing.subr0_iff normalizing.add_r0_iff] + semiring ops: semiring_ops + semiring rules: semiring_rules + ring ops: ring_ops + ring rules: ring_rules + field ops: field_ops + field rules: field_rules + idom rules: noteq_reduce add_scale_eq_noteq + ideal rules: right_minus_eq add_0_iff] declaration (in field) {* Semiring_Normalizer.field_funs @{thm normalizing_field_axioms} *} +hide_fact (open) normalizing_comm_semiring_1_axioms + normalizing_comm_semiring_1_cancel_norm_axioms semiring_ops semiring_rules + +hide_fact (open) normalizing_comm_ring_1_axioms + normalizing_idom_axioms ring_ops ring_rules + +hide_fact (open) normalizing_field_axioms field_ops field_rules + +hide_fact (open) add_scale_eq_noteq noteq_reduce + end