diff -r 150f37dad503 -r f0285e69d704 src/HOL/Import/HOLLightInt.thy --- a/src/HOL/Import/HOLLightInt.thy Sat Mar 03 21:42:41 2012 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,208 +0,0 @@ -(* Title: HOL/Import/HOLLightInt.thy - Author: Cezary Kaliszyk -*) - -header {* Compatibility theorems for HOL Light integers *} - -theory HOLLightInt imports Main Real GCD begin - -fun int_coprime where "int_coprime ((a :: int), (b :: int)) = coprime a b" - -lemma DEF_int_coprime: - "int_coprime = (\u. \x y. ((fst u) * x) + ((snd u) * y) = int 1)" - apply (auto simp add: fun_eq_iff) - apply (metis bezout_int mult_commute) - by (metis coprime_divisors_nat dvd_triv_left gcd_1_int gcd_add2_int) - -lemma INT_FORALL_POS: - "(\n. P (int n)) = (\i\(int 0). P i)" - by (auto, drule_tac x="nat i" in spec) simp - -lemma INT_LT_DISCRETE: - "(x < y) = (x + int 1 \ y)" - by auto - -lemma INT_ABS_MUL_1: - "(abs (x * y) = int 1) = (abs x = int 1 \ abs y = int 1)" - by simp (metis dvd_mult_right zdvd1_eq abs_zmult_eq_1 abs_mult mult_1_right) - -lemma dest_int_rep: - "\(n :: nat). real (i :: int) = real n \ real i = - real n" - by (metis (full_types) of_int_of_nat real_eq_of_int real_of_nat_def) - -lemma DEF_int_add: - "op + = (\u ua. floor (real u + real ua))" - by simp - -lemma DEF_int_sub: - "op - = (\u ua. floor (real u - real ua))" - by simp - -lemma DEF_int_mul: - "op * = (\u ua. floor (real u * real ua))" - by (metis floor_number_of number_of_is_id number_of_real_def real_eq_of_int real_of_int_mult) - -lemma DEF_int_abs: - "abs = (\u. floor (abs (real u)))" - by (metis floor_real_of_int real_of_int_abs) - -lemma DEF_int_sgn: - "sgn = (\u. floor (sgn (real u)))" - by (simp add: sgn_if fun_eq_iff) - -lemma int_sgn_th: - "real (sgn (x :: int)) = sgn (real x)" - by (simp add: sgn_if) - -lemma DEF_int_max: - "max = (\u ua. floor (max (real u) (real ua)))" - by (metis floor_real_of_int real_of_int_le_iff sup_absorb1 sup_commute sup_max linorder_linear) - -lemma int_max_th: - "real (max (x :: int) y) = max (real x) (real y)" - by (metis min_max.le_iff_sup min_max.sup_absorb1 real_of_int_le_iff linorder_linear) - -lemma DEF_int_min: - "min = (\u ua. floor (min (real u) (real ua)))" - by (metis floor_real_of_int inf_absorb1 inf_absorb2 inf_int_def inf_real_def real_of_int_le_iff linorder_linear) - -lemma int_min_th: - "real (min (x :: int) y) = min (real x) (real y)" - by (metis inf_absorb1 inf_absorb2 inf_int_def inf_real_def real_of_int_le_iff linorder_linear) - -lemma INT_IMAGE: - "(\n. x = int n) \ (\n. x = - int n)" - by (metis number_of_eq number_of_is_id of_int_of_nat) - -lemma DEF_int_pow: - "op ^ = (\u ua. floor (real u ^ ua))" - by (simp add: floor_power) - -lemma DEF_int_divides: - "op dvd = (\(u :: int) ua. \x. ua = u * x)" - by (metis dvdE dvdI) - -lemma DEF_int_divides': - "(a :: int) dvd b = (\x. b = a * x)" - by (metis dvdE dvdI) - -definition "int_mod (u :: int) ua ub = (u dvd (ua - ub))" - -lemma int_mod_def': - "int_mod = (\u ua ub. (u dvd (ua - ub)))" - by (simp add: int_mod_def_raw) - -lemma int_congruent: - "\x xa xb. int_mod xb x xa = (\d. x - xa = xb * d)" - unfolding int_mod_def' - by (auto simp add: DEF_int_divides') - -lemma int_congruent': - "\(x :: int) y n. (n dvd x - y) = (\d. x - y = n * d)" - using int_congruent[unfolded int_mod_def] . - -fun int_gcd where - "int_gcd ((a :: int), (b :: int)) = gcd a b" - -definition "hl_mod (k\int) (l\int) = (if 0 \ l then k mod l else k mod - l)" - -lemma hl_mod_nonneg: - "b \ 0 \ hl_mod a b \ 0" - by (simp add: hl_mod_def) - -lemma hl_mod_lt_abs: - "b \ 0 \ hl_mod a b < abs b" - by (simp add: hl_mod_def) - -definition "hl_div k l = (if 0 \ l then k div l else -(k div (-l)))" - -lemma hl_mod_div: - "n \ (0\int) \ m = hl_div m n * n + hl_mod m n" - unfolding hl_div_def hl_mod_def - by auto (metis zmod_zdiv_equality mult_commute mult_minus_left) - -lemma sth: - "(\(x :: int) y z. x + (y + z) = x + y + z) \ - (\(x :: int) y. x + y = y + x) \ - (\(x :: int). int 0 + x = x) \ - (\(x :: int) y z. x * (y * z) = x * y * z) \ - (\(x :: int) y. x * y = y * x) \ - (\(x :: int). int 1 * x = x) \ - (\(x :: int). int 0 * x = int 0) \ - (\(x :: int) y z. x * (y + z) = x * y + x * z) \ - (\(x :: int). x ^ 0 = int 1) \ (\(x :: int) n. x ^ Suc n = x * x ^ n)" - by (simp_all add: right_distrib) - -lemma INT_DIVISION: - "n ~= int 0 \ m = hl_div m n * n + hl_mod m n \ int 0 \ hl_mod m n \ hl_mod m n < abs n" - by (auto simp add: hl_mod_nonneg hl_mod_lt_abs hl_mod_div) - -lemma INT_DIVMOD_EXIST_0: - "\q r. if n = int 0 then q = int 0 \ r = m - else int 0 \ r \ r < abs n \ m = q * n + r" - apply (rule_tac x="hl_div m n" in exI) - apply (rule_tac x="hl_mod m n" in exI) - apply (auto simp add: hl_mod_nonneg hl_mod_lt_abs hl_mod_div) - unfolding hl_div_def hl_mod_def - by auto - -lemma DEF_div: - "hl_div = (SOME q. \r. \m n. if n = int 0 then q m n = int 0 \ r m n = m - else (int 0) \ (r m n) \ (r m n) < (abs n) \ m = ((q m n) * n) + (r m n))" - apply (rule some_equality[symmetric]) - apply (rule_tac x="hl_mod" in exI) - apply (auto simp add: fun_eq_iff hl_mod_nonneg hl_mod_lt_abs hl_mod_div) - apply (simp add: hl_div_def) - apply (simp add: hl_mod_def) - apply (drule_tac x="x" in spec) - apply (drule_tac x="xa" in spec) - apply (case_tac "0 = xa") - apply (simp add: hl_mod_def hl_div_def) - apply (case_tac "xa > 0") - apply (simp add: hl_mod_def hl_div_def) - apply (metis comm_semiring_1_class.normalizing_semiring_rules(24) div_mult_self2 not_less_iff_gr_or_eq order_less_le add_0 zdiv_eq_0_iff mult_commute) - apply (simp add: hl_mod_def hl_div_def) - by (metis add.comm_neutral add_pos_nonneg div_mult_self1 less_minus_iff minus_add minus_add_cancel minus_minus mult_zero_right not_square_less_zero zdiv_eq_0_iff zdiv_zminus2) - -lemma DEF_rem: - "hl_mod = (SOME r. \m n. if n = int 0 then - (if 0 \ n then m div n else - (m div - n)) = int 0 \ r m n = m - else int 0 \ r m n \ r m n < abs n \ - m = (if 0 \ n then m div n else - (m div - n)) * n + r m n)" - apply (rule some_equality[symmetric]) - apply (fold hl_div_def) - apply (auto simp add: fun_eq_iff hl_mod_nonneg hl_mod_lt_abs hl_mod_div) - apply (simp add: hl_div_def) - apply (simp add: hl_mod_def) - apply (drule_tac x="x" in spec) - apply (drule_tac x="xa" in spec) - apply (case_tac "0 = xa") - apply (simp add: hl_mod_def hl_div_def) - apply (case_tac "xa > 0") - apply (simp add: hl_mod_def hl_div_def) - apply (metis add_left_cancel mod_div_equality) - apply (simp add: hl_mod_def hl_div_def) - by (metis minus_mult_right mod_mult_self2 mod_pos_pos_trivial add_commute zminus_zmod zmod_zminus2 mult_commute) - -lemma DEF_int_gcd: - "int_gcd = (SOME d. \a b. (int 0) \ (d (a, b)) \ (d (a, b)) dvd a \ - (d (a, b)) dvd b \ (\x y. d (a, b) = (a * x) + (b * y)))" - apply (rule some_equality[symmetric]) - apply auto - apply (metis bezout_int mult_commute) - apply (auto simp add: fun_eq_iff) - apply (drule_tac x="a" in spec) - apply (drule_tac x="b" in spec) - using gcd_greatest_int zdvd_antisym_nonneg - by auto - -definition "eqeq x y (r :: 'a \ 'b \ bool) = r x y" - -lemma INT_INTEGRAL: - "(\x. int 0 * x = int 0) \ - (\(x :: int) y z. (x + y = x + z) = (y = z)) \ - (\(w :: int) x y z. (w * y + x * z = w * z + x * y) = (w = x \ y = z))" - by (auto simp add: crossproduct_eq) - -end -