| author | wenzelm | 
| Wed, 07 Jan 2009 12:08:22 +0100 | |
| changeset 29380 | a9ee3475abf4 | 
| parent 29037 | 208fee4049a0 | 
| child 29657 | 881f328dfbb3 | 
| child 29667 | 53103fc8ffa3 | 
| permissions | -rw-r--r-- | 
| 23664 | 1  | 
theory ComputeNumeral  | 
| 
26512
 
682dfb674df3
proofs adjusted to new situation in Int.thy/Presburger.thy
 
haftmann 
parents: 
26086 
diff
changeset
 | 
2  | 
imports ComputeHOL "~~/src/HOL/Real/Float"  | 
| 23664 | 3  | 
begin  | 
4  | 
||
5  | 
(* normalization of bit strings *)  | 
|
| 
26075
 
815f3ccc0b45
added lemma lists {normalize,succ,pred,minus,add,mult}_bin_simps
 
huffman 
parents: 
25919 
diff
changeset
 | 
6  | 
lemmas bitnorm = normalize_bin_simps  | 
| 23664 | 7  | 
|
8  | 
(* neg for bit strings *)  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
9  | 
lemma neg1: "neg Int.Pls = False" by (simp add: Int.Pls_def)  | 
| 
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
10  | 
lemma neg2: "neg Int.Min = True" apply (subst Int.Min_def) by auto  | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
11  | 
lemma neg3: "neg (Int.Bit0 x) = neg x" apply (simp add: neg_def) apply (subst Bit0_def) by auto  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
12  | 
lemma neg4: "neg (Int.Bit1 x) = neg x" apply (simp add: neg_def) apply (subst Bit1_def) by auto  | 
| 23664 | 13  | 
lemmas bitneg = neg1 neg2 neg3 neg4  | 
14  | 
||
15  | 
(* iszero for bit strings *)  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
16  | 
lemma iszero1: "iszero Int.Pls = True" by (simp add: Int.Pls_def iszero_def)  | 
| 
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
17  | 
lemma iszero2: "iszero Int.Min = False" apply (subst Int.Min_def) apply (subst iszero_def) by simp  | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
18  | 
lemma iszero3: "iszero (Int.Bit0 x) = iszero x" apply (subst Int.Bit0_def) apply (subst iszero_def)+ by auto  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
19  | 
lemma iszero4: "iszero (Int.Bit1 x) = False" apply (subst Int.Bit1_def) apply (subst iszero_def)+ apply simp by arith  | 
| 23664 | 20  | 
lemmas bitiszero = iszero1 iszero2 iszero3 iszero4  | 
21  | 
||
22  | 
(* lezero for bit strings *)  | 
|
23  | 
constdefs  | 
|
24  | 
"lezero x == (x \<le> 0)"  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
25  | 
lemma lezero1: "lezero Int.Pls = True" unfolding Int.Pls_def lezero_def by auto  | 
| 
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
26  | 
lemma lezero2: "lezero Int.Min = True" unfolding Int.Min_def lezero_def by auto  | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
27  | 
lemma lezero3: "lezero (Int.Bit0 x) = lezero x" unfolding Int.Bit0_def lezero_def by auto  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
28  | 
lemma lezero4: "lezero (Int.Bit1 x) = neg x" unfolding Int.Bit1_def lezero_def neg_def by auto  | 
| 23664 | 29  | 
lemmas bitlezero = lezero1 lezero2 lezero3 lezero4  | 
30  | 
||
31  | 
(* equality for bit strings *)  | 
|
| 29037 | 32  | 
lemmas biteq = eq_bin_simps  | 
| 23664 | 33  | 
|
34  | 
(* x < y for bit strings *)  | 
|
| 29037 | 35  | 
lemmas bitless = less_bin_simps  | 
| 23664 | 36  | 
|
37  | 
(* x \<le> y for bit strings *)  | 
|
| 29037 | 38  | 
lemmas bitle = le_bin_simps  | 
| 23664 | 39  | 
|
40  | 
(* succ for bit strings *)  | 
|
| 
26075
 
