src/HOL/Library/Target_Numeral.thy
author Christian Sternagel
Wed, 29 Aug 2012 12:24:26 +0900
changeset 49084 e3973567ed4f
parent 48075 ec5e62b868eb
child 49834 b27bbb021df1
permissions -rw-r--r--
base Sublist_Order on Sublist (using a simplified form of embedding as sublist relation)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     1
theory Target_Numeral
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     2
imports Main Code_Nat
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     3
begin
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     4
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     5
subsection {* Type of target language numerals *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     6
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     7
typedef (open) int = "UNIV \<Colon> int set"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     8
  morphisms int_of of_int ..
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
     9
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    10
hide_type (open) int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    11
hide_const (open) of_int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    12
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    13
lemma int_eq_iff:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    14
  "k = l \<longleftrightarrow> int_of k = int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    15
  using int_of_inject [of k l] ..
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    16
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    17
lemma int_eqI:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    18
  "int_of k = int_of l \<Longrightarrow> k = l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    19
  using int_eq_iff [of k l] by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    20
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    21
lemma int_of_int [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    22
  "int_of (Target_Numeral.of_int k) = k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    23
  using of_int_inverse [of k] by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    24
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    25
lemma of_int_of [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    26
  "Target_Numeral.of_int (int_of k) = k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    27
  using int_of_inverse [of k] by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    28
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    29
hide_fact (open) int_eq_iff int_eqI
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    30
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    31
instantiation Target_Numeral.int :: ring_1
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    32
begin
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    33
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    34
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    35
  "0 = Target_Numeral.of_int 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    36
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    37
lemma int_of_zero [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    38
  "int_of 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    39
  by (simp add: zero_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    40
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    41
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    42
  "1 = Target_Numeral.of_int 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    43
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    44
lemma int_of_one [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    45
  "int_of 1 = 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    46
  by (simp add: one_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    47
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    48
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    49
  "k + l = Target_Numeral.of_int (int_of k + int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    50
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    51
lemma int_of_plus [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    52
  "int_of (k + l) = int_of k + int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    53
  by (simp add: plus_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    54
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    55
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    56
  "- k = Target_Numeral.of_int (- int_of k)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    57
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    58
lemma int_of_uminus [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    59
  "int_of (- k) = - int_of k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    60
  by (simp add: uminus_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    61
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    62
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    63
  "k - l = Target_Numeral.of_int (int_of k - int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    64
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    65
lemma int_of_minus [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    66
  "int_of (k - l) = int_of k - int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    67
  by (simp add: minus_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    68
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    69
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    70
  "k * l = Target_Numeral.of_int (int_of k * int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    71
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    72
lemma int_of_times [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    73
  "int_of (k * l) = int_of k * int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    74
  by (simp add: times_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    75
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    76
instance proof
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    77
qed (auto simp add: Target_Numeral.int_eq_iff algebra_simps)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    78
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    79
end
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    80
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    81
lemma int_of_of_nat [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    82
  "int_of (of_nat n) = of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    83
  by (induct n) simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    84
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    85
definition nat_of :: "Target_Numeral.int \<Rightarrow> nat" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    86
  "nat_of k = Int.nat (int_of k)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    87
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    88
lemma nat_of_of_nat [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    89
  "nat_of (of_nat n) = n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    90
  by (simp add: nat_of_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    91
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    92
lemma int_of_of_int [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    93
  "int_of (of_int k) = k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    94
  by (induct k) (simp_all, simp only: neg_numeral_def numeral_One int_of_uminus int_of_one)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    95
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    96
lemma of_int_of_int [simp, code_abbrev]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    97
  "Target_Numeral.of_int = of_int"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    98
  by rule (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
    99
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   100
lemma int_of_numeral [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   101
  "int_of (numeral k) = numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   102
  using int_of_of_int [of "numeral k"] by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   103
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   104
lemma int_of_neg_numeral [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   105
  "int_of (neg_numeral k) = neg_numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   106
  by (simp only: neg_numeral_def int_of_uminus) simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   107
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   108
lemma int_of_sub [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   109
  "int_of (Num.sub k l) = Num.sub k l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   110
  by (simp only: Num.sub_def int_of_minus int_of_numeral)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   111
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   112
instantiation Target_Numeral.int :: "{ring_div, equal, linordered_idom}"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   113
begin
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   114
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   115
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   116
  "k div l = of_int (int_of k div int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   117
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   118
lemma int_of_div [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   119
  "int_of (k div l) = int_of k div int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   120
  by (simp add: div_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   121
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   122
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   123
  "k mod l = of_int (int_of k mod int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   124
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   125
lemma int_of_mod [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   126
  "int_of (k mod l) = int_of k mod int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   127
  by (simp add: mod_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   128
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   129
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   130
  "\<bar>k\<bar> = of_int \<bar>int_of k\<bar>"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   131
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   132
lemma int_of_abs [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   133
  "int_of \<bar>k\<bar> = \<bar>int_of k\<bar>"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   134
  by (simp add: abs_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   135
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   136
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   137
  "sgn k = of_int (sgn (int_of k))"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   138
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   139
lemma int_of_sgn [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   140
  "int_of (sgn k) = sgn (int_of k)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   141
  by (simp add: sgn_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   142
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   143
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   144
  "k \<le> l \<longleftrightarrow> int_of k \<le> int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   145
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   146
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   147
  "k < l \<longleftrightarrow> int_of k < int_of l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   148
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   149
definition
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   150
  "HOL.equal k l \<longleftrightarrow> HOL.equal (int_of k) (int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   151
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   152
instance proof
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   153
qed (auto simp add: Target_Numeral.int_eq_iff algebra_simps
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   154
  less_eq_int_def less_int_def equal_int_def equal)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   155
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   156
end
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   157
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   158
lemma int_of_min [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   159
  "int_of (min k l) = min (int_of k) (int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   160
  by (simp add: min_def less_eq_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   161
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   162
lemma int_of_max [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   163
  "int_of (max k l) = max (int_of k) (int_of l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   164
  by (simp add: max_def less_eq_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   165
47400
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   166
lemma of_nat_nat_of [simp]:
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   167
  "of_nat (nat_of k) = max 0 k"
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   168
  by (simp add: nat_of_def Target_Numeral.int_eq_iff less_eq_int_def max_def)
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   169
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   170
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   171
subsection {* Code theorems for target language numerals *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   172
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   173
text {* Constructors *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   174
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   175
definition Pos :: "num \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   176
  [simp, code_abbrev]: "Pos = numeral"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   177
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   178
definition Neg :: "num \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   179
  [simp, code_abbrev]: "Neg = neg_numeral"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   180
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   181
code_datatype "0::Target_Numeral.int" Pos Neg
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   182
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   183
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   184
text {* Auxiliary operations *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   185
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   186
definition dup :: "Target_Numeral.int \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   187
  [simp]: "dup k = k + k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   188
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   189
lemma dup_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   190
  "dup 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   191
  "dup (Pos n) = Pos (Num.Bit0 n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   192
  "dup (Neg n) = Neg (Num.Bit0 n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   193
  unfolding Pos_def Neg_def neg_numeral_def
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   194
  by (simp_all add: numeral_Bit0)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   195
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   196
definition sub :: "num \<Rightarrow> num \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   197
  [simp]: "sub m n = numeral m - numeral n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   198
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   199
lemma sub_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   200
  "sub Num.One Num.One = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   201
  "sub (Num.Bit0 m) Num.One = Pos (Num.BitM m)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   202
  "sub (Num.Bit1 m) Num.One = Pos (Num.Bit0 m)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   203
  "sub Num.One (Num.Bit0 n) = Neg (Num.BitM n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   204
  "sub Num.One (Num.Bit1 n) = Neg (Num.Bit0 n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   205
  "sub (Num.Bit0 m) (Num.Bit0 n) = dup (sub m n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   206
  "sub (Num.Bit1 m) (Num.Bit1 n) = dup (sub m n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   207
  "sub (Num.Bit1 m) (Num.Bit0 n) = dup (sub m n) + 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   208
  "sub (Num.Bit0 m) (Num.Bit1 n) = dup (sub m n) - 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   209
  unfolding sub_def dup_def numeral.simps Pos_def Neg_def
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   210
    neg_numeral_def numeral_BitM
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   211
  by (simp_all only: algebra_simps add.comm_neutral)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   212
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   213
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   214
text {* Implementations *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   215
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   216
lemma one_int_code [code, code_unfold]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   217
  "1 = Pos Num.One"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   218
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   219
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   220
lemma plus_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   221
  "k + 0 = (k::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   222
  "0 + l = (l::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   223
  "Pos m + Pos n = Pos (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   224
  "Pos m + Neg n = sub m n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   225
  "Neg m + Pos n = sub n m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   226
  "Neg m + Neg n = Neg (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   227
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   228
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   229
lemma uminus_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   230
  "uminus 0 = (0::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   231
  "uminus (Pos m) = Neg m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   232
  "uminus (Neg m) = Pos m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   233
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   234
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   235
lemma minus_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   236
  "k - 0 = (k::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   237
  "0 - l = uminus (l::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   238
  "Pos m - Pos n = sub m n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   239
  "Pos m - Neg n = Pos (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   240
  "Neg m - Pos n = Neg (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   241
  "Neg m - Neg n = sub n m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   242
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   243
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   244
lemma times_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   245
  "k * 0 = (0::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   246
  "0 * l = (0::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   247
  "Pos m * Pos n = Pos (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   248
  "Pos m * Neg n = Neg (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   249
  "Neg m * Pos n = Neg (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   250
  "Neg m * Neg n = Pos (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   251
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   252
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   253
definition divmod :: "Target_Numeral.int \<Rightarrow> Target_Numeral.int \<Rightarrow> Target_Numeral.int \<times> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   254
  "divmod k l = (k div l, k mod l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   255
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   256
lemma fst_divmod [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   257
  "fst (divmod k l) = k div l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   258
  by (simp add: divmod_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   259
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   260
lemma snd_divmod [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   261
  "snd (divmod k l) = k mod l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   262
  by (simp add: divmod_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   263
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   264
definition divmod_abs :: "Target_Numeral.int \<Rightarrow> Target_Numeral.int \<Rightarrow> Target_Numeral.int \<times> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   265
  "divmod_abs k l = (\<bar>k\<bar> div \<bar>l\<bar>, \<bar>k\<bar> mod \<bar>l\<bar>)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   266
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   267
lemma fst_divmod_abs [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   268
  "fst (divmod_abs k l) = \<bar>k\<bar> div \<bar>l\<bar>"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   269
  by (simp add: divmod_abs_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   270
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   271
lemma snd_divmod_abs [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   272
  "snd (divmod_abs k l) = \<bar>k\<bar> mod \<bar>l\<bar>"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   273
  by (simp add: divmod_abs_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   274
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   275
lemma divmod_abs_terminate_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   276
  "divmod_abs (Neg k) (Neg l) = divmod_abs (Pos k) (Pos l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   277
  "divmod_abs (Neg k) (Pos l) = divmod_abs (Pos k) (Pos l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   278
  "divmod_abs (Pos k) (Neg l) = divmod_abs (Pos k) (Pos l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   279
  "divmod_abs j 0 = (0, \<bar>j\<bar>)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   280
  "divmod_abs 0 j = (0, 0)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   281
  by (simp_all add: prod_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   282
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   283
lemma divmod_abs_rec_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   284
  "divmod_abs (Pos k) (Pos l) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   285
    (let j = sub k l in
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   286
       if j < 0 then (0, Pos k)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   287
       else let (q, r) = divmod_abs j (Pos l) in (q + 1, r))"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   288
  by (auto simp add: prod_eq_iff Target_Numeral.int_eq_iff Let_def prod_case_beta
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   289
    sub_non_negative sub_negative div_pos_pos_trivial mod_pos_pos_trivial div_pos_geq mod_pos_geq)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   290
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   291
lemma divmod_code [code]: "divmod k l =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   292
  (if k = 0 then (0, 0) else if l = 0 then (0, k) else
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   293
  (apsnd \<circ> times \<circ> sgn) l (if sgn k = sgn l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   294
    then divmod_abs k l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   295
    else (let (r, s) = divmod_abs k l in
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   296
      if s = 0 then (- r, 0) else (- r - 1, \<bar>l\<bar> - s))))"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   297
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   298
  have aux1: "\<And>k l::int. sgn k = sgn l \<longleftrightarrow> k = 0 \<and> l = 0 \<or> 0 < l \<and> 0 < k \<or> l < 0 \<and> k < 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   299
    by (auto simp add: sgn_if)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   300
  have aux2: "\<And>q::int. - int_of k = int_of l * q \<longleftrightarrow> int_of k = int_of l * - q" by auto
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   301
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   302
    by (simp add: prod_eq_iff Target_Numeral.int_eq_iff prod_case_beta aux1)
47159
978c00c20a59 generalize some theorems about div/mod
huffman
parents: 47108
diff changeset
   303
      (auto simp add: zdiv_zminus1_eq_if zmod_zminus1_eq_if div_minus_right mod_minus_right aux2)
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   304
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   305
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   306
lemma div_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   307
  "k div l = fst (divmod k l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   308
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   309
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   310
lemma div_mod_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   311
  "k mod l = snd (divmod k l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   312
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   313
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   314
lemma equal_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   315
  "HOL.equal 0 (0::Target_Numeral.int) \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   316
  "HOL.equal 0 (Pos l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   317
  "HOL.equal 0 (Neg l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   318
  "HOL.equal (Pos k) 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   319
  "HOL.equal (Pos k) (Pos l) \<longleftrightarrow> HOL.equal k l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   320
  "HOL.equal (Pos k) (Neg l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   321
  "HOL.equal (Neg k) 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   322
  "HOL.equal (Neg k) (Pos l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   323
  "HOL.equal (Neg k) (Neg l) \<longleftrightarrow> HOL.equal k l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   324
  by (simp_all add: equal Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   325
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   326
lemma equal_int_refl [code nbe]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   327
  "HOL.equal (k::Target_Numeral.int) k \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   328
  by (fact equal_refl)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   329
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   330
lemma less_eq_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   331
  "0 \<le> (0::Target_Numeral.int) \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   332
  "0 \<le> Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   333
  "0 \<le> Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   334
  "Pos k \<le> 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   335
  "Pos k \<le> Pos l \<longleftrightarrow> k \<le> l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   336
  "Pos k \<le> Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   337
  "Neg k \<le> 0 \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   338
  "Neg k \<le> Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   339
  "Neg k \<le> Neg l \<longleftrightarrow> l \<le> k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   340
  by (simp_all add: less_eq_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   341
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   342
lemma less_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   343
  "0 < (0::Target_Numeral.int) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   344
  "0 < Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   345
  "0 < Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   346
  "Pos k < 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   347
  "Pos k < Pos l \<longleftrightarrow> k < l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   348
  "Pos k < Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   349
  "Neg k < 0 \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   350
  "Neg k < Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   351
  "Neg k < Neg l \<longleftrightarrow> l < k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   352
  by (simp_all add: less_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   353
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   354
lemma nat_of_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   355
  "nat_of (Neg k) = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   356
  "nat_of 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   357
  "nat_of (Pos k) = nat_of_num k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   358
  by (simp_all add: nat_of_def nat_of_num_numeral)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   359
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   360
lemma int_of_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   361
  "int_of (Neg k) = neg_numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   362
  "int_of 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   363
  "int_of (Pos k) = numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   364
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   365
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   366
lemma of_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   367
  "Target_Numeral.of_int (Int.Neg k) = neg_numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   368
  "Target_Numeral.of_int 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   369
  "Target_Numeral.of_int (Int.Pos k) = numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   370
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   371
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   372
definition num_of_int :: "Target_Numeral.int \<Rightarrow> num" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   373
  "num_of_int = num_of_nat \<circ> nat_of"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   374
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   375
lemma num_of_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   376
  "num_of_int k = (if k \<le> 1 then Num.One
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   377
     else let
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   378
       (l, j) = divmod k 2;
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   379
       l' = num_of_int l + num_of_int l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   380
     in if j = 0 then l' else l' + Num.One)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   381
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   382
  {
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   383
    assume "int_of k mod 2 = 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   384
    then have "nat (int_of k mod 2) = nat 1" by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   385
    moreover assume *: "1 < int_of k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   386
    ultimately have **: "nat (int_of k) mod 2 = 1" by (simp add: nat_mod_distrib)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   387
    have "num_of_nat (nat (int_of k)) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   388
      num_of_nat (2 * (nat (int_of k) div 2) + nat (int_of k) mod 2)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   389
      by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   390
    then have "num_of_nat (nat (int_of k)) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   391
      num_of_nat (nat (int_of k) div 2 + nat (int_of k) div 2 + nat (int_of k) mod 2)"
47217
501b9bbd0d6e removed redundant nat-specific copies of theorems
huffman
parents: 47159
diff changeset
   392
      by (simp add: mult_2)
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   393
    with ** have "num_of_nat (nat (int_of k)) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   394
      num_of_nat (nat (int_of k) div 2 + nat (int_of k) div 2 + 1)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   395
      by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   396
  }
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   397
  note aux = this
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   398
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   399
    by (auto simp add: num_of_int_def nat_of_def Let_def prod_case_beta
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   400
      not_le Target_Numeral.int_eq_iff less_eq_int_def
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   401
      nat_mult_distrib nat_div_distrib num_of_nat_One num_of_nat_plus_distrib
47217
501b9bbd0d6e removed redundant nat-specific copies of theorems
huffman
parents: 47159
diff changeset
   402
       mult_2 [where 'a=nat] aux add_One)
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   403
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   404
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   405
hide_const (open) int_of nat_of Pos Neg sub dup divmod_abs num_of_int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   406
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   407
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   408
subsection {* Serializer setup for target language numerals *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   409
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   410
code_type Target_Numeral.int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   411
  (SML "IntInf.int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   412
  (OCaml "Big'_int.big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   413
  (Haskell "Integer")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   414
  (Scala "BigInt")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   415
  (Eval "int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   416
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   417
code_instance Target_Numeral.int :: equal
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   418
  (Haskell -)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   419
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   420
code_const "0::Target_Numeral.int"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   421
  (SML "0")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   422
  (OCaml "Big'_int.zero'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   423
  (Haskell "0")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   424
  (Scala "BigInt(0)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   425
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   426
setup {*
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   427
  fold (Numeral.add_code @{const_name Target_Numeral.Pos}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   428
    false Code_Printer.literal_numeral) ["SML", "OCaml", "Haskell", "Scala"]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   429
*}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   430
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   431
setup {*
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   432
  fold (Numeral.add_code @{const_name Target_Numeral.Neg}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   433
    true Code_Printer.literal_numeral) ["SML", "OCaml", "Haskell", "Scala"]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   434
*}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   435
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   436
code_const "plus :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   437
  (SML "IntInf.+ ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   438
  (OCaml "Big'_int.add'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   439
  (Haskell infixl 6 "+")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   440
  (Scala infixl 7 "+")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   441
  (Eval infixl 8 "+")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   442
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   443
code_const "uminus :: Target_Numeral.int \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   444
  (SML "IntInf.~")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   445
  (OCaml "Big'_int.minus'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   446
  (Haskell "negate")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   447
  (Scala "!(- _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   448
  (Eval "~/ _")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   449
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   450
code_const "minus :: Target_Numeral.int \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   451
  (SML "IntInf.- ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   452
  (OCaml "Big'_int.sub'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   453
  (Haskell infixl 6 "-")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   454
  (Scala infixl 7 "-")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   455
  (Eval infixl 8 "-")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   456
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   457
code_const Target_Numeral.dup
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   458
  (SML "IntInf.*/ (2,/ (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   459
  (OCaml "Big'_int.mult'_big'_int/ 2")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   460
  (Haskell "!(2 * _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   461
  (Scala "!(2 * _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   462
  (Eval "!(2 * _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   463
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   464
code_const Target_Numeral.sub
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   465
  (SML "!(raise/ Fail/ \"sub\")")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   466
  (OCaml "failwith/ \"sub\"")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   467
  (Haskell "error/ \"sub\"")
48073
1b609a7837ef prefer sys.error over plain error in Scala to avoid deprecation warning
haftmann
parents: 47830
diff changeset
   468
  (Scala "!sys.error(\"sub\")")
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   469
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   470
code_const "times :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   471
  (SML "IntInf.* ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   472
  (OCaml "Big'_int.mult'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   473
  (Haskell infixl 7 "*")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   474
  (Scala infixl 8 "*")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   475
  (Eval infixl 9 "*")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   476
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   477
code_const Target_Numeral.divmod_abs
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   478
  (SML "IntInf.divMod/ (IntInf.abs _,/ IntInf.abs _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   479
  (OCaml "Big'_int.quomod'_big'_int/ (Big'_int.abs'_big'_int _)/ (Big'_int.abs'_big'_int _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   480
  (Haskell "divMod/ (abs _)/ (abs _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   481
  (Scala "!((k: BigInt) => (l: BigInt) =>/ if (l == 0)/ (BigInt(0), k) else/ (k.abs '/% l.abs))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   482
  (Eval "Integer.div'_mod/ (abs _)/ (abs _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   483
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   484
code_const "HOL.equal :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> bool"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   485
  (SML "!((_ : IntInf.int) = _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   486
  (OCaml "Big'_int.eq'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   487
  (Haskell infix 4 "==")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   488
  (Scala infixl 5 "==")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   489
  (Eval infixl 6 "=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   490
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   491
code_const "less_eq :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> bool"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   492
  (SML "IntInf.<= ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   493
  (OCaml "Big'_int.le'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   494
  (Haskell infix 4 "<=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   495
  (Scala infixl 4 "<=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   496
  (Eval infixl 6 "<=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   497
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   498
code_const "less :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> bool"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   499
  (SML "IntInf.< ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   500
  (OCaml "Big'_int.lt'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   501
  (Haskell infix 4 "<")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   502
  (Scala infixl 4 "<")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   503
  (Eval infixl 6 "<")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   504
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   505
ML {*
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   506
structure Target_Numeral =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   507
struct
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   508
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   509
val T = @{typ "Target_Numeral.int"};
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   510
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   511
end;
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   512
*}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   513
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   514
code_reserved Eval Target_Numeral
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   515
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   516
code_const "Code_Evaluation.term_of \<Colon> Target_Numeral.int \<Rightarrow> term"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   517
  (Eval "HOLogic.mk'_number/ Target'_Numeral.T")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   518
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   519
code_modulename SML
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   520
  Target_Numeral Arith
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   521
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   522
code_modulename OCaml
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   523
  Target_Numeral Arith
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   524
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   525
code_modulename Haskell
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   526
  Target_Numeral Arith
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   527
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   528
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   529
subsection {* Implementation for @{typ int} *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   530
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   531
code_datatype Target_Numeral.int_of
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   532
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   533
lemma [code, code del]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   534
  "Target_Numeral.of_int = Target_Numeral.of_int" ..
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   535
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   536
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   537
  "Target_Numeral.of_int (Target_Numeral.int_of k) = k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   538
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   539
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   540
declare Int.Pos_def [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   541
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   542
lemma [code_abbrev]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   543
  "Target_Numeral.int_of (Target_Numeral.Pos k) = Int.Pos k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   544
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   545
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   546
declare Int.Neg_def [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   547
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   548
lemma [code_abbrev]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   549
  "Target_Numeral.int_of (Target_Numeral.Neg k) = Int.Neg k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   550
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   551
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   552
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   553
  "0 = Target_Numeral.int_of 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   554
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   555
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   556
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   557
  "1 = Target_Numeral.int_of 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   558
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   559
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   560
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   561
  "k + l = Target_Numeral.int_of (of_int k + of_int l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   562
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   563
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   564
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   565
  "- k = Target_Numeral.int_of (- of_int k)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   566
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   567
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   568
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   569
  "k - l = Target_Numeral.int_of (of_int k - of_int l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   570
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   571
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   572
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   573
  "Int.dup k = Target_Numeral.int_of (Target_Numeral.dup (of_int k))"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   574
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   575
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   576
lemma [code, code del]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   577
  "Int.sub = Int.sub" ..
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   578
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   579
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   580
  "k * l = Target_Numeral.int_of (of_int k * of_int l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   581
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   582
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   583
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   584
  "pdivmod k l = map_pair Target_Numeral.int_of Target_Numeral.int_of
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   585
    (Target_Numeral.divmod_abs (of_int k) (of_int l))"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   586
  by (simp add: prod_eq_iff pdivmod_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   587
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   588
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   589
  "k div l = Target_Numeral.int_of (of_int k div of_int l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   590
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   591
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   592
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   593
  "k mod l = Target_Numeral.int_of (of_int k mod of_int l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   594
  by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   595
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   596
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   597
  "HOL.equal k l = HOL.equal (of_int k :: Target_Numeral.int) (of_int l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   598
  by (simp add: equal Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   599
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   600
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   601
  "k \<le> l \<longleftrightarrow> (of_int k :: Target_Numeral.int) \<le> of_int l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   602
  by (simp add: less_eq_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   603
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   604
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   605
  "k < l \<longleftrightarrow> (of_int k :: Target_Numeral.int) < of_int l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   606
  by (simp add: less_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   607
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   608
lemma (in ring_1) of_int_code:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   609
  "of_int k = (if k = 0 then 0
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   610
     else if k < 0 then - of_int (- k)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   611
     else let
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   612
       (l, j) = divmod_int k 2;
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   613
       l' = 2 * of_int l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   614
     in if j = 0 then l' else l' + 1)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   615
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   616
  from mod_div_equality have *: "of_int k = of_int (k div 2 * 2 + k mod 2)" by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   617
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   618
    by (simp add: Let_def divmod_int_mod_div mod_2_not_eq_zero_eq_one_int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   619
      of_int_add [symmetric]) (simp add: * mult_commute)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   620
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   621
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   622
declare of_int_code [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   623
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   624
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   625
subsection {* Implementation for @{typ nat} *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   626
47400
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   627
definition Nat :: "Target_Numeral.int \<Rightarrow> nat" where
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   628
  "Nat = Target_Numeral.nat_of"
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   629
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   630
definition of_nat :: "nat \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   631
  [code_abbrev]: "of_nat = Nat.of_nat"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   632
47400
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   633
hide_const (open) of_nat Nat
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   634
47830
4ad2b7ccd0ff compact nat literals
haftmann
parents: 47819
diff changeset
   635
lemma [code_unfold]:
4ad2b7ccd0ff compact nat literals
haftmann
parents: 47819
diff changeset
   636
  "Int.nat (Target_Numeral.int_of k) = Target_Numeral.nat_of k"
4ad2b7ccd0ff compact nat literals
haftmann
parents: 47819
diff changeset
   637
  by (simp add: nat_of_def)
4ad2b7ccd0ff compact nat literals
haftmann
parents: 47819
diff changeset
   638
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   639
lemma int_of_nat [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   640
  "Target_Numeral.int_of (Target_Numeral.of_nat n) = of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   641
  by (simp add: of_nat_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   642
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   643
lemma [code abstype]:
47400
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   644
  "Target_Numeral.Nat (Target_Numeral.of_nat n) = n"
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   645
  by (simp add: Nat_def nat_of_def)
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   646
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   647
lemma [code abstract]:
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   648
  "Target_Numeral.of_nat (Target_Numeral.nat_of k) = max 0 k"
b7625245a846 explicit constructor Nat leaves nat_of as conversion
haftmann
parents: 47217
diff changeset
   649
  by (simp add: of_nat_def)
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   650
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   651
lemma [code_abbrev]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   652
  "nat (Int.Pos k) = nat_of_num k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   653
  by (simp add: nat_of_num_numeral)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   654
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   655
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   656
  "Target_Numeral.of_nat 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   657
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   658
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   659
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   660
  "Target_Numeral.of_nat 1 = 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   661
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   662
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   663
lemma [code abstract]:
48075
ec5e62b868eb apply preprocessing simpset also to rhs of abstract code equations
haftmann
parents: 48073
diff changeset
   664
  "Target_Numeral.of_nat (m + n) = of_nat m + of_nat n"
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   665
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   666
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   667
lemma [code abstract]:
48075
ec5e62b868eb apply preprocessing simpset also to rhs of abstract code equations
haftmann
parents: 48073
diff changeset
   668
  "Target_Numeral.of_nat (Code_Nat.dup n) = Target_Numeral.dup (of_nat n)"
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   669
  by (simp add: Target_Numeral.int_eq_iff Code_Nat.dup_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   670
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   671
lemma [code, code del]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   672
  "Code_Nat.sub = Code_Nat.sub" ..
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   673
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   674
lemma [code abstract]:
48075
ec5e62b868eb apply preprocessing simpset also to rhs of abstract code equations
haftmann
parents: 48073
diff changeset
   675
  "Target_Numeral.of_nat (m - n) = max 0 (of_nat m - of_nat n)"
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   676
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   677
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   678
lemma [code abstract]:
48075
ec5e62b868eb apply preprocessing simpset also to rhs of abstract code equations
haftmann
parents: 48073
diff changeset
   679
  "Target_Numeral.of_nat (m * n) = of_nat m * of_nat n"
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   680
  by (simp add: Target_Numeral.int_eq_iff of_nat_mult)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   681
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   682
lemma [code abstract]:
48075
ec5e62b868eb apply preprocessing simpset also to rhs of abstract code equations
haftmann
parents: 48073
diff changeset
   683
  "Target_Numeral.of_nat (m div n) = of_nat m div of_nat n"
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   684
  by (simp add: Target_Numeral.int_eq_iff zdiv_int)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   685
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   686
lemma [code abstract]:
48075
ec5e62b868eb apply preprocessing simpset also to rhs of abstract code equations
haftmann
parents: 48073
diff changeset
   687
  "Target_Numeral.of_nat (m mod n) = of_nat m mod of_nat n"
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   688
  by (simp add: Target_Numeral.int_eq_iff zmod_int)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   689
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   690
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   691
  "Divides.divmod_nat m n = (m div n, m mod n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   692
  by (simp add: prod_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   693
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   694
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   695
  "HOL.equal m n = HOL.equal (of_nat m :: Target_Numeral.int) (of_nat n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   696
  by (simp add: equal Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   697
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   698
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   699
  "m \<le> n \<longleftrightarrow> (of_nat m :: Target_Numeral.int) \<le> of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   700
  by (simp add: less_eq_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   701
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   702
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   703
  "m < n \<longleftrightarrow> (of_nat m :: Target_Numeral.int) < of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   704
  by (simp add: less_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   705
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   706
lemma num_of_nat_code [code]:
48075
ec5e62b868eb apply preprocessing simpset also to rhs of abstract code equations
haftmann
parents: 48073
diff changeset
   707
  "num_of_nat = Target_Numeral.num_of_int \<circ> of_nat"
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   708
  by (simp add: fun_eq_iff num_of_int_def of_nat_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   709
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   710
lemma (in semiring_1) of_nat_code:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   711
  "of_nat n = (if n = 0 then 0
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   712
     else let
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   713
       (m, q) = divmod_nat n 2;
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   714
       m' = 2 * of_nat m
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   715
     in if q = 0 then m' else m' + 1)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   716
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   717
  from mod_div_equality have *: "of_nat n = of_nat (n div 2 * 2 + n mod 2)" by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   718
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   719
    by (simp add: Let_def divmod_nat_div_mod mod_2_not_eq_zero_eq_one_nat
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   720
      of_nat_add [symmetric])
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   721
      (simp add: * mult_commute of_nat_mult add_commute)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   722
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   723
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   724
declare of_nat_code [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   725
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   726
text {* Conversions between @{typ nat} and @{typ int} *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   727
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   728
definition int :: "nat \<Rightarrow> int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   729
  [code_abbrev]: "int = of_nat"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   730
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   731
hide_const (open) int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   732
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   733
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   734
  "Target_Numeral.int n = Target_Numeral.int_of (of_nat n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   735
  by (simp add: int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   736
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   737
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   738
  "Target_Numeral.of_nat (nat k) = max 0 (Target_Numeral.of_int k)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   739
  by (simp add: of_nat_def of_int_of_nat max_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   740
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   741
end
47819
d402ac2288b8 rhs of abstract code equations are not subject to preprocessing: inline code abbrevs explicitly
haftmann
parents: 47487
diff changeset
   742