diff -r 9545bb3cefac -r 2bd54d4b5f3d src/HOL/Import/HOLLightInt.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Import/HOLLightInt.thy Wed Jul 13 00:23:24 2011 +0900 @@ -0,0 +1,207 @@ +(* 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 zmult_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 zmult_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 zle_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 zle_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 zle_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 zle_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 zmult_commute zmult_zminus) + +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: zadd_zmult_distrib2) + +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 zadd_0 zdiv_eq_0_iff zmult_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 zadd_commute zminus_zmod zmod_zminus2 zmult_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 zmult_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