815f3ccc0b45
added lemma lists {normalize,succ,pred,minus,add,mult}_bin_simps
 
huffman 
parents: 
25919 
diff
changeset
 | 
41  | 
lemmas bitsucc = succ_bin_simps  | 
| 23664 | 42  | 
|
43  | 
(* pred for bit strings *)  | 
|
| 
26075
 
815f3ccc0b45
added lemma lists {normalize,succ,pred,minus,add,mult}_bin_simps
 
huffman 
parents: 
25919 
diff
changeset
 | 
44  | 
lemmas bitpred = pred_bin_simps  | 
| 23664 | 45  | 
|
46  | 
(* unary minus for bit strings *)  | 
|
| 
26075
 
815f3ccc0b45
added lemma lists {normalize,succ,pred,minus,add,mult}_bin_simps
 
huffman 
parents: 
25919 
diff
changeset
 | 
47  | 
lemmas bituminus = minus_bin_simps  | 
| 23664 | 48  | 
|
49  | 
(* addition for bit strings *)  | 
|
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
50  | 
lemmas bitadd = add_bin_simps  | 
| 23664 | 51  | 
|
52  | 
(* multiplication for bit strings *)  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
53  | 
lemma mult_Pls_right: "x * Int.Pls = Int.Pls" by (simp add: Pls_def)  | 
| 
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
54  | 
lemma mult_Min_right: "x * Int.Min = - x" by (subst mult_commute, simp add: mult_Min)  | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
55  | 
lemma multb0x: "(Int.Bit0 x) * y = Int.Bit0 (x * y)" by (rule mult_Bit0)  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
56  | 
lemma multxb0: "x * (Int.Bit0 y) = Int.Bit0 (x * y)" unfolding Bit0_def by simp  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
57  | 
lemma multb1: "(Int.Bit1 x) * (Int.Bit1 y) = Int.Bit1 (Int.Bit0 (x * y) + x + y)"  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
58  | 
unfolding Bit0_def Bit1_def by (simp add: ring_simps)  | 
| 23664 | 59  | 
lemmas bitmul = mult_Pls mult_Min mult_Pls_right mult_Min_right multb0x multxb0 multb1  | 
60  | 
||
61  | 
lemmas bitarith = bitnorm bitiszero bitneg bitlezero biteq bitless bitle bitsucc bitpred bituminus bitadd bitmul  | 
|
62  | 
||
63  | 
constdefs  | 
|
64  | 
"nat_norm_number_of (x::nat) == x"  | 
|
65  | 
||
66  | 
lemma nat_norm_number_of: "nat_norm_number_of (number_of w) = (if lezero w then 0 else number_of w)"  | 
|
67  | 
apply (simp add: nat_norm_number_of_def)  | 
|
68  | 
unfolding lezero_def iszero_def neg_def  | 
|
| 28990 | 69  | 
apply (simp add: numeral_simps)  | 
| 23664 | 70  | 
done  | 
71  | 
||
72  | 
(* Normalization of nat literals *)  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
73  | 
lemma natnorm0: "(0::nat) = number_of (Int.Pls)" by auto  | 
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
74  | 
lemma natnorm1: "(1 :: nat) = number_of (Int.Bit1 Int.Pls)" by auto  | 
| 23664 | 75  | 
lemmas natnorm = natnorm0 natnorm1 nat_norm_number_of  | 
76  | 
||
77  | 
(* Suc *)  | 
|
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
78  | 
lemma natsuc: "Suc (number_of x) = (if neg x then 1 else number_of (Int.succ x))" by (auto simp add: number_of_is_id)  | 
| 23664 | 79  | 
|
80  | 
(* Addition for nat *)  | 
|
81  | 
lemma natadd: "number_of x + ((number_of y)::nat) = (if neg x then (number_of y) else (if neg y then number_of x else (number_of (x + y))))"  | 
|
| 29013 | 82  | 
unfolding nat_number_of_def number_of_is_id neg_def  | 
83  | 
by auto  | 
|
| 23664 | 84  | 
|
85  | 
(* Subtraction for nat *)  | 
|
86  | 
lemma natsub: "(number_of x) - ((number_of y)::nat) =  | 
|
87  | 
(if neg x then 0 else (if neg y then number_of x else (nat_norm_number_of (number_of (x + (- y))))))"  | 
|
88  | 
unfolding nat_norm_number_of  | 
|
89  | 
by (auto simp add: number_of_is_id neg_def lezero_def iszero_def Let_def nat_number_of_def)  | 
|
90  | 
||
91  | 
(* Multiplication for nat *)  | 
|
92  | 
lemma natmul: "(number_of x) * ((number_of y)::nat) =  | 
|
93  | 
(if neg x then 0 else (if neg y then 0 else number_of (x * y)))"  | 
|
| 29013 | 94  | 
unfolding nat_number_of_def number_of_is_id neg_def  | 
95  | 
by (simp add: nat_mult_distrib)  | 
|
| 23664 | 96  | 
|
97  | 
lemma nateq: "(((number_of x)::nat) = (number_of y)) = ((lezero x \<and> lezero y) \<or> (x = y))"  | 
|
98  | 
by (auto simp add: iszero_def lezero_def neg_def number_of_is_id)  | 
|
99  | 
||
100  | 
lemma natless: "(((number_of x)::nat) < (number_of y)) = ((x < y) \<and> (\<not> (lezero y)))"  | 
|
| 29013 | 101  | 
by (simp add: lezero_def numeral_simps not_le)  | 
| 23664 | 102  | 
|
103  | 
lemma natle: "(((number_of x)::nat) \<le> (number_of y)) = (y < x \<longrightarrow> lezero x)"  | 
|
104  | 
by (auto simp add: number_of_is_id lezero_def nat_number_of_def)  | 
|
105  | 
||
106  | 
fun natfac :: "nat \<Rightarrow> nat"  | 
|
107  | 
where  | 
|
108  | 
"natfac n = (if n = 0 then 1 else n * (natfac (n - 1)))"  | 
|
109  | 
||
110  | 
lemmas compute_natarith = bitarith natnorm natsuc natadd natsub natmul nateq natless natle natfac.simps  | 
|
111  | 
||
112  | 
lemma number_eq: "(((number_of x)::'a::{number_ring, ordered_idom}) = (number_of y)) = (x = y)"
 | 
