# HG changeset patch # User haftmann # Date 1360841096 -3600 # Node ID 3e913a575dc677215aafc07aa63b44d0e7b68e09 # Parent 222fb6cb2c3eaa088a4c08311271efb2aa22e246 type lifting setup for code numeral types diff -r 222fb6cb2c3e -r 3e913a575dc6 src/HOL/Library/Code_Numeral_Types.thy --- a/src/HOL/Library/Code_Numeral_Types.thy Thu Feb 14 12:24:56 2013 +0100 +++ b/src/HOL/Library/Code_Numeral_Types.thy Thu Feb 14 12:24:56 2013 +0100 @@ -13,9 +13,11 @@ typedef integer = "UNIV \ int set" morphisms int_of_integer integer_of_int .. +setup_lifting (no_code) type_definition_integer + lemma integer_eq_iff: "k = l \ int_of_integer k = int_of_integer l" - using int_of_integer_inject [of k l] .. + by transfer rule lemma integer_eqI: "int_of_integer k = int_of_integer l \ k = l" @@ -23,172 +25,199 @@ lemma int_of_integer_integer_of_int [simp]: "int_of_integer (integer_of_int k) = k" - using integer_of_int_inverse [of k] by simp + by transfer rule lemma integer_of_int_int_of_integer [simp]: "integer_of_int (int_of_integer k) = k" - using int_of_integer_inverse [of k] by simp + by transfer rule instantiation integer :: ring_1 begin -definition - "0 = integer_of_int 0" +lift_definition zero_integer :: integer + is "0 :: int" + . -lemma int_of_integer_zero [simp]: - "int_of_integer 0 = 0" - by (simp add: zero_integer_def) - -definition - "1 = integer_of_int 1" +declare zero_integer.rep_eq [simp] -lemma int_of_integer_one [simp]: - "int_of_integer 1 = 1" - by (simp add: one_integer_def) +lift_definition one_integer :: integer + is "1 :: int" + . + +declare one_integer.rep_eq [simp] -definition - "k + l = integer_of_int (int_of_integer k + int_of_integer l)" +lift_definition plus_integer :: "integer \ integer \ integer" + is "plus :: int \ int \ int" + . -lemma int_of_integer_plus [simp]: - "int_of_integer (k + l) = int_of_integer k + int_of_integer l" - by (simp add: plus_integer_def) +declare plus_integer.rep_eq [simp] -definition - "- k = integer_of_int (- int_of_integer k)" +lift_definition uminus_integer :: "integer \ integer" + is "uminus :: int \ int" + . -lemma int_of_integer_uminus [simp]: - "int_of_integer (- k) = - int_of_integer k" - by (simp add: uminus_integer_def) - -definition - "k - l = integer_of_int (int_of_integer k - int_of_integer l)" +declare uminus_integer.rep_eq [simp] -lemma int_of_integer_minus [simp]: - "int_of_integer (k - l) = int_of_integer k - int_of_integer l" - by (simp add: minus_integer_def) +lift_definition minus_integer :: "integer \ integer \ integer" + is "minus :: int \ int \ int" + . + +declare minus_integer.rep_eq [simp] -definition - "k * l = integer_of_int (int_of_integer k * int_of_integer l)" +lift_definition times_integer :: "integer \ integer \ integer" + is "times :: int \ int \ int" + . -lemma int_of_integer_times [simp]: - "int_of_integer (k * l) = int_of_integer k * int_of_integer l" - by (simp add: times_integer_def) +declare times_integer.rep_eq [simp] instance proof -qed (auto simp add: integer_eq_iff algebra_simps) +qed (transfer, simp add: algebra_simps)+ end +lemma [transfer_rule]: + "fun_rel HOL.eq cr_integer (of_nat :: nat \ int) (of_nat :: nat \ integer)" + by (unfold of_nat_def [abs_def]) transfer_prover + +lemma [transfer_rule]: + "fun_rel HOL.eq cr_integer (\k :: int. k :: int) (of_int :: int \ integer)" +proof - + have "fun_rel HOL.eq cr_integer (of_int :: int \ int) (of_int :: int \ integer)" + by (unfold of_int_of_nat [abs_def]) transfer_prover + then show ?thesis by (simp add: id_def) +qed + +lemma [transfer_rule]: + "fun_rel HOL.eq cr_integer (numeral :: num \ int) (numeral :: num \ integer)" +proof - + have "fun_rel HOL.eq cr_integer (numeral :: num \ int) (\n. of_int (numeral n))" + by transfer_prover + then show ?thesis by simp +qed + +lemma [transfer_rule]: + "fun_rel HOL.eq cr_integer (neg_numeral :: num \ int) (neg_numeral :: num \ integer)" + by (unfold neg_numeral_def [abs_def]) transfer_prover + +lemma [transfer_rule]: + "fun_rel HOL.eq (fun_rel HOL.eq cr_integer) (Num.sub :: _ \ _ \ int) (Num.sub :: _ \ _ \ integer)" + by (unfold Num.sub_def [abs_def]) transfer_prover + lemma int_of_integer_of_nat [simp]: "int_of_integer (of_nat n) = of_nat n" - by (induct n) simp_all + by transfer rule -definition integer_of_nat :: "nat \ integer" -where - "integer_of_nat = of_nat" +lift_definition integer_of_nat :: "nat \ integer" + is "of_nat :: nat \ int" + . lemma int_of_integer_integer_of_nat [simp]: "int_of_integer (integer_of_nat n) = of_nat n" - by (simp add: integer_of_nat_def) - -definition nat_of_integer :: "integer \ nat" -where - "nat_of_integer k = Int.nat (int_of_integer k)" + by transfer rule + +lift_definition nat_of_integer :: "integer \ nat" + is Int.nat + . lemma nat_of_integer_of_nat [simp]: "nat_of_integer (of_nat n) = n" - by (simp add: nat_of_integer_def) + by transfer simp lemma int_of_integer_of_int [simp]: "int_of_integer (of_int k) = k" - by (induct k) (simp_all, simp only: neg_numeral_def numeral_One int_of_integer_uminus int_of_integer_one) + by transfer simp lemma nat_of_integer_integer_of_nat [simp]: "nat_of_integer (integer_of_nat n) = n" - by (simp add: integer_of_nat_def) + by transfer simp lemma integer_of_int_eq_of_int [simp, code_abbrev]: "integer_of_int = of_int" - by rule (simp add: integer_eq_iff) + by transfer (simp add: fun_eq_iff) lemma of_int_integer_of [simp]: "of_int (int_of_integer k) = (k :: integer)" - by (simp add: integer_eq_iff) + by transfer rule lemma int_of_integer_numeral [simp]: "int_of_integer (numeral k) = numeral k" - using int_of_integer_of_int [of "numeral k"] by simp + by transfer rule lemma int_of_integer_neg_numeral [simp]: "int_of_integer (neg_numeral k) = neg_numeral k" - by (simp only: neg_numeral_def int_of_integer_uminus) simp + by transfer rule lemma int_of_integer_sub [simp]: "int_of_integer (Num.sub k l) = Num.sub k l" - by (simp only: Num.sub_def int_of_integer_minus int_of_integer_numeral) + by transfer rule instantiation integer :: "{ring_div, equal, linordered_idom}" begin -definition - "k div l = of_int (int_of_integer k div int_of_integer l)" +lift_definition div_integer :: "integer \ integer \ integer" + is "Divides.div :: int \ int \ int" + . -lemma int_of_integer_div [simp]: - "int_of_integer (k div l) = int_of_integer k div int_of_integer l" - by (simp add: div_integer_def) +declare div_integer.rep_eq [simp] -definition - "k mod l = of_int (int_of_integer k mod int_of_integer l)" +lift_definition mod_integer :: "integer \ integer \ integer" + is "Divides.mod :: int \ int \ int" + . + +declare mod_integer.rep_eq [simp] -lemma int_of_integer_mod [simp]: - "int_of_integer (k mod l) = int_of_integer k mod int_of_integer l" - by (simp add: mod_integer_def) +lift_definition abs_integer :: "integer \ integer" + is "abs :: int \ int" + . -definition - "\k\ = of_int \int_of_integer k\" +declare abs_integer.rep_eq [simp] -lemma int_of_integer_abs [simp]: - "int_of_integer \k\ = \int_of_integer k\" - by (simp add: abs_integer_def) +lift_definition sgn_integer :: "integer \ integer" + is "sgn :: int \ int" + . -definition - "sgn k = of_int (sgn (int_of_integer k))" +declare sgn_integer.rep_eq [simp] -lemma int_of_integer_sgn [simp]: - "int_of_integer (sgn k) = sgn (int_of_integer k)" - by (simp add: sgn_integer_def) +lift_definition less_eq_integer :: "integer \ integer \ bool" + is "less_eq :: int \ int \ bool" + . -definition - "k \ l \ int_of_integer k \ int_of_integer l" +lift_definition less_integer :: "integer \ integer \ bool" + is "less :: int \ int \ bool" + . -definition - "k < l \ int_of_integer k < int_of_integer l" - -definition - "HOL.equal k l \ HOL.equal (int_of_integer k) (int_of_integer l)" +lift_definition equal_integer :: "integer \ integer \ bool" + is "HOL.equal :: int \ int \ bool" + . instance proof -qed (auto simp add: integer_eq_iff algebra_simps - less_eq_integer_def less_integer_def equal_integer_def equal - intro: mult_strict_right_mono) +qed (transfer, simp add: algebra_simps equal less_le_not_le [symmetric] mult_strict_right_mono linear)+ end +lemma [transfer_rule]: + "fun_rel cr_integer (fun_rel cr_integer cr_integer) (min :: _ \ _ \ int) (min :: _ \ _ \ integer)" + by (unfold min_def [abs_def]) transfer_prover + +lemma [transfer_rule]: + "fun_rel cr_integer (fun_rel cr_integer cr_integer) (max :: _ \ _ \ int) (max :: _ \ _ \ integer)" + by (unfold max_def [abs_def]) transfer_prover + lemma int_of_integer_min [simp]: "int_of_integer (min k l) = min (int_of_integer k) (int_of_integer l)" - by (simp add: min_def less_eq_integer_def) + by transfer rule lemma int_of_integer_max [simp]: "int_of_integer (max k l) = max (int_of_integer k) (int_of_integer l)" - by (simp add: max_def less_eq_integer_def) + by transfer rule lemma nat_of_integer_non_positive [simp]: "k \ 0 \ nat_of_integer k = 0" - by (simp add: nat_of_integer_def less_eq_integer_def) + by transfer simp lemma of_nat_of_integer [simp]: "of_nat (nat_of_integer k) = max 0 k" - by (simp add: nat_of_integer_def integer_eq_iff less_eq_integer_def max_def) + by transfer auto subsection {* Code theorems for target language integers *} @@ -199,29 +228,36 @@ where [simp, code_abbrev]: "Pos = numeral" +lemma [transfer_rule]: + "fun_rel HOL.eq cr_integer numeral Pos" + by simp transfer_prover + definition Neg :: "num \ integer" where [simp, code_abbrev]: "Neg = neg_numeral" +lemma [transfer_rule]: + "fun_rel HOL.eq cr_integer neg_numeral Neg" + by simp transfer_prover + code_datatype "0::integer" Pos Neg text {* Auxiliary operations *} -definition dup :: "integer \ integer" -where - [simp]: "dup k = k + k" +lift_definition dup :: "integer \ integer" + is "\k::int. k + k" + . lemma dup_code [code]: "dup 0 = 0" "dup (Pos n) = Pos (Num.Bit0 n)" "dup (Neg n) = Neg (Num.Bit0 n)" - unfolding Pos_def Neg_def neg_numeral_def - by (simp_all add: numeral_Bit0) + by (transfer, simp only: neg_numeral_def numeral_Bit0 minus_add_distrib)+ -definition sub :: "num \ num \ integer" -where - [simp]: "sub m n = numeral m - numeral n" +lift_definition sub :: "num \ num \ integer" + is "\m n. numeral m - numeral n :: int" + . lemma sub_code [code]: "sub Num.One Num.One = 0" @@ -233,9 +269,7 @@ "sub (Num.Bit1 m) (Num.Bit1 n) = dup (sub m n)" "sub (Num.Bit1 m) (Num.Bit0 n) = dup (sub m n) + 1" "sub (Num.Bit0 m) (Num.Bit1 n) = dup (sub m n) - 1" - unfolding sub_def dup_def numeral.simps Pos_def Neg_def - neg_numeral_def numeral_BitM - by (simp_all only: algebra_simps add.comm_neutral) + by (transfer, simp add: dbl_def dbl_inc_def dbl_dec_def)+ text {* Implementations *} @@ -251,7 +285,7 @@ "Pos m + Neg n = sub m n" "Neg m + Pos n = sub n m" "Neg m + Neg n = Neg (m + n)" - by simp_all + by (transfer, simp)+ lemma uminus_integer_code [code]: "uminus 0 = (0::integer)" @@ -266,7 +300,7 @@ "Pos m - Neg n = Pos (m + n)" "Neg m - Pos n = Neg (m + n)" "Neg m - Neg n = sub n m" - by simp_all + by (transfer, simp)+ lemma abs_integer_code [code]: "\k\ = (if (k::integer) < 0 then - k else k)" @@ -322,15 +356,18 @@ (let j = sub k l in if j < 0 then (0, Pos k) else let (q, r) = divmod_abs j (Pos l) in (q + 1, r))" - by (auto simp add: prod_eq_iff integer_eq_iff Let_def prod_case_beta - sub_non_negative sub_negative div_pos_pos_trivial mod_pos_pos_trivial div_pos_geq mod_pos_geq) + apply (simp add: prod_eq_iff Let_def prod_case_beta) + apply transfer + apply (simp add: sub_non_negative sub_negative div_pos_pos_trivial mod_pos_pos_trivial div_pos_geq mod_pos_geq) + done -lemma divmod_integer_code [code]: "divmod_integer k l = - (if k = 0 then (0, 0) else if l = 0 then (0, k) else - (apsnd \ times \ sgn) l (if sgn k = sgn l - then divmod_abs k l - else (let (r, s) = divmod_abs k l in - if s = 0 then (- r, 0) else (- r - 1, \l\ - s))))" +lemma divmod_integer_code [code]: + "divmod_integer k l = + (if k = 0 then (0, 0) else if l = 0 then (0, k) else + (apsnd \ times \ sgn) l (if sgn k = sgn l + then divmod_abs k l + else (let (r, s) = divmod_abs k l in + if s = 0 then (- r, 0) else (- r - 1, \l\ - s))))" proof - have aux1: "\k l::int. sgn k = sgn l \ k = 0 \ l = 0 \ 0 < l \ 0 < k \ l < 0 \ k < 0" by (auto simp add: sgn_if) @@ -358,7 +395,7 @@ "HOL.equal (Neg k) 0 \ False" "HOL.equal (Neg k) (Pos l) \ False" "HOL.equal (Neg k) (Neg l) \ HOL.equal k l" - by (simp_all add: equal integer_eq_iff) + by (simp_all add: equal) lemma equal_integer_refl [code nbe]: "HOL.equal (k::integer) k \ True" @@ -374,7 +411,7 @@ "Neg k \ 0 \ True" "Neg k \ Pos l \ True" "Neg k \ Neg l \ l \ k" - by (simp_all add: less_eq_integer_def) + by simp_all lemma less_integer_code [code]: "0 < (0::integer) \ False" @@ -386,21 +423,21 @@ "Neg k < 0 \ True" "Neg k < Pos l \ True" "Neg k < Neg l \ l < k" - by (simp_all add: less_integer_def) + by simp_all -definition integer_of_num :: "num \ integer" -where - "integer_of_num = numeral" +lift_definition integer_of_num :: "num \ integer" + is "numeral :: num \ int" + . lemma integer_of_num [code]: "integer_of_num num.One = 1" "integer_of_num (num.Bit0 n) = (let k = integer_of_num n in k + k)" "integer_of_num (num.Bit1 n) = (let k = integer_of_num n in k + k + 1)" - by (simp_all only: Let_def) (simp_all only: integer_of_num_def numeral.simps) + by (transfer, simp only: numeral.simps Let_def)+ -definition num_of_integer :: "integer \ num" -where - "num_of_integer = num_of_nat \ nat_of_integer" +lift_definition num_of_integer :: "integer \ num" + is "num_of_nat \ nat" + . lemma num_of_integer_code [code]: "num_of_integer k = (if k \ 1 then Num.One @@ -587,9 +624,11 @@ typedef natural = "UNIV \ nat set" morphisms nat_of_natural natural_of_nat .. +setup_lifting (no_code) type_definition_natural + lemma natural_eq_iff [termination_simp]: "m = n \ nat_of_natural m = nat_of_natural n" - using nat_of_natural_inject [of m n] .. + by transfer rule lemma natural_eqI: "nat_of_natural m = nat_of_natural n \ m = n" @@ -597,168 +636,179 @@ lemma nat_of_natural_of_nat_inverse [simp]: "nat_of_natural (natural_of_nat n) = n" - using natural_of_nat_inverse [of n] by simp + by transfer rule lemma natural_of_nat_of_natural_inverse [simp]: "natural_of_nat (nat_of_natural n) = n" - using nat_of_natural_inverse [of n] by simp + by transfer rule instantiation natural :: "{comm_monoid_diff, semiring_1}" begin -definition - "0 = natural_of_nat 0" +lift_definition zero_natural :: natural + is "0 :: nat" + . -lemma nat_of_natural_zero [simp]: - "nat_of_natural 0 = 0" - by (simp add: zero_natural_def) +declare zero_natural.rep_eq [simp] -definition - "1 = natural_of_nat 1" +lift_definition one_natural :: natural + is "1 :: nat" + . -lemma nat_of_natural_one [simp]: - "nat_of_natural 1 = 1" - by (simp add: one_natural_def) - -definition - "m + n = natural_of_nat (nat_of_natural m + nat_of_natural n)" +declare one_natural.rep_eq [simp] -lemma nat_of_natural_plus [simp]: - "nat_of_natural (m + n) = nat_of_natural m + nat_of_natural n" - by (simp add: plus_natural_def) +lift_definition plus_natural :: "natural \ natural \ natural" + is "plus :: nat \ nat \ nat" + . -definition - "m - n = natural_of_nat (nat_of_natural m - nat_of_natural n)" +declare plus_natural.rep_eq [simp] -lemma nat_of_natural_minus [simp]: - "nat_of_natural (m - n) = nat_of_natural m - nat_of_natural n" - by (simp add: minus_natural_def) +lift_definition minus_natural :: "natural \ natural \ natural" + is "minus :: nat \ nat \ nat" + . + +declare minus_natural.rep_eq [simp] -definition - "m * n = natural_of_nat (nat_of_natural m * nat_of_natural n)" +lift_definition times_natural :: "natural \ natural \ natural" + is "times :: nat \ nat \ nat" + . -lemma nat_of_natural_times [simp]: - "nat_of_natural (m * n) = nat_of_natural m * nat_of_natural n" - by (simp add: times_natural_def) +declare times_natural.rep_eq [simp] instance proof -qed (auto simp add: natural_eq_iff algebra_simps) +qed (transfer, simp add: algebra_simps)+ end +lemma [transfer_rule]: + "fun_rel HOL.eq cr_natural (\n::nat. n) (of_nat :: nat \ natural)" +proof - + have "fun_rel HOL.eq cr_natural (of_nat :: nat \ nat) (of_nat :: nat \ natural)" + by (unfold of_nat_def [abs_def]) transfer_prover + then show ?thesis by (simp add: id_def) +qed + +lemma [transfer_rule]: + "fun_rel HOL.eq cr_natural (numeral :: num \ nat) (numeral :: num \ natural)" +proof - + have "fun_rel HOL.eq cr_natural (numeral :: num \ nat) (\n. of_nat (numeral n))" + by transfer_prover + then show ?thesis by simp +qed + lemma nat_of_natural_of_nat [simp]: "nat_of_natural (of_nat n) = n" - by (induct n) simp_all + by transfer rule lemma natural_of_nat_of_nat [simp, code_abbrev]: "natural_of_nat = of_nat" - by rule (simp add: natural_eq_iff) + by transfer rule lemma of_nat_of_natural [simp]: "of_nat (nat_of_natural n) = n" - using natural_of_nat_of_natural_inverse [of n] by simp + by transfer rule lemma nat_of_natural_numeral [simp]: "nat_of_natural (numeral k) = numeral k" - using nat_of_natural_of_nat [of "numeral k"] by simp + by transfer rule instantiation natural :: "{semiring_div, equal, linordered_semiring}" begin -definition - "m div n = natural_of_nat (nat_of_natural m div nat_of_natural n)" +lift_definition div_natural :: "natural \ natural \ natural" + is "Divides.div :: nat \ nat \ nat" + . + +declare div_natural.rep_eq [simp] -lemma nat_of_natural_div [simp]: - "nat_of_natural (m div n) = nat_of_natural m div nat_of_natural n" - by (simp add: div_natural_def) +lift_definition mod_natural :: "natural \ natural \ natural" + is "Divides.mod :: nat \ nat \ nat" + . -definition - "m mod n = natural_of_nat (nat_of_natural m mod nat_of_natural n)" +declare mod_natural.rep_eq [simp] -lemma nat_of_natural_mod [simp]: - "nat_of_natural (m mod n) = nat_of_natural m mod nat_of_natural n" - by (simp add: mod_natural_def) +lift_definition less_eq_natural :: "natural \ natural \ bool" + is "less_eq :: nat \ nat \ bool" + . + +declare less_eq_natural.rep_eq [termination_simp] -definition - [termination_simp]: "m \ n \ nat_of_natural m \ nat_of_natural n" +lift_definition less_natural :: "natural \ natural \ bool" + is "less :: nat \ nat \ bool" + . -definition - [termination_simp]: "m < n \ nat_of_natural m < nat_of_natural n" +declare less_natural.rep_eq [termination_simp] -definition - "HOL.equal m n \ HOL.equal (nat_of_natural m) (nat_of_natural n)" +lift_definition equal_natural :: "natural \ natural \ bool" + is "HOL.equal :: nat \ nat \ bool" + . instance proof -qed (auto simp add: natural_eq_iff algebra_simps - less_eq_natural_def less_natural_def equal_natural_def equal) +qed (transfer, simp add: algebra_simps equal less_le_not_le [symmetric] linear)+ end +lemma [transfer_rule]: + "fun_rel cr_natural (fun_rel cr_natural cr_natural) (min :: _ \ _ \ nat) (min :: _ \ _ \ natural)" + by (unfold min_def [abs_def]) transfer_prover + +lemma [transfer_rule]: + "fun_rel cr_natural (fun_rel cr_natural cr_natural) (max :: _ \ _ \ nat) (max :: _ \ _ \ natural)" + by (unfold max_def [abs_def]) transfer_prover + lemma nat_of_natural_min [simp]: "nat_of_natural (min k l) = min (nat_of_natural k) (nat_of_natural l)" - by (simp add: min_def less_eq_natural_def) + by transfer rule lemma nat_of_natural_max [simp]: "nat_of_natural (max k l) = max (nat_of_natural k) (nat_of_natural l)" - by (simp add: max_def less_eq_natural_def) + by transfer rule -definition natural_of_integer :: "integer \ natural" -where - "natural_of_integer = of_nat \ nat_of_integer" +lift_definition natural_of_integer :: "integer \ natural" + is "nat :: int \ nat" + . -definition integer_of_natural :: "natural \ integer" -where - "integer_of_natural = of_nat \ nat_of_natural" +lift_definition integer_of_natural :: "natural \ integer" + is "of_nat :: nat \ int" + . lemma natural_of_integer_of_natural [simp]: "natural_of_integer (integer_of_natural n) = n" - by (simp add: natural_of_integer_def integer_of_natural_def natural_eq_iff) + by transfer simp lemma integer_of_natural_of_integer [simp]: "integer_of_natural (natural_of_integer k) = max 0 k" - by (simp add: natural_of_integer_def integer_of_natural_def integer_eq_iff) + by transfer auto lemma int_of_integer_of_natural [simp]: "int_of_integer (integer_of_natural n) = of_nat (nat_of_natural n)" - by (simp add: integer_of_natural_def) + by transfer rule lemma integer_of_natural_of_nat [simp]: "integer_of_natural (of_nat n) = of_nat n" - by (simp add: integer_eq_iff) + by transfer rule lemma [measure_function]: - "is_measure nat_of_natural" by (rule is_measure_trivial) + "is_measure nat_of_natural" + by (rule is_measure_trivial) subsection {* Inductive represenation of target language naturals *} -definition Suc :: "natural \ natural" -where - "Suc = natural_of_nat \ Nat.Suc \ nat_of_natural" +lift_definition Suc :: "natural \ natural" + is Nat.Suc + . -lemma nat_of_natural_Suc [simp]: - "nat_of_natural (Suc n) = Nat.Suc (nat_of_natural n)" - by (simp add: Suc_def) +declare Suc.rep_eq [simp] rep_datatype "0::natural" Suc -proof - - fix P :: "natural \ bool" - fix n :: natural - assume "P 0" then have init: "P (natural_of_nat 0)" by simp - assume "\n. P n \ P (Suc n)" - then have "\n. P (natural_of_nat n) \ P (Suc (natural_of_nat n))" . - then have step: "\n. P (natural_of_nat n) \ P (natural_of_nat (Nat.Suc n))" - by (simp add: Suc_def) - from init step have "P (natural_of_nat (nat_of_natural n))" - by (rule nat.induct) - with natural_of_nat_of_natural_inverse show "P n" by simp -qed (simp_all add: natural_eq_iff) + by (transfer, fact nat.induct nat.inject nat.distinct)+ lemma natural_case [case_names nat, cases type: natural]: fixes m :: natural assumes "\n. m = of_nat n \ P" shows P - by (rule assms [of "nat_of_natural m"]) simp + using assms by transfer blast lemma [simp, code]: "natural_size = nat_of_natural" @@ -778,7 +828,7 @@ lemma natural_decr [termination_simp]: "n \ 0 \ nat_of_natural n - Nat.Suc 0 < nat_of_natural n" - by (simp add: natural_eq_iff) + by transfer simp lemma natural_zero_minus_one: "(0::natural) - 1 = 0" @@ -786,26 +836,26 @@ lemma Suc_natural_minus_one: "Suc n - 1 = n" - by (simp add: natural_eq_iff) + by transfer simp hide_const (open) Suc subsection {* Code refinement for target language naturals *} -definition Nat :: "integer \ natural" -where - "Nat = natural_of_integer" +lift_definition Nat :: "integer \ natural" + is nat + . lemma [code_post]: "Nat 0 = 0" "Nat 1 = 1" "Nat (numeral k) = numeral k" - by (simp_all add: Nat_def nat_of_integer_def natural_of_integer_def) + by (transfer, simp)+ lemma [code abstype]: "Nat (integer_of_natural n) = n" - by (unfold Nat_def) (fact natural_of_integer_of_natural) + by transfer simp lemma [code abstract]: "integer_of_natural (natural_of_nat n) = of_nat n" @@ -817,23 +867,23 @@ lemma [code_abbrev]: "natural_of_integer (Code_Numeral_Types.Pos k) = numeral k" - by (simp add: nat_of_integer_def natural_of_integer_def) + by transfer simp lemma [code abstract]: "integer_of_natural 0 = 0" - by (simp add: integer_eq_iff) + by transfer simp lemma [code abstract]: "integer_of_natural 1 = 1" - by (simp add: integer_eq_iff) + by transfer simp lemma [code abstract]: "integer_of_natural (Code_Numeral_Types.Suc n) = integer_of_natural n + 1" - by (simp add: integer_eq_iff) + by transfer simp lemma [code]: "nat_of_natural = nat_of_integer \ integer_of_natural" - by (simp add: integer_of_natural_def fun_eq_iff) + by transfer (simp add: fun_eq_iff) lemma [code, code_unfold]: "natural_case f g n = (if n = 0 then f else g (n - 1))" @@ -843,39 +893,39 @@ lemma [code abstract]: "integer_of_natural (m + n) = integer_of_natural m + integer_of_natural n" - by (simp add: integer_eq_iff) + by transfer simp lemma [code abstract]: "integer_of_natural (m - n) = max 0 (integer_of_natural m - integer_of_natural n)" - by (simp add: integer_eq_iff) + by transfer simp lemma [code abstract]: "integer_of_natural (m * n) = integer_of_natural m * integer_of_natural n" - by (simp add: integer_eq_iff of_nat_mult) + by transfer (simp add: of_nat_mult) lemma [code abstract]: "integer_of_natural (m div n) = integer_of_natural m div integer_of_natural n" - by (simp add: integer_eq_iff zdiv_int) + by transfer (simp add: zdiv_int) lemma [code abstract]: "integer_of_natural (m mod n) = integer_of_natural m mod integer_of_natural n" - by (simp add: integer_eq_iff zmod_int) + by transfer (simp add: zmod_int) lemma [code]: "HOL.equal m n \ HOL.equal (integer_of_natural m) (integer_of_natural n)" - by (simp add: equal natural_eq_iff integer_eq_iff) + by transfer (simp add: equal) lemma [code nbe]: "HOL.equal n (n::natural) \ True" by (simp add: equal) lemma [code]: - "m \ n \ (integer_of_natural m) \ integer_of_natural n" - by (simp add: less_eq_natural_def less_eq_integer_def) + "m \ n \ integer_of_natural m \ integer_of_natural n" + by transfer simp lemma [code]: - "m < n \ (integer_of_natural m) < integer_of_natural n" - by (simp add: less_natural_def less_integer_def) + "m < n \ integer_of_natural m < integer_of_natural n" + by transfer simp hide_const (open) Nat diff -r 222fb6cb2c3e -r 3e913a575dc6 src/HOL/Library/Code_Target_Int.thy --- a/src/HOL/Library/Code_Target_Int.thy Thu Feb 14 12:24:56 2013 +0100 +++ b/src/HOL/Library/Code_Target_Int.thy Thu Feb 14 12:24:56 2013 +0100 @@ -15,47 +15,47 @@ lemma [code]: "integer_of_int (int_of_integer k) = k" - by (simp add: integer_eq_iff) + by transfer rule lemma [code]: "Int.Pos = int_of_integer \ integer_of_num" - by (simp add: integer_of_num_def fun_eq_iff) + by transfer (simp add: fun_eq_iff) lemma [code]: "Int.Neg = int_of_integer \ uminus \ integer_of_num" - by (simp add: integer_of_num_def fun_eq_iff) + by transfer (simp add: fun_eq_iff) lemma [code_abbrev]: "int_of_integer (numeral k) = Int.Pos k" - by simp + by transfer simp lemma [code_abbrev]: "int_of_integer (neg_numeral k) = Int.Neg k" - by simp + by transfer simp lemma [code, symmetric, code_post]: "0 = int_of_integer 0" - by simp + by transfer simp lemma [code, symmetric, code_post]: "1 = int_of_integer 1" - by simp + by transfer simp lemma [code]: "k + l = int_of_integer (of_int k + of_int l)" - by simp + by transfer simp lemma [code]: "- k = int_of_integer (- of_int k)" - by simp + by transfer simp lemma [code]: "k - l = int_of_integer (of_int k - of_int l)" - by simp + by transfer simp lemma [code]: "Int.dup k = int_of_integer (Code_Numeral_Types.dup (of_int k))" - by simp + by transfer simp lemma [code, code del]: "Int.sub = Int.sub" .. @@ -79,15 +79,15 @@ lemma [code]: "HOL.equal k l = HOL.equal (of_int k :: integer) (of_int l)" - by (simp add: equal integer_eq_iff) + by transfer (simp add: equal) lemma [code]: "k \ l \ (of_int k :: integer) \ of_int l" - by (simp add: less_eq_int_def) + by transfer rule lemma [code]: "k < l \ (of_int k :: integer) < of_int l" - by (simp add: less_int_def) + by transfer rule lemma (in ring_1) of_int_code: "of_int k = (if k = 0 then 0 @@ -107,7 +107,7 @@ lemma [code]: "nat = nat_of_integer \ of_int" - by (simp add: fun_eq_iff nat_of_integer_def) + by transfer (simp add: fun_eq_iff) code_modulename SML Code_Target_Int Arith diff -r 222fb6cb2c3e -r 3e913a575dc6 src/HOL/Library/Code_Target_Nat.thy --- a/src/HOL/Library/Code_Target_Nat.thy Thu Feb 14 12:24:56 2013 +0100 +++ b/src/HOL/Library/Code_Target_Nat.thy Thu Feb 14 12:24:56 2013 +0100 @@ -10,47 +10,47 @@ subsection {* Implementation for @{typ nat} *} -definition Nat :: "integer \ nat" -where - "Nat = nat_of_integer" +lift_definition Nat :: "integer \ nat" + is nat + . lemma [code_post]: "Nat 0 = 0" "Nat 1 = 1" "Nat (numeral k) = numeral k" - by (simp_all add: Nat_def nat_of_integer_def) + by (transfer, simp)+ lemma [code_abbrev]: "integer_of_nat = of_nat" - by (fact integer_of_nat_def) + by transfer rule lemma [code_unfold]: "Int.nat (int_of_integer k) = nat_of_integer k" - by (simp add: nat_of_integer_def) + by transfer rule lemma [code abstype]: "Code_Target_Nat.Nat (integer_of_nat n) = n" - by (simp add: Nat_def integer_of_nat_def) + by transfer simp lemma [code abstract]: "integer_of_nat (nat_of_integer k) = max 0 k" - by (simp add: integer_of_nat_def) + by transfer auto lemma [code_abbrev]: "nat_of_integer (numeral k) = nat_of_num k" - by (simp add: nat_of_integer_def nat_of_num_numeral) + by transfer (simp add: nat_of_num_numeral) lemma [code abstract]: "integer_of_nat (nat_of_num n) = integer_of_num n" - by (simp add: integer_eq_iff integer_of_num_def nat_of_num_numeral) + by transfer (simp add: nat_of_num_numeral) lemma [code abstract]: "integer_of_nat 0 = 0" - by (simp add: integer_eq_iff integer_of_nat_def) + by transfer simp lemma [code abstract]: "integer_of_nat 1 = 1" - by (simp add: integer_eq_iff integer_of_nat_def) + by transfer simp lemma [code]: "Suc n = n + 1" @@ -58,23 +58,23 @@ lemma [code abstract]: "integer_of_nat (m + n) = of_nat m + of_nat n" - by (simp add: integer_eq_iff integer_of_nat_def) + by transfer simp lemma [code abstract]: "integer_of_nat (m - n) = max 0 (of_nat m - of_nat n)" - by (simp add: integer_eq_iff integer_of_nat_def) + by transfer simp lemma [code abstract]: "integer_of_nat (m * n) = of_nat m * of_nat n" - by (simp add: integer_eq_iff of_nat_mult integer_of_nat_def) + by transfer (simp add: of_nat_mult) lemma [code abstract]: "integer_of_nat (m div n) = of_nat m div of_nat n" - by (simp add: integer_eq_iff zdiv_int integer_of_nat_def) + by transfer (simp add: zdiv_int) lemma [code abstract]: "integer_of_nat (m mod n) = of_nat m mod of_nat n" - by (simp add: integer_eq_iff zmod_int integer_of_nat_def) + by transfer (simp add: zmod_int) lemma [code]: "Divides.divmod_nat m n = (m div n, m mod n)" @@ -82,7 +82,7 @@ lemma [code]: "HOL.equal m n = HOL.equal (of_nat m :: integer) (of_nat n)" - by (simp add: equal integer_eq_iff) + by transfer (simp add: equal) lemma [code]: "m \ n \ (of_nat m :: integer) \ of_nat n" @@ -94,7 +94,7 @@ lemma num_of_nat_code [code]: "num_of_nat = num_of_integer \ of_nat" - by (simp add: fun_eq_iff num_of_integer_def integer_of_nat_def) + by transfer (simp add: fun_eq_iff) lemma (in semiring_1) of_nat_code: "of_nat n = (if n = 0 then 0 @@ -121,7 +121,7 @@ lemma [code abstract]: "integer_of_nat (nat k) = max 0 (integer_of_int k)" - by (simp add: integer_of_nat_def of_int_of_nat max_def) + by transfer auto code_modulename SML Code_Target_Nat Arith