| author | smolkas | 
| Fri, 11 Jan 2013 14:35:28 +0100 | |
| changeset 50824 | a991d603aac6 | 
| parent 50023 | 28f3263d4d1b | 
| child 51095 | 7ae79f2e3cc7 | 
| permissions | -rw-r--r-- | 
| 50023 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 1 | (* Title: HOL/Library/Code_Target_Nat.thy | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 2 | Author: Stefan Berghofer, Florian Haftmann, TU Muenchen | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 3 | *) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 4 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 5 | header {* Implementation of natural numbers by target-language integers *}
 | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 6 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 7 | theory Code_Target_Nat | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 8 | imports Main Code_Numeral_Types Code_Binary_Nat | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 9 | begin | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 10 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 11 | subsection {* Implementation for @{typ nat} *}
 | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 12 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 13 | definition Nat :: "integer \<Rightarrow> nat" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 14 | where | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 15 | "Nat = nat_of_integer" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 16 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 17 | definition integer_of_nat :: "nat \<Rightarrow> integer" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 18 | where | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 19 | [code_abbrev]: "integer_of_nat = of_nat" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 20 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 21 | lemma int_of_integer_integer_of_nat [simp]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 22 | "int_of_integer (integer_of_nat n) = of_nat n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 23 | by (simp add: integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 24 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 25 | lemma [code_unfold]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 26 | "Int.nat (int_of_integer k) = nat_of_integer k" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 27 | by (simp add: nat_of_integer_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 28 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 29 | lemma [code abstype]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 30 | "Code_Target_Nat.Nat (integer_of_nat n) = n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 31 | by (simp add: Nat_def integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 32 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 33 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 34 | "integer_of_nat (nat_of_integer k) = max 0 k" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 35 | by (simp add: integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 36 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 37 | lemma [code_abbrev]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 38 | "nat_of_integer (Code_Numeral_Types.Pos k) = nat_of_num k" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 39 | by (simp add: nat_of_integer_def nat_of_num_numeral) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 40 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 41 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 42 | "integer_of_nat (nat_of_num n) = integer_of_num n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 43 | by (simp add: integer_eq_iff integer_of_num_def nat_of_num_numeral) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 44 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 45 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 46 | "integer_of_nat 0 = 0" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 47 | by (simp add: integer_eq_iff integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 48 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 49 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 50 | "integer_of_nat 1 = 1" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 51 | by (simp add: integer_eq_iff integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 52 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 53 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 54 | "integer_of_nat (m + n) = of_nat m + of_nat n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 55 | by (simp add: integer_eq_iff integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 56 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 57 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 58 | "integer_of_nat (Code_Binary_Nat.dup n) = Code_Numeral_Types.dup (of_nat n)" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 59 | by (simp add: integer_eq_iff Code_Binary_Nat.dup_def integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 60 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 61 | lemma [code, code del]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 62 | "Code_Binary_Nat.sub = Code_Binary_Nat.sub" .. | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 63 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 64 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 65 | "integer_of_nat (m - n) = max 0 (of_nat m - of_nat n)" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 66 | by (simp add: integer_eq_iff integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 67 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 68 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 69 | "integer_of_nat (m * n) = of_nat m * of_nat n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 70 | by (simp add: integer_eq_iff of_nat_mult integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 71 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 72 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 73 | "integer_of_nat (m div n) = of_nat m div of_nat n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 74 | by (simp add: integer_eq_iff zdiv_int integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 75 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 76 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 77 | "integer_of_nat (m mod n) = of_nat m mod of_nat n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 78 | by (simp add: integer_eq_iff zmod_int integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 79 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 80 | lemma [code]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 81 | "Divides.divmod_nat m n = (m div n, m mod n)" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 82 | by (simp add: prod_eq_iff) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 83 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 84 | lemma [code]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 85 | "HOL.equal m n = HOL.equal (of_nat m :: integer) (of_nat n)" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 86 | by (simp add: equal integer_eq_iff) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 87 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 88 | lemma [code]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 89 | "m \<le> n \<longleftrightarrow> (of_nat m :: integer) \<le> of_nat n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 90 | by simp | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 91 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 92 | lemma [code]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 93 | "m < n \<longleftrightarrow> (of_nat m :: integer) < of_nat n" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 94 | by simp | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 95 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 96 | lemma num_of_nat_code [code]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 97 | "num_of_nat = num_of_integer \<circ> of_nat" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 98 | by (simp add: fun_eq_iff num_of_integer_def integer_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 99 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 100 | lemma (in semiring_1) of_nat_code: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 101 | "of_nat n = (if n = 0 then 0 | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 102 | else let | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 103 | (m, q) = divmod_nat n 2; | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 104 | m' = 2 * of_nat m | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 105 | in if q = 0 then m' else m' + 1)" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 106 | proof - | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 107 | from mod_div_equality have *: "of_nat n = of_nat (n div 2 * 2 + n mod 2)" by simp | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 108 | show ?thesis | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 109 | by (simp add: Let_def divmod_nat_div_mod mod_2_not_eq_zero_eq_one_nat | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 110 | of_nat_add [symmetric]) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 111 | (simp add: * mult_commute of_nat_mult add_commute) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 112 | qed | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 113 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 114 | declare of_nat_code [code] | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 115 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 116 | definition int_of_nat :: "nat \<Rightarrow> int" where | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 117 | [code_abbrev]: "int_of_nat = of_nat" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 118 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 119 | lemma [code]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 120 | "int_of_nat n = int_of_integer (of_nat n)" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 121 | by (simp add: int_of_nat_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 122 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 123 | lemma [code abstract]: | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 124 | "integer_of_nat (nat k) = max 0 (integer_of_int k)" | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 125 | by (simp add: integer_of_nat_def of_int_of_nat max_def) | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 126 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 127 | code_modulename SML | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 128 | Code_Target_Nat Arith | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 129 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 130 | code_modulename OCaml | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 131 | Code_Target_Nat Arith | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 132 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 133 | code_modulename Haskell | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 134 | Code_Target_Nat Arith | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 135 | |
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 136 | end | 
| 
28f3263d4d1b
refined stack of library theories implementing int and/or nat by target language numerals
 haftmann parents: diff
changeset | 137 |