|
113  | 
unfolding number_of_eq  | 
|
114  | 
apply simp  | 
|
115  | 
done  | 
|
116  | 
||
117  | 
lemma number_le: "(((number_of x)::'a::{number_ring, ordered_idom}) \<le>  (number_of y)) = (x \<le> y)"
 | 
|
118  | 
unfolding number_of_eq  | 
|
119  | 
apply simp  | 
|
120  | 
done  | 
|
121  | 
||
122  | 
lemma number_less: "(((number_of x)::'a::{number_ring, ordered_idom}) <  (number_of y)) = (x < y)"
 | 
|
123  | 
unfolding number_of_eq  | 
|
124  | 
apply simp  | 
|
125  | 
done  | 
|
126  | 
||
127  | 
lemma number_diff: "((number_of x)::'a::{number_ring, ordered_idom}) - number_of y = number_of (x + (- y))"
 | 
|
128  | 
apply (subst diff_number_of_eq)  | 
|
129  | 
apply simp  | 
|
130  | 
done  | 
|
131  | 
||
132  | 
lemmas number_norm = number_of_Pls[symmetric] numeral_1_eq_1[symmetric]  | 
|
133  | 
||
134  | 
lemmas compute_numberarith = number_of_minus[symmetric] number_of_add[symmetric] number_diff number_of_mult[symmetric] number_norm number_eq number_le number_less  | 
|
135  | 
||
136  | 
lemma compute_real_of_nat_number_of: "real ((number_of v)::nat) = (if neg v then 0 else number_of v)"  | 
|
137  | 
by (simp only: real_of_nat_number_of number_of_is_id)  | 
|
138  | 
||
139  | 
lemma compute_nat_of_int_number_of: "nat ((number_of v)::int) = (number_of v)"  | 
|
140  | 
by simp  | 
|
141  | 
||
142  | 
lemmas compute_num_conversions = compute_real_of_nat_number_of compute_nat_of_int_number_of real_number_of  | 
|
143  | 
||
144  | 
lemmas zpowerarith = zpower_number_of_even  | 
|
145  | 
zpower_number_of_odd[simplified zero_eq_Numeral0_nring one_eq_Numeral1_nring]  | 
|
146  | 
zpower_Pls zpower_Min  | 
|
147  | 
||
148  | 
(* div, mod *)  | 
|
149  | 
||
150  | 
lemma adjust: "adjust b (q, r) = (if 0 \<le> r - b then (2 * q + 1, r - b) else (2 * q, r))"  | 
|
151  | 
by (auto simp only: adjust_def)  | 
|
152  | 
||
153  | 
lemma negateSnd: "negateSnd (q, r) = (q, -r)"  | 
|
154  | 
by (auto simp only: negateSnd_def)  | 
|
155  | 
||
156  | 
lemma divAlg: "divAlg (a, b) = (if 0\<le>a then  | 
|
157  | 
if 0\<le>b then posDivAlg a b  | 
|
158  | 
else if a=0 then (0, 0)  | 
|
159  | 
else negateSnd (negDivAlg (-a) (-b))  | 
|
160  | 
else  | 
|
161  | 
if 0<b then negDivAlg a b  | 
|
162  | 
else negateSnd (posDivAlg (-a) (-b)))"  | 
|
163  | 
by (auto simp only: divAlg_def)  | 
|
164  | 
||
165  | 
lemmas compute_div_mod = div_def mod_def divAlg adjust negateSnd posDivAlg.simps negDivAlg.simps  | 
|
166  | 
||
167  | 
||
168  | 
||
169  | 
(* collecting all the theorems *)  | 
|
170  | 
||
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
171  | 
lemma even_Pls: "even (Int.Pls) = True"  | 
| 23664 | 172  | 
apply (unfold Pls_def even_def)  | 
173  | 
by simp  | 
|
174  | 
||
| 
25919
 
