src/HOL/Library/Target_Numeral.thy
author wenzelm
Sat, 07 Apr 2012 16:41:59 +0200
changeset 47389 e8552cba702d
parent 47217 501b9bbd0d6e
child 47400 b7625245a846
permissions -rw-r--r--
explicit checks stable_finished_theory/stable_command allow parallel asynchronous command transactions; tuned;
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
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   166
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   167
subsection {* Code theorems for target language numerals *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   168
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   169
text {* Constructors *}
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
definition Pos :: "num \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   172
  [simp, code_abbrev]: "Pos = numeral"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   173
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   174
definition Neg :: "num \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   175
  [simp, code_abbrev]: "Neg = neg_numeral"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   176
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   177
code_datatype "0::Target_Numeral.int" Pos Neg
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   178
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   179
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   180
text {* Auxiliary operations *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   181
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   182
definition dup :: "Target_Numeral.int \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   183
  [simp]: "dup k = k + k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   184
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   185
lemma dup_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   186
  "dup 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   187
  "dup (Pos n) = Pos (Num.Bit0 n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   188
  "dup (Neg n) = Neg (Num.Bit0 n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   189
  unfolding Pos_def Neg_def neg_numeral_def
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   190
  by (simp_all add: numeral_Bit0)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   191
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   192
definition sub :: "num \<Rightarrow> num \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   193
  [simp]: "sub m n = numeral m - numeral n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   194
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   195
lemma sub_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   196
  "sub Num.One Num.One = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   197
  "sub (Num.Bit0 m) Num.One = Pos (Num.BitM m)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   198
  "sub (Num.Bit1 m) Num.One = Pos (Num.Bit0 m)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   199
  "sub Num.One (Num.Bit0 n) = Neg (Num.BitM n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   200
  "sub Num.One (Num.Bit1 n) = Neg (Num.Bit0 n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   201
  "sub (Num.Bit0 m) (Num.Bit0 n) = dup (sub m n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   202
  "sub (Num.Bit1 m) (Num.Bit1 n) = dup (sub m n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   203
  "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
   204
  "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
   205
  unfolding sub_def dup_def numeral.simps Pos_def Neg_def
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   206
    neg_numeral_def numeral_BitM
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   207
  by (simp_all only: algebra_simps add.comm_neutral)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   208
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   209
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   210
text {* Implementations *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   211
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   212
lemma one_int_code [code, code_unfold]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   213
  "1 = Pos Num.One"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   214
  by simp
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 plus_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   217
  "k + 0 = (k::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   218
  "0 + l = (l::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   219
  "Pos m + Pos n = Pos (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   220
  "Pos m + Neg n = sub m n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   221
  "Neg m + Pos n = sub n m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   222
  "Neg m + Neg n = Neg (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   223
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   224
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   225
lemma uminus_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   226
  "uminus 0 = (0::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   227
  "uminus (Pos m) = Neg m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   228
  "uminus (Neg m) = Pos m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   229
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   230
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   231
lemma minus_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   232
  "k - 0 = (k::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   233
  "0 - l = uminus (l::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   234
  "Pos m - Pos n = sub m n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   235
  "Pos m - Neg n = Pos (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   236
  "Neg m - Pos n = Neg (m + n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   237
  "Neg m - Neg n = sub n m"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   238
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   239
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   240
lemma times_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   241
  "k * 0 = (0::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   242
  "0 * l = (0::Target_Numeral.int)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   243
  "Pos m * Pos n = Pos (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   244
  "Pos m * Neg n = Neg (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   245
  "Neg m * Pos n = Neg (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   246
  "Neg m * Neg n = Pos (m * n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   247
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   248
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   249
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
   250
  "divmod k l = (k div l, k mod l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   251
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   252
lemma fst_divmod [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   253
  "fst (divmod k l) = k div l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   254
  by (simp add: divmod_def)
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 snd_divmod [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   257
  "snd (divmod k l) = k mod 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
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
   261
  "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
   262
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   263
lemma fst_divmod_abs [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   264
  "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
   265
  by (simp add: divmod_abs_def)
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 snd_divmod_abs [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   268
  "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
   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 divmod_abs_terminate_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   272
  "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
   273
  "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
   274
  "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
   275
  "divmod_abs j 0 = (0, \<bar>j\<bar>)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   276
  "divmod_abs 0 j = (0, 0)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   277
  by (simp_all add: prod_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   278
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   279
lemma divmod_abs_rec_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   280
  "divmod_abs (Pos k) (Pos l) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   281
    (let j = sub k l in
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   282
       if j < 0 then (0, Pos k)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   283
       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
   284
  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
   285
    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
   286
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   287
lemma divmod_code [code]: "divmod k l =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   288
  (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
   289
  (apsnd \<circ> times \<circ> sgn) l (if sgn k = sgn l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   290
    then divmod_abs k l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   291
    else (let (r, s) = divmod_abs k l in
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   292
      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
   293
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   294
  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
   295
    by (auto simp add: sgn_if)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   296
  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
   297
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   298
    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
   299
      (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
   300
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   301
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   302
lemma div_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   303
  "k div l = fst (divmod k l)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   304
  by simp
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_mod_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   307
  "k mod l = snd (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 equal_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   311
  "HOL.equal 0 (0::Target_Numeral.int) \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   312
  "HOL.equal 0 (Pos l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   313
  "HOL.equal 0 (Neg l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   314
  "HOL.equal (Pos k) 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   315
  "HOL.equal (Pos k) (Pos l) \<longleftrightarrow> HOL.equal k l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   316
  "HOL.equal (Pos k) (Neg l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   317
  "HOL.equal (Neg k) 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   318
  "HOL.equal (Neg k) (Pos l) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   319
  "HOL.equal (Neg k) (Neg l) \<longleftrightarrow> HOL.equal k l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   320
  by (simp_all add: equal Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   321
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   322
lemma equal_int_refl [code nbe]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   323
  "HOL.equal (k::Target_Numeral.int) k \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   324
  by (fact equal_refl)
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 less_eq_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   327
  "0 \<le> (0::Target_Numeral.int) \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   328
  "0 \<le> Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   329
  "0 \<le> Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   330
  "Pos k \<le> 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   331
  "Pos k \<le> Pos l \<longleftrightarrow> k \<le> l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   332
  "Pos k \<le> Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   333
  "Neg k \<le> 0 \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   334
  "Neg k \<le> Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   335
  "Neg k \<le> Neg l \<longleftrightarrow> l \<le> k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   336
  by (simp_all add: less_eq_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   337
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   338
lemma less_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   339
  "0 < (0::Target_Numeral.int) \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   340
  "0 < Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   341
  "0 < Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   342
  "Pos k < 0 \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   343
  "Pos k < Pos l \<longleftrightarrow> k < l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   344
  "Pos k < Neg l \<longleftrightarrow> False"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   345
  "Neg k < 0 \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   346
  "Neg k < Pos l \<longleftrightarrow> True"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   347
  "Neg k < Neg l \<longleftrightarrow> l < k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   348
  by (simp_all add: less_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   349
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   350
lemma nat_of_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   351
  "nat_of (Neg k) = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   352
  "nat_of 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   353
  "nat_of (Pos k) = nat_of_num k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   354
  by (simp_all add: nat_of_def nat_of_num_numeral)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   355
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   356
lemma int_of_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   357
  "int_of (Neg k) = neg_numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   358
  "int_of 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   359
  "int_of (Pos k) = numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   360
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   361
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   362
lemma of_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   363
  "Target_Numeral.of_int (Int.Neg k) = neg_numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   364
  "Target_Numeral.of_int 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   365
  "Target_Numeral.of_int (Int.Pos k) = numeral k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   366
  by simp_all
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   367
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   368
definition num_of_int :: "Target_Numeral.int \<Rightarrow> num" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   369
  "num_of_int = num_of_nat \<circ> nat_of"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   370
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   371
lemma num_of_int_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   372
  "num_of_int k = (if k \<le> 1 then Num.One
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   373
     else let
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   374
       (l, j) = divmod k 2;
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   375
       l' = num_of_int l + num_of_int l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   376
     in if j = 0 then l' else l' + Num.One)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   377
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   378
  {
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   379
    assume "int_of k mod 2 = 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   380
    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
   381
    moreover assume *: "1 < int_of k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   382
    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
   383
    have "num_of_nat (nat (int_of k)) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   384
      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
   385
      by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   386
    then have "num_of_nat (nat (int_of k)) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   387
      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
   388
      by (simp add: mult_2)
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   389
    with ** have "num_of_nat (nat (int_of k)) =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   390
      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
   391
      by simp
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   392
  }
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   393
  note aux = this
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   394
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   395
    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
   396
      not_le Target_Numeral.int_eq_iff less_eq_int_def
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   397
      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
   398
       mult_2 [where 'a=nat] aux add_One)
47108
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   399
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   400
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   401
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
   402
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   403
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   404
subsection {* Serializer setup for target language numerals *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   405
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   406
code_type Target_Numeral.int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   407
  (SML "IntInf.int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   408
  (OCaml "Big'_int.big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   409
  (Haskell "Integer")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   410
  (Scala "BigInt")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   411
  (Eval "int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   412
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   413
code_instance Target_Numeral.int :: equal
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   414
  (Haskell -)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   415
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   416
code_const "0::Target_Numeral.int"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   417
  (SML "0")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   418
  (OCaml "Big'_int.zero'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   419
  (Haskell "0")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   420
  (Scala "BigInt(0)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   421
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   422
setup {*
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   423
  fold (Numeral.add_code @{const_name Target_Numeral.Pos}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   424
    false Code_Printer.literal_numeral) ["SML", "OCaml", "Haskell", "Scala"]
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
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   427
setup {*
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   428
  fold (Numeral.add_code @{const_name Target_Numeral.Neg}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   429
    true Code_Printer.literal_numeral) ["SML", "OCaml", "Haskell", "Scala"]
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
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   432
code_const "plus :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   433
  (SML "IntInf.+ ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   434
  (OCaml "Big'_int.add'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   435
  (Haskell infixl 6 "+")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   436
  (Scala infixl 7 "+")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   437
  (Eval infixl 8 "+")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   438
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   439
code_const "uminus :: Target_Numeral.int \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   440
  (SML "IntInf.~")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   441
  (OCaml "Big'_int.minus'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   442
  (Haskell "negate")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   443
  (Scala "!(- _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   444
  (Eval "~/ _")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   445
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   446
code_const "minus :: Target_Numeral.int \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   447
  (SML "IntInf.- ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   448
  (OCaml "Big'_int.sub'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   449
  (Haskell infixl 6 "-")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   450
  (Scala infixl 7 "-")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   451
  (Eval infixl 8 "-")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   452
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   453
code_const Target_Numeral.dup
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   454
  (SML "IntInf.*/ (2,/ (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   455
  (OCaml "Big'_int.mult'_big'_int/ 2")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   456
  (Haskell "!(2 * _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   457
  (Scala "!(2 * _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   458
  (Eval "!(2 * _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   459
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   460
code_const Target_Numeral.sub
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   461
  (SML "!(raise/ Fail/ \"sub\")")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   462
  (OCaml "failwith/ \"sub\"")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   463
  (Haskell "error/ \"sub\"")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   464
  (Scala "!error(\"sub\")")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   465
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   466
code_const "times :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> _"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   467
  (SML "IntInf.* ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   468
  (OCaml "Big'_int.mult'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   469
  (Haskell infixl 7 "*")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   470
  (Scala infixl 8 "*")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   471
  (Eval infixl 9 "*")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   472
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   473
code_const Target_Numeral.divmod_abs
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   474
  (SML "IntInf.divMod/ (IntInf.abs _,/ IntInf.abs _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   475
  (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
   476
  (Haskell "divMod/ (abs _)/ (abs _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   477
  (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
   478
  (Eval "Integer.div'_mod/ (abs _)/ (abs _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   479
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   480
code_const "HOL.equal :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> bool"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   481
  (SML "!((_ : IntInf.int) = _)")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   482
  (OCaml "Big'_int.eq'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   483
  (Haskell infix 4 "==")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   484
  (Scala infixl 5 "==")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   485
  (Eval infixl 6 "=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   486
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   487
code_const "less_eq :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> bool"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   488
  (SML "IntInf.<= ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   489
  (OCaml "Big'_int.le'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   490
  (Haskell infix 4 "<=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   491
  (Scala infixl 4 "<=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   492
  (Eval infixl 6 "<=")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   493
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   494
code_const "less :: Target_Numeral.int \<Rightarrow> _ \<Rightarrow> bool"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   495
  (SML "IntInf.< ((_), (_))")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   496
  (OCaml "Big'_int.lt'_big'_int")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   497
  (Haskell infix 4 "<")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   498
  (Scala infixl 4 "<")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   499
  (Eval infixl 6 "<")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   500
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   501
ML {*
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   502
structure Target_Numeral =
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   503
struct
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
val T = @{typ "Target_Numeral.int"};
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   506
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   507
end;
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
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   510
code_reserved Eval Target_Numeral
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   511
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   512
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
   513
  (Eval "HOLogic.mk'_number/ Target'_Numeral.T")
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   514
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   515
code_modulename SML
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   516
  Target_Numeral Arith
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   517
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   518
code_modulename OCaml
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   519
  Target_Numeral Arith
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   520
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   521
code_modulename Haskell
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   522
  Target_Numeral Arith
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   523
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
subsection {* Implementation for @{typ int} *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   526
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   527
code_datatype Target_Numeral.int_of
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
lemma [code, code del]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   530
  "Target_Numeral.of_int = Target_Numeral.of_int" ..
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   531
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   532
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   533
  "Target_Numeral.of_int (Target_Numeral.int_of k) = k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   534
  by (simp add: Target_Numeral.int_eq_iff)
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
declare Int.Pos_def [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   537
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   538
lemma [code_abbrev]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   539
  "Target_Numeral.int_of (Target_Numeral.Pos k) = Int.Pos k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   540
  by simp
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
declare Int.Neg_def [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   543
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   544
lemma [code_abbrev]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   545
  "Target_Numeral.int_of (Target_Numeral.Neg k) = Int.Neg k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   546
  by simp
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]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   549
  "0 = Target_Numeral.int_of 0"
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
  "1 = Target_Numeral.int_of 1"
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
  "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
   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 = Target_Numeral.int_of (- of_int k)"
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 - l = Target_Numeral.int_of (of_int k - of_int l)"
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
  "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
   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, code del]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   573
  "Int.sub = Int.sub" ..
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   574
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   575
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   576
  "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
   577
  by simp
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
  "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
   581
    (Target_Numeral.divmod_abs (of_int k) (of_int l))"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   582
  by (simp add: prod_eq_iff pdivmod_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   583
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   584
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   585
  "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
   586
  by simp
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 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
   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
  "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
   594
  by (simp add: equal Target_Numeral.int_eq_iff)
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
  "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
   598
  by (simp add: less_eq_int_def)
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 < l \<longleftrightarrow> (of_int k :: Target_Numeral.int) < of_int l"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   602
  by (simp add: less_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 (in ring_1) of_int_code:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   605
  "of_int k = (if k = 0 then 0
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   606
     else if k < 0 then - of_int (- k)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   607
     else let
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   608
       (l, j) = divmod_int k 2;
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   609
       l' = 2 * of_int l
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   610
     in if j = 0 then l' else l' + 1)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   611
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   612
  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
   613
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   614
    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
   615
      of_int_add [symmetric]) (simp add: * mult_commute)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   616
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   617
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   618
declare of_int_code [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   619
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   620
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   621
subsection {* Implementation for @{typ nat} *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   622
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   623
definition of_nat :: "nat \<Rightarrow> Target_Numeral.int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   624
  [code_abbrev]: "of_nat = Nat.of_nat"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   625
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   626
hide_const (open) of_nat
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   627
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   628
lemma int_of_nat [simp]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   629
  "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
   630
  by (simp add: of_nat_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   631
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   632
lemma [code abstype]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   633
  "Target_Numeral.nat_of (Target_Numeral.of_nat n) = n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   634
  by (simp add: nat_of_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   635
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   636
lemma [code_abbrev]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   637
  "nat (Int.Pos k) = nat_of_num k"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   638
  by (simp add: nat_of_num_numeral)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   639
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   640
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   641
  "Target_Numeral.of_nat 0 = 0"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   642
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   643
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   644
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   645
  "Target_Numeral.of_nat 1 = 1"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   646
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   647
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   648
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   649
  "Target_Numeral.of_nat (m + n) = of_nat m + of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   650
  by (simp add: Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   651
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   652
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   653
  "Target_Numeral.of_nat (Code_Nat.dup n) = Target_Numeral.dup (of_nat n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   654
  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
   655
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   656
lemma [code, code del]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   657
  "Code_Nat.sub = Code_Nat.sub" ..
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 (m - n) = max 0 (of_nat m - of_nat n)"
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]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   664
  "Target_Numeral.of_nat (m * n) = of_nat m * of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   665
  by (simp add: Target_Numeral.int_eq_iff of_nat_mult)
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]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   668
  "Target_Numeral.of_nat (m div n) = of_nat m div of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   669
  by (simp add: Target_Numeral.int_eq_iff zdiv_int)
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 abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   672
  "Target_Numeral.of_nat (m mod n) = of_nat m mod of_nat n"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   673
  by (simp add: Target_Numeral.int_eq_iff zmod_int)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   674
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   675
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   676
  "Divides.divmod_nat m n = (m div n, m mod n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   677
  by (simp add: prod_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   678
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   679
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   680
  "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
   681
  by (simp add: equal Target_Numeral.int_eq_iff)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   682
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   683
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   684
  "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
   685
  by (simp add: less_eq_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   686
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   687
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   688
  "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
   689
  by (simp add: less_int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   690
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   691
lemma num_of_nat_code [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   692
  "num_of_nat = Target_Numeral.num_of_int \<circ> Target_Numeral.of_nat"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   693
  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
   694
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   695
lemma (in semiring_1) of_nat_code:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   696
  "of_nat n = (if n = 0 then 0
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   697
     else let
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   698
       (m, q) = divmod_nat n 2;
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   699
       m' = 2 * of_nat m
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   700
     in if q = 0 then m' else m' + 1)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   701
proof -
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   702
  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
   703
  show ?thesis
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   704
    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
   705
      of_nat_add [symmetric])
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   706
      (simp add: * mult_commute of_nat_mult add_commute)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   707
qed
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   708
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   709
declare of_nat_code [code]
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   710
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   711
text {* Conversions between @{typ nat} and @{typ int} *}
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   712
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   713
definition int :: "nat \<Rightarrow> int" where
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   714
  [code_abbrev]: "int = of_nat"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   715
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   716
hide_const (open) int
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   717
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   718
lemma [code]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   719
  "Target_Numeral.int n = Target_Numeral.int_of (of_nat n)"
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   720
  by (simp add: int_def)
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   721
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   722
lemma [code abstract]:
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   723
  "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
   724
  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
   725
2a1953f0d20d merged fork with new numeral representation (see NEWS)
huffman
parents:
diff changeset
   726
end