author | wenzelm |
Fri, 27 Mar 2020 12:46:56 +0100 | |
changeset 71598 | 269dc4bf1f40 |
parent 71535 | b612edee9b0c |
child 71965 | d45f5d4c41bd |
permissions | -rw-r--r-- |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1 |
(* Title: HOL/Code_Numeral.thy |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
2 |
Author: Florian Haftmann, TU Muenchen |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
3 |
*) |
24999 | 4 |
|
60758 | 5 |
section \<open>Numeric types for code generation onto target language numerals only\<close> |
24999 | 6 |
|
31205
98370b26c2ce
String.literal replaces message_string, code_numeral replaces (code_)index
haftmann
parents:
31203
diff
changeset
|
7 |
theory Code_Numeral |
66836 | 8 |
imports Divides Lifting |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
9 |
begin |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
10 |
|
60758 | 11 |
subsection \<open>Type of target language integers\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
12 |
|
61076 | 13 |
typedef integer = "UNIV :: int set" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
14 |
morphisms int_of_integer integer_of_int .. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
15 |
|
59487
adaa430fc0f7
default abstypes and default abstract equations make technical (no_code) annotation superfluous
haftmann
parents:
58889
diff
changeset
|
16 |
setup_lifting type_definition_integer |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
17 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
18 |
lemma integer_eq_iff: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
19 |
"k = l \<longleftrightarrow> int_of_integer k = int_of_integer l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
20 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
21 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
22 |
lemma integer_eqI: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
23 |
"int_of_integer k = int_of_integer l \<Longrightarrow> k = l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
24 |
using integer_eq_iff [of k l] by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
25 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
26 |
lemma int_of_integer_integer_of_int [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
27 |
"int_of_integer (integer_of_int k) = k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
28 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
29 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
30 |
lemma integer_of_int_int_of_integer [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
31 |
"integer_of_int (int_of_integer k) = k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
32 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
33 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
34 |
instantiation integer :: ring_1 |
24999 | 35 |
begin |
36 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
37 |
lift_definition zero_integer :: integer |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
38 |
is "0 :: int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
39 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
40 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
41 |
declare zero_integer.rep_eq [simp] |
24999 | 42 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
43 |
lift_definition one_integer :: integer |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
44 |
is "1 :: int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
45 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
46 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
47 |
declare one_integer.rep_eq [simp] |
24999 | 48 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
49 |
lift_definition plus_integer :: "integer \<Rightarrow> integer \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
50 |
is "plus :: int \<Rightarrow> int \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
51 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
52 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
53 |
declare plus_integer.rep_eq [simp] |
24999 | 54 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
55 |
lift_definition uminus_integer :: "integer \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
56 |
is "uminus :: int \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
57 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
58 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
59 |
declare uminus_integer.rep_eq [simp] |
24999 | 60 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
61 |
lift_definition minus_integer :: "integer \<Rightarrow> integer \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
62 |
is "minus :: int \<Rightarrow> int \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
63 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
64 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
65 |
declare minus_integer.rep_eq [simp] |
24999 | 66 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
67 |
lift_definition times_integer :: "integer \<Rightarrow> integer \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
68 |
is "times :: int \<Rightarrow> int \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
69 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
70 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
71 |
declare times_integer.rep_eq [simp] |
28708
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
72 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
73 |
instance proof |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
74 |
qed (transfer, simp add: algebra_simps)+ |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
75 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
76 |
end |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
77 |
|
64241
430d74089d4d
transfer rules for divides relation on integer and natural
haftmann
parents:
64178
diff
changeset
|
78 |
instance integer :: Rings.dvd .. |
430d74089d4d
transfer rules for divides relation on integer and natural
haftmann
parents:
64178
diff
changeset
|
79 |
|
70927 | 80 |
context |
81 |
includes lifting_syntax |
|
82 |
notes transfer_rule_numeral [transfer_rule] |
|
83 |
begin |
|
64241
430d74089d4d
transfer rules for divides relation on integer and natural
haftmann
parents:
64178
diff
changeset
|
84 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
85 |
lemma [transfer_rule]: |
70927 | 86 |
"(pcr_integer ===> pcr_integer ===> (\<longleftrightarrow>)) (dvd) (dvd)" |
87 |
by (unfold dvd_def) transfer_prover |
|
88 |
||
89 |
lemma [transfer_rule]: |
|
90 |
"((\<longleftrightarrow>) ===> pcr_integer) of_bool of_bool" |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
91 |
by (unfold of_bool_def) transfer_prover |
68010 | 92 |
|
93 |
lemma [transfer_rule]: |
|
70927 | 94 |
"((=) ===> pcr_integer) int of_nat" |
64178 | 95 |
by (rule transfer_rule_of_nat) transfer_prover+ |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
96 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
97 |
lemma [transfer_rule]: |
70927 | 98 |
"((=) ===> pcr_integer) (\<lambda>k. k) of_int" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
99 |
proof - |
70927 | 100 |
have "((=) ===> pcr_integer) of_int of_int" |
64178 | 101 |
by (rule transfer_rule_of_int) transfer_prover+ |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
102 |
then show ?thesis by (simp add: id_def) |
24999 | 103 |
qed |
104 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
105 |
lemma [transfer_rule]: |
70927 | 106 |
"((=) ===> pcr_integer) numeral numeral" |
107 |
by transfer_prover |
|
26140 | 108 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
109 |
lemma [transfer_rule]: |
70927 | 110 |
"((=) ===> (=) ===> pcr_integer) Num.sub Num.sub" |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
111 |
by (unfold Num.sub_def) transfer_prover |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
112 |
|
68010 | 113 |
lemma [transfer_rule]: |
70927 | 114 |
"(pcr_integer ===> (=) ===> pcr_integer) (^) (^)" |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
115 |
by (unfold power_def) transfer_prover |
68010 | 116 |
|
70927 | 117 |
end |
118 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
119 |
lemma int_of_integer_of_nat [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
120 |
"int_of_integer (of_nat n) = of_nat n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
121 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
122 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
123 |
lift_definition integer_of_nat :: "nat \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
124 |
is "of_nat :: nat \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
125 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
126 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
127 |
lemma integer_of_nat_eq_of_nat [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
128 |
"integer_of_nat = of_nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
129 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
130 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
131 |
lemma int_of_integer_integer_of_nat [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
132 |
"int_of_integer (integer_of_nat n) = of_nat n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
133 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
134 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
135 |
lift_definition nat_of_integer :: "integer \<Rightarrow> nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
136 |
is Int.nat |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
137 |
. |
26140 | 138 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
139 |
lemma nat_of_integer_of_nat [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
140 |
"nat_of_integer (of_nat n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
141 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
142 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
143 |
lemma int_of_integer_of_int [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
144 |
"int_of_integer (of_int k) = k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
145 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
146 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
147 |
lemma nat_of_integer_integer_of_nat [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
148 |
"nat_of_integer (integer_of_nat n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
149 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
150 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
151 |
lemma integer_of_int_eq_of_int [simp, code_abbrev]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
152 |
"integer_of_int = of_int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
153 |
by transfer (simp add: fun_eq_iff) |
26140 | 154 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
155 |
lemma of_int_integer_of [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
156 |
"of_int (int_of_integer k) = (k :: integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
157 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
158 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
159 |
lemma int_of_integer_numeral [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
160 |
"int_of_integer (numeral k) = numeral k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
161 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
162 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
163 |
lemma int_of_integer_sub [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
164 |
"int_of_integer (Num.sub k l) = Num.sub k l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
165 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
166 |
|
66190 | 167 |
definition integer_of_num :: "num \<Rightarrow> integer" |
168 |
where [simp]: "integer_of_num = numeral" |
|
61275
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
169 |
|
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
170 |
lemma integer_of_num [code]: |
66190 | 171 |
"integer_of_num Num.One = 1" |
172 |
"integer_of_num (Num.Bit0 n) = (let k = integer_of_num n in k + k)" |
|
173 |
"integer_of_num (Num.Bit1 n) = (let k = integer_of_num n in k + k + 1)" |
|
174 |
by (simp_all only: integer_of_num_def numeral.simps Let_def) |
|
61275
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
175 |
|
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
176 |
lemma integer_of_num_triv: |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
177 |
"integer_of_num Num.One = 1" |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
178 |
"integer_of_num (Num.Bit0 Num.One) = 2" |
66190 | 179 |
by simp_all |
61275
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
180 |
|
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
181 |
instantiation integer :: "{linordered_idom, equal}" |
26140 | 182 |
begin |
183 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
184 |
lift_definition abs_integer :: "integer \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
185 |
is "abs :: int \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
186 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
187 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
188 |
declare abs_integer.rep_eq [simp] |
26140 | 189 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
190 |
lift_definition sgn_integer :: "integer \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
191 |
is "sgn :: int \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
192 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
193 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
194 |
declare sgn_integer.rep_eq [simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
195 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
196 |
lift_definition less_eq_integer :: "integer \<Rightarrow> integer \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
197 |
is "less_eq :: int \<Rightarrow> int \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
198 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
199 |
|
69946 | 200 |
lemma integer_less_eq_iff: |
201 |
"k \<le> l \<longleftrightarrow> int_of_integer k \<le> int_of_integer l" |
|
202 |
by (fact less_eq_integer.rep_eq) |
|
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
203 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
204 |
lift_definition less_integer :: "integer \<Rightarrow> integer \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
205 |
is "less :: int \<Rightarrow> int \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
206 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
207 |
|
69946 | 208 |
lemma integer_less_iff: |
209 |
"k < l \<longleftrightarrow> int_of_integer k < int_of_integer l" |
|
210 |
by (fact less_integer.rep_eq) |
|
211 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
212 |
lift_definition equal_integer :: "integer \<Rightarrow> integer \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
213 |
is "HOL.equal :: int \<Rightarrow> int \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
214 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
215 |
|
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
216 |
instance |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
217 |
by standard (transfer, simp add: algebra_simps equal less_le_not_le [symmetric] mult_strict_right_mono linear)+ |
26140 | 218 |
|
219 |
end |
|
220 |
||
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
221 |
context |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
222 |
includes lifting_syntax |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
223 |
begin |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
224 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
225 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
226 |
\<open>(pcr_integer ===> pcr_integer ===> pcr_integer) min min\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
227 |
by (unfold min_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
228 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
229 |
lemma [transfer_rule]: |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
230 |
\<open>(pcr_integer ===> pcr_integer ===> pcr_integer) max max\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
231 |
by (unfold max_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
232 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
233 |
end |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
234 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
235 |
lemma int_of_integer_min [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
236 |
"int_of_integer (min k l) = min (int_of_integer k) (int_of_integer l)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
237 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
238 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
239 |
lemma int_of_integer_max [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
240 |
"int_of_integer (max k l) = max (int_of_integer k) (int_of_integer l)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
241 |
by transfer rule |
26140 | 242 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
243 |
lemma nat_of_integer_non_positive [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
244 |
"k \<le> 0 \<Longrightarrow> nat_of_integer k = 0" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
245 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
246 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
247 |
lemma of_nat_of_integer [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
248 |
"of_nat (nat_of_integer k) = max 0 k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
249 |
by transfer auto |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
250 |
|
66817 | 251 |
instantiation integer :: unique_euclidean_ring |
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
252 |
begin |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
253 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
254 |
lift_definition divide_integer :: "integer \<Rightarrow> integer \<Rightarrow> integer" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
255 |
is "divide :: int \<Rightarrow> int \<Rightarrow> int" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
256 |
. |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
257 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
258 |
declare divide_integer.rep_eq [simp] |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
259 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
260 |
lift_definition modulo_integer :: "integer \<Rightarrow> integer \<Rightarrow> integer" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
261 |
is "modulo :: int \<Rightarrow> int \<Rightarrow> int" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
262 |
. |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
263 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
264 |
declare modulo_integer.rep_eq [simp] |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
265 |
|
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
266 |
lift_definition euclidean_size_integer :: "integer \<Rightarrow> nat" |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
267 |
is "euclidean_size :: int \<Rightarrow> nat" |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
268 |
. |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
269 |
|
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
270 |
declare euclidean_size_integer.rep_eq [simp] |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
271 |
|
66838
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
272 |
lift_definition division_segment_integer :: "integer \<Rightarrow> integer" |
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
273 |
is "division_segment :: int \<Rightarrow> int" |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
274 |
. |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
275 |
|
66838
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
276 |
declare division_segment_integer.rep_eq [simp] |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
277 |
|
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
278 |
instance |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
279 |
by (standard; transfer) |
66838
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
280 |
(use mult_le_mono2 [of 1] in \<open>auto simp add: sgn_mult_abs abs_mult sgn_mult abs_mod_less sgn_mod nat_mult_distrib |
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
281 |
division_segment_mult division_segment_mod intro: div_eqI\<close>) |
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
282 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
283 |
end |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
284 |
|
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
285 |
lemma [code]: |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
286 |
"euclidean_size = nat_of_integer \<circ> abs" |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
287 |
by (simp add: fun_eq_iff nat_of_integer.rep_eq) |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
288 |
|
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
289 |
lemma [code]: |
66838
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
290 |
"division_segment (k :: integer) = (if k \<ge> 0 then 1 else - 1)" |
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
291 |
by transfer (simp add: division_segment_int_def) |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
292 |
|
70340 | 293 |
instance integer :: unique_euclidean_ring_with_nat |
66839 | 294 |
by (standard; transfer) (simp_all add: of_nat_div division_segment_int_def) |
66815 | 295 |
|
71094 | 296 |
instantiation integer :: semiring_bit_shifts |
297 |
begin |
|
298 |
||
299 |
lift_definition push_bit_integer :: \<open>nat \<Rightarrow> integer \<Rightarrow> integer\<close> |
|
300 |
is \<open>push_bit\<close> . |
|
301 |
||
302 |
lift_definition drop_bit_integer :: \<open>nat \<Rightarrow> integer \<Rightarrow> integer\<close> |
|
303 |
is \<open>drop_bit\<close> . |
|
304 |
||
305 |
instance by (standard; transfer) |
|
71195 | 306 |
(fact bit_eq_rec bits_induct push_bit_eq_mult drop_bit_eq_div |
307 |
bits_div_0 bits_div_by_1 bits_mod_div_trivial even_succ_div_2 |
|
71413 | 308 |
exp_div_exp_eq div_exp_eq mod_exp_eq mult_exp_mod_exp_eq div_exp_mod_exp_eq |
71424 | 309 |
even_mask_div_iff even_mult_exp_div_exp_iff)+ |
71094 | 310 |
|
311 |
end |
|
68010 | 312 |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
313 |
context |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
314 |
includes lifting_syntax |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
315 |
begin |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
316 |
|
68010 | 317 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
318 |
\<open>(pcr_integer ===> (=) ===> (\<longleftrightarrow>)) bit bit\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
319 |
by (unfold bit_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
320 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
321 |
lemma [transfer_rule]: |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
322 |
\<open>((=) ===> pcr_integer ===> pcr_integer) take_bit take_bit\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
323 |
by (unfold take_bit_eq_mod) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
324 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
325 |
end |
68010 | 326 |
|
71094 | 327 |
instance integer :: unique_euclidean_semiring_with_bit_shifts .. |
328 |
||
329 |
lemma [code]: |
|
330 |
\<open>push_bit n k = k * 2 ^ n\<close> |
|
331 |
\<open>drop_bit n k = k div 2 ^ n\<close> for k :: integer |
|
332 |
by (fact push_bit_eq_mult drop_bit_eq_div)+ |
|
68010 | 333 |
|
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
334 |
instantiation integer :: unique_euclidean_semiring_numeral |
61275
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
335 |
begin |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
336 |
|
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
337 |
definition divmod_integer :: "num \<Rightarrow> num \<Rightarrow> integer \<times> integer" |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
338 |
where |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
339 |
divmod_integer'_def: "divmod_integer m n = (numeral m div numeral n, numeral m mod numeral n)" |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
340 |
|
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
341 |
definition divmod_step_integer :: "num \<Rightarrow> integer \<times> integer \<Rightarrow> integer \<times> integer" |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
342 |
where |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
343 |
"divmod_step_integer l qr = (let (q, r) = qr |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
344 |
in if r \<ge> numeral l then (2 * q + 1, r - numeral l) |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
345 |
else (2 * q, r))" |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
346 |
|
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
347 |
instance proof |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
348 |
show "divmod m n = (numeral m div numeral n :: integer, numeral m mod numeral n)" |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
349 |
for m n by (fact divmod_integer'_def) |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
350 |
show "divmod_step l qr = (let (q, r) = qr |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
351 |
in if r \<ge> numeral l then (2 * q + 1, r - numeral l) |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
352 |
else (2 * q, r))" for l and qr :: "integer \<times> integer" |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
353 |
by (fact divmod_step_integer_def) |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
354 |
qed (transfer, |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
355 |
fact le_add_diff_inverse2 |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
356 |
unique_euclidean_semiring_numeral_class.div_less |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
357 |
unique_euclidean_semiring_numeral_class.mod_less |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
358 |
unique_euclidean_semiring_numeral_class.div_positive |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
359 |
unique_euclidean_semiring_numeral_class.mod_less_eq_dividend |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
360 |
unique_euclidean_semiring_numeral_class.pos_mod_bound |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
361 |
unique_euclidean_semiring_numeral_class.pos_mod_sign |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
362 |
unique_euclidean_semiring_numeral_class.mod_mult2_eq |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
363 |
unique_euclidean_semiring_numeral_class.div_mult2_eq |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
364 |
unique_euclidean_semiring_numeral_class.discrete)+ |
61275
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
365 |
|
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
366 |
end |
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
367 |
|
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
368 |
declare divmod_algorithm_code [where ?'a = integer, |
69946 | 369 |
folded integer_of_num_def, unfolded integer_of_num_triv, |
61275
053ec04ea866
monomorphization of divmod wrt. code generation avoids costly dictionary unpacking at runtime
haftmann
parents:
61274
diff
changeset
|
370 |
code] |
53069
d165213e3924
execution of int division by class semiring_numeral_div, replacing pdivmod by divmod_abs
haftmann
parents:
52435
diff
changeset
|
371 |
|
55427
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
372 |
lemma integer_of_nat_0: "integer_of_nat 0 = 0" |
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
373 |
by transfer simp |
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
374 |
|
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
375 |
lemma integer_of_nat_1: "integer_of_nat 1 = 1" |
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
376 |
by transfer simp |
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
377 |
|
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
378 |
lemma integer_of_nat_numeral: |
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
379 |
"integer_of_nat (numeral n) = numeral n" |
ff54d22fe357
make integer_of_char and char_of_integer work with NBE and code_simp
Andreas Lochbihler
parents:
54489
diff
changeset
|
380 |
by transfer simp |
26140 | 381 |
|
68010 | 382 |
|
60758 | 383 |
subsection \<open>Code theorems for target language integers\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
384 |
|
60758 | 385 |
text \<open>Constructors\<close> |
26140 | 386 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
387 |
definition Pos :: "num \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
388 |
where |
61274
0261eec37233
more selective preprocessing allows bare "numeral" occurences to be retained as real function in generated code
haftmann
parents:
61076
diff
changeset
|
389 |
[simp, code_post]: "Pos = numeral" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
390 |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
391 |
context |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
392 |
includes lifting_syntax |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
393 |
begin |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
394 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
395 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
396 |
\<open>((=) ===> pcr_integer) numeral Pos\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
397 |
by simp transfer_prover |
30245
e67f42ac1157
consequent rewrite of index_size, size [index] to nat_of; support pseudo-primrec sepcifications with fun
haftmann
parents:
29823
diff
changeset
|
398 |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
399 |
end |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
400 |
|
61274
0261eec37233
more selective preprocessing allows bare "numeral" occurences to be retained as real function in generated code
haftmann
parents:
61076
diff
changeset
|
401 |
lemma Pos_fold [code_unfold]: |
0261eec37233
more selective preprocessing allows bare "numeral" occurences to be retained as real function in generated code
haftmann
parents:
61076
diff
changeset
|
402 |
"numeral Num.One = Pos Num.One" |
0261eec37233
more selective preprocessing allows bare "numeral" occurences to be retained as real function in generated code
haftmann
parents:
61076
diff
changeset
|
403 |
"numeral (Num.Bit0 k) = Pos (Num.Bit0 k)" |
0261eec37233
more selective preprocessing allows bare "numeral" occurences to be retained as real function in generated code
haftmann
parents:
61076
diff
changeset
|
404 |
"numeral (Num.Bit1 k) = Pos (Num.Bit1 k)" |
0261eec37233
more selective preprocessing allows bare "numeral" occurences to be retained as real function in generated code
haftmann
parents:
61076
diff
changeset
|
405 |
by simp_all |
0261eec37233
more selective preprocessing allows bare "numeral" occurences to be retained as real function in generated code
haftmann
parents:
61076
diff
changeset
|
406 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
407 |
definition Neg :: "num \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
408 |
where |
54489
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
haftmann
parents:
53069
diff
changeset
|
409 |
[simp, code_abbrev]: "Neg n = - Pos n" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
410 |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
411 |
context |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
412 |
includes lifting_syntax |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
413 |
begin |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
414 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
415 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
416 |
\<open>((=) ===> pcr_integer) (\<lambda>n. - numeral n) Neg\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
417 |
by (unfold Neg_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
418 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
419 |
end |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
420 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
421 |
code_datatype "0::integer" Pos Neg |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
422 |
|
64994
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
423 |
|
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
424 |
text \<open>A further pair of constructors for generated computations\<close> |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
425 |
|
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
426 |
context |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
427 |
begin |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
428 |
|
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
429 |
qualified definition positive :: "num \<Rightarrow> integer" |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
430 |
where [simp]: "positive = numeral" |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
431 |
|
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
432 |
qualified definition negative :: "num \<Rightarrow> integer" |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
433 |
where [simp]: "negative = uminus \<circ> numeral" |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
434 |
|
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
435 |
lemma [code_computation_unfold]: |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
436 |
"numeral = positive" |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
437 |
"Pos = positive" |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
438 |
"Neg = negative" |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
439 |
by (simp_all add: fun_eq_iff) |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
440 |
|
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
441 |
end |
6e4c05e8edbb
computation preprocessing rules to allow literals as input for computations
haftmann
parents:
64848
diff
changeset
|
442 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
443 |
|
60758 | 444 |
text \<open>Auxiliary operations\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
445 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
446 |
lift_definition dup :: "integer \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
447 |
is "\<lambda>k::int. k + k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
448 |
. |
26140 | 449 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
450 |
lemma dup_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
451 |
"dup 0 = 0" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
452 |
"dup (Pos n) = Pos (Num.Bit0 n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
453 |
"dup (Neg n) = Neg (Num.Bit0 n)" |
54489
03ff4d1e6784
eliminiated neg_numeral in favour of - (numeral _)
haftmann
parents:
53069
diff
changeset
|
454 |
by (transfer, simp only: numeral_Bit0 minus_add_distrib)+ |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
455 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
456 |
lift_definition sub :: "num \<Rightarrow> num \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
457 |
is "\<lambda>m n. numeral m - numeral n :: int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
458 |
. |
26140 | 459 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
460 |
lemma sub_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
461 |
"sub Num.One Num.One = 0" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
462 |
"sub (Num.Bit0 m) Num.One = Pos (Num.BitM m)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
463 |
"sub (Num.Bit1 m) Num.One = Pos (Num.Bit0 m)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
464 |
"sub Num.One (Num.Bit0 n) = Neg (Num.BitM n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
465 |
"sub Num.One (Num.Bit1 n) = Neg (Num.Bit0 n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
466 |
"sub (Num.Bit0 m) (Num.Bit0 n) = dup (sub m n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
467 |
"sub (Num.Bit1 m) (Num.Bit1 n) = dup (sub m n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
468 |
"sub (Num.Bit1 m) (Num.Bit0 n) = dup (sub m n) + 1" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
469 |
"sub (Num.Bit0 m) (Num.Bit1 n) = dup (sub m n) - 1" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
470 |
by (transfer, simp add: dbl_def dbl_inc_def dbl_dec_def)+ |
28351 | 471 |
|
24999 | 472 |
|
60758 | 473 |
text \<open>Implementations\<close> |
24999 | 474 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
475 |
lemma one_integer_code [code, code_unfold]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
476 |
"1 = Pos Num.One" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
477 |
by simp |
24999 | 478 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
479 |
lemma plus_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
480 |
"k + 0 = (k::integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
481 |
"0 + l = (l::integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
482 |
"Pos m + Pos n = Pos (m + n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
483 |
"Pos m + Neg n = sub m n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
484 |
"Neg m + Pos n = sub n m" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
485 |
"Neg m + Neg n = Neg (m + n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
486 |
by (transfer, simp)+ |
24999 | 487 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
488 |
lemma uminus_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
489 |
"uminus 0 = (0::integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
490 |
"uminus (Pos m) = Neg m" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
491 |
"uminus (Neg m) = Pos m" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
492 |
by simp_all |
28708
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
493 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
494 |
lemma minus_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
495 |
"k - 0 = (k::integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
496 |
"0 - l = uminus (l::integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
497 |
"Pos m - Pos n = sub m n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
498 |
"Pos m - Neg n = Pos (m + n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
499 |
"Neg m - Pos n = Neg (m + n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
500 |
"Neg m - Neg n = sub n m" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
501 |
by (transfer, simp)+ |
46028
9f113cdf3d66
attribute code_abbrev superseedes code_unfold_post
haftmann
parents:
45694
diff
changeset
|
502 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
503 |
lemma abs_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
504 |
"\<bar>k\<bar> = (if (k::integer) < 0 then - k else k)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
505 |
by simp |
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
46664
diff
changeset
|
506 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
507 |
lemma sgn_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
508 |
"sgn k = (if k = 0 then 0 else if (k::integer) < 0 then - 1 else 1)" |
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
46664
diff
changeset
|
509 |
by simp |
46028
9f113cdf3d66
attribute code_abbrev superseedes code_unfold_post
haftmann
parents:
45694
diff
changeset
|
510 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
511 |
lemma times_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
512 |
"k * 0 = (0::integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
513 |
"0 * l = (0::integer)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
514 |
"Pos m * Pos n = Pos (m * n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
515 |
"Pos m * Neg n = Neg (m * n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
516 |
"Neg m * Pos n = Neg (m * n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
517 |
"Neg m * Neg n = Pos (m * n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
518 |
by simp_all |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
519 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
520 |
definition divmod_integer :: "integer \<Rightarrow> integer \<Rightarrow> integer \<times> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
521 |
where |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
522 |
"divmod_integer k l = (k div l, k mod l)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
523 |
|
66801 | 524 |
lemma fst_divmod_integer [simp]: |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
525 |
"fst (divmod_integer k l) = k div l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
526 |
by (simp add: divmod_integer_def) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
527 |
|
66801 | 528 |
lemma snd_divmod_integer [simp]: |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
529 |
"snd (divmod_integer k l) = k mod l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
530 |
by (simp add: divmod_integer_def) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
531 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
532 |
definition divmod_abs :: "integer \<Rightarrow> integer \<Rightarrow> integer \<times> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
533 |
where |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
534 |
"divmod_abs k l = (\<bar>k\<bar> div \<bar>l\<bar>, \<bar>k\<bar> mod \<bar>l\<bar>)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
535 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
536 |
lemma fst_divmod_abs [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
537 |
"fst (divmod_abs k l) = \<bar>k\<bar> div \<bar>l\<bar>" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
538 |
by (simp add: divmod_abs_def) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
539 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
540 |
lemma snd_divmod_abs [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
541 |
"snd (divmod_abs k l) = \<bar>k\<bar> mod \<bar>l\<bar>" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
542 |
by (simp add: divmod_abs_def) |
28708
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
543 |
|
53069
d165213e3924
execution of int division by class semiring_numeral_div, replacing pdivmod by divmod_abs
haftmann
parents:
52435
diff
changeset
|
544 |
lemma divmod_abs_code [code]: |
d165213e3924
execution of int division by class semiring_numeral_div, replacing pdivmod by divmod_abs
haftmann
parents:
52435
diff
changeset
|
545 |
"divmod_abs (Pos k) (Pos l) = divmod k l" |
d165213e3924
execution of int division by class semiring_numeral_div, replacing pdivmod by divmod_abs
haftmann
parents:
52435
diff
changeset
|
546 |
"divmod_abs (Neg k) (Neg l) = divmod k l" |
d165213e3924
execution of int division by class semiring_numeral_div, replacing pdivmod by divmod_abs
haftmann
parents:
52435
diff
changeset
|
547 |
"divmod_abs (Neg k) (Pos l) = divmod k l" |
d165213e3924
execution of int division by class semiring_numeral_div, replacing pdivmod by divmod_abs
haftmann
parents:
52435
diff
changeset
|
548 |
"divmod_abs (Pos k) (Neg l) = divmod k l" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
549 |
"divmod_abs j 0 = (0, \<bar>j\<bar>)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
550 |
"divmod_abs 0 j = (0, 0)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
551 |
by (simp_all add: prod_eq_iff) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
552 |
|
69946 | 553 |
lemma divmod_integer_eq_cases: |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
554 |
"divmod_integer k l = |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
555 |
(if k = 0 then (0, 0) else if l = 0 then (0, k) else |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
556 |
(apsnd \<circ> times \<circ> sgn) l (if sgn k = sgn l |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
557 |
then divmod_abs k l |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
558 |
else (let (r, s) = divmod_abs k l in |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
559 |
if s = 0 then (- r, 0) else (- r - 1, \<bar>l\<bar> - s))))" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
560 |
proof - |
69946 | 561 |
have *: "sgn k = sgn l \<longleftrightarrow> k = 0 \<and> l = 0 \<or> 0 < l \<and> 0 < k \<or> l < 0 \<and> k < 0" for k l :: int |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
562 |
by (auto simp add: sgn_if) |
69946 | 563 |
have **: "- k = l * q \<longleftrightarrow> k = - (l * q)" for k l q :: int |
564 |
by auto |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
565 |
show ?thesis |
69946 | 566 |
by (simp add: divmod_integer_def divmod_abs_def) |
567 |
(transfer, auto simp add: * ** not_less zdiv_zminus1_eq_if zmod_zminus1_eq_if div_minus_right mod_minus_right) |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
568 |
qed |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
569 |
|
69946 | 570 |
lemma divmod_integer_code [code]: \<^marker>\<open>contributor \<open>René Thiemann\<close>\<close> \<^marker>\<open>contributor \<open>Akihisa Yamada\<close>\<close> |
571 |
"divmod_integer k l = |
|
572 |
(if k = 0 then (0, 0) |
|
573 |
else if l > 0 then |
|
574 |
(if k > 0 then Code_Numeral.divmod_abs k l |
|
575 |
else case Code_Numeral.divmod_abs k l of (r, s) \<Rightarrow> |
|
576 |
if s = 0 then (- r, 0) else (- r - 1, l - s)) |
|
577 |
else if l = 0 then (0, k) |
|
578 |
else apsnd uminus |
|
579 |
(if k < 0 then Code_Numeral.divmod_abs k l |
|
580 |
else case Code_Numeral.divmod_abs k l of (r, s) \<Rightarrow> |
|
581 |
if s = 0 then (- r, 0) else (- r - 1, - l - s)))" |
|
582 |
by (cases l "0 :: integer" rule: linorder_cases) |
|
583 |
(auto split: prod.splits simp add: divmod_integer_eq_cases) |
|
584 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
585 |
lemma div_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
586 |
"k div l = fst (divmod_integer k l)" |
28708
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
587 |
by simp |
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
588 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
589 |
lemma mod_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
590 |
"k mod l = snd (divmod_integer k l)" |
25767 | 591 |
by simp |
24999 | 592 |
|
68028 | 593 |
definition bit_cut_integer :: "integer \<Rightarrow> integer \<times> bool" |
594 |
where "bit_cut_integer k = (k div 2, odd k)" |
|
595 |
||
596 |
lemma bit_cut_integer_code [code]: |
|
597 |
"bit_cut_integer k = (if k = 0 then (0, False) |
|
598 |
else let (r, s) = Code_Numeral.divmod_abs k 2 |
|
599 |
in (if k > 0 then r else - r - s, s = 1))" |
|
600 |
proof - |
|
601 |
have "bit_cut_integer k = (let (r, s) = divmod_integer k 2 in (r, s = 1))" |
|
602 |
by (simp add: divmod_integer_def bit_cut_integer_def odd_iff_mod_2_eq_one) |
|
603 |
then show ?thesis |
|
604 |
by (simp add: divmod_integer_code) (auto simp add: split_def) |
|
605 |
qed |
|
606 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
607 |
lemma equal_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
608 |
"HOL.equal 0 (0::integer) \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
609 |
"HOL.equal 0 (Pos l) \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
610 |
"HOL.equal 0 (Neg l) \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
611 |
"HOL.equal (Pos k) 0 \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
612 |
"HOL.equal (Pos k) (Pos l) \<longleftrightarrow> HOL.equal k l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
613 |
"HOL.equal (Pos k) (Neg l) \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
614 |
"HOL.equal (Neg k) 0 \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
615 |
"HOL.equal (Neg k) (Pos l) \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
616 |
"HOL.equal (Neg k) (Neg l) \<longleftrightarrow> HOL.equal k l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
617 |
by (simp_all add: equal) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
618 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
619 |
lemma equal_integer_refl [code nbe]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
620 |
"HOL.equal (k::integer) k \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
621 |
by (fact equal_refl) |
31266 | 622 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
623 |
lemma less_eq_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
624 |
"0 \<le> (0::integer) \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
625 |
"0 \<le> Pos l \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
626 |
"0 \<le> Neg l \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
627 |
"Pos k \<le> 0 \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
628 |
"Pos k \<le> Pos l \<longleftrightarrow> k \<le> l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
629 |
"Pos k \<le> Neg l \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
630 |
"Neg k \<le> 0 \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
631 |
"Neg k \<le> Pos l \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
632 |
"Neg k \<le> Neg l \<longleftrightarrow> l \<le> k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
633 |
by simp_all |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
634 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
635 |
lemma less_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
636 |
"0 < (0::integer) \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
637 |
"0 < Pos l \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
638 |
"0 < Neg l \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
639 |
"Pos k < 0 \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
640 |
"Pos k < Pos l \<longleftrightarrow> k < l" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
641 |
"Pos k < Neg l \<longleftrightarrow> False" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
642 |
"Neg k < 0 \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
643 |
"Neg k < Pos l \<longleftrightarrow> True" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
644 |
"Neg k < Neg l \<longleftrightarrow> l < k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
645 |
by simp_all |
26140 | 646 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
647 |
lift_definition num_of_integer :: "integer \<Rightarrow> num" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
648 |
is "num_of_nat \<circ> nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
649 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
650 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
651 |
lemma num_of_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
652 |
"num_of_integer k = (if k \<le> 1 then Num.One |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
653 |
else let |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
654 |
(l, j) = divmod_integer k 2; |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
655 |
l' = num_of_integer l; |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
656 |
l'' = l' + l' |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
657 |
in if j = 0 then l'' else l'' + Num.One)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
658 |
proof - |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
659 |
{ |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
660 |
assume "int_of_integer k mod 2 = 1" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
661 |
then have "nat (int_of_integer k mod 2) = nat 1" by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
662 |
moreover assume *: "1 < int_of_integer k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
663 |
ultimately have **: "nat (int_of_integer k) mod 2 = 1" by (simp add: nat_mod_distrib) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
664 |
have "num_of_nat (nat (int_of_integer k)) = |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
665 |
num_of_nat (2 * (nat (int_of_integer k) div 2) + nat (int_of_integer k) mod 2)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
666 |
by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
667 |
then have "num_of_nat (nat (int_of_integer k)) = |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
668 |
num_of_nat (nat (int_of_integer k) div 2 + nat (int_of_integer k) div 2 + nat (int_of_integer k) mod 2)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
669 |
by (simp add: mult_2) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
670 |
with ** have "num_of_nat (nat (int_of_integer k)) = |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
671 |
num_of_nat (nat (int_of_integer k) div 2 + nat (int_of_integer k) div 2 + 1)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
672 |
by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
673 |
} |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
674 |
note aux = this |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
675 |
show ?thesis |
55414
eab03e9cee8a
renamed '{prod,sum,bool,unit}_case' to 'case_...'
blanchet
parents:
54489
diff
changeset
|
676 |
by (auto simp add: num_of_integer_def nat_of_integer_def Let_def case_prod_beta |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
677 |
not_le integer_eq_iff less_eq_integer_def |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
678 |
nat_mult_distrib nat_div_distrib num_of_nat_One num_of_nat_plus_distrib |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
679 |
mult_2 [where 'a=nat] aux add_One) |
25918 | 680 |
qed |
681 |
||
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
682 |
lemma nat_of_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
683 |
"nat_of_integer k = (if k \<le> 0 then 0 |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
684 |
else let |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
685 |
(l, j) = divmod_integer k 2; |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
686 |
l' = nat_of_integer l; |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
687 |
l'' = l' + l' |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
688 |
in if j = 0 then l'' else l'' + 1)" |
33340
a165b97f3658
moved Nat_Transfer before Divides; distributed Nat_Transfer setup accordingly
haftmann
parents:
33318
diff
changeset
|
689 |
proof - |
66886 | 690 |
obtain j where k: "k = integer_of_int j" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
691 |
proof |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
692 |
show "k = integer_of_int (int_of_integer k)" by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
693 |
qed |
66886 | 694 |
have *: "nat j mod 2 = nat_of_integer (of_int j mod 2)" if "j \<ge> 0" |
695 |
using that by transfer (simp add: nat_mod_distrib) |
|
696 |
from k show ?thesis |
|
697 |
by (auto simp add: split_def Let_def nat_of_integer_def nat_div_distrib mult_2 [symmetric] |
|
698 |
minus_mod_eq_mult_div [symmetric] *) |
|
33340
a165b97f3658
moved Nat_Transfer before Divides; distributed Nat_Transfer setup accordingly
haftmann
parents:
33318
diff
changeset
|
699 |
qed |
28708
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
700 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
701 |
lemma int_of_integer_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
702 |
"int_of_integer k = (if k < 0 then - (int_of_integer (- k)) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
703 |
else if k = 0 then 0 |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
704 |
else let |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
705 |
(l, j) = divmod_integer k 2; |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
706 |
l' = 2 * int_of_integer l |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
707 |
in if j = 0 then l' else l' + 1)" |
64246 | 708 |
by (auto simp add: split_def Let_def integer_eq_iff minus_mod_eq_mult_div [symmetric]) |
28708
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
709 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
710 |
lemma integer_of_int_code [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
711 |
"integer_of_int k = (if k < 0 then - (integer_of_int (- k)) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
712 |
else if k = 0 then 0 |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
713 |
else let |
60868
dd18c33c001e
direct bootstrap of integer division from natural division
haftmann
parents:
60758
diff
changeset
|
714 |
l = 2 * integer_of_int (k div 2); |
dd18c33c001e
direct bootstrap of integer division from natural division
haftmann
parents:
60758
diff
changeset
|
715 |
j = k mod 2 |
dd18c33c001e
direct bootstrap of integer division from natural division
haftmann
parents:
60758
diff
changeset
|
716 |
in if j = 0 then l else l + 1)" |
64246 | 717 |
by (auto simp add: split_def Let_def integer_eq_iff minus_mod_eq_mult_div [symmetric]) |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
718 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
719 |
hide_const (open) Pos Neg sub dup divmod_abs |
46547
d1dcb91a512e
use qualified constant names instead of suffixes (from Florian Haftmann)
huffman
parents:
46028
diff
changeset
|
720 |
|
28708
a1a436f09ec6
explicit check for pattern discipline before code translation
haftmann
parents:
28562
diff
changeset
|
721 |
|
60758 | 722 |
subsection \<open>Serializer setup for target language integers\<close> |
24999 | 723 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
724 |
code_reserved Eval int Integer abs |
25767 | 725 |
|
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
726 |
code_printing |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
727 |
type_constructor integer \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
728 |
(SML) "IntInf.int" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
729 |
and (OCaml) "Z.t" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
730 |
and (Haskell) "Integer" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
731 |
and (Scala) "BigInt" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
732 |
and (Eval) "int" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
733 |
| class_instance integer :: equal \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
734 |
(Haskell) - |
24999 | 735 |
|
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
736 |
code_printing |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
737 |
constant "0::integer" \<rightharpoonup> |
58400
d0d3c30806b4
always annotate potentially polymorphic Haskell numerals
haftmann
parents:
58399
diff
changeset
|
738 |
(SML) "!(0/ :/ IntInf.int)" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
739 |
and (OCaml) "Z.zero" |
58400
d0d3c30806b4
always annotate potentially polymorphic Haskell numerals
haftmann
parents:
58399
diff
changeset
|
740 |
and (Haskell) "!(0/ ::/ Integer)" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
741 |
and (Scala) "BigInt(0)" |
47108
2a1953f0d20d
merged fork with new numeral representation (see NEWS)
huffman
parents:
46664
diff
changeset
|
742 |
|
60758 | 743 |
setup \<open> |
58399 | 744 |
fold (fn target => |
69593 | 745 |
Numeral.add_code \<^const_name>\<open>Code_Numeral.Pos\<close> I Code_Printer.literal_numeral target |
746 |
#> Numeral.add_code \<^const_name>\<open>Code_Numeral.Neg\<close> (~) Code_Printer.literal_numeral target) |
|
58399 | 747 |
["SML", "OCaml", "Haskell", "Scala"] |
60758 | 748 |
\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
749 |
|
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
750 |
code_printing |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
751 |
constant "plus :: integer \<Rightarrow> _ \<Rightarrow> _" \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
752 |
(SML) "IntInf.+ ((_), (_))" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
753 |
and (OCaml) "Z.add" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
754 |
and (Haskell) infixl 6 "+" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
755 |
and (Scala) infixl 7 "+" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
756 |
and (Eval) infixl 8 "+" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
757 |
| constant "uminus :: integer \<Rightarrow> _" \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
758 |
(SML) "IntInf.~" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
759 |
and (OCaml) "Z.neg" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
760 |
and (Haskell) "negate" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
761 |
and (Scala) "!(- _)" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
762 |
and (Eval) "~/ _" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
763 |
| constant "minus :: integer \<Rightarrow> _" \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
764 |
(SML) "IntInf.- ((_), (_))" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
765 |
and (OCaml) "Z.sub" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
766 |
and (Haskell) infixl 6 "-" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
767 |
and (Scala) infixl 7 "-" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
768 |
and (Eval) infixl 8 "-" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
769 |
| constant Code_Numeral.dup \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
770 |
(SML) "IntInf.*/ (2,/ (_))" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
771 |
and (OCaml) "Z.shift'_left/ _/ 1" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
772 |
and (Haskell) "!(2 * _)" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
773 |
and (Scala) "!(2 * _)" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
774 |
and (Eval) "!(2 * _)" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
775 |
| constant Code_Numeral.sub \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
776 |
(SML) "!(raise/ Fail/ \"sub\")" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
777 |
and (OCaml) "failwith/ \"sub\"" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
778 |
and (Haskell) "error/ \"sub\"" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
779 |
and (Scala) "!sys.error(\"sub\")" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
780 |
| constant "times :: integer \<Rightarrow> _ \<Rightarrow> _" \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
781 |
(SML) "IntInf.* ((_), (_))" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
782 |
and (OCaml) "Z.mul" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
783 |
and (Haskell) infixl 7 "*" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
784 |
and (Scala) infixl 8 "*" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
785 |
and (Eval) infixl 9 "*" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
786 |
| constant Code_Numeral.divmod_abs \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
787 |
(SML) "IntInf.divMod/ (IntInf.abs _,/ IntInf.abs _)" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
788 |
and (OCaml) "!(fun k l ->/ if Z.equal Z.zero l then/ (Z.zero, l) else/ Z.div'_rem/ (Z.abs k)/ (Z.abs l))" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
789 |
and (Haskell) "divMod/ (abs _)/ (abs _)" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
790 |
and (Scala) "!((k: BigInt) => (l: BigInt) =>/ if (l == 0)/ (BigInt(0), k) else/ (k.abs '/% l.abs))" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
791 |
and (Eval) "Integer.div'_mod/ (abs _)/ (abs _)" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
792 |
| constant "HOL.equal :: integer \<Rightarrow> _ \<Rightarrow> bool" \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
793 |
(SML) "!((_ : IntInf.int) = _)" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
794 |
and (OCaml) "Z.equal" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
795 |
and (Haskell) infix 4 "==" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
796 |
and (Scala) infixl 5 "==" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
797 |
and (Eval) infixl 6 "=" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
798 |
| constant "less_eq :: integer \<Rightarrow> _ \<Rightarrow> bool" \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
799 |
(SML) "IntInf.<= ((_), (_))" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
800 |
and (OCaml) "Z.leq" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
801 |
and (Haskell) infix 4 "<=" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
802 |
and (Scala) infixl 4 "<=" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
803 |
and (Eval) infixl 6 "<=" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
804 |
| constant "less :: integer \<Rightarrow> _ \<Rightarrow> bool" \<rightharpoonup> |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
805 |
(SML) "IntInf.< ((_), (_))" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
806 |
and (OCaml) "Z.lt" |
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
807 |
and (Haskell) infix 4 "<" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
808 |
and (Scala) infixl 4 "<" |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
809 |
and (Eval) infixl 6 "<" |
61857
542f2c6da692
add serialisation for abs on integer to target language operation
Andreas Lochbihler
parents:
61275
diff
changeset
|
810 |
| constant "abs :: integer \<Rightarrow> _" \<rightharpoonup> |
542f2c6da692
add serialisation for abs on integer to target language operation
Andreas Lochbihler
parents:
61275
diff
changeset
|
811 |
(SML) "IntInf.abs" |
69906
55534affe445
migrated from Nums to Zarith as library for OCaml integer arithmetic
haftmann
parents:
69593
diff
changeset
|
812 |
and (OCaml) "Z.abs" |
61857
542f2c6da692
add serialisation for abs on integer to target language operation
Andreas Lochbihler
parents:
61275
diff
changeset
|
813 |
and (Haskell) "Prelude.abs" |
542f2c6da692
add serialisation for abs on integer to target language operation
Andreas Lochbihler
parents:
61275
diff
changeset
|
814 |
and (Scala) "_.abs" |
542f2c6da692
add serialisation for abs on integer to target language operation
Andreas Lochbihler
parents:
61275
diff
changeset
|
815 |
and (Eval) "abs" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
816 |
|
52435
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
817 |
code_identifier |
6646bb548c6b
migration from code_(const|type|class|instance) to code_printing and from code_module to code_identifier
haftmann
parents:
51375
diff
changeset
|
818 |
code_module Code_Numeral \<rightharpoonup> (SML) Arith and (OCaml) Arith and (Haskell) Arith |
46547
d1dcb91a512e
use qualified constant names instead of suffixes (from Florian Haftmann)
huffman
parents:
46028
diff
changeset
|
819 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
820 |
|
60758 | 821 |
subsection \<open>Type of target language naturals\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
822 |
|
61076 | 823 |
typedef natural = "UNIV :: nat set" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
824 |
morphisms nat_of_natural natural_of_nat .. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
825 |
|
59487
adaa430fc0f7
default abstypes and default abstract equations make technical (no_code) annotation superfluous
haftmann
parents:
58889
diff
changeset
|
826 |
setup_lifting type_definition_natural |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
827 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
828 |
lemma natural_eq_iff [termination_simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
829 |
"m = n \<longleftrightarrow> nat_of_natural m = nat_of_natural n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
830 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
831 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
832 |
lemma natural_eqI: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
833 |
"nat_of_natural m = nat_of_natural n \<Longrightarrow> m = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
834 |
using natural_eq_iff [of m n] by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
835 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
836 |
lemma nat_of_natural_of_nat_inverse [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
837 |
"nat_of_natural (natural_of_nat n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
838 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
839 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
840 |
lemma natural_of_nat_of_natural_inverse [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
841 |
"natural_of_nat (nat_of_natural n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
842 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
843 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
844 |
instantiation natural :: "{comm_monoid_diff, semiring_1}" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
845 |
begin |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
846 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
847 |
lift_definition zero_natural :: natural |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
848 |
is "0 :: nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
849 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
850 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
851 |
declare zero_natural.rep_eq [simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
852 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
853 |
lift_definition one_natural :: natural |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
854 |
is "1 :: nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
855 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
856 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
857 |
declare one_natural.rep_eq [simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
858 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
859 |
lift_definition plus_natural :: "natural \<Rightarrow> natural \<Rightarrow> natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
860 |
is "plus :: nat \<Rightarrow> nat \<Rightarrow> nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
861 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
862 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
863 |
declare plus_natural.rep_eq [simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
864 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
865 |
lift_definition minus_natural :: "natural \<Rightarrow> natural \<Rightarrow> natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
866 |
is "minus :: nat \<Rightarrow> nat \<Rightarrow> nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
867 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
868 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
869 |
declare minus_natural.rep_eq [simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
870 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
871 |
lift_definition times_natural :: "natural \<Rightarrow> natural \<Rightarrow> natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
872 |
is "times :: nat \<Rightarrow> nat \<Rightarrow> nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
873 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
874 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
875 |
declare times_natural.rep_eq [simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
876 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
877 |
instance proof |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
878 |
qed (transfer, simp add: algebra_simps)+ |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
879 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
880 |
end |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
881 |
|
64241
430d74089d4d
transfer rules for divides relation on integer and natural
haftmann
parents:
64178
diff
changeset
|
882 |
instance natural :: Rings.dvd .. |
430d74089d4d
transfer rules for divides relation on integer and natural
haftmann
parents:
64178
diff
changeset
|
883 |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
884 |
context |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
885 |
includes lifting_syntax |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
886 |
begin |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
887 |
|
64241
430d74089d4d
transfer rules for divides relation on integer and natural
haftmann
parents:
64178
diff
changeset
|
888 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
889 |
\<open>(pcr_natural ===> pcr_natural ===> (\<longleftrightarrow>)) (dvd) (dvd)\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
890 |
by (unfold dvd_def) transfer_prover |
64241
430d74089d4d
transfer rules for divides relation on integer and natural
haftmann
parents:
64178
diff
changeset
|
891 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
892 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
893 |
\<open>((\<longleftrightarrow>) ===> pcr_natural) of_bool of_bool\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
894 |
by (unfold of_bool_def) transfer_prover |
68010 | 895 |
|
896 |
lemma [transfer_rule]: |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
897 |
\<open>((=) ===> pcr_natural) (\<lambda>n. n) of_nat\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
898 |
proof - |
55945 | 899 |
have "rel_fun HOL.eq pcr_natural (of_nat :: nat \<Rightarrow> nat) (of_nat :: nat \<Rightarrow> natural)" |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
900 |
by (unfold of_nat_def) transfer_prover |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
901 |
then show ?thesis by (simp add: id_def) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
902 |
qed |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
903 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
904 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
905 |
\<open>((=) ===> pcr_natural) numeral numeral\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
906 |
proof - |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
907 |
have \<open>((=) ===> pcr_natural) numeral (\<lambda>n. of_nat (numeral n))\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
908 |
by transfer_prover |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
909 |
then show ?thesis by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
910 |
qed |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
911 |
|
68010 | 912 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
913 |
\<open>(pcr_natural ===> (=) ===> pcr_natural) (^) (^)\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
914 |
by (unfold power_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
915 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
916 |
end |
68010 | 917 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
918 |
lemma nat_of_natural_of_nat [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
919 |
"nat_of_natural (of_nat n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
920 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
921 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
922 |
lemma natural_of_nat_of_nat [simp, code_abbrev]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
923 |
"natural_of_nat = of_nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
924 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
925 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
926 |
lemma of_nat_of_natural [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
927 |
"of_nat (nat_of_natural n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
928 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
929 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
930 |
lemma nat_of_natural_numeral [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
931 |
"nat_of_natural (numeral k) = numeral k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
932 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
933 |
|
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
934 |
instantiation natural :: "{linordered_semiring, equal}" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
935 |
begin |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
936 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
937 |
lift_definition less_eq_natural :: "natural \<Rightarrow> natural \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
938 |
is "less_eq :: nat \<Rightarrow> nat \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
939 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
940 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
941 |
declare less_eq_natural.rep_eq [termination_simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
942 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
943 |
lift_definition less_natural :: "natural \<Rightarrow> natural \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
944 |
is "less :: nat \<Rightarrow> nat \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
945 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
946 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
947 |
declare less_natural.rep_eq [termination_simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
948 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
949 |
lift_definition equal_natural :: "natural \<Rightarrow> natural \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
950 |
is "HOL.equal :: nat \<Rightarrow> nat \<Rightarrow> bool" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
951 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
952 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
953 |
instance proof |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
954 |
qed (transfer, simp add: algebra_simps equal less_le_not_le [symmetric] linear)+ |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
955 |
|
24999 | 956 |
end |
46664
1f6c140f9c72
moved predicate relations and conversion rules between set and predicate relations from Predicate.thy to Relation.thy; moved Predicate.thy upwards in theory hierarchy
haftmann
parents:
46638
diff
changeset
|
957 |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
958 |
context |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
959 |
includes lifting_syntax |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
960 |
begin |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
961 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
962 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
963 |
\<open>(pcr_natural ===> pcr_natural ===> pcr_natural) min min\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
964 |
by (unfold min_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
965 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
966 |
lemma [transfer_rule]: |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
967 |
\<open>(pcr_natural ===> pcr_natural ===> pcr_natural) max max\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
968 |
by (unfold max_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
969 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
970 |
end |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
971 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
972 |
lemma nat_of_natural_min [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
973 |
"nat_of_natural (min k l) = min (nat_of_natural k) (nat_of_natural l)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
974 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
975 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
976 |
lemma nat_of_natural_max [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
977 |
"nat_of_natural (max k l) = max (nat_of_natural k) (nat_of_natural l)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
978 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
979 |
|
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
980 |
instantiation natural :: unique_euclidean_semiring |
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
981 |
begin |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
982 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
983 |
lift_definition divide_natural :: "natural \<Rightarrow> natural \<Rightarrow> natural" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
984 |
is "divide :: nat \<Rightarrow> nat \<Rightarrow> nat" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
985 |
. |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
986 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
987 |
declare divide_natural.rep_eq [simp] |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
988 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
989 |
lift_definition modulo_natural :: "natural \<Rightarrow> natural \<Rightarrow> natural" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
990 |
is "modulo :: nat \<Rightarrow> nat \<Rightarrow> nat" |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
991 |
. |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
992 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
993 |
declare modulo_natural.rep_eq [simp] |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
994 |
|
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
995 |
lift_definition euclidean_size_natural :: "natural \<Rightarrow> nat" |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
996 |
is "euclidean_size :: nat \<Rightarrow> nat" |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
997 |
. |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
998 |
|
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
999 |
declare euclidean_size_natural.rep_eq [simp] |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1000 |
|
66838
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
1001 |
lift_definition division_segment_natural :: "natural \<Rightarrow> natural" |
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
1002 |
is "division_segment :: nat \<Rightarrow> nat" |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1003 |
. |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1004 |
|
66838
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
1005 |
declare division_segment_natural.rep_eq [simp] |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1006 |
|
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
1007 |
instance |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1008 |
by (standard; transfer) |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1009 |
(auto simp add: algebra_simps unit_factor_nat_def gr0_conv_Suc) |
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
1010 |
|
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
1011 |
end |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
1012 |
|
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1013 |
lemma [code]: |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1014 |
"euclidean_size = nat_of_natural" |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1015 |
by (simp add: fun_eq_iff) |
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1016 |
|
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1017 |
lemma [code]: |
66838
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
1018 |
"division_segment (n::natural) = 1" |
17989f6bc7b2
clarified uniqueness criterion for euclidean rings
haftmann
parents:
66836
diff
changeset
|
1019 |
by (simp add: natural_eq_iff) |
66806
a4e82b58d833
abolished (semi)ring_div in favour of euclidean_(semi)ring_cancel
haftmann
parents:
66801
diff
changeset
|
1020 |
|
67905 | 1021 |
instance natural :: linordered_semidom |
1022 |
by (standard; transfer) simp_all |
|
1023 |
||
70340 | 1024 |
instance natural :: unique_euclidean_semiring_with_nat |
66839 | 1025 |
by (standard; transfer) simp_all |
66815 | 1026 |
|
71094 | 1027 |
instantiation natural :: semiring_bit_shifts |
1028 |
begin |
|
1029 |
||
1030 |
lift_definition push_bit_natural :: \<open>nat \<Rightarrow> natural \<Rightarrow> natural\<close> |
|
1031 |
is \<open>push_bit\<close> . |
|
1032 |
||
1033 |
lift_definition drop_bit_natural :: \<open>nat \<Rightarrow> natural \<Rightarrow> natural\<close> |
|
1034 |
is \<open>drop_bit\<close> . |
|
1035 |
||
1036 |
instance by (standard; transfer) |
|
71195 | 1037 |
(fact bit_eq_rec bits_induct push_bit_eq_mult drop_bit_eq_div |
1038 |
bits_div_0 bits_div_by_1 bits_mod_div_trivial even_succ_div_2 |
|
71413 | 1039 |
exp_div_exp_eq div_exp_eq mod_exp_eq mult_exp_mod_exp_eq div_exp_mod_exp_eq |
71424 | 1040 |
even_mask_div_iff even_mult_exp_div_exp_iff)+ |
71094 | 1041 |
|
1042 |
end |
|
68010 | 1043 |
|
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1044 |
context |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1045 |
includes lifting_syntax |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1046 |
begin |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1047 |
|
68010 | 1048 |
lemma [transfer_rule]: |
71535
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1049 |
\<open>(pcr_natural ===> (=) ===> (\<longleftrightarrow>)) bit bit\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1050 |
by (unfold bit_def) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1051 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1052 |
lemma [transfer_rule]: |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1053 |
\<open>((=) ===> pcr_natural ===> pcr_natural) take_bit take_bit\<close> |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1054 |
by (unfold take_bit_eq_mod) transfer_prover |
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1055 |
|
b612edee9b0c
more frugal simp rules for bit operations; more pervasive use of bit selector
haftmann
parents:
71424
diff
changeset
|
1056 |
end |
68010 | 1057 |
|
71094 | 1058 |
instance natural :: unique_euclidean_semiring_with_bit_shifts .. |
1059 |
||
1060 |
lemma [code]: |
|
1061 |
\<open>push_bit n m = m * 2 ^ n\<close> |
|
1062 |
\<open>drop_bit n m = m div 2 ^ n\<close> for m :: natural |
|
1063 |
by (fact push_bit_eq_mult drop_bit_eq_div)+ |
|
68010 | 1064 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1065 |
lift_definition natural_of_integer :: "integer \<Rightarrow> natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1066 |
is "nat :: int \<Rightarrow> nat" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1067 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1068 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1069 |
lift_definition integer_of_natural :: "natural \<Rightarrow> integer" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1070 |
is "of_nat :: nat \<Rightarrow> int" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1071 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1072 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1073 |
lemma natural_of_integer_of_natural [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1074 |
"natural_of_integer (integer_of_natural n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1075 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1076 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1077 |
lemma integer_of_natural_of_integer [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1078 |
"integer_of_natural (natural_of_integer k) = max 0 k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1079 |
by transfer auto |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1080 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1081 |
lemma int_of_integer_of_natural [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1082 |
"int_of_integer (integer_of_natural n) = of_nat (nat_of_natural n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1083 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1084 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1085 |
lemma integer_of_natural_of_nat [simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1086 |
"integer_of_natural (of_nat n) = of_nat n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1087 |
by transfer rule |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1088 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1089 |
lemma [measure_function]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1090 |
"is_measure nat_of_natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1091 |
by (rule is_measure_trivial) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1092 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1093 |
|
60758 | 1094 |
subsection \<open>Inductive representation of target language naturals\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1095 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1096 |
lift_definition Suc :: "natural \<Rightarrow> natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1097 |
is Nat.Suc |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1098 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1099 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1100 |
declare Suc.rep_eq [simp] |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1101 |
|
58306
117ba6cbe414
renamed 'rep_datatype' to 'old_rep_datatype' (HOL)
blanchet
parents:
57512
diff
changeset
|
1102 |
old_rep_datatype "0::natural" Suc |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1103 |
by (transfer, fact nat.induct nat.inject nat.distinct)+ |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1104 |
|
55416 | 1105 |
lemma natural_cases [case_names nat, cases type: natural]: |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1106 |
fixes m :: natural |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1107 |
assumes "\<And>n. m = of_nat n \<Longrightarrow> P" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1108 |
shows P |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1109 |
using assms by transfer blast |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1110 |
|
67332 | 1111 |
instantiation natural :: size |
1112 |
begin |
|
58379
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1113 |
|
67332 | 1114 |
definition size_nat where [simp, code]: "size_nat = nat_of_natural" |
1115 |
||
1116 |
instance .. |
|
1117 |
||
1118 |
end |
|
58379
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1119 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1120 |
lemma natural_decr [termination_simp]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1121 |
"n \<noteq> 0 \<Longrightarrow> nat_of_natural n - Nat.Suc 0 < nat_of_natural n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1122 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1123 |
|
58379
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1124 |
lemma natural_zero_minus_one: "(0::natural) - 1 = 0" |
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1125 |
by (rule zero_diff) |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1126 |
|
58379
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1127 |
lemma Suc_natural_minus_one: "Suc n - 1 = n" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1128 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1129 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1130 |
hide_const (open) Suc |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1131 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1132 |
|
60758 | 1133 |
subsection \<open>Code refinement for target language naturals\<close> |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1134 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1135 |
lift_definition Nat :: "integer \<Rightarrow> natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1136 |
is nat |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1137 |
. |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1138 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1139 |
lemma [code_post]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1140 |
"Nat 0 = 0" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1141 |
"Nat 1 = 1" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1142 |
"Nat (numeral k) = numeral k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1143 |
by (transfer, simp)+ |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1144 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1145 |
lemma [code abstype]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1146 |
"Nat (integer_of_natural n) = n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1147 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1148 |
|
63174
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1149 |
lemma [code]: |
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1150 |
"natural_of_nat n = natural_of_integer (integer_of_nat n)" |
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1151 |
by transfer simp |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1152 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1153 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1154 |
"integer_of_natural (natural_of_integer k) = max 0 k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1155 |
by simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1156 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1157 |
lemma [code_abbrev]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1158 |
"natural_of_integer (Code_Numeral.Pos k) = numeral k" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1159 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1160 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1161 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1162 |
"integer_of_natural 0 = 0" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1163 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1164 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1165 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1166 |
"integer_of_natural 1 = 1" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1167 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1168 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1169 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1170 |
"integer_of_natural (Code_Numeral.Suc n) = integer_of_natural n + 1" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1171 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1172 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1173 |
lemma [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1174 |
"nat_of_natural = nat_of_integer \<circ> integer_of_natural" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1175 |
by transfer (simp add: fun_eq_iff) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1176 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1177 |
lemma [code, code_unfold]: |
55416 | 1178 |
"case_natural f g n = (if n = 0 then f else g (n - 1))" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1179 |
by (cases n rule: natural.exhaust) (simp_all, simp add: Suc_def) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1180 |
|
55642
63beb38e9258
adapted to renaming of datatype 'cases' and 'recs' to 'case' and 'rec'
blanchet
parents:
55428
diff
changeset
|
1181 |
declare natural.rec [code del] |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1182 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1183 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1184 |
"integer_of_natural (m + n) = integer_of_natural m + integer_of_natural n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1185 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1186 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1187 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1188 |
"integer_of_natural (m - n) = max 0 (integer_of_natural m - integer_of_natural n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1189 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1190 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1191 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1192 |
"integer_of_natural (m * n) = integer_of_natural m * integer_of_natural n" |
64592
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
1193 |
by transfer simp |
7759f1766189
more fine-grained type class hierarchy for div and mod
haftmann
parents:
64246
diff
changeset
|
1194 |
|
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1195 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1196 |
"integer_of_natural (m div n) = integer_of_natural m div integer_of_natural n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1197 |
by transfer (simp add: zdiv_int) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1198 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1199 |
lemma [code abstract]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1200 |
"integer_of_natural (m mod n) = integer_of_natural m mod integer_of_natural n" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1201 |
by transfer (simp add: zmod_int) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1202 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1203 |
lemma [code]: |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1204 |
"HOL.equal m n \<longleftrightarrow> HOL.equal (integer_of_natural m) (integer_of_natural n)" |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1205 |
by transfer (simp add: equal) |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1206 |
|
58379
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1207 |
lemma [code nbe]: "HOL.equal n (n::natural) \<longleftrightarrow> True" |
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1208 |
by (rule equal_class.equal_refl) |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1209 |
|
58379
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1210 |
lemma [code]: "m \<le> n \<longleftrightarrow> integer_of_natural m \<le> integer_of_natural n" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1211 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1212 |
|
58379
c044539a2bda
reintroduced an instantiation of 'size' for 'numerals'
blanchet
parents:
58377
diff
changeset
|
1213 |
lemma [code]: "m < n \<longleftrightarrow> integer_of_natural m < integer_of_natural n" |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1214 |
by transfer simp |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1215 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1216 |
hide_const (open) Nat |
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1217 |
|
55736
f1ed1e9cd080
unregister lifting setup following the best practice of Lifting
kuncar
parents:
55642
diff
changeset
|
1218 |
lifting_update integer.lifting |
f1ed1e9cd080
unregister lifting setup following the best practice of Lifting
kuncar
parents:
55642
diff
changeset
|
1219 |
lifting_forget integer.lifting |
f1ed1e9cd080
unregister lifting setup following the best practice of Lifting
kuncar
parents:
55642
diff
changeset
|
1220 |
|
f1ed1e9cd080
unregister lifting setup following the best practice of Lifting
kuncar
parents:
55642
diff
changeset
|
1221 |
lifting_update natural.lifting |
f1ed1e9cd080
unregister lifting setup following the best practice of Lifting
kuncar
parents:
55642
diff
changeset
|
1222 |
lifting_forget natural.lifting |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1223 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1224 |
code_reflect Code_Numeral |
63174
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1225 |
datatypes natural |
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1226 |
functions "Code_Numeral.Suc" "0 :: natural" "1 :: natural" |
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1227 |
"plus :: natural \<Rightarrow> _" "minus :: natural \<Rightarrow> _" |
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1228 |
"times :: natural \<Rightarrow> _" "divide :: natural \<Rightarrow> _" |
63950
cdc1e59aa513
syntactic type class for operation mod named after mod;
haftmann
parents:
63174
diff
changeset
|
1229 |
"modulo :: natural \<Rightarrow> _" |
63174
57c0d60e491c
do not export abstract constructors in code_reflect
haftmann
parents:
61857
diff
changeset
|
1230 |
integer_of_natural natural_of_integer |
51143
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1231 |
|
0a2371e7ced3
two target language numeral types: integer and natural, as replacement for code_numeral;
haftmann
parents:
49962
diff
changeset
|
1232 |
end |