8b1c0d434824
joined theories IntDef, Numeral, IntArith to theory Int
 
haftmann 
parents: 
23664 
diff
changeset
 | 
175  | 
lemma even_Min: "even (Int.Min) = False"  | 
| 23664 | 176  | 
apply (unfold Min_def even_def)  | 
177  | 
by simp  | 
|
178  | 
||
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
179  | 
lemma even_B0: "even (Int.Bit0 x) = True"  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
180  | 
apply (unfold Bit0_def)  | 
| 23664 | 181  | 
by simp  | 
182  | 
||
| 
26086
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
183  | 
lemma even_B1: "even (Int.Bit1 x) = False"  | 
| 
 
3c243098b64a
New simpler representation of numerals, using Bit0 and Bit1 instead of BIT, B0, and B1
 
huffman 
parents: 
26075 
diff
changeset
 | 
184  | 
apply (unfold Bit1_def)  | 
| 23664 | 185  | 
by simp  | 
186  | 
||
187  | 
lemma even_number_of: "even ((number_of w)::int) = even w"  | 
|
188  | 
by (simp only: number_of_is_id)  | 
|
189  | 
||
190  | 
lemmas compute_even = even_Pls even_Min even_B0 even_B1 even_number_of  | 
|
191  | 
||
192  | 
lemmas compute_numeral = compute_if compute_let compute_pair compute_bool  | 
|
193  | 
compute_natarith compute_numberarith max_def min_def compute_num_conversions zpowerarith compute_div_mod compute_even  | 
|
194  | 
||
195  | 
end  | 
|
196  | 
||
197  | 
||
198  |