author | wenzelm |
Sat, 30 Dec 2006 16:08:06 +0100 | |
changeset 21966 | edab0ecfbd7c |
parent 19233 | 77ca20b0ed77 |
child 34974 | 18b41bba42b5 |
permissions | -rw-r--r-- |
17644 | 1 |
(* AUTOMATICALLY GENERATED, DO NOT EDIT! *) |
2 |
||
19093 | 3 |
theory HOLLight = "../HOLLightCompat" + "../HOL4Syntax": |
17644 | 4 |
|
5 |
;setup_theory hollight |
|
6 |
||
7 |
consts |
|
8 |
"_FALSITY_" :: "bool" ("'_FALSITY'_") |
|
9 |
||
10 |
defs |
|
11 |
"_FALSITY__def": "_FALSITY_ == False" |
|
12 |
||
13 |
lemma DEF__FALSITY_: "_FALSITY_ = False" |
|
14 |
by (import hollight DEF__FALSITY_) |
|
15 |
||
16 |
lemma CONJ_ACI: "((p::bool) & (q::bool)) = (q & p) & |
|
17 |
((p & q) & (r::bool)) = (p & q & r) & |
|
18 |
(p & q & r) = (q & p & r) & (p & p) = p & (p & p & q) = (p & q)" |
|
19 |
by (import hollight CONJ_ACI) |
|
20 |
||
21 |
lemma DISJ_ACI: "((p::bool) | (q::bool)) = (q | p) & |
|
22 |
((p | q) | (r::bool)) = (p | q | r) & |
|
23 |
(p | q | r) = (q | p | r) & (p | p) = p & (p | p | q) = (p | q)" |
|
24 |
by (import hollight DISJ_ACI) |
|
25 |
||
26 |
lemma EQ_CLAUSES: "ALL t::bool. |
|
27 |
(True = t) = t & |
|
28 |
(t = True) = t & (False = t) = (~ t) & (t = False) = (~ t)" |
|
29 |
by (import hollight EQ_CLAUSES) |
|
30 |
||
31 |
lemma NOT_CLAUSES_WEAK: "(~ True) = False & (~ False) = True" |
|
32 |
by (import hollight NOT_CLAUSES_WEAK) |
|
33 |
||
34 |
lemma AND_CLAUSES: "ALL t::bool. |
|
35 |
(True & t) = t & |
|
36 |
(t & True) = t & (False & t) = False & (t & False) = False & (t & t) = t" |
|
37 |
by (import hollight AND_CLAUSES) |
|
38 |
||
39 |
lemma OR_CLAUSES: "ALL t::bool. |
|
40 |
(True | t) = True & |
|
41 |
(t | True) = True & (False | t) = t & (t | False) = t & (t | t) = t" |
|
42 |
by (import hollight OR_CLAUSES) |
|
43 |
||
44 |
lemma IMP_CLAUSES: "ALL t::bool. |
|
45 |
(True --> t) = t & |
|
46 |
(t --> True) = True & |
|
47 |
(False --> t) = True & (t --> t) = True & (t --> False) = (~ t)" |
|
48 |
by (import hollight IMP_CLAUSES) |
|
49 |
||
50 |
lemma IMP_EQ_CLAUSE: "((x::'q_864::type) = x --> (p::bool)) = p" |
|
51 |
by (import hollight IMP_EQ_CLAUSE) |
|
52 |
||
53 |
lemma SWAP_FORALL_THM: "ALL P::'A::type => 'B::type => bool. |
|
54 |
(ALL x::'A::type. All (P x)) = (ALL (y::'B::type) x::'A::type. P x y)" |
|
55 |
by (import hollight SWAP_FORALL_THM) |
|
56 |
||
57 |
lemma SWAP_EXISTS_THM: "ALL P::'A::type => 'B::type => bool. |
|
58 |
(EX x::'A::type. Ex (P x)) = (EX (x::'B::type) xa::'A::type. P xa x)" |
|
59 |
by (import hollight SWAP_EXISTS_THM) |
|
60 |
||
61 |
lemma TRIV_EXISTS_AND_THM: "ALL (P::bool) Q::bool. |
|
62 |
(EX x::'A::type. P & Q) = ((EX x::'A::type. P) & (EX x::'A::type. Q))" |
|
63 |
by (import hollight TRIV_EXISTS_AND_THM) |
|
64 |
||
65 |
lemma TRIV_AND_EXISTS_THM: "ALL (P::bool) Q::bool. |
|
66 |
((EX x::'A::type. P) & (EX x::'A::type. Q)) = (EX x::'A::type. P & Q)" |
|
67 |
by (import hollight TRIV_AND_EXISTS_THM) |
|
68 |
||
69 |
lemma TRIV_FORALL_OR_THM: "ALL (P::bool) Q::bool. |
|
70 |
(ALL x::'A::type. P | Q) = ((ALL x::'A::type. P) | (ALL x::'A::type. Q))" |
|
71 |
by (import hollight TRIV_FORALL_OR_THM) |
|
72 |
||
73 |
lemma TRIV_OR_FORALL_THM: "ALL (P::bool) Q::bool. |
|
74 |
((ALL x::'A::type. P) | (ALL x::'A::type. Q)) = (ALL x::'A::type. P | Q)" |
|
75 |
by (import hollight TRIV_OR_FORALL_THM) |
|
76 |
||
77 |
lemma TRIV_FORALL_IMP_THM: "ALL (P::bool) Q::bool. |
|
78 |
(ALL x::'A::type. P --> Q) = |
|
79 |
((EX x::'A::type. P) --> (ALL x::'A::type. Q))" |
|
80 |
by (import hollight TRIV_FORALL_IMP_THM) |
|
81 |
||
82 |
lemma TRIV_EXISTS_IMP_THM: "ALL (P::bool) Q::bool. |
|
83 |
(EX x::'A::type. P --> Q) = |
|
84 |
((ALL x::'A::type. P) --> (EX x::'A::type. Q))" |
|
85 |
by (import hollight TRIV_EXISTS_IMP_THM) |
|
86 |
||
87 |
lemma EXISTS_UNIQUE_ALT: "ALL P::'A::type => bool. |
|
88 |
Ex1 P = (EX x::'A::type. ALL y::'A::type. P y = (x = y))" |
|
89 |
by (import hollight EXISTS_UNIQUE_ALT) |
|
90 |
||
91 |
lemma SELECT_UNIQUE: "ALL (P::'A::type => bool) x::'A::type. |
|
92 |
(ALL y::'A::type. P y = (y = x)) --> Eps P = x" |
|
93 |
by (import hollight SELECT_UNIQUE) |
|
94 |
||
95 |
lemma EXCLUDED_MIDDLE: "ALL t::bool. t | ~ t" |
|
96 |
by (import hollight EXCLUDED_MIDDLE) |
|
97 |
||
98 |
constdefs |
|
17652 | 99 |
COND :: "bool => 'A => 'A => 'A" |
17644 | 100 |
"COND == |
101 |
%(t::bool) (t1::'A::type) t2::'A::type. |
|
102 |
SOME x::'A::type. (t = True --> x = t1) & (t = False --> x = t2)" |
|
103 |
||
104 |
lemma DEF_COND: "COND = |
|
105 |
(%(t::bool) (t1::'A::type) t2::'A::type. |
|
106 |
SOME x::'A::type. (t = True --> x = t1) & (t = False --> x = t2))" |
|
107 |
by (import hollight DEF_COND) |
|
108 |
||
109 |
lemma COND_CLAUSES: "ALL (x::'A::type) xa::'A::type. COND True x xa = x & COND False x xa = xa" |
|
110 |
by (import hollight COND_CLAUSES) |
|
111 |
||
112 |
lemma COND_EXPAND: "ALL (b::bool) (t1::bool) t2::bool. COND b t1 t2 = ((~ b | t1) & (b | t2))" |
|
113 |
by (import hollight COND_EXPAND) |
|
114 |
||
115 |
lemma COND_ID: "ALL (b::bool) t::'A::type. COND b t t = t" |
|
116 |
by (import hollight COND_ID) |
|
117 |
||
118 |
lemma COND_RAND: "ALL (b::bool) (f::'A::type => 'B::type) (x::'A::type) y::'A::type. |
|
119 |
f (COND b x y) = COND b (f x) (f y)" |
|
120 |
by (import hollight COND_RAND) |
|
121 |
||
122 |
lemma COND_RATOR: "ALL (b::bool) (f::'A::type => 'B::type) (g::'A::type => 'B::type) |
|
123 |
x::'A::type. COND b f g x = COND b (f x) (g x)" |
|
124 |
by (import hollight COND_RATOR) |
|
125 |
||
126 |
lemma COND_ABS: "ALL (b::bool) (f::'A::type => 'B::type) g::'A::type => 'B::type. |
|
127 |
(%x::'A::type. COND b (f x) (g x)) = COND b f g" |
|
128 |
by (import hollight COND_ABS) |
|
129 |
||
130 |
lemma MONO_COND: "((A::bool) --> (B::bool)) & ((C::bool) --> (D::bool)) --> |
|
131 |
COND (b::bool) A C --> COND b B D" |
|
132 |
by (import hollight MONO_COND) |
|
133 |
||
134 |
lemma COND_ELIM_THM: "(P::'A::type => bool) (COND (c::bool) (x::'A::type) (y::'A::type)) = |
|
135 |
((c --> P x) & (~ c --> P y))" |
|
136 |
by (import hollight COND_ELIM_THM) |
|
137 |
||
138 |
lemma SKOLEM_THM: "ALL P::'A::type => 'B::type => bool. |
|
139 |
(ALL x::'A::type. Ex (P x)) = |
|
140 |
(EX x::'A::type => 'B::type. ALL xa::'A::type. P xa (x xa))" |
|
141 |
by (import hollight SKOLEM_THM) |
|
142 |
||
143 |
lemma UNIQUE_SKOLEM_ALT: "ALL P::'A::type => 'B::type => bool. |
|
144 |
(ALL x::'A::type. Ex1 (P x)) = |
|
145 |
(EX f::'A::type => 'B::type. |
|
146 |
ALL (x::'A::type) y::'B::type. P x y = (f x = y))" |
|
147 |
by (import hollight UNIQUE_SKOLEM_ALT) |
|
148 |
||
149 |
lemma COND_EQ_CLAUSE: "COND ((x::'q_3000::type) = x) (y::'q_2993::type) (z::'q_2993::type) = y" |
|
150 |
by (import hollight COND_EQ_CLAUSE) |
|
151 |
||
152 |
lemma o_ASSOC: "ALL (f::'C::type => 'D::type) (g::'B::type => 'C::type) |
|
153 |
h::'A::type => 'B::type. f o (g o h) = f o g o h" |
|
154 |
by (import hollight o_ASSOC) |
|
155 |
||
156 |
lemma I_O_ID: "ALL f::'A::type => 'B::type. id o f = f & f o id = f" |
|
157 |
by (import hollight I_O_ID) |
|
158 |
||
159 |
lemma EXISTS_ONE_REP: "EX x::bool. x" |
|
160 |
by (import hollight EXISTS_ONE_REP) |
|
161 |
||
162 |
lemma one_axiom: "ALL f::'A::type => unit. All (op = f)" |
|
163 |
by (import hollight one_axiom) |
|
164 |
||
165 |
lemma one_RECURSION: "ALL e::'A::type. EX x::unit => 'A::type. x () = e" |
|
166 |
by (import hollight one_RECURSION) |
|
167 |
||
168 |
lemma one_Axiom: "ALL e::'A::type. EX! fn::unit => 'A::type. fn () = e" |
|
169 |
by (import hollight one_Axiom) |
|
170 |
||
171 |
lemma th_cond: "(P::'A::type => bool => bool) (COND (b::bool) (x::'A::type) (y::'A::type)) |
|
172 |
b = |
|
173 |
(b & P x True | ~ b & P y False)" |
|
174 |
by (import hollight th_cond) |
|
175 |
||
176 |
constdefs |
|
17652 | 177 |
LET_END :: "'A => 'A" |
17644 | 178 |
"LET_END == %t::'A::type. t" |
179 |
||
180 |
lemma DEF_LET_END: "LET_END = (%t::'A::type. t)" |
|
181 |
by (import hollight DEF_LET_END) |
|
182 |
||
183 |
constdefs |
|
17652 | 184 |
GABS :: "('A => bool) => 'A" |
17644 | 185 |
"(op ==::(('A::type => bool) => 'A::type) |
186 |
=> (('A::type => bool) => 'A::type) => prop) |
|
187 |
(GABS::('A::type => bool) => 'A::type) |
|
188 |
(Eps::('A::type => bool) => 'A::type)" |
|
189 |
||
190 |
lemma DEF_GABS: "(op =::(('A::type => bool) => 'A::type) |
|
191 |
=> (('A::type => bool) => 'A::type) => bool) |
|
192 |
(GABS::('A::type => bool) => 'A::type) |
|
193 |
(Eps::('A::type => bool) => 'A::type)" |
|
194 |
by (import hollight DEF_GABS) |
|
195 |
||
196 |
constdefs |
|
17652 | 197 |
GEQ :: "'A => 'A => bool" |
17644 | 198 |
"(op ==::('A::type => 'A::type => bool) |
199 |
=> ('A::type => 'A::type => bool) => prop) |
|
200 |
(GEQ::'A::type => 'A::type => bool) (op =::'A::type => 'A::type => bool)" |
|
201 |
||
202 |
lemma DEF_GEQ: "(op =::('A::type => 'A::type => bool) |
|
203 |
=> ('A::type => 'A::type => bool) => bool) |
|
204 |
(GEQ::'A::type => 'A::type => bool) (op =::'A::type => 'A::type => bool)" |
|
205 |
by (import hollight DEF_GEQ) |
|
206 |
||
207 |
lemma PAIR_EXISTS_THM: "EX (x::'A::type => 'B::type => bool) (a::'A::type) b::'B::type. |
|
208 |
x = Pair_Rep a b" |
|
209 |
by (import hollight PAIR_EXISTS_THM) |
|
210 |
||
211 |
constdefs |
|
17652 | 212 |
CURRY :: "('A * 'B => 'C) => 'A => 'B => 'C" |
17644 | 213 |
"CURRY == |
214 |
%(u::'A::type * 'B::type => 'C::type) (ua::'A::type) ub::'B::type. |
|
215 |
u (ua, ub)" |
|
216 |
||
217 |
lemma DEF_CURRY: "CURRY = |
|
218 |
(%(u::'A::type * 'B::type => 'C::type) (ua::'A::type) ub::'B::type. |
|
219 |
u (ua, ub))" |
|
220 |
by (import hollight DEF_CURRY) |
|
221 |
||
222 |
constdefs |
|
17652 | 223 |
UNCURRY :: "('A => 'B => 'C) => 'A * 'B => 'C" |
17644 | 224 |
"UNCURRY == |
225 |
%(u::'A::type => 'B::type => 'C::type) ua::'A::type * 'B::type. |
|
226 |
u (fst ua) (snd ua)" |
|
227 |
||
228 |
lemma DEF_UNCURRY: "UNCURRY = |
|
229 |
(%(u::'A::type => 'B::type => 'C::type) ua::'A::type * 'B::type. |
|
230 |
u (fst ua) (snd ua))" |
|
231 |
by (import hollight DEF_UNCURRY) |
|
232 |
||
233 |
constdefs |
|
17652 | 234 |
PASSOC :: "(('A * 'B) * 'C => 'D) => 'A * 'B * 'C => 'D" |
17644 | 235 |
"PASSOC == |
236 |
%(u::('A::type * 'B::type) * 'C::type => 'D::type) |
|
237 |
ua::'A::type * 'B::type * 'C::type. |
|
238 |
u ((fst ua, fst (snd ua)), snd (snd ua))" |
|
239 |
||
240 |
lemma DEF_PASSOC: "PASSOC = |
|
241 |
(%(u::('A::type * 'B::type) * 'C::type => 'D::type) |
|
242 |
ua::'A::type * 'B::type * 'C::type. |
|
243 |
u ((fst ua, fst (snd ua)), snd (snd ua)))" |
|
244 |
by (import hollight DEF_PASSOC) |
|
245 |
||
246 |
lemma num_Axiom: "ALL (e::'A::type) f::'A::type => nat => 'A::type. |
|
17652 | 247 |
EX! fn::nat => 'A::type. fn 0 = e & (ALL n::nat. fn (Suc n) = f (fn n) n)" |
17644 | 248 |
by (import hollight num_Axiom) |
249 |
||
17652 | 250 |
lemma ADD_CLAUSES: "(ALL x::nat. 0 + x = x) & |
251 |
(ALL x::nat. x + 0 = x) & |
|
17644 | 252 |
(ALL (x::nat) xa::nat. Suc x + xa = Suc (x + xa)) & |
253 |
(ALL (x::nat) xa::nat. x + Suc xa = Suc (x + xa))" |
|
254 |
by (import hollight ADD_CLAUSES) |
|
255 |
||
256 |
lemma ADD_AC: "(m::nat) + (n::nat) = n + m & |
|
257 |
m + n + (p::nat) = m + (n + p) & m + (n + p) = n + (m + p)" |
|
258 |
by (import hollight ADD_AC) |
|
259 |
||
17652 | 260 |
lemma EQ_ADD_LCANCEL_0: "ALL (m::nat) n::nat. (m + n = m) = (n = 0)" |
17644 | 261 |
by (import hollight EQ_ADD_LCANCEL_0) |
262 |
||
17652 | 263 |
lemma EQ_ADD_RCANCEL_0: "ALL (x::nat) xa::nat. (x + xa = xa) = (x = 0)" |
17644 | 264 |
by (import hollight EQ_ADD_RCANCEL_0) |
265 |
||
17652 | 266 |
lemma ONE: "NUMERAL_BIT1 0 = Suc 0" |
17644 | 267 |
by (import hollight ONE) |
268 |
||
17652 | 269 |
lemma TWO: "NUMERAL_BIT0 (NUMERAL_BIT1 0) = Suc (NUMERAL_BIT1 0)" |
17644 | 270 |
by (import hollight TWO) |
271 |
||
17652 | 272 |
lemma ADD1: "ALL x::nat. Suc x = x + NUMERAL_BIT1 0" |
17644 | 273 |
by (import hollight ADD1) |
274 |
||
17652 | 275 |
lemma MULT_CLAUSES: "(ALL x::nat. 0 * x = 0) & |
276 |
(ALL x::nat. x * 0 = 0) & |
|
277 |
(ALL x::nat. NUMERAL_BIT1 0 * x = x) & |
|
278 |
(ALL x::nat. x * NUMERAL_BIT1 0 = x) & |
|
17644 | 279 |
(ALL (x::nat) xa::nat. Suc x * xa = x * xa + xa) & |
280 |
(ALL (x::nat) xa::nat. x * Suc xa = x + x * xa)" |
|
281 |
by (import hollight MULT_CLAUSES) |
|
282 |
||
283 |
lemma MULT_AC: "(m::nat) * (n::nat) = n * m & |
|
284 |
m * n * (p::nat) = m * (n * p) & m * (n * p) = n * (m * p)" |
|
285 |
by (import hollight MULT_AC) |
|
286 |
||
17652 | 287 |
lemma MULT_2: "ALL n::nat. NUMERAL_BIT0 (NUMERAL_BIT1 0) * n = n + n" |
17644 | 288 |
by (import hollight MULT_2) |
289 |
||
290 |
lemma MULT_EQ_1: "ALL (m::nat) n::nat. |
|
17652 | 291 |
(m * n = NUMERAL_BIT1 0) = (m = NUMERAL_BIT1 0 & n = NUMERAL_BIT1 0)" |
17644 | 292 |
by (import hollight MULT_EQ_1) |
293 |
||
294 |
constdefs |
|
295 |
EXP :: "nat => nat => nat" |
|
296 |
"EXP == |
|
297 |
SOME EXP::nat => nat => nat. |
|
17652 | 298 |
(ALL m::nat. EXP m 0 = NUMERAL_BIT1 0) & |
17644 | 299 |
(ALL (m::nat) n::nat. EXP m (Suc n) = m * EXP m n)" |
300 |
||
301 |
lemma DEF_EXP: "EXP = |
|
302 |
(SOME EXP::nat => nat => nat. |
|
17652 | 303 |
(ALL m::nat. EXP m 0 = NUMERAL_BIT1 0) & |
17644 | 304 |
(ALL (m::nat) n::nat. EXP m (Suc n) = m * EXP m n))" |
305 |
by (import hollight DEF_EXP) |
|
306 |
||
17652 | 307 |
lemma EXP_EQ_0: "ALL (m::nat) n::nat. (EXP m n = 0) = (m = 0 & n ~= 0)" |
17644 | 308 |
by (import hollight EXP_EQ_0) |
309 |
||
310 |
lemma EXP_ADD: "ALL (m::nat) (n::nat) p::nat. EXP m (n + p) = EXP m n * EXP m p" |
|
311 |
by (import hollight EXP_ADD) |
|
312 |
||
17652 | 313 |
lemma EXP_ONE: "ALL n::nat. EXP (NUMERAL_BIT1 0) n = NUMERAL_BIT1 0" |
17644 | 314 |
by (import hollight EXP_ONE) |
315 |
||
17652 | 316 |
lemma EXP_1: "ALL x::nat. EXP x (NUMERAL_BIT1 0) = x" |
17644 | 317 |
by (import hollight EXP_1) |
318 |
||
17652 | 319 |
lemma EXP_2: "ALL x::nat. EXP x (NUMERAL_BIT0 (NUMERAL_BIT1 0)) = x * x" |
17644 | 320 |
by (import hollight EXP_2) |
321 |
||
322 |
lemma MULT_EXP: "ALL (p::nat) (m::nat) n::nat. EXP (m * n) p = EXP m p * EXP n p" |
|
323 |
by (import hollight MULT_EXP) |
|
324 |
||
325 |
lemma EXP_MULT: "ALL (m::nat) (n::nat) p::nat. EXP m (n * p) = EXP (EXP m n) p" |
|
326 |
by (import hollight EXP_MULT) |
|
327 |
||
328 |
consts |
|
329 |
"<=" :: "nat => nat => bool" ("<=") |
|
330 |
||
331 |
defs |
|
332 |
"<=_def": "<= == |
|
333 |
SOME u::nat => nat => bool. |
|
17652 | 334 |
(ALL m::nat. u m 0 = (m = 0)) & |
17644 | 335 |
(ALL (m::nat) n::nat. u m (Suc n) = (m = Suc n | u m n))" |
336 |
||
337 |
lemma DEF__lessthan__equal_: "<= = |
|
338 |
(SOME u::nat => nat => bool. |
|
17652 | 339 |
(ALL m::nat. u m 0 = (m = 0)) & |
17644 | 340 |
(ALL (m::nat) n::nat. u m (Suc n) = (m = Suc n | u m n)))" |
341 |
by (import hollight DEF__lessthan__equal_) |
|
342 |
||
343 |
consts |
|
344 |
"<" :: "nat => nat => bool" ("<") |
|
345 |
||
346 |
defs |
|
347 |
"<_def": "< == |
|
348 |
SOME u::nat => nat => bool. |
|
17652 | 349 |
(ALL m::nat. u m 0 = False) & |
17644 | 350 |
(ALL (m::nat) n::nat. u m (Suc n) = (m = n | u m n))" |
351 |
||
352 |
lemma DEF__lessthan_: "< = |
|
353 |
(SOME u::nat => nat => bool. |
|
17652 | 354 |
(ALL m::nat. u m 0 = False) & |
17644 | 355 |
(ALL (m::nat) n::nat. u m (Suc n) = (m = n | u m n)))" |
356 |
by (import hollight DEF__lessthan_) |
|
357 |
||
358 |
consts |
|
359 |
">=" :: "nat => nat => bool" (">=") |
|
360 |
||
361 |
defs |
|
362 |
">=_def": ">= == %(u::nat) ua::nat. <= ua u" |
|
363 |
||
364 |
lemma DEF__greaterthan__equal_: ">= = (%(u::nat) ua::nat. <= ua u)" |
|
365 |
by (import hollight DEF__greaterthan__equal_) |
|
366 |
||
367 |
consts |
|
368 |
">" :: "nat => nat => bool" (">") |
|
369 |
||
370 |
defs |
|
371 |
">_def": "> == %(u::nat) ua::nat. < ua u" |
|
372 |
||
373 |
lemma DEF__greaterthan_: "> = (%(u::nat) ua::nat. < ua u)" |
|
374 |
by (import hollight DEF__greaterthan_) |
|
375 |
||
376 |
lemma LE_SUC_LT: "ALL (m::nat) n::nat. <= (Suc m) n = < m n" |
|
377 |
by (import hollight LE_SUC_LT) |
|
378 |
||
379 |
lemma LT_SUC_LE: "ALL (m::nat) n::nat. < m (Suc n) = <= m n" |
|
380 |
by (import hollight LT_SUC_LE) |
|
381 |
||
382 |
lemma LE_SUC: "ALL (x::nat) xa::nat. <= (Suc x) (Suc xa) = <= x xa" |
|
383 |
by (import hollight LE_SUC) |
|
384 |
||
385 |
lemma LT_SUC: "ALL (x::nat) xa::nat. < (Suc x) (Suc xa) = < x xa" |
|
386 |
by (import hollight LT_SUC) |
|
387 |
||
17652 | 388 |
lemma LE_0: "All (<= 0)" |
17644 | 389 |
by (import hollight LE_0) |
390 |
||
17652 | 391 |
lemma LT_0: "ALL x::nat. < 0 (Suc x)" |
17644 | 392 |
by (import hollight LT_0) |
393 |
||
394 |
lemma LE_REFL: "ALL n::nat. <= n n" |
|
395 |
by (import hollight LE_REFL) |
|
396 |
||
397 |
lemma LT_REFL: "ALL n::nat. ~ < n n" |
|
398 |
by (import hollight LT_REFL) |
|
399 |
||
400 |
lemma LE_ANTISYM: "ALL (m::nat) n::nat. (<= m n & <= n m) = (m = n)" |
|
401 |
by (import hollight LE_ANTISYM) |
|
402 |
||
403 |
lemma LT_ANTISYM: "ALL (m::nat) n::nat. ~ (< m n & < n m)" |
|
404 |
by (import hollight LT_ANTISYM) |
|
405 |
||
406 |
lemma LET_ANTISYM: "ALL (m::nat) n::nat. ~ (<= m n & < n m)" |
|
407 |
by (import hollight LET_ANTISYM) |
|
408 |
||
409 |
lemma LTE_ANTISYM: "ALL (x::nat) xa::nat. ~ (< x xa & <= xa x)" |
|
410 |
by (import hollight LTE_ANTISYM) |
|
411 |
||
412 |
lemma LE_TRANS: "ALL (m::nat) (n::nat) p::nat. <= m n & <= n p --> <= m p" |
|
413 |
by (import hollight LE_TRANS) |
|
414 |
||
415 |
lemma LT_TRANS: "ALL (m::nat) (n::nat) p::nat. < m n & < n p --> < m p" |
|
416 |
by (import hollight LT_TRANS) |
|
417 |
||
418 |
lemma LET_TRANS: "ALL (m::nat) (n::nat) p::nat. <= m n & < n p --> < m p" |
|
419 |
by (import hollight LET_TRANS) |
|
420 |
||
421 |
lemma LTE_TRANS: "ALL (m::nat) (n::nat) p::nat. < m n & <= n p --> < m p" |
|
422 |
by (import hollight LTE_TRANS) |
|
423 |
||
424 |
lemma LE_CASES: "ALL (m::nat) n::nat. <= m n | <= n m" |
|
425 |
by (import hollight LE_CASES) |
|
426 |
||
427 |
lemma LT_CASES: "ALL (m::nat) n::nat. < m n | < n m | m = n" |
|
428 |
by (import hollight LT_CASES) |
|
429 |
||
430 |
lemma LET_CASES: "ALL (m::nat) n::nat. <= m n | < n m" |
|
431 |
by (import hollight LET_CASES) |
|
432 |
||
433 |
lemma LTE_CASES: "ALL (x::nat) xa::nat. < x xa | <= xa x" |
|
434 |
by (import hollight LTE_CASES) |
|
435 |
||
17652 | 436 |
lemma LT_NZ: "ALL n::nat. < 0 n = (n ~= 0)" |
17644 | 437 |
by (import hollight LT_NZ) |
438 |
||
439 |
lemma LE_LT: "ALL (m::nat) n::nat. <= m n = (< m n | m = n)" |
|
440 |
by (import hollight LE_LT) |
|
441 |
||
442 |
lemma LT_LE: "ALL (x::nat) xa::nat. < x xa = (<= x xa & x ~= xa)" |
|
443 |
by (import hollight LT_LE) |
|
444 |
||
445 |
lemma NOT_LE: "ALL (m::nat) n::nat. (~ <= m n) = < n m" |
|
446 |
by (import hollight NOT_LE) |
|
447 |
||
448 |
lemma NOT_LT: "ALL (m::nat) n::nat. (~ < m n) = <= n m" |
|
449 |
by (import hollight NOT_LT) |
|
450 |
||
451 |
lemma LT_IMP_LE: "ALL (x::nat) xa::nat. < x xa --> <= x xa" |
|
452 |
by (import hollight LT_IMP_LE) |
|
453 |
||
454 |
lemma EQ_IMP_LE: "ALL (m::nat) n::nat. m = n --> <= m n" |
|
455 |
by (import hollight EQ_IMP_LE) |
|
456 |
||
457 |
lemma LE_EXISTS: "ALL (m::nat) n::nat. <= m n = (EX d::nat. n = m + d)" |
|
458 |
by (import hollight LE_EXISTS) |
|
459 |
||
460 |
lemma LT_EXISTS: "ALL (m::nat) n::nat. < m n = (EX d::nat. n = m + Suc d)" |
|
461 |
by (import hollight LT_EXISTS) |
|
462 |
||
463 |
lemma LE_ADD: "ALL (m::nat) n::nat. <= m (m + n)" |
|
464 |
by (import hollight LE_ADD) |
|
465 |
||
466 |
lemma LE_ADDR: "ALL (x::nat) xa::nat. <= xa (x + xa)" |
|
467 |
by (import hollight LE_ADDR) |
|
468 |
||
17652 | 469 |
lemma LT_ADD: "ALL (m::nat) n::nat. < m (m + n) = < 0 n" |
17644 | 470 |
by (import hollight LT_ADD) |
471 |
||
17652 | 472 |
lemma LT_ADDR: "ALL (x::nat) xa::nat. < xa (x + xa) = < 0 x" |
17644 | 473 |
by (import hollight LT_ADDR) |
474 |
||
475 |
lemma LE_ADD_LCANCEL: "ALL (x::nat) (xa::nat) xb::nat. <= (x + xa) (x + xb) = <= xa xb" |
|
476 |
by (import hollight LE_ADD_LCANCEL) |
|
477 |
||
478 |
lemma LE_ADD_RCANCEL: "ALL (x::nat) (xa::nat) xb::nat. <= (x + xb) (xa + xb) = <= x xa" |
|
479 |
by (import hollight LE_ADD_RCANCEL) |
|
480 |
||
481 |
lemma LT_ADD_LCANCEL: "ALL (x::nat) (xa::nat) xb::nat. < (x + xa) (x + xb) = < xa xb" |
|
482 |
by (import hollight LT_ADD_LCANCEL) |
|
483 |
||
484 |
lemma LT_ADD_RCANCEL: "ALL (x::nat) (xa::nat) xb::nat. < (x + xb) (xa + xb) = < x xa" |
|
485 |
by (import hollight LT_ADD_RCANCEL) |
|
486 |
||
487 |
lemma LE_ADD2: "ALL (m::nat) (n::nat) (p::nat) q::nat. |
|
488 |
<= m p & <= n q --> <= (m + n) (p + q)" |
|
489 |
by (import hollight LE_ADD2) |
|
490 |
||
491 |
lemma LET_ADD2: "ALL (m::nat) (n::nat) (p::nat) q::nat. <= m p & < n q --> < (m + n) (p + q)" |
|
492 |
by (import hollight LET_ADD2) |
|
493 |
||
494 |
lemma LTE_ADD2: "ALL (x::nat) (xa::nat) (xb::nat) xc::nat. |
|
495 |
< x xb & <= xa xc --> < (x + xa) (xb + xc)" |
|
496 |
by (import hollight LTE_ADD2) |
|
497 |
||
498 |
lemma LT_ADD2: "ALL (m::nat) (n::nat) (p::nat) q::nat. < m p & < n q --> < (m + n) (p + q)" |
|
499 |
by (import hollight LT_ADD2) |
|
500 |
||
17652 | 501 |
lemma LT_MULT: "ALL (m::nat) n::nat. < 0 (m * n) = (< 0 m & < 0 n)" |
17644 | 502 |
by (import hollight LT_MULT) |
503 |
||
504 |
lemma LE_MULT2: "ALL (m::nat) (n::nat) (p::nat) q::nat. |
|
505 |
<= m n & <= p q --> <= (m * p) (n * q)" |
|
506 |
by (import hollight LE_MULT2) |
|
507 |
||
17652 | 508 |
lemma LT_LMULT: "ALL (m::nat) (n::nat) p::nat. m ~= 0 & < n p --> < (m * n) (m * p)" |
17644 | 509 |
by (import hollight LT_LMULT) |
510 |
||
17652 | 511 |
lemma LE_MULT_LCANCEL: "ALL (m::nat) (n::nat) p::nat. <= (m * n) (m * p) = (m = 0 | <= n p)" |
17644 | 512 |
by (import hollight LE_MULT_LCANCEL) |
513 |
||
17652 | 514 |
lemma LE_MULT_RCANCEL: "ALL (x::nat) (xa::nat) xb::nat. <= (x * xb) (xa * xb) = (<= x xa | xb = 0)" |
17644 | 515 |
by (import hollight LE_MULT_RCANCEL) |
516 |
||
17652 | 517 |
lemma LT_MULT_LCANCEL: "ALL (m::nat) (n::nat) p::nat. < (m * n) (m * p) = (m ~= 0 & < n p)" |
17644 | 518 |
by (import hollight LT_MULT_LCANCEL) |
519 |
||
17652 | 520 |
lemma LT_MULT_RCANCEL: "ALL (x::nat) (xa::nat) xb::nat. < (x * xb) (xa * xb) = (< x xa & xb ~= 0)" |
17644 | 521 |
by (import hollight LT_MULT_RCANCEL) |
522 |
||
523 |
lemma LT_MULT2: "ALL (m::nat) (n::nat) (p::nat) q::nat. < m n & < p q --> < (m * p) (n * q)" |
|
524 |
by (import hollight LT_MULT2) |
|
525 |
||
526 |
lemma LE_SQUARE_REFL: "ALL n::nat. <= n (n * n)" |
|
527 |
by (import hollight LE_SQUARE_REFL) |
|
528 |
||
529 |
lemma WLOG_LE: "(ALL (m::nat) n::nat. (P::nat => nat => bool) m n = P n m) & |
|
530 |
(ALL (m::nat) n::nat. <= m n --> P m n) --> |
|
531 |
(ALL m::nat. All (P m))" |
|
532 |
by (import hollight WLOG_LE) |
|
533 |
||
534 |
lemma WLOG_LT: "(ALL m::nat. (P::nat => nat => bool) m m) & |
|
535 |
(ALL (m::nat) n::nat. P m n = P n m) & |
|
536 |
(ALL (m::nat) n::nat. < m n --> P m n) --> |
|
537 |
(ALL m::nat. All (P m))" |
|
538 |
by (import hollight WLOG_LT) |
|
539 |
||
540 |
lemma num_WF: "ALL P::nat => bool. |
|
541 |
(ALL n::nat. (ALL m::nat. < m n --> P m) --> P n) --> All P" |
|
542 |
by (import hollight num_WF) |
|
543 |
||
544 |
lemma num_WOP: "ALL P::nat => bool. Ex P = (EX n::nat. P n & (ALL m::nat. < m n --> ~ P m))" |
|
545 |
by (import hollight num_WOP) |
|
546 |
||
547 |
lemma num_MAX: "ALL P::nat => bool. |
|
548 |
(Ex P & (EX M::nat. ALL x::nat. P x --> <= x M)) = |
|
549 |
(EX m::nat. P m & (ALL x::nat. P x --> <= x m))" |
|
550 |
by (import hollight num_MAX) |
|
551 |
||
552 |
constdefs |
|
553 |
EVEN :: "nat => bool" |
|
554 |
"EVEN == |
|
555 |
SOME EVEN::nat => bool. |
|
17652 | 556 |
EVEN 0 = True & (ALL n::nat. EVEN (Suc n) = (~ EVEN n))" |
17644 | 557 |
|
558 |
lemma DEF_EVEN: "EVEN = |
|
559 |
(SOME EVEN::nat => bool. |
|
17652 | 560 |
EVEN 0 = True & (ALL n::nat. EVEN (Suc n) = (~ EVEN n)))" |
17644 | 561 |
by (import hollight DEF_EVEN) |
562 |
||
563 |
constdefs |
|
564 |
ODD :: "nat => bool" |
|
565 |
"ODD == |
|
17652 | 566 |
SOME ODD::nat => bool. ODD 0 = False & (ALL n::nat. ODD (Suc n) = (~ ODD n))" |
17644 | 567 |
|
568 |
lemma DEF_ODD: "ODD = |
|
569 |
(SOME ODD::nat => bool. |
|
17652 | 570 |
ODD 0 = False & (ALL n::nat. ODD (Suc n) = (~ ODD n)))" |
17644 | 571 |
by (import hollight DEF_ODD) |
572 |
||
573 |
lemma NOT_EVEN: "ALL n::nat. (~ EVEN n) = ODD n" |
|
574 |
by (import hollight NOT_EVEN) |
|
575 |
||
576 |
lemma NOT_ODD: "ALL n::nat. (~ ODD n) = EVEN n" |
|
577 |
by (import hollight NOT_ODD) |
|
578 |
||
579 |
lemma EVEN_OR_ODD: "ALL n::nat. EVEN n | ODD n" |
|
580 |
by (import hollight EVEN_OR_ODD) |
|
581 |
||
582 |
lemma EVEN_AND_ODD: "ALL x::nat. ~ (EVEN x & ODD x)" |
|
583 |
by (import hollight EVEN_AND_ODD) |
|
584 |
||
585 |
lemma EVEN_ADD: "ALL (m::nat) n::nat. EVEN (m + n) = (EVEN m = EVEN n)" |
|
586 |
by (import hollight EVEN_ADD) |
|
587 |
||
588 |
lemma EVEN_MULT: "ALL (m::nat) n::nat. EVEN (m * n) = (EVEN m | EVEN n)" |
|
589 |
by (import hollight EVEN_MULT) |
|
590 |
||
17652 | 591 |
lemma EVEN_EXP: "ALL (m::nat) n::nat. EVEN (EXP m n) = (EVEN m & n ~= 0)" |
17644 | 592 |
by (import hollight EVEN_EXP) |
593 |
||
594 |
lemma ODD_ADD: "ALL (m::nat) n::nat. ODD (m + n) = (ODD m ~= ODD n)" |
|
595 |
by (import hollight ODD_ADD) |
|
596 |
||
597 |
lemma ODD_MULT: "ALL (m::nat) n::nat. ODD (m * n) = (ODD m & ODD n)" |
|
598 |
by (import hollight ODD_MULT) |
|
599 |
||
17652 | 600 |
lemma ODD_EXP: "ALL (m::nat) n::nat. ODD (EXP m n) = (ODD m | n = 0)" |
17644 | 601 |
by (import hollight ODD_EXP) |
602 |
||
17652 | 603 |
lemma EVEN_DOUBLE: "ALL n::nat. EVEN (NUMERAL_BIT0 (NUMERAL_BIT1 0) * n)" |
17644 | 604 |
by (import hollight EVEN_DOUBLE) |
605 |
||
17652 | 606 |
lemma ODD_DOUBLE: "ALL x::nat. ODD (Suc (NUMERAL_BIT0 (NUMERAL_BIT1 0) * x))" |
17644 | 607 |
by (import hollight ODD_DOUBLE) |
608 |
||
609 |
lemma EVEN_EXISTS_LEMMA: "ALL n::nat. |
|
17652 | 610 |
(EVEN n --> (EX m::nat. n = NUMERAL_BIT0 (NUMERAL_BIT1 0) * m)) & |
611 |
(~ EVEN n --> (EX m::nat. n = Suc (NUMERAL_BIT0 (NUMERAL_BIT1 0) * m)))" |
|
17644 | 612 |
by (import hollight EVEN_EXISTS_LEMMA) |
613 |
||
17652 | 614 |
lemma EVEN_EXISTS: "ALL n::nat. EVEN n = (EX m::nat. n = NUMERAL_BIT0 (NUMERAL_BIT1 0) * m)" |
17644 | 615 |
by (import hollight EVEN_EXISTS) |
616 |
||
17652 | 617 |
lemma ODD_EXISTS: "ALL n::nat. ODD n = (EX m::nat. n = Suc (NUMERAL_BIT0 (NUMERAL_BIT1 0) * m))" |
17644 | 618 |
by (import hollight ODD_EXISTS) |
619 |
||
620 |
lemma EVEN_ODD_DECOMPOSITION: "ALL n::nat. |
|
621 |
(EX (k::nat) m::nat. |
|
17652 | 622 |
ODD m & n = EXP (NUMERAL_BIT0 (NUMERAL_BIT1 0)) k * m) = |
623 |
(n ~= 0)" |
|
17644 | 624 |
by (import hollight EVEN_ODD_DECOMPOSITION) |
625 |
||
17652 | 626 |
lemma SUB_0: "ALL x::nat. 0 - x = 0 & x - 0 = x" |
17644 | 627 |
by (import hollight SUB_0) |
628 |
||
629 |
lemma SUB_PRESUC: "ALL (m::nat) n::nat. Pred (Suc m - n) = m - n" |
|
630 |
by (import hollight SUB_PRESUC) |
|
631 |
||
17652 | 632 |
lemma SUB_EQ_0: "ALL (m::nat) n::nat. (m - n = 0) = <= m n" |
17644 | 633 |
by (import hollight SUB_EQ_0) |
634 |
||
17652 | 635 |
lemma ADD_SUBR: "ALL (x::nat) xa::nat. xa - (x + xa) = 0" |
17644 | 636 |
by (import hollight ADD_SUBR) |
637 |
||
638 |
lemma SUB_ADD: "ALL (x::nat) xa::nat. <= xa x --> x - xa + xa = x" |
|
639 |
by (import hollight SUB_ADD) |
|
640 |
||
17652 | 641 |
lemma SUC_SUB1: "ALL x::nat. Suc x - NUMERAL_BIT1 0 = x" |
17644 | 642 |
by (import hollight SUC_SUB1) |
643 |
||
644 |
constdefs |
|
645 |
FACT :: "nat => nat" |
|
646 |
"FACT == |
|
647 |
SOME FACT::nat => nat. |
|
17652 | 648 |
FACT 0 = NUMERAL_BIT1 0 & (ALL n::nat. FACT (Suc n) = Suc n * FACT n)" |
17644 | 649 |
|
650 |
lemma DEF_FACT: "FACT = |
|
651 |
(SOME FACT::nat => nat. |
|
17652 | 652 |
FACT 0 = NUMERAL_BIT1 0 & (ALL n::nat. FACT (Suc n) = Suc n * FACT n))" |
17644 | 653 |
by (import hollight DEF_FACT) |
654 |
||
17652 | 655 |
lemma FACT_LT: "ALL n::nat. < 0 (FACT n)" |
17644 | 656 |
by (import hollight FACT_LT) |
657 |
||
17652 | 658 |
lemma FACT_LE: "ALL x::nat. <= (NUMERAL_BIT1 0) (FACT x)" |
17644 | 659 |
by (import hollight FACT_LE) |
660 |
||
661 |
lemma FACT_MONO: "ALL (m::nat) n::nat. <= m n --> <= (FACT m) (FACT n)" |
|
662 |
by (import hollight FACT_MONO) |
|
663 |
||
17652 | 664 |
lemma DIVMOD_EXIST: "ALL (m::nat) n::nat. n ~= 0 --> (EX (q::nat) r::nat. m = q * n + r & < r n)" |
17644 | 665 |
by (import hollight DIVMOD_EXIST) |
666 |
||
667 |
lemma DIVMOD_EXIST_0: "ALL (m::nat) n::nat. |
|
668 |
EX (x::nat) xa::nat. |
|
17652 | 669 |
COND (n = 0) (x = 0 & xa = 0) (m = x * n + xa & < xa n)" |
17644 | 670 |
by (import hollight DIVMOD_EXIST_0) |
671 |
||
672 |
constdefs |
|
673 |
DIV :: "nat => nat => nat" |
|
674 |
"DIV == |
|
675 |
SOME q::nat => nat => nat. |
|
676 |
EX r::nat => nat => nat. |
|
677 |
ALL (m::nat) n::nat. |
|
17652 | 678 |
COND (n = 0) (q m n = 0 & r m n = 0) |
17644 | 679 |
(m = q m n * n + r m n & < (r m n) n)" |
680 |
||
681 |
lemma DEF_DIV: "DIV = |
|
682 |
(SOME q::nat => nat => nat. |
|
683 |
EX r::nat => nat => nat. |
|
684 |
ALL (m::nat) n::nat. |
|
17652 | 685 |
COND (n = 0) (q m n = 0 & r m n = 0) |
17644 | 686 |
(m = q m n * n + r m n & < (r m n) n))" |
687 |
by (import hollight DEF_DIV) |
|
688 |
||
689 |
constdefs |
|
690 |
MOD :: "nat => nat => nat" |
|
691 |
"MOD == |
|
692 |
SOME r::nat => nat => nat. |
|
693 |
ALL (m::nat) n::nat. |
|
17652 | 694 |
COND (n = 0) (DIV m n = 0 & r m n = 0) |
17644 | 695 |
(m = DIV m n * n + r m n & < (r m n) n)" |
696 |
||
697 |
lemma DEF_MOD: "MOD = |
|
698 |
(SOME r::nat => nat => nat. |
|
699 |
ALL (m::nat) n::nat. |
|
17652 | 700 |
COND (n = 0) (DIV m n = 0 & r m n = 0) |
17644 | 701 |
(m = DIV m n * n + r m n & < (r m n) n))" |
702 |
by (import hollight DEF_MOD) |
|
703 |
||
17652 | 704 |
lemma DIVISION: "ALL (m::nat) n::nat. n ~= 0 --> m = DIV m n * n + MOD m n & < (MOD m n) n" |
17644 | 705 |
by (import hollight DIVISION) |
706 |
||
707 |
lemma DIVMOD_UNIQ_LEMMA: "ALL (m::nat) (n::nat) (q1::nat) (r1::nat) (q2::nat) r2::nat. |
|
708 |
(m = q1 * n + r1 & < r1 n) & m = q2 * n + r2 & < r2 n --> |
|
709 |
q1 = q2 & r1 = r2" |
|
710 |
by (import hollight DIVMOD_UNIQ_LEMMA) |
|
711 |
||
712 |
lemma DIVMOD_UNIQ: "ALL (m::nat) (n::nat) (q::nat) r::nat. |
|
713 |
m = q * n + r & < r n --> DIV m n = q & MOD m n = r" |
|
714 |
by (import hollight DIVMOD_UNIQ) |
|
715 |
||
716 |
lemma MOD_UNIQ: "ALL (m::nat) (n::nat) (q::nat) r::nat. m = q * n + r & < r n --> MOD m n = r" |
|
717 |
by (import hollight MOD_UNIQ) |
|
718 |
||
719 |
lemma DIV_UNIQ: "ALL (m::nat) (n::nat) (q::nat) r::nat. m = q * n + r & < r n --> DIV m n = q" |
|
720 |
by (import hollight DIV_UNIQ) |
|
721 |
||
17652 | 722 |
lemma MOD_MULT: "ALL (x::nat) xa::nat. x ~= 0 --> MOD (x * xa) x = 0" |
17644 | 723 |
by (import hollight MOD_MULT) |
724 |
||
17652 | 725 |
lemma DIV_MULT: "ALL (x::nat) xa::nat. x ~= 0 --> DIV (x * xa) x = xa" |
17644 | 726 |
by (import hollight DIV_MULT) |
727 |
||
17652 | 728 |
lemma DIV_DIV: "ALL (m::nat) (n::nat) p::nat. n * p ~= 0 --> DIV (DIV m n) p = DIV m (n * p)" |
17644 | 729 |
by (import hollight DIV_DIV) |
730 |
||
731 |
lemma MOD_LT: "ALL (m::nat) n::nat. < m n --> MOD m n = m" |
|
732 |
by (import hollight MOD_LT) |
|
733 |
||
734 |
lemma MOD_EQ: "ALL (m::nat) (n::nat) (p::nat) q::nat. m = n + q * p --> MOD m p = MOD n p" |
|
735 |
by (import hollight MOD_EQ) |
|
736 |
||
737 |
lemma DIV_MOD: "ALL (m::nat) (n::nat) p::nat. |
|
17652 | 738 |
n * p ~= 0 --> MOD (DIV m n) p = DIV (MOD m (n * p)) n" |
17644 | 739 |
by (import hollight DIV_MOD) |
740 |
||
17652 | 741 |
lemma DIV_1: "ALL n::nat. DIV n (NUMERAL_BIT1 0) = n" |
17644 | 742 |
by (import hollight DIV_1) |
743 |
||
17652 | 744 |
lemma EXP_LT_0: "ALL (x::nat) xa::nat. < 0 (EXP xa x) = (xa ~= 0 | x = 0)" |
17644 | 745 |
by (import hollight EXP_LT_0) |
746 |
||
17652 | 747 |
lemma DIV_LE: "ALL (m::nat) n::nat. n ~= 0 --> <= (DIV m n) m" |
17644 | 748 |
by (import hollight DIV_LE) |
749 |
||
750 |
lemma DIV_MUL_LE: "ALL (m::nat) n::nat. <= (n * DIV m n) m" |
|
751 |
by (import hollight DIV_MUL_LE) |
|
752 |
||
17652 | 753 |
lemma DIV_0: "ALL n::nat. n ~= 0 --> DIV 0 n = 0" |
17644 | 754 |
by (import hollight DIV_0) |
755 |
||
17652 | 756 |
lemma MOD_0: "ALL n::nat. n ~= 0 --> MOD 0 n = 0" |
17644 | 757 |
by (import hollight MOD_0) |
758 |
||
17652 | 759 |
lemma DIV_LT: "ALL (m::nat) n::nat. < m n --> DIV m n = 0" |
17644 | 760 |
by (import hollight DIV_LT) |
761 |
||
17652 | 762 |
lemma MOD_MOD: "ALL (m::nat) (n::nat) p::nat. n * p ~= 0 --> MOD (MOD m (n * p)) n = MOD m n" |
17644 | 763 |
by (import hollight MOD_MOD) |
764 |
||
17652 | 765 |
lemma MOD_MOD_REFL: "ALL (m::nat) n::nat. n ~= 0 --> MOD (MOD m n) n = MOD m n" |
17644 | 766 |
by (import hollight MOD_MOD_REFL) |
767 |
||
768 |
lemma DIV_MULT2: "ALL (x::nat) (xa::nat) xb::nat. |
|
17652 | 769 |
x * xb ~= 0 --> DIV (x * xa) (x * xb) = DIV xa xb" |
17644 | 770 |
by (import hollight DIV_MULT2) |
771 |
||
772 |
lemma MOD_MULT2: "ALL (x::nat) (xa::nat) xb::nat. |
|
17652 | 773 |
x * xb ~= 0 --> MOD (x * xa) (x * xb) = x * MOD xa xb" |
17644 | 774 |
by (import hollight MOD_MULT2) |
775 |
||
17652 | 776 |
lemma MOD_1: "ALL n::nat. MOD n (NUMERAL_BIT1 0) = 0" |
17644 | 777 |
by (import hollight MOD_1) |
778 |
||
779 |
lemma MOD_EXISTS: "ALL (m::nat) n::nat. |
|
17652 | 780 |
(EX q::nat. m = n * q) = COND (n = 0) (m = 0) (MOD m n = 0)" |
17644 | 781 |
by (import hollight MOD_EXISTS) |
782 |
||
783 |
lemma LT_EXP: "ALL (x::nat) (m::nat) n::nat. |
|
784 |
< (EXP x m) (EXP x n) = |
|
17652 | 785 |
(<= (NUMERAL_BIT0 (NUMERAL_BIT1 0)) x & < m n | x = 0 & m ~= 0 & n = 0)" |
17644 | 786 |
by (import hollight LT_EXP) |
787 |
||
788 |
lemma LE_EXP: "ALL (x::nat) (m::nat) n::nat. |
|
789 |
<= (EXP x m) (EXP x n) = |
|
17652 | 790 |
COND (x = 0) (m = 0 --> n = 0) (x = NUMERAL_BIT1 0 | <= m n)" |
17644 | 791 |
by (import hollight LE_EXP) |
792 |
||
17652 | 793 |
lemma DIV_MONO: "ALL (m::nat) (n::nat) p::nat. p ~= 0 & <= m n --> <= (DIV m p) (DIV n p)" |
17644 | 794 |
by (import hollight DIV_MONO) |
795 |
||
796 |
lemma DIV_MONO_LT: "ALL (m::nat) (n::nat) p::nat. |
|
17652 | 797 |
p ~= 0 & <= (m + p) n --> < (DIV m p) (DIV n p)" |
17644 | 798 |
by (import hollight DIV_MONO_LT) |
799 |
||
17652 | 800 |
lemma LE_LDIV: "ALL (a::nat) (b::nat) n::nat. a ~= 0 & <= b (a * n) --> <= (DIV b a) n" |
17644 | 801 |
by (import hollight LE_LDIV) |
802 |
||
17652 | 803 |
lemma LE_RDIV_EQ: "ALL (a::nat) (b::nat) n::nat. a ~= 0 --> <= n (DIV b a) = <= (a * n) b" |
17644 | 804 |
by (import hollight LE_RDIV_EQ) |
805 |
||
806 |
lemma LE_LDIV_EQ: "ALL (a::nat) (b::nat) n::nat. |
|
17652 | 807 |
a ~= 0 --> <= (DIV b a) n = < b (a * (n + NUMERAL_BIT1 0))" |
17644 | 808 |
by (import hollight LE_LDIV_EQ) |
809 |
||
17652 | 810 |
lemma DIV_EQ_0: "ALL (m::nat) n::nat. n ~= 0 --> (DIV m n = 0) = < m n" |
17644 | 811 |
by (import hollight DIV_EQ_0) |
812 |
||
17652 | 813 |
lemma MOD_EQ_0: "ALL (m::nat) n::nat. n ~= 0 --> (MOD m n = 0) = (EX q::nat. m = q * n)" |
17644 | 814 |
by (import hollight MOD_EQ_0) |
815 |
||
17652 | 816 |
lemma EVEN_MOD: "ALL n::nat. EVEN n = (MOD n (NUMERAL_BIT0 (NUMERAL_BIT1 0)) = 0)" |
17644 | 817 |
by (import hollight EVEN_MOD) |
818 |
||
17652 | 819 |
lemma ODD_MOD: "ALL n::nat. ODD n = (MOD n (NUMERAL_BIT0 (NUMERAL_BIT1 0)) = NUMERAL_BIT1 0)" |
17644 | 820 |
by (import hollight ODD_MOD) |
821 |
||
17652 | 822 |
lemma MOD_MULT_RMOD: "ALL (m::nat) (n::nat) p::nat. n ~= 0 --> MOD (m * MOD p n) n = MOD (m * p) n" |
17644 | 823 |
by (import hollight MOD_MULT_RMOD) |
824 |
||
825 |
lemma MOD_MULT_LMOD: "ALL (x::nat) (xa::nat) xb::nat. |
|
17652 | 826 |
xa ~= 0 --> MOD (MOD x xa * xb) xa = MOD (x * xb) xa" |
17644 | 827 |
by (import hollight MOD_MULT_LMOD) |
828 |
||
829 |
lemma MOD_MULT_MOD2: "ALL (x::nat) (xa::nat) xb::nat. |
|
17652 | 830 |
xa ~= 0 --> MOD (MOD x xa * MOD xb xa) xa = MOD (x * xb) xa" |
17644 | 831 |
by (import hollight MOD_MULT_MOD2) |
832 |
||
833 |
lemma MOD_EXP_MOD: "ALL (m::nat) (n::nat) p::nat. |
|
17652 | 834 |
n ~= 0 --> MOD (EXP (MOD m n) p) n = MOD (EXP m p) n" |
17644 | 835 |
by (import hollight MOD_EXP_MOD) |
836 |
||
837 |
lemma MOD_MULT_ADD: "ALL (m::nat) (n::nat) p::nat. MOD (m * n + p) n = MOD p n" |
|
838 |
by (import hollight MOD_MULT_ADD) |
|
839 |
||
840 |
lemma MOD_ADD_MOD: "ALL (a::nat) (b::nat) n::nat. |
|
17652 | 841 |
n ~= 0 --> MOD (MOD a n + MOD b n) n = MOD (a + b) n" |
17644 | 842 |
by (import hollight MOD_ADD_MOD) |
843 |
||
844 |
lemma DIV_ADD_MOD: "ALL (a::nat) (b::nat) n::nat. |
|
17652 | 845 |
n ~= 0 --> |
17644 | 846 |
(MOD (a + b) n = MOD a n + MOD b n) = (DIV (a + b) n = DIV a n + DIV b n)" |
847 |
by (import hollight DIV_ADD_MOD) |
|
848 |
||
17652 | 849 |
lemma DIV_REFL: "ALL n::nat. n ~= 0 --> DIV n n = NUMERAL_BIT1 0" |
17644 | 850 |
by (import hollight DIV_REFL) |
851 |
||
17652 | 852 |
lemma MOD_LE: "ALL (m::nat) n::nat. n ~= 0 --> <= (MOD m n) m" |
17644 | 853 |
by (import hollight MOD_LE) |
854 |
||
17652 | 855 |
lemma DIV_MONO2: "ALL (m::nat) (n::nat) p::nat. p ~= 0 & <= p m --> <= (DIV n m) (DIV n p)" |
17644 | 856 |
by (import hollight DIV_MONO2) |
857 |
||
858 |
lemma DIV_LE_EXCLUSION: "ALL (a::nat) (b::nat) (c::nat) d::nat. |
|
17652 | 859 |
b ~= 0 & < (b * c) ((a + NUMERAL_BIT1 0) * d) --> <= (DIV c d) (DIV a b)" |
17644 | 860 |
by (import hollight DIV_LE_EXCLUSION) |
861 |
||
17652 | 862 |
lemma DIV_EQ_EXCLUSION: "< ((b::nat) * (c::nat)) (((a::nat) + NUMERAL_BIT1 0) * (d::nat)) & |
863 |
< (a * d) ((c + NUMERAL_BIT1 0) * b) --> |
|
17644 | 864 |
DIV a b = DIV c d" |
865 |
by (import hollight DIV_EQ_EXCLUSION) |
|
866 |
||
867 |
lemma SUB_ELIM_THM: "(P::nat => bool) ((a::nat) - (b::nat)) = |
|
17652 | 868 |
(ALL x::nat. (b = a + x --> P 0) & (a = b + x --> P x))" |
17644 | 869 |
by (import hollight SUB_ELIM_THM) |
870 |
||
871 |
lemma PRE_ELIM_THM: "(P::nat => bool) (Pred (n::nat)) = |
|
17652 | 872 |
(ALL m::nat. (n = 0 --> P 0) & (n = Suc m --> P m))" |
17644 | 873 |
by (import hollight PRE_ELIM_THM) |
874 |
||
875 |
lemma DIVMOD_ELIM_THM: "(P::nat => nat => bool) (DIV (m::nat) (n::nat)) (MOD m n) = |
|
17652 | 876 |
(n = 0 & P 0 0 | |
877 |
n ~= 0 & (ALL (q::nat) r::nat. m = q * n + r & < r n --> P q r))" |
|
17644 | 878 |
by (import hollight DIVMOD_ELIM_THM) |
879 |
||
880 |
constdefs |
|
17652 | 881 |
eqeq :: "'q_9910 => 'q_9909 => ('q_9910 => 'q_9909 => bool) => bool" |
17644 | 882 |
"eqeq == |
883 |
%(u::'q_9910::type) (ua::'q_9909::type) |
|
884 |
ub::'q_9910::type => 'q_9909::type => bool. ub u ua" |
|
885 |
||
886 |
lemma DEF__equal__equal_: "eqeq = |
|
887 |
(%(u::'q_9910::type) (ua::'q_9909::type) |
|
888 |
ub::'q_9910::type => 'q_9909::type => bool. ub u ua)" |
|
889 |
by (import hollight DEF__equal__equal_) |
|
890 |
||
891 |
constdefs |
|
892 |
mod_nat :: "nat => nat => nat => bool" |
|
893 |
"mod_nat == |
|
894 |
%(u::nat) (ua::nat) ub::nat. EX (q1::nat) q2::nat. ua + u * q1 = ub + u * q2" |
|
895 |
||
896 |
lemma DEF_mod_nat: "mod_nat = |
|
897 |
(%(u::nat) (ua::nat) ub::nat. |
|
898 |
EX (q1::nat) q2::nat. ua + u * q1 = ub + u * q2)" |
|
899 |
by (import hollight DEF_mod_nat) |
|
900 |
||
901 |
constdefs |
|
902 |
minimal :: "(nat => bool) => nat" |
|
903 |
"minimal == %u::nat => bool. SOME n::nat. u n & (ALL m::nat. < m n --> ~ u m)" |
|
904 |
||
905 |
lemma DEF_minimal: "minimal = |
|
906 |
(%u::nat => bool. SOME n::nat. u n & (ALL m::nat. < m n --> ~ u m))" |
|
907 |
by (import hollight DEF_minimal) |
|
908 |
||
909 |
lemma MINIMAL: "ALL P::nat => bool. |
|
910 |
Ex P = (P (minimal P) & (ALL x::nat. < x (minimal P) --> ~ P x))" |
|
911 |
by (import hollight MINIMAL) |
|
912 |
||
913 |
constdefs |
|
17652 | 914 |
WF :: "('A => 'A => bool) => bool" |
17644 | 915 |
"WF == |
916 |
%u::'A::type => 'A::type => bool. |
|
917 |
ALL P::'A::type => bool. |
|
918 |
Ex P --> (EX x::'A::type. P x & (ALL y::'A::type. u y x --> ~ P y))" |
|
919 |
||
920 |
lemma DEF_WF: "WF = |
|
921 |
(%u::'A::type => 'A::type => bool. |
|
922 |
ALL P::'A::type => bool. |
|
923 |
Ex P --> (EX x::'A::type. P x & (ALL y::'A::type. u y x --> ~ P y)))" |
|
924 |
by (import hollight DEF_WF) |
|
925 |
||
19093 | 926 |
lemma WF_EQ: "WF (u_353::'A::type => 'A::type => bool) = |
17644 | 927 |
(ALL P::'A::type => bool. |
19093 | 928 |
Ex P = (EX x::'A::type. P x & (ALL y::'A::type. u_353 y x --> ~ P y)))" |
17644 | 929 |
by (import hollight WF_EQ) |
930 |
||
19093 | 931 |
lemma WF_IND: "WF (u_353::'A::type => 'A::type => bool) = |
17644 | 932 |
(ALL P::'A::type => bool. |
19093 | 933 |
(ALL x::'A::type. (ALL y::'A::type. u_353 y x --> P y) --> P x) --> |
17644 | 934 |
All P)" |
935 |
by (import hollight WF_IND) |
|
936 |
||
19093 | 937 |
lemma WF_DCHAIN: "WF (u_353::'A::type => 'A::type => bool) = |
938 |
(~ (EX s::nat => 'A::type. ALL n::nat. u_353 (s (Suc n)) (s n)))" |
|
17644 | 939 |
by (import hollight WF_DCHAIN) |
940 |
||
19093 | 941 |
lemma WF_UREC: "WF (u_353::'A::type => 'A::type => bool) --> |
17644 | 942 |
(ALL H::('A::type => 'B::type) => 'A::type => 'B::type. |
943 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) x::'A::type. |
|
19093 | 944 |
(ALL z::'A::type. u_353 z x --> f z = g z) --> H f x = H g x) --> |
17644 | 945 |
(ALL (f::'A::type => 'B::type) g::'A::type => 'B::type. |
946 |
(ALL x::'A::type. f x = H f x) & (ALL x::'A::type. g x = H g x) --> |
|
947 |
f = g))" |
|
948 |
by (import hollight WF_UREC) |
|
949 |
||
950 |
lemma WF_UREC_WF: "(ALL H::('A::type => bool) => 'A::type => bool. |
|
951 |
(ALL (f::'A::type => bool) (g::'A::type => bool) x::'A::type. |
|
952 |
(ALL z::'A::type. |
|
19093 | 953 |
(u_353::'A::type => 'A::type => bool) z x --> f z = g z) --> |
17644 | 954 |
H f x = H g x) --> |
955 |
(ALL (f::'A::type => bool) g::'A::type => bool. |
|
956 |
(ALL x::'A::type. f x = H f x) & (ALL x::'A::type. g x = H g x) --> |
|
957 |
f = g)) --> |
|
19093 | 958 |
WF u_353" |
17644 | 959 |
by (import hollight WF_UREC_WF) |
960 |
||
19093 | 961 |
lemma WF_REC_INVARIANT: "WF (u_353::'A::type => 'A::type => bool) --> |
17644 | 962 |
(ALL (H::('A::type => 'B::type) => 'A::type => 'B::type) |
963 |
S::'A::type => 'B::type => bool. |
|
964 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) x::'A::type. |
|
19093 | 965 |
(ALL z::'A::type. u_353 z x --> f z = g z & S z (f z)) --> |
17644 | 966 |
H f x = H g x & S x (H f x)) --> |
967 |
(EX f::'A::type => 'B::type. ALL x::'A::type. f x = H f x))" |
|
968 |
by (import hollight WF_REC_INVARIANT) |
|
969 |
||
19093 | 970 |
lemma WF_REC: "WF (u_353::'A::type => 'A::type => bool) --> |
17644 | 971 |
(ALL H::('A::type => 'B::type) => 'A::type => 'B::type. |
972 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) x::'A::type. |
|
19093 | 973 |
(ALL z::'A::type. u_353 z x --> f z = g z) --> H f x = H g x) --> |
17644 | 974 |
(EX f::'A::type => 'B::type. ALL x::'A::type. f x = H f x))" |
975 |
by (import hollight WF_REC) |
|
976 |
||
977 |
lemma WF_REC_WF: "(ALL H::('A::type => nat) => 'A::type => nat. |
|
978 |
(ALL (f::'A::type => nat) (g::'A::type => nat) x::'A::type. |
|
979 |
(ALL z::'A::type. |
|
19093 | 980 |
(u_353::'A::type => 'A::type => bool) z x --> f z = g z) --> |
17644 | 981 |
H f x = H g x) --> |
982 |
(EX f::'A::type => nat. ALL x::'A::type. f x = H f x)) --> |
|
19093 | 983 |
WF u_353" |
17644 | 984 |
by (import hollight WF_REC_WF) |
985 |
||
19093 | 986 |
lemma WF_EREC: "WF (u_353::'A::type => 'A::type => bool) --> |
17644 | 987 |
(ALL H::('A::type => 'B::type) => 'A::type => 'B::type. |
988 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) x::'A::type. |
|
19093 | 989 |
(ALL z::'A::type. u_353 z x --> f z = g z) --> H f x = H g x) --> |
17644 | 990 |
(EX! f::'A::type => 'B::type. ALL x::'A::type. f x = H f x))" |
991 |
by (import hollight WF_EREC) |
|
992 |
||
993 |
lemma WF_SUBSET: "(ALL (x::'A::type) y::'A::type. |
|
19093 | 994 |
(u_353::'A::type => 'A::type => bool) x y --> |
995 |
(u_472::'A::type => 'A::type => bool) x y) & |
|
996 |
WF u_472 --> |
|
997 |
WF u_353" |
|
17644 | 998 |
by (import hollight WF_SUBSET) |
999 |
||
1000 |
lemma WF_MEASURE_GEN: "ALL m::'A::type => 'B::type. |
|
19093 | 1001 |
WF (u_353::'B::type => 'B::type => bool) --> |
1002 |
WF (%(x::'A::type) x'::'A::type. u_353 (m x) (m x'))" |
|
17644 | 1003 |
by (import hollight WF_MEASURE_GEN) |
1004 |
||
1005 |
lemma WF_LEX_DEPENDENT: "ALL (R::'A::type => 'A::type => bool) |
|
1006 |
S::'A::type => 'B::type => 'B::type => bool. |
|
1007 |
WF R & (ALL x::'A::type. WF (S x)) --> |
|
1008 |
WF (GABS |
|
1009 |
(%f::'A::type * 'B::type => 'A::type * 'B::type => bool. |
|
1010 |
ALL (r1::'A::type) s1::'B::type. |
|
1011 |
GEQ (f (r1, s1)) |
|
1012 |
(GABS |
|
1013 |
(%f::'A::type * 'B::type => bool. |
|
1014 |
ALL (r2::'A::type) s2::'B::type. |
|
1015 |
GEQ (f (r2, s2)) |
|
1016 |
(R r1 r2 | r1 = r2 & S r1 s1 s2)))))" |
|
1017 |
by (import hollight WF_LEX_DEPENDENT) |
|
1018 |
||
1019 |
lemma WF_LEX: "ALL (x::'A::type => 'A::type => bool) xa::'B::type => 'B::type => bool. |
|
1020 |
WF x & WF xa --> |
|
1021 |
WF (GABS |
|
1022 |
(%f::'A::type * 'B::type => 'A::type * 'B::type => bool. |
|
1023 |
ALL (r1::'A::type) s1::'B::type. |
|
1024 |
GEQ (f (r1, s1)) |
|
1025 |
(GABS |
|
1026 |
(%f::'A::type * 'B::type => bool. |
|
1027 |
ALL (r2::'A::type) s2::'B::type. |
|
1028 |
GEQ (f (r2, s2)) (x r1 r2 | r1 = r2 & xa s1 s2)))))" |
|
1029 |
by (import hollight WF_LEX) |
|
1030 |
||
19093 | 1031 |
lemma WF_POINTWISE: "WF (u_353::'A::type => 'A::type => bool) & |
1032 |
WF (u_472::'B::type => 'B::type => bool) --> |
|
17644 | 1033 |
WF (GABS |
1034 |
(%f::'A::type * 'B::type => 'A::type * 'B::type => bool. |
|
1035 |
ALL (x1::'A::type) y1::'B::type. |
|
1036 |
GEQ (f (x1, y1)) |
|
1037 |
(GABS |
|
1038 |
(%f::'A::type * 'B::type => bool. |
|
1039 |
ALL (x2::'A::type) y2::'B::type. |
|
19093 | 1040 |
GEQ (f (x2, y2)) (u_353 x1 x2 & u_472 y1 y2)))))" |
17644 | 1041 |
by (import hollight WF_POINTWISE) |
1042 |
||
1043 |
lemma WF_num: "WF <" |
|
1044 |
by (import hollight WF_num) |
|
1045 |
||
1046 |
lemma WF_REC_num: "ALL H::(nat => 'A::type) => nat => 'A::type. |
|
1047 |
(ALL (f::nat => 'A::type) (g::nat => 'A::type) x::nat. |
|
1048 |
(ALL z::nat. < z x --> f z = g z) --> H f x = H g x) --> |
|
1049 |
(EX f::nat => 'A::type. ALL x::nat. f x = H f x)" |
|
1050 |
by (import hollight WF_REC_num) |
|
1051 |
||
1052 |
consts |
|
17652 | 1053 |
measure :: "('q_11107 => nat) => 'q_11107 => 'q_11107 => bool" |
17644 | 1054 |
|
1055 |
defs |
|
1056 |
measure_def: "hollight.measure == |
|
1057 |
%(u::'q_11107::type => nat) (x::'q_11107::type) y::'q_11107::type. |
|
1058 |
< (u x) (u y)" |
|
1059 |
||
1060 |
lemma DEF_measure: "hollight.measure = |
|
1061 |
(%(u::'q_11107::type => nat) (x::'q_11107::type) y::'q_11107::type. |
|
1062 |
< (u x) (u y))" |
|
1063 |
by (import hollight DEF_measure) |
|
1064 |
||
1065 |
lemma WF_MEASURE: "ALL m::'A::type => nat. WF (hollight.measure m)" |
|
1066 |
by (import hollight WF_MEASURE) |
|
1067 |
||
1068 |
lemma MEASURE_LE: "(ALL x::'q_11137::type. |
|
1069 |
hollight.measure (m::'q_11137::type => nat) x (a::'q_11137::type) --> |
|
1070 |
hollight.measure m x (b::'q_11137::type)) = |
|
1071 |
<= (m a) (m b)" |
|
1072 |
by (import hollight MEASURE_LE) |
|
1073 |
||
19093 | 1074 |
lemma WF_REFL: "ALL x::'A::type. WF (u_353::'A::type => 'A::type => bool) --> ~ u_353 x x" |
17644 | 1075 |
by (import hollight WF_REFL) |
1076 |
||
1077 |
lemma WF_FALSE: "WF (%(x::'A::type) y::'A::type. False)" |
|
1078 |
by (import hollight WF_FALSE) |
|
1079 |
||
1080 |
lemma WF_REC_TAIL: "ALL (P::'A::type => bool) (g::'A::type => 'A::type) h::'A::type => 'B::type. |
|
1081 |
EX f::'A::type => 'B::type. |
|
1082 |
ALL x::'A::type. f x = COND (P x) (f (g x)) (h x)" |
|
1083 |
by (import hollight WF_REC_TAIL) |
|
1084 |
||
1085 |
lemma WF_REC_TAIL_GENERAL: "ALL (P::('A::type => 'B::type) => 'A::type => bool) |
|
1086 |
(G::('A::type => 'B::type) => 'A::type => 'A::type) |
|
1087 |
H::('A::type => 'B::type) => 'A::type => 'B::type. |
|
19093 | 1088 |
WF (u_353::'A::type => 'A::type => bool) & |
17644 | 1089 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) x::'A::type. |
19093 | 1090 |
(ALL z::'A::type. u_353 z x --> f z = g z) --> |
17644 | 1091 |
P f x = P g x & G f x = G g x & H f x = H g x) & |
1092 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) x::'A::type. |
|
19093 | 1093 |
(ALL z::'A::type. u_353 z x --> f z = g z) --> H f x = H g x) & |
17644 | 1094 |
(ALL (f::'A::type => 'B::type) (x::'A::type) y::'A::type. |
19093 | 1095 |
P f x & u_353 y (G f x) --> u_353 y x) --> |
17644 | 1096 |
(EX f::'A::type => 'B::type. |
1097 |
ALL x::'A::type. f x = COND (P f x) (f (G f x)) (H f x))" |
|
1098 |
by (import hollight WF_REC_TAIL_GENERAL) |
|
1099 |
||
17652 | 1100 |
lemma ARITH_ZERO: "(op &::bool => bool => bool) ((op =::nat => nat => bool) (0::nat) (0::nat)) |
1101 |
((op =::nat => nat => bool) ((NUMERAL_BIT0::nat => nat) (0::nat)) (0::nat))" |
|
17644 | 1102 |
by (import hollight ARITH_ZERO) |
1103 |
||
1104 |
lemma ARITH_SUC: "(ALL x::nat. Suc x = Suc x) & |
|
17652 | 1105 |
Suc 0 = NUMERAL_BIT1 0 & |
17644 | 1106 |
(ALL x::nat. Suc (NUMERAL_BIT0 x) = NUMERAL_BIT1 x) & |
1107 |
(ALL x::nat. Suc (NUMERAL_BIT1 x) = NUMERAL_BIT0 (Suc x))" |
|
1108 |
by (import hollight ARITH_SUC) |
|
1109 |
||
1110 |
lemma ARITH_PRE: "(ALL x::nat. Pred x = Pred x) & |
|
17652 | 1111 |
Pred 0 = 0 & |
17644 | 1112 |
(ALL x::nat. |
17652 | 1113 |
Pred (NUMERAL_BIT0 x) = COND (x = 0) 0 (NUMERAL_BIT1 (Pred x))) & |
17644 | 1114 |
(ALL x::nat. Pred (NUMERAL_BIT1 x) = NUMERAL_BIT0 x)" |
1115 |
by (import hollight ARITH_PRE) |
|
1116 |
||
17652 | 1117 |
lemma ARITH_ADD: "(op &::bool => bool => bool) |
1118 |
((All::(nat => bool) => bool) |
|
1119 |
(%x::nat. |
|
1120 |
(All::(nat => bool) => bool) |
|
1121 |
(%xa::nat. |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1122 |
(op =::nat => nat => bool) ((HOL.plus::nat => nat => nat) x xa) |
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1123 |
((HOL.plus::nat => nat => nat) x xa)))) |
17652 | 1124 |
((op &::bool => bool => bool) |
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1125 |
((op =::nat => nat => bool) ((HOL.plus::nat => nat => nat) (0::nat) (0::nat)) |
17652 | 1126 |
(0::nat)) |
1127 |
((op &::bool => bool => bool) |
|
1128 |
((All::(nat => bool) => bool) |
|
1129 |
(%x::nat. |
|
1130 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1131 |
((HOL.plus::nat => nat => nat) (0::nat) |
17652 | 1132 |
((NUMERAL_BIT0::nat => nat) x)) |
1133 |
((NUMERAL_BIT0::nat => nat) x))) |
|
1134 |
((op &::bool => bool => bool) |
|
1135 |
((All::(nat => bool) => bool) |
|
1136 |
(%x::nat. |
|
1137 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1138 |
((HOL.plus::nat => nat => nat) (0::nat) |
17652 | 1139 |
((NUMERAL_BIT1::nat => nat) x)) |
1140 |
((NUMERAL_BIT1::nat => nat) x))) |
|
1141 |
((op &::bool => bool => bool) |
|
1142 |
((All::(nat => bool) => bool) |
|
1143 |
(%x::nat. |
|
1144 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1145 |
((HOL.plus::nat => nat => nat) ((NUMERAL_BIT0::nat => nat) x) |
17652 | 1146 |
(0::nat)) |
1147 |
((NUMERAL_BIT0::nat => nat) x))) |
|
1148 |
((op &::bool => bool => bool) |
|
1149 |
((All::(nat => bool) => bool) |
|
1150 |
(%x::nat. |
|
1151 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1152 |
((HOL.plus::nat => nat => nat) ((NUMERAL_BIT1::nat => nat) x) |
17652 | 1153 |
(0::nat)) |
1154 |
((NUMERAL_BIT1::nat => nat) x))) |
|
1155 |
((op &::bool => bool => bool) |
|
1156 |
((All::(nat => bool) => bool) |
|
1157 |
(%x::nat. |
|
1158 |
(All::(nat => bool) => bool) |
|
1159 |
(%xa::nat. |
|
1160 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1161 |
((HOL.plus::nat => nat => nat) |
17652 | 1162 |
((NUMERAL_BIT0::nat => nat) x) |
1163 |
((NUMERAL_BIT0::nat => nat) xa)) |
|
1164 |
((NUMERAL_BIT0::nat => nat) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1165 |
((HOL.plus::nat => nat => nat) x xa))))) |
17652 | 1166 |
((op &::bool => bool => bool) |
1167 |
((All::(nat => bool) => bool) |
|
1168 |
(%x::nat. |
|
1169 |
(All::(nat => bool) => bool) |
|
1170 |
(%xa::nat. |
|
1171 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1172 |
((HOL.plus::nat => nat => nat) |
17652 | 1173 |
((NUMERAL_BIT0::nat => nat) x) |
1174 |
((NUMERAL_BIT1::nat => nat) xa)) |
|
1175 |
((NUMERAL_BIT1::nat => nat) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1176 |
((HOL.plus::nat => nat => nat) x xa))))) |
17652 | 1177 |
((op &::bool => bool => bool) |
1178 |
((All::(nat => bool) => bool) |
|
1179 |
(%x::nat. |
|
1180 |
(All::(nat => bool) => bool) |
|
1181 |
(%xa::nat. |
|
1182 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1183 |
((HOL.plus::nat => nat => nat) |
17652 | 1184 |
((NUMERAL_BIT1::nat => nat) x) |
1185 |
((NUMERAL_BIT0::nat => nat) xa)) |
|
1186 |
((NUMERAL_BIT1::nat => nat) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1187 |
((HOL.plus::nat => nat => nat) x xa))))) |
17652 | 1188 |
((All::(nat => bool) => bool) |
1189 |
(%x::nat. |
|
1190 |
(All::(nat => bool) => bool) |
|
1191 |
(%xa::nat. |
|
1192 |
(op =::nat => nat => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1193 |
((HOL.plus::nat => nat => nat) |
17652 | 1194 |
((NUMERAL_BIT1::nat => nat) x) |
1195 |
((NUMERAL_BIT1::nat => nat) xa)) |
|
1196 |
((NUMERAL_BIT0::nat => nat) |
|
1197 |
((Suc::nat => nat) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1198 |
((HOL.plus::nat => nat => nat) x |
17652 | 1199 |
xa))))))))))))))" |
17644 | 1200 |
by (import hollight ARITH_ADD) |
1201 |
||
17652 | 1202 |
lemma ARITH_MULT: "(op &::bool => bool => bool) |
1203 |
((All::(nat => bool) => bool) |
|
1204 |
(%x::nat. |
|
1205 |
(All::(nat => bool) => bool) |
|
1206 |
(%xa::nat. |
|
1207 |
(op =::nat => nat => bool) ((op *::nat => nat => nat) x xa) |
|
1208 |
((op *::nat => nat => nat) x xa)))) |
|
1209 |
((op &::bool => bool => bool) |
|
1210 |
((op =::nat => nat => bool) ((op *::nat => nat => nat) (0::nat) (0::nat)) |
|
1211 |
(0::nat)) |
|
1212 |
((op &::bool => bool => bool) |
|
1213 |
((All::(nat => bool) => bool) |
|
1214 |
(%x::nat. |
|
1215 |
(op =::nat => nat => bool) |
|
1216 |
((op *::nat => nat => nat) (0::nat) |
|
1217 |
((NUMERAL_BIT0::nat => nat) x)) |
|
1218 |
(0::nat))) |
|
1219 |
((op &::bool => bool => bool) |
|
1220 |
((All::(nat => bool) => bool) |
|
1221 |
(%x::nat. |
|
1222 |
(op =::nat => nat => bool) |
|
1223 |
((op *::nat => nat => nat) (0::nat) |
|
1224 |
((NUMERAL_BIT1::nat => nat) x)) |
|
1225 |
(0::nat))) |
|
1226 |
((op &::bool => bool => bool) |
|
1227 |
((All::(nat => bool) => bool) |
|
1228 |
(%x::nat. |
|
1229 |
(op =::nat => nat => bool) |
|
1230 |
((op *::nat => nat => nat) ((NUMERAL_BIT0::nat => nat) x) |
|
1231 |
(0::nat)) |
|
1232 |
(0::nat))) |
|
1233 |
((op &::bool => bool => bool) |
|
1234 |
((All::(nat => bool) => bool) |
|
1235 |
(%x::nat. |
|
1236 |
(op =::nat => nat => bool) |
|
1237 |
((op *::nat => nat => nat) ((NUMERAL_BIT1::nat => nat) x) |
|
1238 |
(0::nat)) |
|
1239 |
(0::nat))) |
|
1240 |
((op &::bool => bool => bool) |
|
1241 |
((All::(nat => bool) => bool) |
|
1242 |
(%x::nat. |
|
1243 |
(All::(nat => bool) => bool) |
|
1244 |
(%xa::nat. |
|
1245 |
(op =::nat => nat => bool) |
|
1246 |
((op *::nat => nat => nat) |
|
1247 |
((NUMERAL_BIT0::nat => nat) x) |
|
1248 |
((NUMERAL_BIT0::nat => nat) xa)) |
|
1249 |
((NUMERAL_BIT0::nat => nat) |
|
1250 |
((NUMERAL_BIT0::nat => nat) |
|
1251 |
((op *::nat => nat => nat) x xa)))))) |
|
1252 |
((op &::bool => bool => bool) |
|
1253 |
((All::(nat => bool) => bool) |
|
1254 |
(%x::nat. |
|
1255 |
(All::(nat => bool) => bool) |
|
1256 |
(%xa::nat. |
|
1257 |
(op =::nat => nat => bool) |
|
1258 |
((op *::nat => nat => nat) |
|
1259 |
((NUMERAL_BIT0::nat => nat) x) |
|
1260 |
((NUMERAL_BIT1::nat => nat) xa)) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1261 |
((HOL.plus::nat => nat => nat) |
17652 | 1262 |
((NUMERAL_BIT0::nat => nat) x) |
1263 |
((NUMERAL_BIT0::nat => nat) |
|
1264 |
((NUMERAL_BIT0::nat => nat) |
|
1265 |
((op *::nat => nat => nat) x xa))))))) |
|
1266 |
((op &::bool => bool => bool) |
|
1267 |
((All::(nat => bool) => bool) |
|
1268 |
(%x::nat. |
|
1269 |
(All::(nat => bool) => bool) |
|
1270 |
(%xa::nat. |
|
1271 |
(op =::nat => nat => bool) |
|
1272 |
((op *::nat => nat => nat) |
|
1273 |
((NUMERAL_BIT1::nat => nat) x) |
|
1274 |
((NUMERAL_BIT0::nat => nat) xa)) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1275 |
((HOL.plus::nat => nat => nat) |
17652 | 1276 |
((NUMERAL_BIT0::nat => nat) xa) |
1277 |
((NUMERAL_BIT0::nat => nat) |
|
1278 |
((NUMERAL_BIT0::nat => nat) |
|
1279 |
((op *::nat => nat => nat) x xa))))))) |
|
1280 |
((All::(nat => bool) => bool) |
|
1281 |
(%x::nat. |
|
1282 |
(All::(nat => bool) => bool) |
|
1283 |
(%xa::nat. |
|
1284 |
(op =::nat => nat => bool) |
|
1285 |
((op *::nat => nat => nat) |
|
1286 |
((NUMERAL_BIT1::nat => nat) x) |
|
1287 |
((NUMERAL_BIT1::nat => nat) xa)) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1288 |
((HOL.plus::nat => nat => nat) |
17652 | 1289 |
((NUMERAL_BIT1::nat => nat) x) |
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
1290 |
((HOL.plus::nat => nat => nat) |
17652 | 1291 |
((NUMERAL_BIT0::nat => nat) xa) |
1292 |
((NUMERAL_BIT0::nat => nat) |
|
1293 |
((NUMERAL_BIT0::nat => nat) |
|
1294 |
((op *::nat => nat => nat) x |
|
1295 |
xa))))))))))))))))" |
|
17644 | 1296 |
by (import hollight ARITH_MULT) |
1297 |
||
1298 |
lemma ARITH_EXP: "(ALL (x::nat) xa::nat. EXP x xa = EXP x xa) & |
|
17652 | 1299 |
EXP 0 0 = NUMERAL_BIT1 0 & |
1300 |
(ALL m::nat. EXP (NUMERAL_BIT0 m) 0 = NUMERAL_BIT1 0) & |
|
1301 |
(ALL m::nat. EXP (NUMERAL_BIT1 m) 0 = NUMERAL_BIT1 0) & |
|
1302 |
(ALL n::nat. EXP 0 (NUMERAL_BIT0 n) = EXP 0 n * EXP 0 n) & |
|
17644 | 1303 |
(ALL (m::nat) n::nat. |
1304 |
EXP (NUMERAL_BIT0 m) (NUMERAL_BIT0 n) = |
|
1305 |
EXP (NUMERAL_BIT0 m) n * EXP (NUMERAL_BIT0 m) n) & |
|
1306 |
(ALL (m::nat) n::nat. |
|
1307 |
EXP (NUMERAL_BIT1 m) (NUMERAL_BIT0 n) = |
|
1308 |
EXP (NUMERAL_BIT1 m) n * EXP (NUMERAL_BIT1 m) n) & |
|
17652 | 1309 |
(ALL n::nat. EXP 0 (NUMERAL_BIT1 n) = 0) & |
17644 | 1310 |
(ALL (m::nat) n::nat. |
1311 |
EXP (NUMERAL_BIT0 m) (NUMERAL_BIT1 n) = |
|
1312 |
NUMERAL_BIT0 m * (EXP (NUMERAL_BIT0 m) n * EXP (NUMERAL_BIT0 m) n)) & |
|
1313 |
(ALL (m::nat) n::nat. |
|
1314 |
EXP (NUMERAL_BIT1 m) (NUMERAL_BIT1 n) = |
|
1315 |
NUMERAL_BIT1 m * (EXP (NUMERAL_BIT1 m) n * EXP (NUMERAL_BIT1 m) n))" |
|
1316 |
by (import hollight ARITH_EXP) |
|
1317 |
||
1318 |
lemma ARITH_EVEN: "(ALL x::nat. EVEN x = EVEN x) & |
|
17652 | 1319 |
EVEN 0 = True & |
17644 | 1320 |
(ALL x::nat. EVEN (NUMERAL_BIT0 x) = True) & |
1321 |
(ALL x::nat. EVEN (NUMERAL_BIT1 x) = False)" |
|
1322 |
by (import hollight ARITH_EVEN) |
|
1323 |
||
1324 |
lemma ARITH_ODD: "(ALL x::nat. ODD x = ODD x) & |
|
17652 | 1325 |
ODD 0 = False & |
17644 | 1326 |
(ALL x::nat. ODD (NUMERAL_BIT0 x) = False) & |
1327 |
(ALL x::nat. ODD (NUMERAL_BIT1 x) = True)" |
|
1328 |
by (import hollight ARITH_ODD) |
|
1329 |
||
1330 |
lemma ARITH_LE: "(ALL (x::nat) xa::nat. <= x xa = <= x xa) & |
|
17652 | 1331 |
<= 0 0 = True & |
1332 |
(ALL x::nat. <= (NUMERAL_BIT0 x) 0 = (x = 0)) & |
|
1333 |
(ALL x::nat. <= (NUMERAL_BIT1 x) 0 = False) & |
|
1334 |
(ALL x::nat. <= 0 (NUMERAL_BIT0 x) = True) & |
|
1335 |
(ALL x::nat. <= 0 (NUMERAL_BIT1 x) = True) & |
|
17644 | 1336 |
(ALL (x::nat) xa::nat. <= (NUMERAL_BIT0 x) (NUMERAL_BIT0 xa) = <= x xa) & |
1337 |
(ALL (x::nat) xa::nat. <= (NUMERAL_BIT0 x) (NUMERAL_BIT1 xa) = <= x xa) & |
|
1338 |
(ALL (x::nat) xa::nat. <= (NUMERAL_BIT1 x) (NUMERAL_BIT0 xa) = < x xa) & |
|
1339 |
(ALL (x::nat) xa::nat. <= (NUMERAL_BIT1 x) (NUMERAL_BIT1 xa) = <= x xa)" |
|
1340 |
by (import hollight ARITH_LE) |
|
1341 |
||
1342 |
lemma ARITH_LT: "(ALL (x::nat) xa::nat. < x xa = < x xa) & |
|
17652 | 1343 |
< 0 0 = False & |
1344 |
(ALL x::nat. < (NUMERAL_BIT0 x) 0 = False) & |
|
1345 |
(ALL x::nat. < (NUMERAL_BIT1 x) 0 = False) & |
|
1346 |
(ALL x::nat. < 0 (NUMERAL_BIT0 x) = < 0 x) & |
|
1347 |
(ALL x::nat. < 0 (NUMERAL_BIT1 x) = True) & |
|
17644 | 1348 |
(ALL (x::nat) xa::nat. < (NUMERAL_BIT0 x) (NUMERAL_BIT0 xa) = < x xa) & |
1349 |
(ALL (x::nat) xa::nat. < (NUMERAL_BIT0 x) (NUMERAL_BIT1 xa) = <= x xa) & |
|
1350 |
(ALL (x::nat) xa::nat. < (NUMERAL_BIT1 x) (NUMERAL_BIT0 xa) = < x xa) & |
|
1351 |
(ALL (x::nat) xa::nat. < (NUMERAL_BIT1 x) (NUMERAL_BIT1 xa) = < x xa)" |
|
1352 |
by (import hollight ARITH_LT) |
|
1353 |
||
17652 | 1354 |
lemma ARITH_EQ: "(op &::bool => bool => bool) |
1355 |
((All::(nat => bool) => bool) |
|
1356 |
(%x::nat. |
|
1357 |
(All::(nat => bool) => bool) |
|
1358 |
(%xa::nat. |
|
1359 |
(op =::bool => bool => bool) ((op =::nat => nat => bool) x xa) |
|
1360 |
((op =::nat => nat => bool) x xa)))) |
|
1361 |
((op &::bool => bool => bool) |
|
1362 |
((op =::bool => bool => bool) |
|
1363 |
((op =::nat => nat => bool) (0::nat) (0::nat)) (True::bool)) |
|
1364 |
((op &::bool => bool => bool) |
|
1365 |
((All::(nat => bool) => bool) |
|
1366 |
(%x::nat. |
|
1367 |
(op =::bool => bool => bool) |
|
1368 |
((op =::nat => nat => bool) ((NUMERAL_BIT0::nat => nat) x) |
|
1369 |
(0::nat)) |
|
1370 |
((op =::nat => nat => bool) x (0::nat)))) |
|
1371 |
((op &::bool => bool => bool) |
|
1372 |
((All::(nat => bool) => bool) |
|
1373 |
(%x::nat. |
|
1374 |
(op =::bool => bool => bool) |
|
1375 |
((op =::nat => nat => bool) ((NUMERAL_BIT1::nat => nat) x) |
|
1376 |
(0::nat)) |
|
1377 |
(False::bool))) |
|
1378 |
((op &::bool => bool => bool) |
|
1379 |
((All::(nat => bool) => bool) |
|
1380 |
(%x::nat. |
|
1381 |
(op =::bool => bool => bool) |
|
1382 |
((op =::nat => nat => bool) (0::nat) |
|
1383 |
((NUMERAL_BIT0::nat => nat) x)) |
|
1384 |
((op =::nat => nat => bool) (0::nat) x))) |
|
1385 |
((op &::bool => bool => bool) |
|
1386 |
((All::(nat => bool) => bool) |
|
1387 |
(%x::nat. |
|
1388 |
(op =::bool => bool => bool) |
|
1389 |
((op =::nat => nat => bool) (0::nat) |
|
1390 |
((NUMERAL_BIT1::nat => nat) x)) |
|
1391 |
(False::bool))) |
|
1392 |
((op &::bool => bool => bool) |
|
1393 |
((All::(nat => bool) => bool) |
|
1394 |
(%x::nat. |
|
1395 |
(All::(nat => bool) => bool) |
|
1396 |
(%xa::nat. |
|
1397 |
(op =::bool => bool => bool) |
|
1398 |
((op =::nat => nat => bool) |
|
1399 |
((NUMERAL_BIT0::nat => nat) x) |
|
1400 |
((NUMERAL_BIT0::nat => nat) xa)) |
|
1401 |
((op =::nat => nat => bool) x xa)))) |
|
1402 |
((op &::bool => bool => bool) |
|
1403 |
((All::(nat => bool) => bool) |
|
1404 |
(%x::nat. |
|
1405 |
(All::(nat => bool) => bool) |
|
1406 |
(%xa::nat. |
|
1407 |
(op =::bool => bool => bool) |
|
1408 |
((op =::nat => nat => bool) |
|
1409 |
((NUMERAL_BIT0::nat => nat) x) |
|
1410 |
((NUMERAL_BIT1::nat => nat) xa)) |
|
1411 |
(False::bool)))) |
|
1412 |
((op &::bool => bool => bool) |
|
1413 |
((All::(nat => bool) => bool) |
|
1414 |
(%x::nat. |
|
1415 |
(All::(nat => bool) => bool) |
|
1416 |
(%xa::nat. |
|
1417 |
(op =::bool => bool => bool) |
|
1418 |
((op =::nat => nat => bool) |
|
1419 |
((NUMERAL_BIT1::nat => nat) x) |
|
1420 |
((NUMERAL_BIT0::nat => nat) xa)) |
|
1421 |
(False::bool)))) |
|
1422 |
((All::(nat => bool) => bool) |
|
1423 |
(%x::nat. |
|
1424 |
(All::(nat => bool) => bool) |
|
1425 |
(%xa::nat. |
|
1426 |
(op =::bool => bool => bool) |
|
1427 |
((op =::nat => nat => bool) |
|
1428 |
((NUMERAL_BIT1::nat => nat) x) |
|
1429 |
((NUMERAL_BIT1::nat => nat) xa)) |
|
1430 |
((op =::nat => nat => bool) x xa))))))))))))" |
|
17644 | 1431 |
by (import hollight ARITH_EQ) |
1432 |
||
17652 | 1433 |
lemma ARITH_SUB: "(op &::bool => bool => bool) |
1434 |
((All::(nat => bool) => bool) |
|
1435 |
(%x::nat. |
|
1436 |
(All::(nat => bool) => bool) |
|
1437 |
(%xa::nat. |
|
1438 |
(op =::nat => nat => bool) ((op -::nat => nat => nat) x xa) |
|
1439 |
((op -::nat => nat => nat) x xa)))) |
|
1440 |
((op &::bool => bool => bool) |
|
1441 |
((op =::nat => nat => bool) ((op -::nat => nat => nat) (0::nat) (0::nat)) |
|
1442 |
(0::nat)) |
|
1443 |
((op &::bool => bool => bool) |
|
1444 |
((All::(nat => bool) => bool) |
|
1445 |
(%x::nat. |
|
1446 |
(op =::nat => nat => bool) |
|
1447 |
((op -::nat => nat => nat) (0::nat) |
|
1448 |
((NUMERAL_BIT0::nat => nat) x)) |
|
1449 |
(0::nat))) |
|
1450 |
((op &::bool => bool => bool) |
|
1451 |
((All::(nat => bool) => bool) |
|
1452 |
(%x::nat. |
|
1453 |
(op =::nat => nat => bool) |
|
1454 |
((op -::nat => nat => nat) (0::nat) |
|
1455 |
((NUMERAL_BIT1::nat => nat) x)) |
|
1456 |
(0::nat))) |
|
1457 |
((op &::bool => bool => bool) |
|
1458 |
((All::(nat => bool) => bool) |
|
1459 |
(%x::nat. |
|
1460 |
(op =::nat => nat => bool) |
|
1461 |
((op -::nat => nat => nat) ((NUMERAL_BIT0::nat => nat) x) |
|
1462 |
(0::nat)) |
|
1463 |
((NUMERAL_BIT0::nat => nat) x))) |
|
1464 |
((op &::bool => bool => bool) |
|
1465 |
((All::(nat => bool) => bool) |
|
1466 |
(%x::nat. |
|
1467 |
(op =::nat => nat => bool) |
|
1468 |
((op -::nat => nat => nat) ((NUMERAL_BIT1::nat => nat) x) |
|
1469 |
(0::nat)) |
|
1470 |
((NUMERAL_BIT1::nat => nat) x))) |
|
1471 |
((op &::bool => bool => bool) |
|
1472 |
((All::(nat => bool) => bool) |
|
1473 |
(%m::nat. |
|
1474 |
(All::(nat => bool) => bool) |
|
1475 |
(%n::nat. |
|
1476 |
(op =::nat => nat => bool) |
|
1477 |
((op -::nat => nat => nat) |
|
1478 |
((NUMERAL_BIT0::nat => nat) m) |
|
1479 |
((NUMERAL_BIT0::nat => nat) n)) |
|
1480 |
((NUMERAL_BIT0::nat => nat) |
|
1481 |
((op -::nat => nat => nat) m n))))) |
|
1482 |
((op &::bool => bool => bool) |
|
1483 |
((All::(nat => bool) => bool) |
|
1484 |
(%m::nat. |
|
1485 |
(All::(nat => bool) => bool) |
|
1486 |
(%n::nat. |
|
1487 |
(op =::nat => nat => bool) |
|
1488 |
((op -::nat => nat => nat) |
|
1489 |
((NUMERAL_BIT0::nat => nat) m) |
|
1490 |
((NUMERAL_BIT1::nat => nat) n)) |
|
1491 |
((Pred::nat => nat) |
|
1492 |
((NUMERAL_BIT0::nat => nat) |
|
1493 |
((op -::nat => nat => nat) m n)))))) |
|
1494 |
((op &::bool => bool => bool) |
|
1495 |
((All::(nat => bool) => bool) |
|
1496 |
(%m::nat. |
|
1497 |
(All::(nat => bool) => bool) |
|
1498 |
(%n::nat. |
|
1499 |
(op =::nat => nat => bool) |
|
1500 |
((op -::nat => nat => nat) |
|
1501 |
((NUMERAL_BIT1::nat => nat) m) |
|
1502 |
((NUMERAL_BIT0::nat => nat) n)) |
|
1503 |
((COND::bool => nat => nat => nat) |
|
1504 |
((<=::nat => nat => bool) n m) |
|
1505 |
((NUMERAL_BIT1::nat => nat) |
|
1506 |
((op -::nat => nat => nat) m n)) |
|
1507 |
(0::nat))))) |
|
1508 |
((All::(nat => bool) => bool) |
|
1509 |
(%m::nat. |
|
1510 |
(All::(nat => bool) => bool) |
|
1511 |
(%n::nat. |
|
1512 |
(op =::nat => nat => bool) |
|
1513 |
((op -::nat => nat => nat) |
|
1514 |
((NUMERAL_BIT1::nat => nat) m) |
|
1515 |
((NUMERAL_BIT1::nat => nat) n)) |
|
1516 |
((NUMERAL_BIT0::nat => nat) |
|
1517 |
((op -::nat => nat => nat) m n)))))))))))))" |
|
17644 | 1518 |
by (import hollight ARITH_SUB) |
1519 |
||
1520 |
lemma right_th: "(s::nat) * NUMERAL_BIT1 (x::nat) = s + NUMERAL_BIT0 (s * x)" |
|
1521 |
by (import hollight right_th) |
|
1522 |
||
1523 |
lemma SEMIRING_PTHS: "(ALL (x::'A::type) (y::'A::type) z::'A::type. |
|
1524 |
(add::'A::type => 'A::type => 'A::type) x (add y z) = add (add x y) z) & |
|
1525 |
(ALL (x::'A::type) y::'A::type. add x y = add y x) & |
|
1526 |
(ALL x::'A::type. add (r0::'A::type) x = x) & |
|
1527 |
(ALL (x::'A::type) (y::'A::type) z::'A::type. |
|
1528 |
(mul::'A::type => 'A::type => 'A::type) x (mul y z) = mul (mul x y) z) & |
|
1529 |
(ALL (x::'A::type) y::'A::type. mul x y = mul y x) & |
|
1530 |
(ALL x::'A::type. mul (r1::'A::type) x = x) & |
|
1531 |
(ALL x::'A::type. mul r0 x = r0) & |
|
1532 |
(ALL (x::'A::type) (y::'A::type) z::'A::type. |
|
1533 |
mul x (add y z) = add (mul x y) (mul x z)) & |
|
17652 | 1534 |
(ALL x::'A::type. (pwr::'A::type => nat => 'A::type) x 0 = r1) & |
17644 | 1535 |
(ALL (x::'A::type) n::nat. pwr x (Suc n) = mul x (pwr x n)) --> |
1536 |
mul r1 (x::'A::type) = x & |
|
1537 |
add (mul (a::'A::type) (m::'A::type)) (mul (b::'A::type) m) = |
|
1538 |
mul (add a b) m & |
|
1539 |
add (mul a m) m = mul (add a r1) m & |
|
1540 |
add m (mul a m) = mul (add a r1) m & |
|
1541 |
add m m = mul (add r1 r1) m & |
|
1542 |
mul r0 m = r0 & |
|
1543 |
add r0 a = a & |
|
1544 |
add a r0 = a & |
|
1545 |
mul a b = mul b a & |
|
1546 |
mul (add a b) (c::'A::type) = add (mul a c) (mul b c) & |
|
1547 |
mul r0 a = r0 & |
|
1548 |
mul a r0 = r0 & |
|
1549 |
mul r1 a = a & |
|
1550 |
mul a r1 = a & |
|
1551 |
mul (mul (lx::'A::type) (ly::'A::type)) |
|
1552 |
(mul (rx::'A::type) (ry::'A::type)) = |
|
1553 |
mul (mul lx rx) (mul ly ry) & |
|
1554 |
mul (mul lx ly) (mul rx ry) = mul lx (mul ly (mul rx ry)) & |
|
1555 |
mul (mul lx ly) (mul rx ry) = mul rx (mul (mul lx ly) ry) & |
|
1556 |
mul (mul lx ly) rx = mul (mul lx rx) ly & |
|
1557 |
mul (mul lx ly) rx = mul lx (mul ly rx) & |
|
1558 |
mul lx rx = mul rx lx & |
|
1559 |
mul lx (mul rx ry) = mul (mul lx rx) ry & |
|
1560 |
mul lx (mul rx ry) = mul rx (mul lx ry) & |
|
1561 |
add (add a b) (add c (d::'A::type)) = add (add a c) (add b d) & |
|
1562 |
add (add a b) c = add a (add b c) & |
|
1563 |
add a (add c d) = add c (add a d) & |
|
1564 |
add (add a b) c = add (add a c) b & |
|
1565 |
add a c = add c a & |
|
1566 |
add a (add c d) = add (add a c) d & |
|
1567 |
mul (pwr x (p::nat)) (pwr x (q::nat)) = pwr x (p + q) & |
|
1568 |
mul x (pwr x q) = pwr x (Suc q) & |
|
1569 |
mul (pwr x q) x = pwr x (Suc q) & |
|
17652 | 1570 |
mul x x = pwr x (NUMERAL_BIT0 (NUMERAL_BIT1 0)) & |
17644 | 1571 |
pwr (mul x (y::'A::type)) q = mul (pwr x q) (pwr y q) & |
1572 |
pwr (pwr x p) q = pwr x (p * q) & |
|
17652 | 1573 |
pwr x 0 = r1 & |
1574 |
pwr x (NUMERAL_BIT1 0) = x & |
|
17644 | 1575 |
mul x (add y (z::'A::type)) = add (mul x y) (mul x z) & |
1576 |
pwr x (Suc q) = mul x (pwr x q)" |
|
1577 |
by (import hollight SEMIRING_PTHS) |
|
1578 |
||
1579 |
lemma sth: "(ALL (x::nat) (y::nat) z::nat. x + (y + z) = x + y + z) & |
|
1580 |
(ALL (x::nat) y::nat. x + y = y + x) & |
|
17652 | 1581 |
(ALL x::nat. 0 + x = x) & |
17644 | 1582 |
(ALL (x::nat) (y::nat) z::nat. x * (y * z) = x * y * z) & |
1583 |
(ALL (x::nat) y::nat. x * y = y * x) & |
|
17652 | 1584 |
(ALL x::nat. NUMERAL_BIT1 0 * x = x) & |
1585 |
(ALL x::nat. 0 * x = 0) & |
|
17644 | 1586 |
(ALL (x::nat) (xa::nat) xb::nat. x * (xa + xb) = x * xa + x * xb) & |
17652 | 1587 |
(ALL x::nat. EXP x 0 = NUMERAL_BIT1 0) & |
17644 | 1588 |
(ALL (x::nat) xa::nat. EXP x (Suc xa) = x * EXP x xa)" |
1589 |
by (import hollight sth) |
|
1590 |
||
1591 |
lemma NUM_INTEGRAL_LEMMA: "(w::nat) = (x::nat) + (d::nat) & (y::nat) = (z::nat) + (e::nat) --> |
|
1592 |
(w * y + x * z = w * z + x * y) = (w = x | y = z)" |
|
1593 |
by (import hollight NUM_INTEGRAL_LEMMA) |
|
1594 |
||
17652 | 1595 |
lemma NUM_INTEGRAL: "(ALL x::nat. 0 * x = 0) & |
17644 | 1596 |
(ALL (x::nat) (xa::nat) xb::nat. (x + xa = x + xb) = (xa = xb)) & |
1597 |
(ALL (w::nat) (x::nat) (y::nat) z::nat. |
|
1598 |
(w * y + x * z = w * z + x * y) = (w = x | y = z))" |
|
1599 |
by (import hollight NUM_INTEGRAL) |
|
1600 |
||
1601 |
lemma INJ_INVERSE2: "ALL P::'A::type => 'B::type => 'C::type. |
|
1602 |
(ALL (x1::'A::type) (y1::'B::type) (x2::'A::type) y2::'B::type. |
|
1603 |
(P x1 y1 = P x2 y2) = (x1 = x2 & y1 = y2)) --> |
|
1604 |
(EX (x::'C::type => 'A::type) Y::'C::type => 'B::type. |
|
1605 |
ALL (xa::'A::type) y::'B::type. x (P xa y) = xa & Y (P xa y) = y)" |
|
1606 |
by (import hollight INJ_INVERSE2) |
|
1607 |
||
1608 |
constdefs |
|
1609 |
NUMPAIR :: "nat => nat => nat" |
|
1610 |
"NUMPAIR == |
|
1611 |
%(u::nat) ua::nat. |
|
17652 | 1612 |
EXP (NUMERAL_BIT0 (NUMERAL_BIT1 0)) u * |
1613 |
(NUMERAL_BIT0 (NUMERAL_BIT1 0) * ua + NUMERAL_BIT1 0)" |
|
17644 | 1614 |
|
1615 |
lemma DEF_NUMPAIR: "NUMPAIR = |
|
1616 |
(%(u::nat) ua::nat. |
|
17652 | 1617 |
EXP (NUMERAL_BIT0 (NUMERAL_BIT1 0)) u * |
1618 |
(NUMERAL_BIT0 (NUMERAL_BIT1 0) * ua + NUMERAL_BIT1 0))" |
|
17644 | 1619 |
by (import hollight DEF_NUMPAIR) |
1620 |
||
1621 |
lemma NUMPAIR_INJ_LEMMA: "ALL (x::nat) (xa::nat) (xb::nat) xc::nat. |
|
1622 |
NUMPAIR x xa = NUMPAIR xb xc --> x = xb" |
|
1623 |
by (import hollight NUMPAIR_INJ_LEMMA) |
|
1624 |
||
1625 |
lemma NUMPAIR_INJ: "ALL (x1::nat) (y1::nat) (x2::nat) y2::nat. |
|
1626 |
(NUMPAIR x1 y1 = NUMPAIR x2 y2) = (x1 = x2 & y1 = y2)" |
|
1627 |
by (import hollight NUMPAIR_INJ) |
|
1628 |
||
1629 |
constdefs |
|
1630 |
NUMFST :: "nat => nat" |
|
1631 |
"NUMFST == |
|
1632 |
SOME X::nat => nat. |
|
1633 |
EX Y::nat => nat. |
|
1634 |
ALL (x::nat) y::nat. X (NUMPAIR x y) = x & Y (NUMPAIR x y) = y" |
|
1635 |
||
1636 |
lemma DEF_NUMFST: "NUMFST = |
|
1637 |
(SOME X::nat => nat. |
|
1638 |
EX Y::nat => nat. |
|
1639 |
ALL (x::nat) y::nat. X (NUMPAIR x y) = x & Y (NUMPAIR x y) = y)" |
|
1640 |
by (import hollight DEF_NUMFST) |
|
1641 |
||
1642 |
constdefs |
|
1643 |
NUMSND :: "nat => nat" |
|
1644 |
"NUMSND == |
|
1645 |
SOME Y::nat => nat. |
|
1646 |
ALL (x::nat) y::nat. NUMFST (NUMPAIR x y) = x & Y (NUMPAIR x y) = y" |
|
1647 |
||
1648 |
lemma DEF_NUMSND: "NUMSND = |
|
1649 |
(SOME Y::nat => nat. |
|
1650 |
ALL (x::nat) y::nat. NUMFST (NUMPAIR x y) = x & Y (NUMPAIR x y) = y)" |
|
1651 |
by (import hollight DEF_NUMSND) |
|
1652 |
||
1653 |
constdefs |
|
1654 |
NUMSUM :: "bool => nat => nat" |
|
1655 |
"NUMSUM == |
|
1656 |
%(u::bool) ua::nat. |
|
17652 | 1657 |
COND u (Suc (NUMERAL_BIT0 (NUMERAL_BIT1 0) * ua)) |
1658 |
(NUMERAL_BIT0 (NUMERAL_BIT1 0) * ua)" |
|
17644 | 1659 |
|
1660 |
lemma DEF_NUMSUM: "NUMSUM = |
|
1661 |
(%(u::bool) ua::nat. |
|
17652 | 1662 |
COND u (Suc (NUMERAL_BIT0 (NUMERAL_BIT1 0) * ua)) |
1663 |
(NUMERAL_BIT0 (NUMERAL_BIT1 0) * ua))" |
|
17644 | 1664 |
by (import hollight DEF_NUMSUM) |
1665 |
||
1666 |
lemma NUMSUM_INJ: "ALL (b1::bool) (x1::nat) (b2::bool) x2::nat. |
|
1667 |
(NUMSUM b1 x1 = NUMSUM b2 x2) = (b1 = b2 & x1 = x2)" |
|
1668 |
by (import hollight NUMSUM_INJ) |
|
1669 |
||
1670 |
constdefs |
|
1671 |
NUMLEFT :: "nat => bool" |
|
1672 |
"NUMLEFT == |
|
1673 |
SOME X::nat => bool. |
|
1674 |
EX Y::nat => nat. |
|
1675 |
ALL (x::bool) y::nat. X (NUMSUM x y) = x & Y (NUMSUM x y) = y" |
|
1676 |
||
1677 |
lemma DEF_NUMLEFT: "NUMLEFT = |
|
1678 |
(SOME X::nat => bool. |
|
1679 |
EX Y::nat => nat. |
|
1680 |
ALL (x::bool) y::nat. X (NUMSUM x y) = x & Y (NUMSUM x y) = y)" |
|
1681 |
by (import hollight DEF_NUMLEFT) |
|
1682 |
||
1683 |
constdefs |
|
1684 |
NUMRIGHT :: "nat => nat" |
|
1685 |
"NUMRIGHT == |
|
1686 |
SOME Y::nat => nat. |
|
1687 |
ALL (x::bool) y::nat. NUMLEFT (NUMSUM x y) = x & Y (NUMSUM x y) = y" |
|
1688 |
||
1689 |
lemma DEF_NUMRIGHT: "NUMRIGHT = |
|
1690 |
(SOME Y::nat => nat. |
|
1691 |
ALL (x::bool) y::nat. NUMLEFT (NUMSUM x y) = x & Y (NUMSUM x y) = y)" |
|
1692 |
by (import hollight DEF_NUMRIGHT) |
|
1693 |
||
1694 |
constdefs |
|
17652 | 1695 |
INJN :: "nat => nat => 'A => bool" |
17644 | 1696 |
"INJN == %(u::nat) (n::nat) a::'A::type. n = u" |
1697 |
||
1698 |
lemma DEF_INJN: "INJN = (%(u::nat) (n::nat) a::'A::type. n = u)" |
|
1699 |
by (import hollight DEF_INJN) |
|
1700 |
||
1701 |
lemma INJN_INJ: "(All::(nat => bool) => bool) |
|
1702 |
(%n1::nat. |
|
1703 |
(All::(nat => bool) => bool) |
|
1704 |
(%n2::nat. |
|
1705 |
(op =::bool => bool => bool) |
|
1706 |
((op =::(nat => 'A::type => bool) |
|
1707 |
=> (nat => 'A::type => bool) => bool) |
|
1708 |
((INJN::nat => nat => 'A::type => bool) n1) |
|
1709 |
((INJN::nat => nat => 'A::type => bool) n2)) |
|
1710 |
((op =::nat => nat => bool) n1 n2)))" |
|
1711 |
by (import hollight INJN_INJ) |
|
1712 |
||
1713 |
constdefs |
|
17652 | 1714 |
INJA :: "'A => nat => 'A => bool" |
17644 | 1715 |
"INJA == %(u::'A::type) (n::nat) b::'A::type. b = u" |
1716 |
||
1717 |
lemma DEF_INJA: "INJA = (%(u::'A::type) (n::nat) b::'A::type. b = u)" |
|
1718 |
by (import hollight DEF_INJA) |
|
1719 |
||
1720 |
lemma INJA_INJ: "ALL (a1::'A::type) a2::'A::type. (INJA a1 = INJA a2) = (a1 = a2)" |
|
1721 |
by (import hollight INJA_INJ) |
|
1722 |
||
1723 |
constdefs |
|
17652 | 1724 |
INJF :: "(nat => nat => 'A => bool) => nat => 'A => bool" |
17644 | 1725 |
"INJF == %(u::nat => nat => 'A::type => bool) n::nat. u (NUMFST n) (NUMSND n)" |
1726 |
||
1727 |
lemma DEF_INJF: "INJF = |
|
1728 |
(%(u::nat => nat => 'A::type => bool) n::nat. u (NUMFST n) (NUMSND n))" |
|
1729 |
by (import hollight DEF_INJF) |
|
1730 |
||
1731 |
lemma INJF_INJ: "ALL (f1::nat => nat => 'A::type => bool) f2::nat => nat => 'A::type => bool. |
|
1732 |
(INJF f1 = INJF f2) = (f1 = f2)" |
|
1733 |
by (import hollight INJF_INJ) |
|
1734 |
||
1735 |
constdefs |
|
17652 | 1736 |
INJP :: "(nat => 'A => bool) => (nat => 'A => bool) => nat => 'A => bool" |
17644 | 1737 |
"INJP == |
1738 |
%(u::nat => 'A::type => bool) (ua::nat => 'A::type => bool) (n::nat) |
|
1739 |
a::'A::type. COND (NUMLEFT n) (u (NUMRIGHT n) a) (ua (NUMRIGHT n) a)" |
|
1740 |
||
1741 |
lemma DEF_INJP: "INJP = |
|
1742 |
(%(u::nat => 'A::type => bool) (ua::nat => 'A::type => bool) (n::nat) |
|
1743 |
a::'A::type. COND (NUMLEFT n) (u (NUMRIGHT n) a) (ua (NUMRIGHT n) a))" |
|
1744 |
by (import hollight DEF_INJP) |
|
1745 |
||
1746 |
lemma INJP_INJ: "ALL (f1::nat => 'A::type => bool) (f1'::nat => 'A::type => bool) |
|
1747 |
(f2::nat => 'A::type => bool) f2'::nat => 'A::type => bool. |
|
1748 |
(INJP f1 f2 = INJP f1' f2') = (f1 = f1' & f2 = f2')" |
|
1749 |
by (import hollight INJP_INJ) |
|
1750 |
||
1751 |
constdefs |
|
17652 | 1752 |
ZCONSTR :: "nat => 'A => (nat => nat => 'A => bool) => nat => 'A => bool" |
17644 | 1753 |
"ZCONSTR == |
1754 |
%(u::nat) (ua::'A::type) ub::nat => nat => 'A::type => bool. |
|
1755 |
INJP (INJN (Suc u)) (INJP (INJA ua) (INJF ub))" |
|
1756 |
||
1757 |
lemma DEF_ZCONSTR: "ZCONSTR = |
|
1758 |
(%(u::nat) (ua::'A::type) ub::nat => nat => 'A::type => bool. |
|
1759 |
INJP (INJN (Suc u)) (INJP (INJA ua) (INJF ub)))" |
|
1760 |
by (import hollight DEF_ZCONSTR) |
|
1761 |
||
1762 |
constdefs |
|
17652 | 1763 |
ZBOT :: "nat => 'A => bool" |
1764 |
"ZBOT == INJP (INJN 0) (SOME z::nat => 'A::type => bool. True)" |
|
1765 |
||
1766 |
lemma DEF_ZBOT: "ZBOT = INJP (INJN 0) (SOME z::nat => 'A::type => bool. True)" |
|
17644 | 1767 |
by (import hollight DEF_ZBOT) |
1768 |
||
1769 |
lemma ZCONSTR_ZBOT: "ALL (x::nat) (xa::'A::type) xb::nat => nat => 'A::type => bool. |
|
1770 |
ZCONSTR x xa xb ~= ZBOT" |
|
1771 |
by (import hollight ZCONSTR_ZBOT) |
|
1772 |
||
1773 |
constdefs |
|
17652 | 1774 |
ZRECSPACE :: "(nat => 'A => bool) => bool" |
17644 | 1775 |
"ZRECSPACE == |
1776 |
%a::nat => 'A::type => bool. |
|
1777 |
ALL ZRECSPACE'::(nat => 'A::type => bool) => bool. |
|
1778 |
(ALL a::nat => 'A::type => bool. |
|
1779 |
a = ZBOT | |
|
1780 |
(EX (c::nat) (i::'A::type) r::nat => nat => 'A::type => bool. |
|
1781 |
a = ZCONSTR c i r & (ALL n::nat. ZRECSPACE' (r n))) --> |
|
1782 |
ZRECSPACE' a) --> |
|
1783 |
ZRECSPACE' a" |
|
1784 |
||
1785 |
lemma DEF_ZRECSPACE: "ZRECSPACE = |
|
1786 |
(%a::nat => 'A::type => bool. |
|
1787 |
ALL ZRECSPACE'::(nat => 'A::type => bool) => bool. |
|
1788 |
(ALL a::nat => 'A::type => bool. |
|
1789 |
a = ZBOT | |
|
1790 |
(EX (c::nat) (i::'A::type) r::nat => nat => 'A::type => bool. |
|
1791 |
a = ZCONSTR c i r & (ALL n::nat. ZRECSPACE' (r n))) --> |
|
1792 |
ZRECSPACE' a) --> |
|
1793 |
ZRECSPACE' a)" |
|
1794 |
by (import hollight DEF_ZRECSPACE) |
|
1795 |
||
1796 |
typedef (open) ('A) recspace = "(Collect::((nat => 'A::type => bool) => bool) |
|
1797 |
=> (nat => 'A::type => bool) set) |
|
1798 |
(ZRECSPACE::(nat => 'A::type => bool) => bool)" morphisms "_dest_rec" "_mk_rec" |
|
1799 |
apply (rule light_ex_imp_nonempty[where t="ZBOT::nat => 'A::type => bool"]) |
|
1800 |
by (import hollight TYDEF_recspace) |
|
1801 |
||
1802 |
syntax |
|
1803 |
"_dest_rec" :: _ ("'_dest'_rec") |
|
1804 |
||
1805 |
syntax |
|
1806 |
"_mk_rec" :: _ ("'_mk'_rec") |
|
1807 |
||
1808 |
lemmas "TYDEF_recspace_@intern" = typedef_hol2hollight |
|
17652 | 1809 |
[where a="a :: 'A recspace" and r=r , |
17644 | 1810 |
OF type_definition_recspace] |
1811 |
||
1812 |
constdefs |
|
17652 | 1813 |
BOTTOM :: "'A recspace" |
1814 |
"(op ==::'A::type recspace => 'A::type recspace => prop) |
|
1815 |
(BOTTOM::'A::type recspace) |
|
1816 |
((_mk_rec::(nat => 'A::type => bool) => 'A::type recspace) |
|
1817 |
(ZBOT::nat => 'A::type => bool))" |
|
1818 |
||
1819 |
lemma DEF_BOTTOM: "(op =::'A::type recspace => 'A::type recspace => bool) |
|
1820 |
(BOTTOM::'A::type recspace) |
|
1821 |
((_mk_rec::(nat => 'A::type => bool) => 'A::type recspace) |
|
1822 |
(ZBOT::nat => 'A::type => bool))" |
|
17644 | 1823 |
by (import hollight DEF_BOTTOM) |
1824 |
||
1825 |
constdefs |
|
17652 | 1826 |
CONSTR :: "nat => 'A => (nat => 'A recspace) => 'A recspace" |
1827 |
"(op ==::(nat => 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1828 |
=> (nat |
|
1829 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1830 |
=> prop) |
|
1831 |
(CONSTR::nat |
|
1832 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1833 |
(%(u::nat) (ua::'A::type) ub::nat => 'A::type recspace. |
|
1834 |
(_mk_rec::(nat => 'A::type => bool) => 'A::type recspace) |
|
1835 |
((ZCONSTR::nat |
|
1836 |
=> 'A::type |
|
1837 |
=> (nat => nat => 'A::type => bool) |
|
1838 |
=> nat => 'A::type => bool) |
|
1839 |
u ua |
|
1840 |
(%n::nat. |
|
1841 |
(_dest_rec::'A::type recspace => nat => 'A::type => bool) |
|
1842 |
(ub n))))" |
|
1843 |
||
1844 |
lemma DEF_CONSTR: "(op =::(nat => 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1845 |
=> (nat |
|
1846 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1847 |
=> bool) |
|
1848 |
(CONSTR::nat |
|
1849 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1850 |
(%(u::nat) (ua::'A::type) ub::nat => 'A::type recspace. |
|
1851 |
(_mk_rec::(nat => 'A::type => bool) => 'A::type recspace) |
|
1852 |
((ZCONSTR::nat |
|
1853 |
=> 'A::type |
|
1854 |
=> (nat => nat => 'A::type => bool) |
|
1855 |
=> nat => 'A::type => bool) |
|
1856 |
u ua |
|
1857 |
(%n::nat. |
|
1858 |
(_dest_rec::'A::type recspace => nat => 'A::type => bool) |
|
1859 |
(ub n))))" |
|
17644 | 1860 |
by (import hollight DEF_CONSTR) |
1861 |
||
17652 | 1862 |
lemma MK_REC_INJ: "(All::((nat => 'A::type => bool) => bool) => bool) |
1863 |
(%x::nat => 'A::type => bool. |
|
1864 |
(All::((nat => 'A::type => bool) => bool) => bool) |
|
1865 |
(%y::nat => 'A::type => bool. |
|
1866 |
(op -->::bool => bool => bool) |
|
1867 |
((op =::'A::type recspace => 'A::type recspace => bool) |
|
1868 |
((_mk_rec::(nat => 'A::type => bool) => 'A::type recspace) x) |
|
1869 |
((_mk_rec::(nat => 'A::type => bool) => 'A::type recspace) y)) |
|
1870 |
((op -->::bool => bool => bool) |
|
1871 |
((op &::bool => bool => bool) |
|
1872 |
((ZRECSPACE::(nat => 'A::type => bool) => bool) x) |
|
1873 |
((ZRECSPACE::(nat => 'A::type => bool) => bool) y)) |
|
1874 |
((op =::(nat => 'A::type => bool) |
|
1875 |
=> (nat => 'A::type => bool) => bool) |
|
1876 |
x y))))" |
|
17644 | 1877 |
by (import hollight MK_REC_INJ) |
1878 |
||
1879 |
lemma CONSTR_BOT: "ALL (c::nat) (i::'A::type) r::nat => 'A::type recspace. |
|
1880 |
CONSTR c i r ~= BOTTOM" |
|
1881 |
by (import hollight CONSTR_BOT) |
|
1882 |
||
1883 |
lemma CONSTR_INJ: "ALL (c1::nat) (i1::'A::type) (r1::nat => 'A::type recspace) (c2::nat) |
|
1884 |
(i2::'A::type) r2::nat => 'A::type recspace. |
|
1885 |
(CONSTR c1 i1 r1 = CONSTR c2 i2 r2) = (c1 = c2 & i1 = i2 & r1 = r2)" |
|
1886 |
by (import hollight CONSTR_INJ) |
|
1887 |
||
1888 |
lemma CONSTR_IND: "ALL P::'A::type recspace => bool. |
|
1889 |
P BOTTOM & |
|
1890 |
(ALL (c::nat) (i::'A::type) r::nat => 'A::type recspace. |
|
1891 |
(ALL n::nat. P (r n)) --> P (CONSTR c i r)) --> |
|
1892 |
All P" |
|
1893 |
by (import hollight CONSTR_IND) |
|
1894 |
||
1895 |
lemma CONSTR_REC: "ALL Fn::nat |
|
1896 |
=> 'A::type |
|
1897 |
=> (nat => 'A::type recspace) => (nat => 'B::type) => 'B::type. |
|
1898 |
EX f::'A::type recspace => 'B::type. |
|
1899 |
ALL (c::nat) (i::'A::type) r::nat => 'A::type recspace. |
|
1900 |
f (CONSTR c i r) = Fn c i r (%n::nat. f (r n))" |
|
1901 |
by (import hollight CONSTR_REC) |
|
1902 |
||
1903 |
constdefs |
|
17652 | 1904 |
FCONS :: "'A => (nat => 'A) => nat => 'A" |
17644 | 1905 |
"FCONS == |
1906 |
SOME FCONS::'A::type => (nat => 'A::type) => nat => 'A::type. |
|
17652 | 1907 |
(ALL (a::'A::type) f::nat => 'A::type. FCONS a f 0 = a) & |
17644 | 1908 |
(ALL (a::'A::type) (f::nat => 'A::type) n::nat. FCONS a f (Suc n) = f n)" |
1909 |
||
1910 |
lemma DEF_FCONS: "FCONS = |
|
1911 |
(SOME FCONS::'A::type => (nat => 'A::type) => nat => 'A::type. |
|
17652 | 1912 |
(ALL (a::'A::type) f::nat => 'A::type. FCONS a f 0 = a) & |
17644 | 1913 |
(ALL (a::'A::type) (f::nat => 'A::type) n::nat. |
1914 |
FCONS a f (Suc n) = f n))" |
|
1915 |
by (import hollight DEF_FCONS) |
|
1916 |
||
17652 | 1917 |
lemma FCONS_UNDO: "ALL f::nat => 'A::type. f = FCONS (f 0) (f o Suc)" |
17644 | 1918 |
by (import hollight FCONS_UNDO) |
1919 |
||
1920 |
constdefs |
|
17652 | 1921 |
FNIL :: "nat => 'A" |
17644 | 1922 |
"FNIL == %u::nat. SOME x::'A::type. True" |
1923 |
||
1924 |
lemma DEF_FNIL: "FNIL = (%u::nat. SOME x::'A::type. True)" |
|
1925 |
by (import hollight DEF_FNIL) |
|
1926 |
||
1927 |
consts |
|
19093 | 1928 |
OUTL :: "'A + 'B => 'A" |
17644 | 1929 |
|
1930 |
defs |
|
1931 |
OUTL_def: "hollight.OUTL == |
|
19093 | 1932 |
SOME OUTL::'A::type + 'B::type => 'A::type. |
1933 |
ALL x::'A::type. OUTL (Inl x) = x" |
|
17644 | 1934 |
|
1935 |
lemma DEF_OUTL: "hollight.OUTL = |
|
19093 | 1936 |
(SOME OUTL::'A::type + 'B::type => 'A::type. |
1937 |
ALL x::'A::type. OUTL (Inl x) = x)" |
|
17644 | 1938 |
by (import hollight DEF_OUTL) |
1939 |
||
1940 |
consts |
|
19093 | 1941 |
OUTR :: "'A + 'B => 'B" |
17644 | 1942 |
|
1943 |
defs |
|
1944 |
OUTR_def: "hollight.OUTR == |
|
19093 | 1945 |
SOME OUTR::'A::type + 'B::type => 'B::type. |
1946 |
ALL y::'B::type. OUTR (Inr y) = y" |
|
17644 | 1947 |
|
1948 |
lemma DEF_OUTR: "hollight.OUTR = |
|
19093 | 1949 |
(SOME OUTR::'A::type + 'B::type => 'B::type. |
1950 |
ALL y::'B::type. OUTR (Inr y) = y)" |
|
17644 | 1951 |
by (import hollight DEF_OUTR) |
1952 |
||
1953 |
typedef (open) ('A) option = "(Collect::('A::type recspace => bool) => 'A::type recspace set) |
|
1954 |
(%a::'A::type recspace. |
|
1955 |
(All::(('A::type recspace => bool) => bool) => bool) |
|
1956 |
(%option'::'A::type recspace => bool. |
|
1957 |
(op -->::bool => bool => bool) |
|
1958 |
((All::('A::type recspace => bool) => bool) |
|
1959 |
(%a::'A::type recspace. |
|
1960 |
(op -->::bool => bool => bool) |
|
1961 |
((op |::bool => bool => bool) |
|
1962 |
((op =::'A::type recspace => 'A::type recspace => bool) |
|
1963 |
a ((CONSTR::nat |
|
1964 |
=> 'A::type |
|
1965 |
=> (nat => 'A::type recspace) |
|
1966 |
=> 'A::type recspace) |
|
1967 |
((NUMERAL::nat => nat) (0::nat)) |
|
1968 |
((Eps::('A::type => bool) => 'A::type) |
|
1969 |
(%v::'A::type. True::bool)) |
|
1970 |
(%n::nat. BOTTOM::'A::type recspace))) |
|
1971 |
((Ex::('A::type => bool) => bool) |
|
1972 |
(%aa::'A::type. |
|
1973 |
(op =::'A::type recspace |
|
1974 |
=> 'A::type recspace => bool) |
|
1975 |
a ((CONSTR::nat |
|
1976 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1977 |
((Suc::nat => nat) |
|
1978 |
((NUMERAL::nat => nat) (0::nat))) |
|
1979 |
aa (%n::nat. BOTTOM::'A::type recspace))))) |
|
1980 |
(option' a))) |
|
1981 |
(option' a)))" morphisms "_dest_option" "_mk_option" |
|
1982 |
apply (rule light_ex_imp_nonempty[where t="(CONSTR::nat => 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
1983 |
((NUMERAL::nat => nat) (0::nat)) |
|
1984 |
((Eps::('A::type => bool) => 'A::type) (%v::'A::type. True::bool)) |
|
1985 |
(%n::nat. BOTTOM::'A::type recspace)"]) |
|
1986 |
by (import hollight TYDEF_option) |
|
1987 |
||
1988 |
syntax |
|
1989 |
"_dest_option" :: _ ("'_dest'_option") |
|
1990 |
||
1991 |
syntax |
|
1992 |
"_mk_option" :: _ ("'_mk'_option") |
|
1993 |
||
1994 |
lemmas "TYDEF_option_@intern" = typedef_hol2hollight |
|
17652 | 1995 |
[where a="a :: 'A hollight.option" and r=r , |
17644 | 1996 |
OF type_definition_option] |
1997 |
||
1998 |
constdefs |
|
17652 | 1999 |
NONE :: "'A hollight.option" |
2000 |
"(op ==::'A::type hollight.option => 'A::type hollight.option => prop) |
|
2001 |
(NONE::'A::type hollight.option) |
|
2002 |
((_mk_option::'A::type recspace => 'A::type hollight.option) |
|
2003 |
((CONSTR::nat |
|
2004 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
2005 |
(0::nat) |
|
2006 |
((Eps::('A::type => bool) => 'A::type) (%v::'A::type. True::bool)) |
|
2007 |
(%n::nat. BOTTOM::'A::type recspace)))" |
|
2008 |
||
2009 |
lemma DEF_NONE: "(op =::'A::type hollight.option => 'A::type hollight.option => bool) |
|
2010 |
(NONE::'A::type hollight.option) |
|
2011 |
((_mk_option::'A::type recspace => 'A::type hollight.option) |
|
2012 |
((CONSTR::nat |
|
2013 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
2014 |
(0::nat) |
|
2015 |
((Eps::('A::type => bool) => 'A::type) (%v::'A::type. True::bool)) |
|
2016 |
(%n::nat. BOTTOM::'A::type recspace)))" |
|
17644 | 2017 |
by (import hollight DEF_NONE) |
2018 |
||
2019 |
consts |
|
17652 | 2020 |
SOME :: "'A => 'A hollight.option" ("SOME") |
17644 | 2021 |
|
2022 |
defs |
|
17652 | 2023 |
SOME_def: "(op ==::('A::type => 'A::type hollight.option) |
2024 |
=> ('A::type => 'A::type hollight.option) => prop) |
|
2025 |
(SOME::'A::type => 'A::type hollight.option) |
|
2026 |
(%a::'A::type. |
|
2027 |
(_mk_option::'A::type recspace => 'A::type hollight.option) |
|
2028 |
((CONSTR::nat |
|
2029 |
=> 'A::type |
|
2030 |
=> (nat => 'A::type recspace) => 'A::type recspace) |
|
2031 |
((Suc::nat => nat) (0::nat)) a |
|
2032 |
(%n::nat. BOTTOM::'A::type recspace)))" |
|
2033 |
||
2034 |
lemma DEF_SOME: "(op =::('A::type => 'A::type hollight.option) |
|
2035 |
=> ('A::type => 'A::type hollight.option) => bool) |
|
2036 |
(SOME::'A::type => 'A::type hollight.option) |
|
2037 |
(%a::'A::type. |
|
2038 |
(_mk_option::'A::type recspace => 'A::type hollight.option) |
|
2039 |
((CONSTR::nat |
|
2040 |
=> 'A::type |
|
2041 |
=> (nat => 'A::type recspace) => 'A::type recspace) |
|
2042 |
((Suc::nat => nat) (0::nat)) a |
|
2043 |
(%n::nat. BOTTOM::'A::type recspace)))" |
|
17644 | 2044 |
by (import hollight DEF_SOME) |
2045 |
||
2046 |
typedef (open) ('A) list = "(Collect::('A::type recspace => bool) => 'A::type recspace set) |
|
2047 |
(%a::'A::type recspace. |
|
2048 |
(All::(('A::type recspace => bool) => bool) => bool) |
|
2049 |
(%list'::'A::type recspace => bool. |
|
2050 |
(op -->::bool => bool => bool) |
|
2051 |
((All::('A::type recspace => bool) => bool) |
|
2052 |
(%a::'A::type recspace. |
|
2053 |
(op -->::bool => bool => bool) |
|
2054 |
((op |::bool => bool => bool) |
|
2055 |
((op =::'A::type recspace => 'A::type recspace => bool) |
|
2056 |
a ((CONSTR::nat |
|
2057 |
=> 'A::type |
|
2058 |
=> (nat => 'A::type recspace) |
|
2059 |
=> 'A::type recspace) |
|
2060 |
((NUMERAL::nat => nat) (0::nat)) |
|
2061 |
((Eps::('A::type => bool) => 'A::type) |
|
2062 |
(%v::'A::type. True::bool)) |
|
2063 |
(%n::nat. BOTTOM::'A::type recspace))) |
|
2064 |
((Ex::('A::type => bool) => bool) |
|
2065 |
(%a0::'A::type. |
|
2066 |
(Ex::('A::type recspace => bool) => bool) |
|
2067 |
(%a1::'A::type recspace. |
|
2068 |
(op &::bool => bool => bool) |
|
2069 |
((op =::'A::type recspace |
|
2070 |
=> 'A::type recspace => bool) |
|
2071 |
a ((CONSTR::nat |
|
2072 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
2073 |
((Suc::nat => nat) ((NUMERAL::nat => nat) (0::nat))) a0 |
|
2074 |
((FCONS::'A::type recspace |
|
2075 |
=> (nat => 'A::type recspace) => nat => 'A::type recspace) |
|
2076 |
a1 (%n::nat. BOTTOM::'A::type recspace)))) |
|
2077 |
(list' a1))))) |
|
2078 |
(list' a))) |
|
2079 |
(list' a)))" morphisms "_dest_list" "_mk_list" |
|
2080 |
apply (rule light_ex_imp_nonempty[where t="(CONSTR::nat => 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
2081 |
((NUMERAL::nat => nat) (0::nat)) |
|
2082 |
((Eps::('A::type => bool) => 'A::type) (%v::'A::type. True::bool)) |
|
2083 |
(%n::nat. BOTTOM::'A::type recspace)"]) |
|
2084 |
by (import hollight TYDEF_list) |
|
2085 |
||
2086 |
syntax |
|
2087 |
"_dest_list" :: _ ("'_dest'_list") |
|
2088 |
||
2089 |
syntax |
|
2090 |
"_mk_list" :: _ ("'_mk'_list") |
|
2091 |
||
2092 |
lemmas "TYDEF_list_@intern" = typedef_hol2hollight |
|
17652 | 2093 |
[where a="a :: 'A hollight.list" and r=r , |
17644 | 2094 |
OF type_definition_list] |
2095 |
||
2096 |
constdefs |
|
17652 | 2097 |
NIL :: "'A hollight.list" |
2098 |
"(op ==::'A::type hollight.list => 'A::type hollight.list => prop) |
|
2099 |
(NIL::'A::type hollight.list) |
|
2100 |
((_mk_list::'A::type recspace => 'A::type hollight.list) |
|
2101 |
((CONSTR::nat |
|
2102 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
2103 |
(0::nat) |
|
2104 |
((Eps::('A::type => bool) => 'A::type) (%v::'A::type. True::bool)) |
|
2105 |
(%n::nat. BOTTOM::'A::type recspace)))" |
|
2106 |
||
2107 |
lemma DEF_NIL: "(op =::'A::type hollight.list => 'A::type hollight.list => bool) |
|
2108 |
(NIL::'A::type hollight.list) |
|
2109 |
((_mk_list::'A::type recspace => 'A::type hollight.list) |
|
2110 |
((CONSTR::nat |
|
2111 |
=> 'A::type => (nat => 'A::type recspace) => 'A::type recspace) |
|
2112 |
(0::nat) |
|
2113 |
((Eps::('A::type => bool) => 'A::type) (%v::'A::type. True::bool)) |
|
2114 |
(%n::nat. BOTTOM::'A::type recspace)))" |
|
17644 | 2115 |
by (import hollight DEF_NIL) |
2116 |
||
2117 |
constdefs |
|
17652 | 2118 |
CONS :: "'A => 'A hollight.list => 'A hollight.list" |
2119 |
"(op ==::('A::type => 'A::type hollight.list => 'A::type hollight.list) |
|
2120 |
=> ('A::type => 'A::type hollight.list => 'A::type hollight.list) |
|
2121 |
=> prop) |
|
2122 |
(CONS::'A::type => 'A::type hollight.list => 'A::type hollight.list) |
|
2123 |
(%(a0::'A::type) a1::'A::type hollight.list. |
|
2124 |
(_mk_list::'A::type recspace => 'A::type hollight.list) |
|
2125 |
((CONSTR::nat |
|
2126 |
=> 'A::type |
|
2127 |
=> (nat => 'A::type recspace) => 'A::type recspace) |
|
2128 |
((Suc::nat => nat) (0::nat)) a0 |
|
2129 |
((FCONS::'A::type recspace |
|
2130 |
=> (nat => 'A::type recspace) => nat => 'A::type recspace) |
|
2131 |
((_dest_list::'A::type hollight.list => 'A::type recspace) a1) |
|
2132 |
(%n::nat. BOTTOM::'A::type recspace))))" |
|
2133 |
||
2134 |
lemma DEF_CONS: "(op =::('A::type => 'A::type hollight.list => 'A::type hollight.list) |
|
2135 |
=> ('A::type => 'A::type hollight.list => 'A::type hollight.list) |
|
2136 |
=> bool) |
|
2137 |
(CONS::'A::type => 'A::type hollight.list => 'A::type hollight.list) |
|
2138 |
(%(a0::'A::type) a1::'A::type hollight.list. |
|
2139 |
(_mk_list::'A::type recspace => 'A::type hollight.list) |
|
2140 |
((CONSTR::nat |
|
2141 |
=> 'A::type |
|
2142 |
=> (nat => 'A::type recspace) => 'A::type recspace) |
|
2143 |
((Suc::nat => nat) (0::nat)) a0 |
|
2144 |
((FCONS::'A::type recspace |
|
2145 |
=> (nat => 'A::type recspace) => nat => 'A::type recspace) |
|
2146 |
((_dest_list::'A::type hollight.list => 'A::type recspace) a1) |
|
2147 |
(%n::nat. BOTTOM::'A::type recspace))))" |
|
17644 | 2148 |
by (import hollight DEF_CONS) |
2149 |
||
2150 |
lemma pair_RECURSION: "ALL PAIR'::'A::type => 'B::type => 'C::type. |
|
2151 |
EX x::'A::type * 'B::type => 'C::type. |
|
2152 |
ALL (a0::'A::type) a1::'B::type. x (a0, a1) = PAIR' a0 a1" |
|
2153 |
by (import hollight pair_RECURSION) |
|
2154 |
||
2155 |
lemma num_RECURSION_STD: "ALL (e::'Z::type) f::nat => 'Z::type => 'Z::type. |
|
17652 | 2156 |
EX fn::nat => 'Z::type. fn 0 = e & (ALL n::nat. fn (Suc n) = f n (fn n))" |
17644 | 2157 |
by (import hollight num_RECURSION_STD) |
2158 |
||
19093 | 2159 |
lemma bool_RECURSION: "ALL (a::'A::type) b::'A::type. |
2160 |
EX x::bool => 'A::type. x False = a & x True = b" |
|
2161 |
by (import hollight bool_RECURSION) |
|
2162 |
||
17644 | 2163 |
constdefs |
17652 | 2164 |
ISO :: "('A => 'B) => ('B => 'A) => bool" |
17644 | 2165 |
"ISO == |
2166 |
%(u::'A::type => 'B::type) ua::'B::type => 'A::type. |
|
2167 |
(ALL x::'B::type. u (ua x) = x) & (ALL y::'A::type. ua (u y) = y)" |
|
2168 |
||
2169 |
lemma DEF_ISO: "ISO = |
|
2170 |
(%(u::'A::type => 'B::type) ua::'B::type => 'A::type. |
|
2171 |
(ALL x::'B::type. u (ua x) = x) & (ALL y::'A::type. ua (u y) = y))" |
|
2172 |
by (import hollight DEF_ISO) |
|
2173 |
||
2174 |
lemma ISO_REFL: "ISO (%x::'A::type. x) (%x::'A::type. x)" |
|
2175 |
by (import hollight ISO_REFL) |
|
2176 |
||
2177 |
lemma ISO_FUN: "ISO (f::'A::type => 'A'::type) (f'::'A'::type => 'A::type) & |
|
2178 |
ISO (g::'B::type => 'B'::type) (g'::'B'::type => 'B::type) --> |
|
2179 |
ISO (%(h::'A::type => 'B::type) a'::'A'::type. g (h (f' a'))) |
|
2180 |
(%(h::'A'::type => 'B'::type) a::'A::type. g' (h (f a)))" |
|
2181 |
by (import hollight ISO_FUN) |
|
2182 |
||
19093 | 2183 |
lemma ISO_USAGE: "ISO (f::'q_16636::type => 'q_16633::type) |
2184 |
(g::'q_16633::type => 'q_16636::type) --> |
|
2185 |
(ALL P::'q_16636::type => bool. All P = (ALL x::'q_16633::type. P (g x))) & |
|
2186 |
(ALL P::'q_16636::type => bool. Ex P = (EX x::'q_16633::type. P (g x))) & |
|
2187 |
(ALL (a::'q_16636::type) b::'q_16633::type. (a = g b) = (f a = b))" |
|
17644 | 2188 |
by (import hollight ISO_USAGE) |
2189 |
||
2190 |
typedef (open) N_2 = "{a::bool recspace. |
|
2191 |
ALL u::bool recspace => bool. |
|
2192 |
(ALL a::bool recspace. |
|
17652 | 2193 |
a = CONSTR (NUMERAL 0) (SOME x::bool. True) (%n::nat. BOTTOM) | |
17644 | 2194 |
a = |
17652 | 2195 |
CONSTR (Suc (NUMERAL 0)) (SOME x::bool. True) (%n::nat. BOTTOM) --> |
17644 | 2196 |
u a) --> |
2197 |
u a}" morphisms "_dest_2" "_mk_2" |
|
17652 | 2198 |
apply (rule light_ex_imp_nonempty[where t="CONSTR (NUMERAL 0) (SOME x::bool. True) (%n::nat. BOTTOM)"]) |
17644 | 2199 |
by (import hollight TYDEF_2) |
2200 |
||
2201 |
syntax |
|
2202 |
"_dest_2" :: _ ("'_dest'_2") |
|
2203 |
||
2204 |
syntax |
|
2205 |
"_mk_2" :: _ ("'_mk'_2") |
|
2206 |
||
2207 |
lemmas "TYDEF_2_@intern" = typedef_hol2hollight |
|
2208 |
[where a="a :: N_2" and r=r , |
|
2209 |
OF type_definition_N_2] |
|
2210 |
||
2211 |
consts |
|
19093 | 2212 |
"_10302" :: "N_2" ("'_10302") |
17644 | 2213 |
|
2214 |
defs |
|
19093 | 2215 |
"_10302_def": "(op ==::N_2 => N_2 => prop) (_10302::N_2) |
17652 | 2216 |
((_mk_2::bool recspace => N_2) |
2217 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2218 |
(0::nat) ((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2219 |
(%n::nat. BOTTOM::bool recspace)))" |
|
2220 |
||
19093 | 2221 |
lemma DEF__10302: "(op =::N_2 => N_2 => bool) (_10302::N_2) |
17652 | 2222 |
((_mk_2::bool recspace => N_2) |
2223 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2224 |
(0::nat) ((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2225 |
(%n::nat. BOTTOM::bool recspace)))" |
|
19093 | 2226 |
by (import hollight DEF__10302) |
17644 | 2227 |
|
2228 |
consts |
|
19093 | 2229 |
"_10303" :: "N_2" ("'_10303") |
17644 | 2230 |
|
2231 |
defs |
|
19093 | 2232 |
"_10303_def": "(op ==::N_2 => N_2 => prop) (_10303::N_2) |
17652 | 2233 |
((_mk_2::bool recspace => N_2) |
2234 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2235 |
((Suc::nat => nat) (0::nat)) |
|
2236 |
((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2237 |
(%n::nat. BOTTOM::bool recspace)))" |
|
2238 |
||
19093 | 2239 |
lemma DEF__10303: "(op =::N_2 => N_2 => bool) (_10303::N_2) |
17652 | 2240 |
((_mk_2::bool recspace => N_2) |
2241 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2242 |
((Suc::nat => nat) (0::nat)) |
|
2243 |
((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2244 |
(%n::nat. BOTTOM::bool recspace)))" |
|
19093 | 2245 |
by (import hollight DEF__10303) |
17644 | 2246 |
|
2247 |
constdefs |
|
2248 |
two_1 :: "N_2" |
|
19093 | 2249 |
"two_1 == _10302" |
2250 |
||
2251 |
lemma DEF_two_1: "two_1 = _10302" |
|
17644 | 2252 |
by (import hollight DEF_two_1) |
2253 |
||
2254 |
constdefs |
|
2255 |
two_2 :: "N_2" |
|
19093 | 2256 |
"two_2 == _10303" |
2257 |
||
2258 |
lemma DEF_two_2: "two_2 = _10303" |
|
17644 | 2259 |
by (import hollight DEF_two_2) |
2260 |
||
2261 |
typedef (open) N_3 = "{a::bool recspace. |
|
2262 |
ALL u::bool recspace => bool. |
|
2263 |
(ALL a::bool recspace. |
|
17652 | 2264 |
a = CONSTR (NUMERAL 0) (SOME x::bool. True) (%n::nat. BOTTOM) | |
17644 | 2265 |
a = |
17652 | 2266 |
CONSTR (Suc (NUMERAL 0)) (SOME x::bool. True) (%n::nat. BOTTOM) | |
17644 | 2267 |
a = |
17652 | 2268 |
CONSTR (Suc (Suc (NUMERAL 0))) (SOME x::bool. True) |
17644 | 2269 |
(%n::nat. BOTTOM) --> |
2270 |
u a) --> |
|
2271 |
u a}" morphisms "_dest_3" "_mk_3" |
|
17652 | 2272 |
apply (rule light_ex_imp_nonempty[where t="CONSTR (NUMERAL 0) (SOME x::bool. True) (%n::nat. BOTTOM)"]) |
17644 | 2273 |
by (import hollight TYDEF_3) |
2274 |
||
2275 |
syntax |
|
2276 |
"_dest_3" :: _ ("'_dest'_3") |
|
2277 |
||
2278 |
syntax |
|
2279 |
"_mk_3" :: _ ("'_mk'_3") |
|
2280 |
||
2281 |
lemmas "TYDEF_3_@intern" = typedef_hol2hollight |
|
2282 |
[where a="a :: N_3" and r=r , |
|
2283 |
OF type_definition_N_3] |
|
2284 |
||
2285 |
consts |
|
19093 | 2286 |
"_10326" :: "N_3" ("'_10326") |
17644 | 2287 |
|
2288 |
defs |
|
19093 | 2289 |
"_10326_def": "(op ==::N_3 => N_3 => prop) (_10326::N_3) |
17652 | 2290 |
((_mk_3::bool recspace => N_3) |
2291 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2292 |
(0::nat) ((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2293 |
(%n::nat. BOTTOM::bool recspace)))" |
|
2294 |
||
19093 | 2295 |
lemma DEF__10326: "(op =::N_3 => N_3 => bool) (_10326::N_3) |
17652 | 2296 |
((_mk_3::bool recspace => N_3) |
2297 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2298 |
(0::nat) ((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2299 |
(%n::nat. BOTTOM::bool recspace)))" |
|
19093 | 2300 |
by (import hollight DEF__10326) |
17644 | 2301 |
|
2302 |
consts |
|
19093 | 2303 |
"_10327" :: "N_3" ("'_10327") |
17644 | 2304 |
|
2305 |
defs |
|
19093 | 2306 |
"_10327_def": "(op ==::N_3 => N_3 => prop) (_10327::N_3) |
17652 | 2307 |
((_mk_3::bool recspace => N_3) |
2308 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2309 |
((Suc::nat => nat) (0::nat)) |
|
2310 |
((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2311 |
(%n::nat. BOTTOM::bool recspace)))" |
|
2312 |
||
19093 | 2313 |
lemma DEF__10327: "(op =::N_3 => N_3 => bool) (_10327::N_3) |
17652 | 2314 |
((_mk_3::bool recspace => N_3) |
2315 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2316 |
((Suc::nat => nat) (0::nat)) |
|
2317 |
((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2318 |
(%n::nat. BOTTOM::bool recspace)))" |
|
19093 | 2319 |
by (import hollight DEF__10327) |
17644 | 2320 |
|
2321 |
consts |
|
19093 | 2322 |
"_10328" :: "N_3" ("'_10328") |
17644 | 2323 |
|
2324 |
defs |
|
19093 | 2325 |
"_10328_def": "(op ==::N_3 => N_3 => prop) (_10328::N_3) |
17652 | 2326 |
((_mk_3::bool recspace => N_3) |
2327 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2328 |
((Suc::nat => nat) ((Suc::nat => nat) (0::nat))) |
|
2329 |
((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2330 |
(%n::nat. BOTTOM::bool recspace)))" |
|
2331 |
||
19093 | 2332 |
lemma DEF__10328: "(op =::N_3 => N_3 => bool) (_10328::N_3) |
17652 | 2333 |
((_mk_3::bool recspace => N_3) |
2334 |
((CONSTR::nat => bool => (nat => bool recspace) => bool recspace) |
|
2335 |
((Suc::nat => nat) ((Suc::nat => nat) (0::nat))) |
|
2336 |
((Eps::(bool => bool) => bool) (%x::bool. True::bool)) |
|
2337 |
(%n::nat. BOTTOM::bool recspace)))" |
|
19093 | 2338 |
by (import hollight DEF__10328) |
17644 | 2339 |
|
2340 |
constdefs |
|
2341 |
three_1 :: "N_3" |
|
19093 | 2342 |
"three_1 == _10326" |
2343 |
||
2344 |
lemma DEF_three_1: "three_1 = _10326" |
|
17644 | 2345 |
by (import hollight DEF_three_1) |
2346 |
||
2347 |
constdefs |
|
2348 |
three_2 :: "N_3" |
|
19093 | 2349 |
"three_2 == _10327" |
2350 |
||
2351 |
lemma DEF_three_2: "three_2 = _10327" |
|
17644 | 2352 |
by (import hollight DEF_three_2) |
2353 |
||
2354 |
constdefs |
|
2355 |
three_3 :: "N_3" |
|
19093 | 2356 |
"three_3 == _10328" |
2357 |
||
2358 |
lemma DEF_three_3: "three_3 = _10328" |
|
17644 | 2359 |
by (import hollight DEF_three_3) |
2360 |
||
2361 |
lemma list_INDUCT: "ALL P::'A::type hollight.list => bool. |
|
2362 |
P NIL & |
|
2363 |
(ALL (a0::'A::type) a1::'A::type hollight.list. |
|
2364 |
P a1 --> P (CONS a0 a1)) --> |
|
2365 |
All P" |
|
2366 |
by (import hollight list_INDUCT) |
|
2367 |
||
2368 |
constdefs |
|
17652 | 2369 |
HD :: "'A hollight.list => 'A" |
17644 | 2370 |
"HD == |
2371 |
SOME HD::'A::type hollight.list => 'A::type. |
|
2372 |
ALL (t::'A::type hollight.list) h::'A::type. HD (CONS h t) = h" |
|
2373 |
||
2374 |
lemma DEF_HD: "HD = |
|
2375 |
(SOME HD::'A::type hollight.list => 'A::type. |
|
2376 |
ALL (t::'A::type hollight.list) h::'A::type. HD (CONS h t) = h)" |
|
2377 |
by (import hollight DEF_HD) |
|
2378 |
||
2379 |
constdefs |
|
17652 | 2380 |
TL :: "'A hollight.list => 'A hollight.list" |
17644 | 2381 |
"TL == |
2382 |
SOME TL::'A::type hollight.list => 'A::type hollight.list. |
|
2383 |
ALL (h::'A::type) t::'A::type hollight.list. TL (CONS h t) = t" |
|
2384 |
||
2385 |
lemma DEF_TL: "TL = |
|
2386 |
(SOME TL::'A::type hollight.list => 'A::type hollight.list. |
|
2387 |
ALL (h::'A::type) t::'A::type hollight.list. TL (CONS h t) = t)" |
|
2388 |
by (import hollight DEF_TL) |
|
2389 |
||
2390 |
constdefs |
|
17652 | 2391 |
APPEND :: "'A hollight.list => 'A hollight.list => 'A hollight.list" |
17644 | 2392 |
"APPEND == |
2393 |
SOME APPEND::'A::type hollight.list |
|
2394 |
=> 'A::type hollight.list => 'A::type hollight.list. |
|
2395 |
(ALL l::'A::type hollight.list. APPEND NIL l = l) & |
|
2396 |
(ALL (h::'A::type) (t::'A::type hollight.list) l::'A::type hollight.list. |
|
2397 |
APPEND (CONS h t) l = CONS h (APPEND t l))" |
|
2398 |
||
2399 |
lemma DEF_APPEND: "APPEND = |
|
2400 |
(SOME APPEND::'A::type hollight.list |
|
2401 |
=> 'A::type hollight.list => 'A::type hollight.list. |
|
2402 |
(ALL l::'A::type hollight.list. APPEND NIL l = l) & |
|
2403 |
(ALL (h::'A::type) (t::'A::type hollight.list) |
|
2404 |
l::'A::type hollight.list. |
|
2405 |
APPEND (CONS h t) l = CONS h (APPEND t l)))" |
|
2406 |
by (import hollight DEF_APPEND) |
|
2407 |
||
2408 |
constdefs |
|
17652 | 2409 |
REVERSE :: "'A hollight.list => 'A hollight.list" |
17644 | 2410 |
"REVERSE == |
2411 |
SOME REVERSE::'A::type hollight.list => 'A::type hollight.list. |
|
2412 |
REVERSE NIL = NIL & |
|
2413 |
(ALL (l::'A::type hollight.list) x::'A::type. |
|
2414 |
REVERSE (CONS x l) = APPEND (REVERSE l) (CONS x NIL))" |
|
2415 |
||
2416 |
lemma DEF_REVERSE: "REVERSE = |
|
2417 |
(SOME REVERSE::'A::type hollight.list => 'A::type hollight.list. |
|
2418 |
REVERSE NIL = NIL & |
|
2419 |
(ALL (l::'A::type hollight.list) x::'A::type. |
|
2420 |
REVERSE (CONS x l) = APPEND (REVERSE l) (CONS x NIL)))" |
|
2421 |
by (import hollight DEF_REVERSE) |
|
2422 |
||
2423 |
constdefs |
|
17652 | 2424 |
LENGTH :: "'A hollight.list => nat" |
17644 | 2425 |
"LENGTH == |
2426 |
SOME LENGTH::'A::type hollight.list => nat. |
|
17652 | 2427 |
LENGTH NIL = 0 & |
17644 | 2428 |
(ALL (h::'A::type) t::'A::type hollight.list. |
2429 |
LENGTH (CONS h t) = Suc (LENGTH t))" |
|
2430 |
||
2431 |
lemma DEF_LENGTH: "LENGTH = |
|
2432 |
(SOME LENGTH::'A::type hollight.list => nat. |
|
17652 | 2433 |
LENGTH NIL = 0 & |
17644 | 2434 |
(ALL (h::'A::type) t::'A::type hollight.list. |
2435 |
LENGTH (CONS h t) = Suc (LENGTH t)))" |
|
2436 |
by (import hollight DEF_LENGTH) |
|
2437 |
||
2438 |
constdefs |
|
17652 | 2439 |
MAP :: "('A => 'B) => 'A hollight.list => 'B hollight.list" |
17644 | 2440 |
"MAP == |
2441 |
SOME MAP::('A::type => 'B::type) |
|
2442 |
=> 'A::type hollight.list => 'B::type hollight.list. |
|
2443 |
(ALL f::'A::type => 'B::type. MAP f NIL = NIL) & |
|
2444 |
(ALL (f::'A::type => 'B::type) (h::'A::type) t::'A::type hollight.list. |
|
2445 |
MAP f (CONS h t) = CONS (f h) (MAP f t))" |
|
2446 |
||
2447 |
lemma DEF_MAP: "MAP = |
|
2448 |
(SOME MAP::('A::type => 'B::type) |
|
2449 |
=> 'A::type hollight.list => 'B::type hollight.list. |
|
2450 |
(ALL f::'A::type => 'B::type. MAP f NIL = NIL) & |
|
2451 |
(ALL (f::'A::type => 'B::type) (h::'A::type) t::'A::type hollight.list. |
|
2452 |
MAP f (CONS h t) = CONS (f h) (MAP f t)))" |
|
2453 |
by (import hollight DEF_MAP) |
|
2454 |
||
2455 |
constdefs |
|
17652 | 2456 |
LAST :: "'A hollight.list => 'A" |
17644 | 2457 |
"LAST == |
2458 |
SOME LAST::'A::type hollight.list => 'A::type. |
|
2459 |
ALL (h::'A::type) t::'A::type hollight.list. |
|
2460 |
LAST (CONS h t) = COND (t = NIL) h (LAST t)" |
|
2461 |
||
2462 |
lemma DEF_LAST: "LAST = |
|
2463 |
(SOME LAST::'A::type hollight.list => 'A::type. |
|
2464 |
ALL (h::'A::type) t::'A::type hollight.list. |
|
2465 |
LAST (CONS h t) = COND (t = NIL) h (LAST t))" |
|
2466 |
by (import hollight DEF_LAST) |
|
2467 |
||
2468 |
constdefs |
|
19093 | 2469 |
REPLICATE :: "nat => 'q_16860 => 'q_16860 hollight.list" |
17644 | 2470 |
"REPLICATE == |
19093 | 2471 |
SOME REPLICATE::nat => 'q_16860::type => 'q_16860::type hollight.list. |
2472 |
(ALL x::'q_16860::type. REPLICATE 0 x = NIL) & |
|
2473 |
(ALL (n::nat) x::'q_16860::type. |
|
17644 | 2474 |
REPLICATE (Suc n) x = CONS x (REPLICATE n x))" |
2475 |
||
2476 |
lemma DEF_REPLICATE: "REPLICATE = |
|
19093 | 2477 |
(SOME REPLICATE::nat => 'q_16860::type => 'q_16860::type hollight.list. |
2478 |
(ALL x::'q_16860::type. REPLICATE 0 x = NIL) & |
|
2479 |
(ALL (n::nat) x::'q_16860::type. |
|
17644 | 2480 |
REPLICATE (Suc n) x = CONS x (REPLICATE n x)))" |
2481 |
by (import hollight DEF_REPLICATE) |
|
2482 |
||
2483 |
constdefs |
|
19093 | 2484 |
NULL :: "'q_16875 hollight.list => bool" |
17644 | 2485 |
"NULL == |
19093 | 2486 |
SOME NULL::'q_16875::type hollight.list => bool. |
17644 | 2487 |
NULL NIL = True & |
19093 | 2488 |
(ALL (h::'q_16875::type) t::'q_16875::type hollight.list. |
17644 | 2489 |
NULL (CONS h t) = False)" |
2490 |
||
2491 |
lemma DEF_NULL: "NULL = |
|
19093 | 2492 |
(SOME NULL::'q_16875::type hollight.list => bool. |
17644 | 2493 |
NULL NIL = True & |
19093 | 2494 |
(ALL (h::'q_16875::type) t::'q_16875::type hollight.list. |
17644 | 2495 |
NULL (CONS h t) = False))" |
2496 |
by (import hollight DEF_NULL) |
|
2497 |
||
2498 |
constdefs |
|
19093 | 2499 |
ALL_list :: "('q_16895 => bool) => 'q_16895 hollight.list => bool" |
17644 | 2500 |
"ALL_list == |
19093 | 2501 |
SOME u::('q_16895::type => bool) => 'q_16895::type hollight.list => bool. |
2502 |
(ALL P::'q_16895::type => bool. u P NIL = True) & |
|
2503 |
(ALL (h::'q_16895::type) (P::'q_16895::type => bool) |
|
2504 |
t::'q_16895::type hollight.list. u P (CONS h t) = (P h & u P t))" |
|
17644 | 2505 |
|
2506 |
lemma DEF_ALL: "ALL_list = |
|
19093 | 2507 |
(SOME u::('q_16895::type => bool) => 'q_16895::type hollight.list => bool. |
2508 |
(ALL P::'q_16895::type => bool. u P NIL = True) & |
|
2509 |
(ALL (h::'q_16895::type) (P::'q_16895::type => bool) |
|
2510 |
t::'q_16895::type hollight.list. u P (CONS h t) = (P h & u P t)))" |
|
17644 | 2511 |
by (import hollight DEF_ALL) |
2512 |
||
2513 |
consts |
|
19093 | 2514 |
EX :: "('q_16916 => bool) => 'q_16916 hollight.list => bool" ("EX") |
17644 | 2515 |
|
2516 |
defs |
|
2517 |
EX_def: "EX == |
|
19093 | 2518 |
SOME u::('q_16916::type => bool) => 'q_16916::type hollight.list => bool. |
2519 |
(ALL P::'q_16916::type => bool. u P NIL = False) & |
|
2520 |
(ALL (h::'q_16916::type) (P::'q_16916::type => bool) |
|
2521 |
t::'q_16916::type hollight.list. u P (CONS h t) = (P h | u P t))" |
|
17644 | 2522 |
|
2523 |
lemma DEF_EX: "EX = |
|
19093 | 2524 |
(SOME u::('q_16916::type => bool) => 'q_16916::type hollight.list => bool. |
2525 |
(ALL P::'q_16916::type => bool. u P NIL = False) & |
|
2526 |
(ALL (h::'q_16916::type) (P::'q_16916::type => bool) |
|
2527 |
t::'q_16916::type hollight.list. u P (CONS h t) = (P h | u P t)))" |
|
17644 | 2528 |
by (import hollight DEF_EX) |
2529 |
||
2530 |
constdefs |
|
19093 | 2531 |
ITLIST :: "('q_16939 => 'q_16938 => 'q_16938) |
2532 |
=> 'q_16939 hollight.list => 'q_16938 => 'q_16938" |
|
17644 | 2533 |
"ITLIST == |
19093 | 2534 |
SOME ITLIST::('q_16939::type => 'q_16938::type => 'q_16938::type) |
2535 |
=> 'q_16939::type hollight.list |
|
2536 |
=> 'q_16938::type => 'q_16938::type. |
|
2537 |
(ALL (f::'q_16939::type => 'q_16938::type => 'q_16938::type) |
|
2538 |
b::'q_16938::type. ITLIST f NIL b = b) & |
|
2539 |
(ALL (h::'q_16939::type) |
|
2540 |
(f::'q_16939::type => 'q_16938::type => 'q_16938::type) |
|
2541 |
(t::'q_16939::type hollight.list) b::'q_16938::type. |
|
17644 | 2542 |
ITLIST f (CONS h t) b = f h (ITLIST f t b))" |
2543 |
||
2544 |
lemma DEF_ITLIST: "ITLIST = |
|
19093 | 2545 |
(SOME ITLIST::('q_16939::type => 'q_16938::type => 'q_16938::type) |
2546 |
=> 'q_16939::type hollight.list |
|
2547 |
=> 'q_16938::type => 'q_16938::type. |
|
2548 |
(ALL (f::'q_16939::type => 'q_16938::type => 'q_16938::type) |
|
2549 |
b::'q_16938::type. ITLIST f NIL b = b) & |
|
2550 |
(ALL (h::'q_16939::type) |
|
2551 |
(f::'q_16939::type => 'q_16938::type => 'q_16938::type) |
|
2552 |
(t::'q_16939::type hollight.list) b::'q_16938::type. |
|
17644 | 2553 |
ITLIST f (CONS h t) b = f h (ITLIST f t b)))" |
2554 |
by (import hollight DEF_ITLIST) |
|
2555 |
||
2556 |
constdefs |
|
19093 | 2557 |
MEM :: "'q_16964 => 'q_16964 hollight.list => bool" |
17644 | 2558 |
"MEM == |
19093 | 2559 |
SOME MEM::'q_16964::type => 'q_16964::type hollight.list => bool. |
2560 |
(ALL x::'q_16964::type. MEM x NIL = False) & |
|
2561 |
(ALL (h::'q_16964::type) (x::'q_16964::type) |
|
2562 |
t::'q_16964::type hollight.list. |
|
17644 | 2563 |
MEM x (CONS h t) = (x = h | MEM x t))" |
2564 |
||
2565 |
lemma DEF_MEM: "MEM = |
|
19093 | 2566 |
(SOME MEM::'q_16964::type => 'q_16964::type hollight.list => bool. |
2567 |
(ALL x::'q_16964::type. MEM x NIL = False) & |
|
2568 |
(ALL (h::'q_16964::type) (x::'q_16964::type) |
|
2569 |
t::'q_16964::type hollight.list. |
|
17644 | 2570 |
MEM x (CONS h t) = (x = h | MEM x t)))" |
2571 |
by (import hollight DEF_MEM) |
|
2572 |
||
2573 |
constdefs |
|
19093 | 2574 |
ALL2 :: "('q_16997 => 'q_17004 => bool) |
2575 |
=> 'q_16997 hollight.list => 'q_17004 hollight.list => bool" |
|
17644 | 2576 |
"ALL2 == |
19093 | 2577 |
SOME ALL2::('q_16997::type => 'q_17004::type => bool) |
2578 |
=> 'q_16997::type hollight.list |
|
2579 |
=> 'q_17004::type hollight.list => bool. |
|
2580 |
(ALL (P::'q_16997::type => 'q_17004::type => bool) |
|
2581 |
l2::'q_17004::type hollight.list. ALL2 P NIL l2 = (l2 = NIL)) & |
|
2582 |
(ALL (h1::'q_16997::type) (P::'q_16997::type => 'q_17004::type => bool) |
|
2583 |
(t1::'q_16997::type hollight.list) l2::'q_17004::type hollight.list. |
|
17644 | 2584 |
ALL2 P (CONS h1 t1) l2 = |
2585 |
COND (l2 = NIL) False (P h1 (HD l2) & ALL2 P t1 (TL l2)))" |
|
2586 |
||
2587 |
lemma DEF_ALL2: "ALL2 = |
|
19093 | 2588 |
(SOME ALL2::('q_16997::type => 'q_17004::type => bool) |
2589 |
=> 'q_16997::type hollight.list |
|
2590 |
=> 'q_17004::type hollight.list => bool. |
|
2591 |
(ALL (P::'q_16997::type => 'q_17004::type => bool) |
|
2592 |
l2::'q_17004::type hollight.list. ALL2 P NIL l2 = (l2 = NIL)) & |
|
2593 |
(ALL (h1::'q_16997::type) (P::'q_16997::type => 'q_17004::type => bool) |
|
2594 |
(t1::'q_16997::type hollight.list) l2::'q_17004::type hollight.list. |
|
17644 | 2595 |
ALL2 P (CONS h1 t1) l2 = |
2596 |
COND (l2 = NIL) False (P h1 (HD l2) & ALL2 P t1 (TL l2))))" |
|
2597 |
by (import hollight DEF_ALL2) |
|
2598 |
||
19093 | 2599 |
lemma ALL2: "ALL2 (P::'q_17059::type => 'q_17058::type => bool) NIL NIL = True & |
2600 |
ALL2 P (CONS (h1::'q_17059::type) (t1::'q_17059::type hollight.list)) NIL = |
|
17644 | 2601 |
False & |
19093 | 2602 |
ALL2 P NIL (CONS (h2::'q_17058::type) (t2::'q_17058::type hollight.list)) = |
17644 | 2603 |
False & |
2604 |
ALL2 P (CONS h1 t1) (CONS h2 t2) = (P h1 h2 & ALL2 P t1 t2)" |
|
2605 |
by (import hollight ALL2) |
|
2606 |
||
2607 |
constdefs |
|
19093 | 2608 |
MAP2 :: "('q_17089 => 'q_17096 => 'q_17086) |
2609 |
=> 'q_17089 hollight.list |
|
2610 |
=> 'q_17096 hollight.list => 'q_17086 hollight.list" |
|
17644 | 2611 |
"MAP2 == |
19093 | 2612 |
SOME MAP2::('q_17089::type => 'q_17096::type => 'q_17086::type) |
2613 |
=> 'q_17089::type hollight.list |
|
2614 |
=> 'q_17096::type hollight.list |
|
2615 |
=> 'q_17086::type hollight.list. |
|
2616 |
(ALL (f::'q_17089::type => 'q_17096::type => 'q_17086::type) |
|
2617 |
l::'q_17096::type hollight.list. MAP2 f NIL l = NIL) & |
|
2618 |
(ALL (h1::'q_17089::type) |
|
2619 |
(f::'q_17089::type => 'q_17096::type => 'q_17086::type) |
|
2620 |
(t1::'q_17089::type hollight.list) l::'q_17096::type hollight.list. |
|
17644 | 2621 |
MAP2 f (CONS h1 t1) l = CONS (f h1 (HD l)) (MAP2 f t1 (TL l)))" |
2622 |
||
2623 |
lemma DEF_MAP2: "MAP2 = |
|
19093 | 2624 |
(SOME MAP2::('q_17089::type => 'q_17096::type => 'q_17086::type) |
2625 |
=> 'q_17089::type hollight.list |
|
2626 |
=> 'q_17096::type hollight.list |
|
2627 |
=> 'q_17086::type hollight.list. |
|
2628 |
(ALL (f::'q_17089::type => 'q_17096::type => 'q_17086::type) |
|
2629 |
l::'q_17096::type hollight.list. MAP2 f NIL l = NIL) & |
|
2630 |
(ALL (h1::'q_17089::type) |
|
2631 |
(f::'q_17089::type => 'q_17096::type => 'q_17086::type) |
|
2632 |
(t1::'q_17089::type hollight.list) l::'q_17096::type hollight.list. |
|
17644 | 2633 |
MAP2 f (CONS h1 t1) l = CONS (f h1 (HD l)) (MAP2 f t1 (TL l))))" |
2634 |
by (import hollight DEF_MAP2) |
|
2635 |
||
19093 | 2636 |
lemma MAP2: "MAP2 (f::'q_17131::type => 'q_17130::type => 'q_17137::type) NIL NIL = NIL & |
2637 |
MAP2 f (CONS (h1::'q_17131::type) (t1::'q_17131::type hollight.list)) |
|
2638 |
(CONS (h2::'q_17130::type) (t2::'q_17130::type hollight.list)) = |
|
17644 | 2639 |
CONS (f h1 h2) (MAP2 f t1 t2)" |
2640 |
by (import hollight MAP2) |
|
2641 |
||
2642 |
constdefs |
|
19093 | 2643 |
EL :: "nat => 'q_17157 hollight.list => 'q_17157" |
17644 | 2644 |
"EL == |
19093 | 2645 |
SOME EL::nat => 'q_17157::type hollight.list => 'q_17157::type. |
2646 |
(ALL l::'q_17157::type hollight.list. EL 0 l = HD l) & |
|
2647 |
(ALL (n::nat) l::'q_17157::type hollight.list. |
|
17644 | 2648 |
EL (Suc n) l = EL n (TL l))" |
2649 |
||
2650 |
lemma DEF_EL: "EL = |
|
19093 | 2651 |
(SOME EL::nat => 'q_17157::type hollight.list => 'q_17157::type. |
2652 |
(ALL l::'q_17157::type hollight.list. EL 0 l = HD l) & |
|
2653 |
(ALL (n::nat) l::'q_17157::type hollight.list. |
|
17644 | 2654 |
EL (Suc n) l = EL n (TL l)))" |
2655 |
by (import hollight DEF_EL) |
|
2656 |
||
2657 |
constdefs |
|
19093 | 2658 |
FILTER :: "('q_17182 => bool) => 'q_17182 hollight.list => 'q_17182 hollight.list" |
17644 | 2659 |
"FILTER == |
19093 | 2660 |
SOME FILTER::('q_17182::type => bool) |
2661 |
=> 'q_17182::type hollight.list |
|
2662 |
=> 'q_17182::type hollight.list. |
|
2663 |
(ALL P::'q_17182::type => bool. FILTER P NIL = NIL) & |
|
2664 |
(ALL (h::'q_17182::type) (P::'q_17182::type => bool) |
|
2665 |
t::'q_17182::type hollight.list. |
|
17644 | 2666 |
FILTER P (CONS h t) = COND (P h) (CONS h (FILTER P t)) (FILTER P t))" |
2667 |
||
2668 |
lemma DEF_FILTER: "FILTER = |
|
19093 | 2669 |
(SOME FILTER::('q_17182::type => bool) |
2670 |
=> 'q_17182::type hollight.list |
|
2671 |
=> 'q_17182::type hollight.list. |
|
2672 |
(ALL P::'q_17182::type => bool. FILTER P NIL = NIL) & |
|
2673 |
(ALL (h::'q_17182::type) (P::'q_17182::type => bool) |
|
2674 |
t::'q_17182::type hollight.list. |
|
17644 | 2675 |
FILTER P (CONS h t) = |
2676 |
COND (P h) (CONS h (FILTER P t)) (FILTER P t)))" |
|
2677 |
by (import hollight DEF_FILTER) |
|
2678 |
||
2679 |
constdefs |
|
19093 | 2680 |
ASSOC :: "'q_17211 => ('q_17211 * 'q_17205) hollight.list => 'q_17205" |
17644 | 2681 |
"ASSOC == |
19093 | 2682 |
SOME ASSOC::'q_17211::type |
2683 |
=> ('q_17211::type * 'q_17205::type) hollight.list |
|
2684 |
=> 'q_17205::type. |
|
2685 |
ALL (h::'q_17211::type * 'q_17205::type) (a::'q_17211::type) |
|
2686 |
t::('q_17211::type * 'q_17205::type) hollight.list. |
|
17644 | 2687 |
ASSOC a (CONS h t) = COND (fst h = a) (snd h) (ASSOC a t)" |
2688 |
||
2689 |
lemma DEF_ASSOC: "ASSOC = |
|
19093 | 2690 |
(SOME ASSOC::'q_17211::type |
2691 |
=> ('q_17211::type * 'q_17205::type) hollight.list |
|
2692 |
=> 'q_17205::type. |
|
2693 |
ALL (h::'q_17211::type * 'q_17205::type) (a::'q_17211::type) |
|
2694 |
t::('q_17211::type * 'q_17205::type) hollight.list. |
|
17644 | 2695 |
ASSOC a (CONS h t) = COND (fst h = a) (snd h) (ASSOC a t))" |
2696 |
by (import hollight DEF_ASSOC) |
|
2697 |
||
2698 |
constdefs |
|
19093 | 2699 |
ITLIST2 :: "('q_17235 => 'q_17243 => 'q_17233 => 'q_17233) |
2700 |
=> 'q_17235 hollight.list => 'q_17243 hollight.list => 'q_17233 => 'q_17233" |
|
17644 | 2701 |
"ITLIST2 == |
19093 | 2702 |
SOME ITLIST2::('q_17235::type |
2703 |
=> 'q_17243::type => 'q_17233::type => 'q_17233::type) |
|
2704 |
=> 'q_17235::type hollight.list |
|
2705 |
=> 'q_17243::type hollight.list |
|
2706 |
=> 'q_17233::type => 'q_17233::type. |
|
2707 |
(ALL (f::'q_17235::type |
|
2708 |
=> 'q_17243::type => 'q_17233::type => 'q_17233::type) |
|
2709 |
(l2::'q_17243::type hollight.list) b::'q_17233::type. |
|
17644 | 2710 |
ITLIST2 f NIL l2 b = b) & |
19093 | 2711 |
(ALL (h1::'q_17235::type) |
2712 |
(f::'q_17235::type |
|
2713 |
=> 'q_17243::type => 'q_17233::type => 'q_17233::type) |
|
2714 |
(t1::'q_17235::type hollight.list) (l2::'q_17243::type hollight.list) |
|
2715 |
b::'q_17233::type. |
|
17644 | 2716 |
ITLIST2 f (CONS h1 t1) l2 b = f h1 (HD l2) (ITLIST2 f t1 (TL l2) b))" |
2717 |
||
2718 |
lemma DEF_ITLIST2: "ITLIST2 = |
|
19093 | 2719 |
(SOME ITLIST2::('q_17235::type |
2720 |
=> 'q_17243::type => 'q_17233::type => 'q_17233::type) |
|
2721 |
=> 'q_17235::type hollight.list |
|
2722 |
=> 'q_17243::type hollight.list |
|
2723 |
=> 'q_17233::type => 'q_17233::type. |
|
2724 |
(ALL (f::'q_17235::type |
|
2725 |
=> 'q_17243::type => 'q_17233::type => 'q_17233::type) |
|
2726 |
(l2::'q_17243::type hollight.list) b::'q_17233::type. |
|
17644 | 2727 |
ITLIST2 f NIL l2 b = b) & |
19093 | 2728 |
(ALL (h1::'q_17235::type) |
2729 |
(f::'q_17235::type |
|
2730 |
=> 'q_17243::type => 'q_17233::type => 'q_17233::type) |
|
2731 |
(t1::'q_17235::type hollight.list) |
|
2732 |
(l2::'q_17243::type hollight.list) b::'q_17233::type. |
|
17644 | 2733 |
ITLIST2 f (CONS h1 t1) l2 b = |
2734 |
f h1 (HD l2) (ITLIST2 f t1 (TL l2) b)))" |
|
2735 |
by (import hollight DEF_ITLIST2) |
|
2736 |
||
2737 |
lemma ITLIST2: "ITLIST2 |
|
19093 | 2738 |
(f::'q_17277::type => 'q_17276::type => 'q_17275::type => 'q_17275::type) |
2739 |
NIL NIL (b::'q_17275::type) = |
|
17644 | 2740 |
b & |
19093 | 2741 |
ITLIST2 f (CONS (h1::'q_17277::type) (t1::'q_17277::type hollight.list)) |
2742 |
(CONS (h2::'q_17276::type) (t2::'q_17276::type hollight.list)) b = |
|
17644 | 2743 |
f h1 h2 (ITLIST2 f t1 t2 b)" |
2744 |
by (import hollight ITLIST2) |
|
2745 |
||
2746 |
consts |
|
19093 | 2747 |
ZIP :: "'q_17307 hollight.list |
2748 |
=> 'q_17315 hollight.list => ('q_17307 * 'q_17315) hollight.list" |
|
17644 | 2749 |
|
2750 |
defs |
|
2751 |
ZIP_def: "hollight.ZIP == |
|
19093 | 2752 |
SOME ZIP::'q_17307::type hollight.list |
2753 |
=> 'q_17315::type hollight.list |
|
2754 |
=> ('q_17307::type * 'q_17315::type) hollight.list. |
|
2755 |
(ALL l2::'q_17315::type hollight.list. ZIP NIL l2 = NIL) & |
|
2756 |
(ALL (h1::'q_17307::type) (t1::'q_17307::type hollight.list) |
|
2757 |
l2::'q_17315::type hollight.list. |
|
17644 | 2758 |
ZIP (CONS h1 t1) l2 = CONS (h1, HD l2) (ZIP t1 (TL l2)))" |
2759 |
||
2760 |
lemma DEF_ZIP: "hollight.ZIP = |
|
19093 | 2761 |
(SOME ZIP::'q_17307::type hollight.list |
2762 |
=> 'q_17315::type hollight.list |
|
2763 |
=> ('q_17307::type * 'q_17315::type) hollight.list. |
|
2764 |
(ALL l2::'q_17315::type hollight.list. ZIP NIL l2 = NIL) & |
|
2765 |
(ALL (h1::'q_17307::type) (t1::'q_17307::type hollight.list) |
|
2766 |
l2::'q_17315::type hollight.list. |
|
17644 | 2767 |
ZIP (CONS h1 t1) l2 = CONS (h1, HD l2) (ZIP t1 (TL l2))))" |
2768 |
by (import hollight DEF_ZIP) |
|
2769 |
||
2770 |
lemma ZIP: "(op &::bool => bool => bool) |
|
19093 | 2771 |
((op =::('q_17326::type * 'q_17327::type) hollight.list |
2772 |
=> ('q_17326::type * 'q_17327::type) hollight.list => bool) |
|
2773 |
((hollight.ZIP::'q_17326::type hollight.list |
|
2774 |
=> 'q_17327::type hollight.list |
|
2775 |
=> ('q_17326::type * 'q_17327::type) hollight.list) |
|
2776 |
(NIL::'q_17326::type hollight.list) |
|
2777 |
(NIL::'q_17327::type hollight.list)) |
|
2778 |
(NIL::('q_17326::type * 'q_17327::type) hollight.list)) |
|
2779 |
((op =::('q_17351::type * 'q_17352::type) hollight.list |
|
2780 |
=> ('q_17351::type * 'q_17352::type) hollight.list => bool) |
|
2781 |
((hollight.ZIP::'q_17351::type hollight.list |
|
2782 |
=> 'q_17352::type hollight.list |
|
2783 |
=> ('q_17351::type * 'q_17352::type) hollight.list) |
|
2784 |
((CONS::'q_17351::type |
|
2785 |
=> 'q_17351::type hollight.list |
|
2786 |
=> 'q_17351::type hollight.list) |
|
2787 |
(h1::'q_17351::type) (t1::'q_17351::type hollight.list)) |
|
2788 |
((CONS::'q_17352::type |
|
2789 |
=> 'q_17352::type hollight.list |
|
2790 |
=> 'q_17352::type hollight.list) |
|
2791 |
(h2::'q_17352::type) (t2::'q_17352::type hollight.list))) |
|
2792 |
((CONS::'q_17351::type * 'q_17352::type |
|
2793 |
=> ('q_17351::type * 'q_17352::type) hollight.list |
|
2794 |
=> ('q_17351::type * 'q_17352::type) hollight.list) |
|
2795 |
((Pair::'q_17351::type |
|
2796 |
=> 'q_17352::type => 'q_17351::type * 'q_17352::type) |
|
17644 | 2797 |
h1 h2) |
19093 | 2798 |
((hollight.ZIP::'q_17351::type hollight.list |
2799 |
=> 'q_17352::type hollight.list |
|
2800 |
=> ('q_17351::type * 'q_17352::type) hollight.list) |
|
17644 | 2801 |
t1 t2)))" |
2802 |
by (import hollight ZIP) |
|
2803 |
||
2804 |
lemma NOT_CONS_NIL: "ALL (x::'A::type) xa::'A::type hollight.list. CONS x xa ~= NIL" |
|
2805 |
by (import hollight NOT_CONS_NIL) |
|
2806 |
||
2807 |
lemma LAST_CLAUSES: "LAST (CONS (h::'A::type) NIL) = h & |
|
2808 |
LAST (CONS h (CONS (k::'A::type) (t::'A::type hollight.list))) = |
|
2809 |
LAST (CONS k t)" |
|
2810 |
by (import hollight LAST_CLAUSES) |
|
2811 |
||
2812 |
lemma APPEND_NIL: "ALL l::'A::type hollight.list. APPEND l NIL = l" |
|
2813 |
by (import hollight APPEND_NIL) |
|
2814 |
||
2815 |
lemma APPEND_ASSOC: "ALL (l::'A::type hollight.list) (m::'A::type hollight.list) |
|
2816 |
n::'A::type hollight.list. APPEND l (APPEND m n) = APPEND (APPEND l m) n" |
|
2817 |
by (import hollight APPEND_ASSOC) |
|
2818 |
||
2819 |
lemma REVERSE_APPEND: "ALL (l::'A::type hollight.list) m::'A::type hollight.list. |
|
2820 |
REVERSE (APPEND l m) = APPEND (REVERSE m) (REVERSE l)" |
|
2821 |
by (import hollight REVERSE_APPEND) |
|
2822 |
||
2823 |
lemma REVERSE_REVERSE: "ALL l::'A::type hollight.list. REVERSE (REVERSE l) = l" |
|
2824 |
by (import hollight REVERSE_REVERSE) |
|
2825 |
||
2826 |
lemma CONS_11: "ALL (x::'A::type) (xa::'A::type) (xb::'A::type hollight.list) |
|
2827 |
xc::'A::type hollight.list. (CONS x xb = CONS xa xc) = (x = xa & xb = xc)" |
|
2828 |
by (import hollight CONS_11) |
|
2829 |
||
2830 |
lemma list_CASES: "ALL l::'A::type hollight.list. |
|
2831 |
l = NIL | (EX (h::'A::type) t::'A::type hollight.list. l = CONS h t)" |
|
2832 |
by (import hollight list_CASES) |
|
2833 |
||
2834 |
lemma LENGTH_APPEND: "ALL (l::'A::type hollight.list) m::'A::type hollight.list. |
|
2835 |
LENGTH (APPEND l m) = LENGTH l + LENGTH m" |
|
2836 |
by (import hollight LENGTH_APPEND) |
|
2837 |
||
2838 |
lemma MAP_APPEND: "ALL (f::'A::type => 'B::type) (l1::'A::type hollight.list) |
|
2839 |
l2::'A::type hollight.list. |
|
2840 |
MAP f (APPEND l1 l2) = APPEND (MAP f l1) (MAP f l2)" |
|
2841 |
by (import hollight MAP_APPEND) |
|
2842 |
||
2843 |
lemma LENGTH_MAP: "ALL (l::'A::type hollight.list) f::'A::type => 'B::type. |
|
2844 |
LENGTH (MAP f l) = LENGTH l" |
|
2845 |
by (import hollight LENGTH_MAP) |
|
2846 |
||
17652 | 2847 |
lemma LENGTH_EQ_NIL: "ALL l::'A::type hollight.list. (LENGTH l = 0) = (l = NIL)" |
17644 | 2848 |
by (import hollight LENGTH_EQ_NIL) |
2849 |
||
19093 | 2850 |
lemma LENGTH_EQ_CONS: "ALL (l::'q_17659::type hollight.list) n::nat. |
17644 | 2851 |
(LENGTH l = Suc n) = |
19093 | 2852 |
(EX (h::'q_17659::type) t::'q_17659::type hollight.list. |
17644 | 2853 |
l = CONS h t & LENGTH t = n)" |
2854 |
by (import hollight LENGTH_EQ_CONS) |
|
2855 |
||
2856 |
lemma MAP_o: "ALL (f::'A::type => 'B::type) (g::'B::type => 'C::type) |
|
2857 |
l::'A::type hollight.list. MAP (g o f) l = MAP g (MAP f l)" |
|
2858 |
by (import hollight MAP_o) |
|
2859 |
||
19093 | 2860 |
lemma MAP_EQ: "ALL (f::'q_17723::type => 'q_17734::type) |
2861 |
(g::'q_17723::type => 'q_17734::type) l::'q_17723::type hollight.list. |
|
2862 |
ALL_list (%x::'q_17723::type. f x = g x) l --> MAP f l = MAP g l" |
|
17644 | 2863 |
by (import hollight MAP_EQ) |
2864 |
||
19093 | 2865 |
lemma ALL_IMP: "ALL (P::'q_17764::type => bool) (Q::'q_17764::type => bool) |
2866 |
l::'q_17764::type hollight.list. |
|
2867 |
(ALL x::'q_17764::type. MEM x l & P x --> Q x) & ALL_list P l --> |
|
17644 | 2868 |
ALL_list Q l" |
2869 |
by (import hollight ALL_IMP) |
|
2870 |
||
19093 | 2871 |
lemma NOT_EX: "ALL (P::'q_17792::type => bool) l::'q_17792::type hollight.list. |
2872 |
(~ EX P l) = ALL_list (%x::'q_17792::type. ~ P x) l" |
|
17644 | 2873 |
by (import hollight NOT_EX) |
2874 |
||
19093 | 2875 |
lemma NOT_ALL: "ALL (P::'q_17814::type => bool) l::'q_17814::type hollight.list. |
2876 |
(~ ALL_list P l) = EX (%x::'q_17814::type. ~ P x) l" |
|
17644 | 2877 |
by (import hollight NOT_ALL) |
2878 |
||
19093 | 2879 |
lemma ALL_MAP: "ALL (P::'q_17836::type => bool) (f::'q_17835::type => 'q_17836::type) |
2880 |
l::'q_17835::type hollight.list. |
|
17644 | 2881 |
ALL_list P (MAP f l) = ALL_list (P o f) l" |
2882 |
by (import hollight ALL_MAP) |
|
2883 |
||
19093 | 2884 |
lemma ALL_T: "All (ALL_list (%x::'q_17854::type. True))" |
17644 | 2885 |
by (import hollight ALL_T) |
2886 |
||
19093 | 2887 |
lemma MAP_EQ_ALL2: "ALL (l::'q_17879::type hollight.list) m::'q_17879::type hollight.list. |
17644 | 2888 |
ALL2 |
19093 | 2889 |
(%(x::'q_17879::type) y::'q_17879::type. |
2890 |
(f::'q_17879::type => 'q_17890::type) x = f y) |
|
17644 | 2891 |
l m --> |
2892 |
MAP f l = MAP f m" |
|
2893 |
by (import hollight MAP_EQ_ALL2) |
|
2894 |
||
19093 | 2895 |
lemma ALL2_MAP: "ALL (P::'q_17921::type => 'q_17922::type => bool) |
2896 |
(f::'q_17922::type => 'q_17921::type) l::'q_17922::type hollight.list. |
|
2897 |
ALL2 P (MAP f l) l = ALL_list (%a::'q_17922::type. P (f a) a) l" |
|
17644 | 2898 |
by (import hollight ALL2_MAP) |
2899 |
||
19093 | 2900 |
lemma MAP_EQ_DEGEN: "ALL (l::'q_17939::type hollight.list) f::'q_17939::type => 'q_17939::type. |
2901 |
ALL_list (%x::'q_17939::type. f x = x) l --> MAP f l = l" |
|
17644 | 2902 |
by (import hollight MAP_EQ_DEGEN) |
2903 |
||
19093 | 2904 |
lemma ALL2_AND_RIGHT: "ALL (l::'q_17982::type hollight.list) (m::'q_17981::type hollight.list) |
2905 |
(P::'q_17982::type => bool) Q::'q_17982::type => 'q_17981::type => bool. |
|
2906 |
ALL2 (%(x::'q_17982::type) y::'q_17981::type. P x & Q x y) l m = |
|
17644 | 2907 |
(ALL_list P l & ALL2 Q l m)" |
2908 |
by (import hollight ALL2_AND_RIGHT) |
|
2909 |
||
19093 | 2910 |
lemma ITLIST_EXTRA: "ALL l::'q_18019::type hollight.list. |
2911 |
ITLIST (f::'q_18019::type => 'q_18018::type => 'q_18018::type) |
|
2912 |
(APPEND l (CONS (a::'q_18019::type) NIL)) (b::'q_18018::type) = |
|
17644 | 2913 |
ITLIST f l (f a b)" |
2914 |
by (import hollight ITLIST_EXTRA) |
|
2915 |
||
19093 | 2916 |
lemma ALL_MP: "ALL (P::'q_18045::type => bool) (Q::'q_18045::type => bool) |
2917 |
l::'q_18045::type hollight.list. |
|
2918 |
ALL_list (%x::'q_18045::type. P x --> Q x) l & ALL_list P l --> |
|
17644 | 2919 |
ALL_list Q l" |
2920 |
by (import hollight ALL_MP) |
|
2921 |
||
19093 | 2922 |
lemma AND_ALL: "ALL x::'q_18075::type hollight.list. |
2923 |
(ALL_list (P::'q_18075::type => bool) x & |
|
2924 |
ALL_list (Q::'q_18075::type => bool) x) = |
|
2925 |
ALL_list (%x::'q_18075::type. P x & Q x) x" |
|
17644 | 2926 |
by (import hollight AND_ALL) |
2927 |
||
19093 | 2928 |
lemma EX_IMP: "ALL (P::'q_18105::type => bool) (Q::'q_18105::type => bool) |
2929 |
l::'q_18105::type hollight.list. |
|
2930 |
(ALL x::'q_18105::type. MEM x l & P x --> Q x) & EX P l --> EX Q l" |
|
17644 | 2931 |
by (import hollight EX_IMP) |
2932 |
||
19093 | 2933 |
lemma ALL_MEM: "ALL (P::'q_18132::type => bool) l::'q_18132::type hollight.list. |
2934 |
(ALL x::'q_18132::type. MEM x l --> P x) = ALL_list P l" |
|
17644 | 2935 |
by (import hollight ALL_MEM) |
2936 |
||
19093 | 2937 |
lemma LENGTH_REPLICATE: "ALL (n::nat) x::'q_18150::type. LENGTH (REPLICATE n x) = n" |
17644 | 2938 |
by (import hollight LENGTH_REPLICATE) |
2939 |
||
19093 | 2940 |
lemma EX_MAP: "ALL (P::'q_18174::type => bool) (f::'q_18173::type => 'q_18174::type) |
2941 |
l::'q_18173::type hollight.list. EX P (MAP f l) = EX (P o f) l" |
|
17644 | 2942 |
by (import hollight EX_MAP) |
2943 |
||
19093 | 2944 |
lemma EXISTS_EX: "ALL (P::'q_18212::type => 'q_18211::type => bool) |
2945 |
l::'q_18211::type hollight.list. |
|
2946 |
(EX x::'q_18212::type. EX (P x) l) = |
|
2947 |
EX (%s::'q_18211::type. EX x::'q_18212::type. P x s) l" |
|
17644 | 2948 |
by (import hollight EXISTS_EX) |
2949 |
||
19093 | 2950 |
lemma FORALL_ALL: "ALL (P::'q_18242::type => 'q_18241::type => bool) |
2951 |
l::'q_18241::type hollight.list. |
|
2952 |
(ALL x::'q_18242::type. ALL_list (P x) l) = |
|
2953 |
ALL_list (%s::'q_18241::type. ALL x::'q_18242::type. P x s) l" |
|
17644 | 2954 |
by (import hollight FORALL_ALL) |
2955 |
||
19093 | 2956 |
lemma MEM_APPEND: "ALL (x::'q_18270::type) (l1::'q_18270::type hollight.list) |
2957 |
l2::'q_18270::type hollight.list. |
|
17644 | 2958 |
MEM x (APPEND l1 l2) = (MEM x l1 | MEM x l2)" |
2959 |
by (import hollight MEM_APPEND) |
|
2960 |
||
19093 | 2961 |
lemma MEM_MAP: "ALL (f::'q_18306::type => 'q_18303::type) (y::'q_18303::type) |
2962 |
l::'q_18306::type hollight.list. |
|
2963 |
MEM y (MAP f l) = (EX x::'q_18306::type. MEM x l & y = f x)" |
|
17644 | 2964 |
by (import hollight MEM_MAP) |
2965 |
||
19093 | 2966 |
lemma FILTER_APPEND: "ALL (P::'q_18337::type => bool) (l1::'q_18337::type hollight.list) |
2967 |
l2::'q_18337::type hollight.list. |
|
17644 | 2968 |
FILTER P (APPEND l1 l2) = APPEND (FILTER P l1) (FILTER P l2)" |
2969 |
by (import hollight FILTER_APPEND) |
|
2970 |
||
19093 | 2971 |
lemma FILTER_MAP: "ALL (P::'q_18364::type => bool) (f::'q_18371::type => 'q_18364::type) |
2972 |
l::'q_18371::type hollight.list. |
|
17644 | 2973 |
FILTER P (MAP f l) = MAP f (FILTER (P o f) l)" |
2974 |
by (import hollight FILTER_MAP) |
|
2975 |
||
19093 | 2976 |
lemma MEM_FILTER: "ALL (P::'q_18398::type => bool) (l::'q_18398::type hollight.list) |
2977 |
x::'q_18398::type. MEM x (FILTER P l) = (P x & MEM x l)" |
|
17644 | 2978 |
by (import hollight MEM_FILTER) |
2979 |
||
19093 | 2980 |
lemma EX_MEM: "ALL (P::'q_18419::type => bool) l::'q_18419::type hollight.list. |
2981 |
(EX x::'q_18419::type. P x & MEM x l) = EX P l" |
|
17644 | 2982 |
by (import hollight EX_MEM) |
2983 |
||
19093 | 2984 |
lemma MAP_FST_ZIP: "ALL (l1::'q_18439::type hollight.list) l2::'q_18441::type hollight.list. |
17644 | 2985 |
LENGTH l1 = LENGTH l2 --> MAP fst (hollight.ZIP l1 l2) = l1" |
2986 |
by (import hollight MAP_FST_ZIP) |
|
2987 |
||
19093 | 2988 |
lemma MAP_SND_ZIP: "ALL (l1::'q_18470::type hollight.list) l2::'q_18472::type hollight.list. |
17644 | 2989 |
LENGTH l1 = LENGTH l2 --> MAP snd (hollight.ZIP l1 l2) = l2" |
2990 |
by (import hollight MAP_SND_ZIP) |
|
2991 |
||
19093 | 2992 |
lemma MEM_ASSOC: "ALL (l::('q_18516::type * 'q_18500::type) hollight.list) x::'q_18516::type. |
17644 | 2993 |
MEM (x, ASSOC x l) l = MEM x (MAP fst l)" |
2994 |
by (import hollight MEM_ASSOC) |
|
2995 |
||
19093 | 2996 |
lemma ALL_APPEND: "ALL (P::'q_18537::type => bool) (l1::'q_18537::type hollight.list) |
2997 |
l2::'q_18537::type hollight.list. |
|
17644 | 2998 |
ALL_list P (APPEND l1 l2) = (ALL_list P l1 & ALL_list P l2)" |
2999 |
by (import hollight ALL_APPEND) |
|
3000 |
||
19093 | 3001 |
lemma MEM_EL: "ALL (l::'q_18560::type hollight.list) n::nat. |
17644 | 3002 |
< n (LENGTH l) --> MEM (EL n l) l" |
3003 |
by (import hollight MEM_EL) |
|
3004 |
||
19093 | 3005 |
lemma ALL2_MAP2: "ALL (l::'q_18603::type hollight.list) m::'q_18604::type hollight.list. |
3006 |
ALL2 (P::'q_18602::type => 'q_18601::type => bool) |
|
3007 |
(MAP (f::'q_18603::type => 'q_18602::type) l) |
|
3008 |
(MAP (g::'q_18604::type => 'q_18601::type) m) = |
|
3009 |
ALL2 (%(x::'q_18603::type) y::'q_18604::type. P (f x) (g y)) l m" |
|
17644 | 3010 |
by (import hollight ALL2_MAP2) |
3011 |
||
19093 | 3012 |
lemma AND_ALL2: "ALL (P::'q_18650::type => 'q_18649::type => bool) |
3013 |
(Q::'q_18650::type => 'q_18649::type => bool) |
|
3014 |
(x::'q_18650::type hollight.list) xa::'q_18649::type hollight.list. |
|
17644 | 3015 |
(ALL2 P x xa & ALL2 Q x xa) = |
19093 | 3016 |
ALL2 (%(x::'q_18650::type) y::'q_18649::type. P x y & Q x y) x xa" |
17644 | 3017 |
by (import hollight AND_ALL2) |
3018 |
||
19093 | 3019 |
lemma ALL2_ALL: "ALL (P::'q_18672::type => 'q_18672::type => bool) |
3020 |
l::'q_18672::type hollight.list. |
|
3021 |
ALL2 P l l = ALL_list (%x::'q_18672::type. P x x) l" |
|
17644 | 3022 |
by (import hollight ALL2_ALL) |
3023 |
||
19093 | 3024 |
lemma APPEND_EQ_NIL: "ALL (x::'q_18701::type hollight.list) xa::'q_18701::type hollight.list. |
17644 | 3025 |
(APPEND x xa = NIL) = (x = NIL & xa = NIL)" |
3026 |
by (import hollight APPEND_EQ_NIL) |
|
3027 |
||
19093 | 3028 |
lemma LENGTH_MAP2: "ALL (f::'q_18721::type => 'q_18723::type => 'q_18734::type) |
3029 |
(l::'q_18721::type hollight.list) m::'q_18723::type hollight.list. |
|
17644 | 3030 |
LENGTH l = LENGTH m --> LENGTH (MAP2 f l m) = LENGTH m" |
3031 |
by (import hollight LENGTH_MAP2) |
|
3032 |
||
3033 |
lemma MONO_ALL: "(ALL x::'A::type. (P::'A::type => bool) x --> (Q::'A::type => bool) x) --> |
|
3034 |
ALL_list P (l::'A::type hollight.list) --> ALL_list Q l" |
|
3035 |
by (import hollight MONO_ALL) |
|
3036 |
||
3037 |
lemma MONO_ALL2: "(ALL (x::'A::type) y::'B::type. |
|
3038 |
(P::'A::type => 'B::type => bool) x y --> |
|
3039 |
(Q::'A::type => 'B::type => bool) x y) --> |
|
3040 |
ALL2 P (l::'A::type hollight.list) (l'::'B::type hollight.list) --> |
|
3041 |
ALL2 Q l l'" |
|
3042 |
by (import hollight MONO_ALL2) |
|
3043 |
||
3044 |
constdefs |
|
3045 |
dist :: "nat * nat => nat" |
|
3046 |
"dist == %u::nat * nat. fst u - snd u + (snd u - fst u)" |
|
3047 |
||
3048 |
lemma DEF_dist: "dist = (%u::nat * nat. fst u - snd u + (snd u - fst u))" |
|
3049 |
by (import hollight DEF_dist) |
|
3050 |
||
17652 | 3051 |
lemma DIST_REFL: "ALL x::nat. dist (x, x) = 0" |
17644 | 3052 |
by (import hollight DIST_REFL) |
3053 |
||
17652 | 3054 |
lemma DIST_LZERO: "ALL x::nat. dist (0, x) = x" |
17644 | 3055 |
by (import hollight DIST_LZERO) |
3056 |
||
17652 | 3057 |
lemma DIST_RZERO: "ALL x::nat. dist (x, 0) = x" |
17644 | 3058 |
by (import hollight DIST_RZERO) |
3059 |
||
3060 |
lemma DIST_SYM: "ALL (x::nat) xa::nat. dist (x, xa) = dist (xa, x)" |
|
3061 |
by (import hollight DIST_SYM) |
|
3062 |
||
3063 |
lemma DIST_LADD: "ALL (x::nat) (xa::nat) xb::nat. dist (x + xb, x + xa) = dist (xb, xa)" |
|
3064 |
by (import hollight DIST_LADD) |
|
3065 |
||
3066 |
lemma DIST_RADD: "ALL (x::nat) (xa::nat) xb::nat. dist (x + xa, xb + xa) = dist (x, xb)" |
|
3067 |
by (import hollight DIST_RADD) |
|
3068 |
||
3069 |
lemma DIST_LADD_0: "ALL (x::nat) xa::nat. dist (x + xa, x) = xa" |
|
3070 |
by (import hollight DIST_LADD_0) |
|
3071 |
||
3072 |
lemma DIST_RADD_0: "ALL (x::nat) xa::nat. dist (x, x + xa) = xa" |
|
3073 |
by (import hollight DIST_RADD_0) |
|
3074 |
||
3075 |
lemma DIST_LMUL: "ALL (x::nat) (xa::nat) xb::nat. x * dist (xa, xb) = dist (x * xa, x * xb)" |
|
3076 |
by (import hollight DIST_LMUL) |
|
3077 |
||
3078 |
lemma DIST_RMUL: "ALL (x::nat) (xa::nat) xb::nat. dist (x, xa) * xb = dist (x * xb, xa * xb)" |
|
3079 |
by (import hollight DIST_RMUL) |
|
3080 |
||
17652 | 3081 |
lemma DIST_EQ_0: "ALL (x::nat) xa::nat. (dist (x, xa) = 0) = (x = xa)" |
17644 | 3082 |
by (import hollight DIST_EQ_0) |
3083 |
||
3084 |
lemma DIST_ELIM_THM: "(P::nat => bool) (dist (x::nat, y::nat)) = |
|
3085 |
(ALL d::nat. (x = y + d --> P d) & (y = x + d --> P d))" |
|
3086 |
by (import hollight DIST_ELIM_THM) |
|
3087 |
||
3088 |
lemma DIST_LE_CASES: "ALL (m::nat) (n::nat) p::nat. |
|
3089 |
<= (dist (m, n)) p = (<= m (n + p) & <= n (m + p))" |
|
3090 |
by (import hollight DIST_LE_CASES) |
|
3091 |
||
3092 |
lemma DIST_ADDBOUND: "ALL (m::nat) n::nat. <= (dist (m, n)) (m + n)" |
|
3093 |
by (import hollight DIST_ADDBOUND) |
|
3094 |
||
3095 |
lemma DIST_TRIANGLE: "ALL (m::nat) (n::nat) p::nat. <= (dist (m, p)) (dist (m, n) + dist (n, p))" |
|
3096 |
by (import hollight DIST_TRIANGLE) |
|
3097 |
||
3098 |
lemma DIST_ADD2: "ALL (m::nat) (n::nat) (p::nat) q::nat. |
|
3099 |
<= (dist (m + n, p + q)) (dist (m, p) + dist (n, q))" |
|
3100 |
by (import hollight DIST_ADD2) |
|
3101 |
||
3102 |
lemma DIST_ADD2_REV: "ALL (m::nat) (n::nat) (p::nat) q::nat. |
|
3103 |
<= (dist (m, p)) (dist (m + n, p + q) + dist (n, q))" |
|
3104 |
by (import hollight DIST_ADD2_REV) |
|
3105 |
||
3106 |
lemma DIST_TRIANGLE_LE: "ALL (m::nat) (n::nat) (p::nat) q::nat. |
|
3107 |
<= (dist (m, n) + dist (n, p)) q --> <= (dist (m, p)) q" |
|
3108 |
by (import hollight DIST_TRIANGLE_LE) |
|
3109 |
||
3110 |
lemma DIST_TRIANGLES_LE: "ALL (m::nat) (n::nat) (p::nat) (q::nat) (r::nat) s::nat. |
|
3111 |
<= (dist (m, n)) r & <= (dist (p, q)) s --> |
|
3112 |
<= (dist (m, p)) (dist (n, q) + (r + s))" |
|
3113 |
by (import hollight DIST_TRIANGLES_LE) |
|
3114 |
||
3115 |
lemma BOUNDS_LINEAR: "ALL (A::nat) (B::nat) C::nat. (ALL n::nat. <= (A * n) (B * n + C)) = <= A B" |
|
3116 |
by (import hollight BOUNDS_LINEAR) |
|
3117 |
||
17652 | 3118 |
lemma BOUNDS_LINEAR_0: "ALL (A::nat) B::nat. (ALL n::nat. <= (A * n) B) = (A = 0)" |
17644 | 3119 |
by (import hollight BOUNDS_LINEAR_0) |
3120 |
||
3121 |
lemma BOUNDS_DIVIDED: "ALL P::nat => nat. |
|
3122 |
(EX B::nat. ALL n::nat. <= (P n) B) = |
|
3123 |
(EX (x::nat) B::nat. ALL n::nat. <= (n * P n) (x * n + B))" |
|
3124 |
by (import hollight BOUNDS_DIVIDED) |
|
3125 |
||
3126 |
lemma BOUNDS_NOTZERO: "ALL (P::nat => nat => nat) (A::nat) B::nat. |
|
17652 | 3127 |
P 0 0 = 0 & (ALL (m::nat) n::nat. <= (P m n) (A * (m + n) + B)) --> |
17644 | 3128 |
(EX x::nat. ALL (m::nat) n::nat. <= (P m n) (x * (m + n)))" |
3129 |
by (import hollight BOUNDS_NOTZERO) |
|
3130 |
||
3131 |
lemma BOUNDS_IGNORE: "ALL (P::nat => nat) Q::nat => nat. |
|
3132 |
(EX B::nat. ALL i::nat. <= (P i) (Q i + B)) = |
|
3133 |
(EX (x::nat) N::nat. ALL i::nat. <= N i --> <= (P i) (Q i + x))" |
|
3134 |
by (import hollight BOUNDS_IGNORE) |
|
3135 |
||
3136 |
constdefs |
|
3137 |
is_nadd :: "(nat => nat) => bool" |
|
3138 |
"is_nadd == |
|
3139 |
%u::nat => nat. |
|
3140 |
EX B::nat. |
|
3141 |
ALL (m::nat) n::nat. <= (dist (m * u n, n * u m)) (B * (m + n))" |
|
3142 |
||
3143 |
lemma DEF_is_nadd: "is_nadd = |
|
3144 |
(%u::nat => nat. |
|
3145 |
EX B::nat. |
|
3146 |
ALL (m::nat) n::nat. <= (dist (m * u n, n * u m)) (B * (m + n)))" |
|
3147 |
by (import hollight DEF_is_nadd) |
|
3148 |
||
17652 | 3149 |
lemma is_nadd_0: "is_nadd (%n::nat. 0)" |
17644 | 3150 |
by (import hollight is_nadd_0) |
3151 |
||
3152 |
typedef (open) nadd = "Collect is_nadd" morphisms "dest_nadd" "mk_nadd" |
|
17652 | 3153 |
apply (rule light_ex_imp_nonempty[where t="%n::nat. NUMERAL 0"]) |
17644 | 3154 |
by (import hollight TYDEF_nadd) |
3155 |
||
3156 |
syntax |
|
3157 |
dest_nadd :: _ |
|
3158 |
||
3159 |
syntax |
|
3160 |
mk_nadd :: _ |
|
3161 |
||
3162 |
lemmas "TYDEF_nadd_@intern" = typedef_hol2hollight |
|
3163 |
[where a="a :: nadd" and r=r , |
|
3164 |
OF type_definition_nadd] |
|
3165 |
||
3166 |
lemma NADD_CAUCHY: "ALL x::nadd. |
|
3167 |
EX xa::nat. |
|
3168 |
ALL (xb::nat) xc::nat. |
|
3169 |
<= (dist (xb * dest_nadd x xc, xc * dest_nadd x xb)) |
|
3170 |
(xa * (xb + xc))" |
|
3171 |
by (import hollight NADD_CAUCHY) |
|
3172 |
||
3173 |
lemma NADD_BOUND: "ALL x::nadd. |
|
3174 |
EX (xa::nat) B::nat. ALL n::nat. <= (dest_nadd x n) (xa * n + B)" |
|
3175 |
by (import hollight NADD_BOUND) |
|
3176 |
||
3177 |
lemma NADD_MULTIPLICATIVE: "ALL x::nadd. |
|
3178 |
EX xa::nat. |
|
3179 |
ALL (m::nat) n::nat. |
|
3180 |
<= (dist (dest_nadd x (m * n), m * dest_nadd x n)) (xa * m + xa)" |
|
3181 |
by (import hollight NADD_MULTIPLICATIVE) |
|
3182 |
||
3183 |
lemma NADD_ADDITIVE: "ALL x::nadd. |
|
3184 |
EX xa::nat. |
|
3185 |
ALL (m::nat) n::nat. |
|
3186 |
<= (dist (dest_nadd x (m + n), dest_nadd x m + dest_nadd x n)) xa" |
|
3187 |
by (import hollight NADD_ADDITIVE) |
|
3188 |
||
3189 |
lemma NADD_SUC: "ALL x::nadd. |
|
3190 |
EX xa::nat. ALL n::nat. <= (dist (dest_nadd x (Suc n), dest_nadd x n)) xa" |
|
3191 |
by (import hollight NADD_SUC) |
|
3192 |
||
3193 |
lemma NADD_DIST_LEMMA: "ALL x::nadd. |
|
3194 |
EX xa::nat. |
|
3195 |
ALL (m::nat) n::nat. |
|
3196 |
<= (dist (dest_nadd x (m + n), dest_nadd x m)) (xa * n)" |
|
3197 |
by (import hollight NADD_DIST_LEMMA) |
|
3198 |
||
3199 |
lemma NADD_DIST: "ALL x::nadd. |
|
3200 |
EX xa::nat. |
|
3201 |
ALL (m::nat) n::nat. |
|
3202 |
<= (dist (dest_nadd x m, dest_nadd x n)) (xa * dist (m, n))" |
|
3203 |
by (import hollight NADD_DIST) |
|
3204 |
||
3205 |
lemma NADD_ALTMUL: "ALL (x::nadd) y::nadd. |
|
3206 |
EX (A::nat) B::nat. |
|
3207 |
ALL n::nat. |
|
3208 |
<= (dist |
|
3209 |
(n * dest_nadd x (dest_nadd y n), |
|
3210 |
dest_nadd x n * dest_nadd y n)) |
|
3211 |
(A * n + B)" |
|
3212 |
by (import hollight NADD_ALTMUL) |
|
3213 |
||
3214 |
constdefs |
|
3215 |
nadd_eq :: "nadd => nadd => bool" |
|
3216 |
"nadd_eq == |
|
3217 |
%(u::nadd) ua::nadd. |
|
3218 |
EX B::nat. ALL n::nat. <= (dist (dest_nadd u n, dest_nadd ua n)) B" |
|
3219 |
||
3220 |
lemma DEF_nadd_eq: "nadd_eq = |
|
3221 |
(%(u::nadd) ua::nadd. |
|
3222 |
EX B::nat. ALL n::nat. <= (dist (dest_nadd u n, dest_nadd ua n)) B)" |
|
3223 |
by (import hollight DEF_nadd_eq) |
|
3224 |
||
3225 |
lemma NADD_EQ_REFL: "ALL x::nadd. nadd_eq x x" |
|
3226 |
by (import hollight NADD_EQ_REFL) |
|
3227 |
||
3228 |
lemma NADD_EQ_SYM: "ALL (x::nadd) y::nadd. nadd_eq x y = nadd_eq y x" |
|
3229 |
by (import hollight NADD_EQ_SYM) |
|
3230 |
||
3231 |
lemma NADD_EQ_TRANS: "ALL (x::nadd) (y::nadd) z::nadd. nadd_eq x y & nadd_eq y z --> nadd_eq x z" |
|
3232 |
by (import hollight NADD_EQ_TRANS) |
|
3233 |
||
3234 |
constdefs |
|
3235 |
nadd_of_num :: "nat => nadd" |
|
3236 |
"nadd_of_num == %u::nat. mk_nadd (op * u)" |
|
3237 |
||
3238 |
lemma DEF_nadd_of_num: "nadd_of_num = (%u::nat. mk_nadd (op * u))" |
|
3239 |
by (import hollight DEF_nadd_of_num) |
|
3240 |
||
3241 |
lemma NADD_OF_NUM: "ALL x::nat. dest_nadd (nadd_of_num x) = op * x" |
|
3242 |
by (import hollight NADD_OF_NUM) |
|
3243 |
||
3244 |
lemma NADD_OF_NUM_WELLDEF: "ALL (m::nat) n::nat. m = n --> nadd_eq (nadd_of_num m) (nadd_of_num n)" |
|
3245 |
by (import hollight NADD_OF_NUM_WELLDEF) |
|
3246 |
||
3247 |
lemma NADD_OF_NUM_EQ: "ALL (m::nat) n::nat. nadd_eq (nadd_of_num m) (nadd_of_num n) = (m = n)" |
|
3248 |
by (import hollight NADD_OF_NUM_EQ) |
|
3249 |
||
3250 |
constdefs |
|
3251 |
nadd_le :: "nadd => nadd => bool" |
|
3252 |
"nadd_le == |
|
3253 |
%(u::nadd) ua::nadd. |
|
3254 |
EX B::nat. ALL n::nat. <= (dest_nadd u n) (dest_nadd ua n + B)" |
|
3255 |
||
3256 |
lemma DEF_nadd_le: "nadd_le = |
|
3257 |
(%(u::nadd) ua::nadd. |
|
3258 |
EX B::nat. ALL n::nat. <= (dest_nadd u n) (dest_nadd ua n + B))" |
|
3259 |
by (import hollight DEF_nadd_le) |
|
3260 |
||
3261 |
lemma NADD_LE_WELLDEF_LEMMA: "ALL (x::nadd) (x'::nadd) (y::nadd) y'::nadd. |
|
3262 |
nadd_eq x x' & nadd_eq y y' & nadd_le x y --> nadd_le x' y'" |
|
3263 |
by (import hollight NADD_LE_WELLDEF_LEMMA) |
|
3264 |
||
3265 |
lemma NADD_LE_WELLDEF: "ALL (x::nadd) (x'::nadd) (y::nadd) y'::nadd. |
|
3266 |
nadd_eq x x' & nadd_eq y y' --> nadd_le x y = nadd_le x' y'" |
|
3267 |
by (import hollight NADD_LE_WELLDEF) |
|
3268 |
||
3269 |
lemma NADD_LE_REFL: "ALL x::nadd. nadd_le x x" |
|
3270 |
by (import hollight NADD_LE_REFL) |
|
3271 |
||
3272 |
lemma NADD_LE_TRANS: "ALL (x::nadd) (y::nadd) z::nadd. nadd_le x y & nadd_le y z --> nadd_le x z" |
|
3273 |
by (import hollight NADD_LE_TRANS) |
|
3274 |
||
3275 |
lemma NADD_LE_ANTISYM: "ALL (x::nadd) y::nadd. (nadd_le x y & nadd_le y x) = nadd_eq x y" |
|
3276 |
by (import hollight NADD_LE_ANTISYM) |
|
3277 |
||
3278 |
lemma NADD_LE_TOTAL_LEMMA: "ALL (x::nadd) y::nadd. |
|
3279 |
~ nadd_le x y --> |
|
17652 | 3280 |
(ALL B::nat. EX n::nat. n ~= 0 & < (dest_nadd y n + B) (dest_nadd x n))" |
17644 | 3281 |
by (import hollight NADD_LE_TOTAL_LEMMA) |
3282 |
||
3283 |
lemma NADD_LE_TOTAL: "ALL (x::nadd) y::nadd. nadd_le x y | nadd_le y x" |
|
3284 |
by (import hollight NADD_LE_TOTAL) |
|
3285 |
||
3286 |
lemma NADD_ARCH: "ALL x::nadd. EX xa::nat. nadd_le x (nadd_of_num xa)" |
|
3287 |
by (import hollight NADD_ARCH) |
|
3288 |
||
3289 |
lemma NADD_OF_NUM_LE: "ALL (m::nat) n::nat. nadd_le (nadd_of_num m) (nadd_of_num n) = <= m n" |
|
3290 |
by (import hollight NADD_OF_NUM_LE) |
|
3291 |
||
3292 |
constdefs |
|
3293 |
nadd_add :: "nadd => nadd => nadd" |
|
3294 |
"nadd_add == |
|
3295 |
%(u::nadd) ua::nadd. mk_nadd (%n::nat. dest_nadd u n + dest_nadd ua n)" |
|
3296 |
||
3297 |
lemma DEF_nadd_add: "nadd_add = |
|
3298 |
(%(u::nadd) ua::nadd. mk_nadd (%n::nat. dest_nadd u n + dest_nadd ua n))" |
|
3299 |
by (import hollight DEF_nadd_add) |
|
3300 |
||
3301 |
lemma NADD_ADD: "ALL (x::nadd) y::nadd. |
|
3302 |
dest_nadd (nadd_add x y) = (%n::nat. dest_nadd x n + dest_nadd y n)" |
|
3303 |
by (import hollight NADD_ADD) |
|
3304 |
||
3305 |
lemma NADD_ADD_WELLDEF: "ALL (x::nadd) (x'::nadd) (y::nadd) y'::nadd. |
|
3306 |
nadd_eq x x' & nadd_eq y y' --> nadd_eq (nadd_add x y) (nadd_add x' y')" |
|
3307 |
by (import hollight NADD_ADD_WELLDEF) |
|
3308 |
||
3309 |
lemma NADD_ADD_SYM: "ALL (x::nadd) y::nadd. nadd_eq (nadd_add x y) (nadd_add y x)" |
|
3310 |
by (import hollight NADD_ADD_SYM) |
|
3311 |
||
3312 |
lemma NADD_ADD_ASSOC: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3313 |
nadd_eq (nadd_add x (nadd_add y z)) (nadd_add (nadd_add x y) z)" |
|
3314 |
by (import hollight NADD_ADD_ASSOC) |
|
3315 |
||
17652 | 3316 |
lemma NADD_ADD_LID: "ALL x::nadd. nadd_eq (nadd_add (nadd_of_num 0) x) x" |
17644 | 3317 |
by (import hollight NADD_ADD_LID) |
3318 |
||
3319 |
lemma NADD_ADD_LCANCEL: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3320 |
nadd_eq (nadd_add x y) (nadd_add x z) --> nadd_eq y z" |
|
3321 |
by (import hollight NADD_ADD_LCANCEL) |
|
3322 |
||
3323 |
lemma NADD_LE_ADD: "ALL (x::nadd) y::nadd. nadd_le x (nadd_add x y)" |
|
3324 |
by (import hollight NADD_LE_ADD) |
|
3325 |
||
3326 |
lemma NADD_LE_EXISTS: "ALL (x::nadd) y::nadd. |
|
3327 |
nadd_le x y --> (EX d::nadd. nadd_eq y (nadd_add x d))" |
|
3328 |
by (import hollight NADD_LE_EXISTS) |
|
3329 |
||
3330 |
lemma NADD_OF_NUM_ADD: "ALL (x::nat) xa::nat. |
|
3331 |
nadd_eq (nadd_add (nadd_of_num x) (nadd_of_num xa)) |
|
3332 |
(nadd_of_num (x + xa))" |
|
3333 |
by (import hollight NADD_OF_NUM_ADD) |
|
3334 |
||
3335 |
constdefs |
|
3336 |
nadd_mul :: "nadd => nadd => nadd" |
|
3337 |
"nadd_mul == |
|
3338 |
%(u::nadd) ua::nadd. mk_nadd (%n::nat. dest_nadd u (dest_nadd ua n))" |
|
3339 |
||
3340 |
lemma DEF_nadd_mul: "nadd_mul = |
|
3341 |
(%(u::nadd) ua::nadd. mk_nadd (%n::nat. dest_nadd u (dest_nadd ua n)))" |
|
3342 |
by (import hollight DEF_nadd_mul) |
|
3343 |
||
3344 |
lemma NADD_MUL: "ALL (x::nadd) y::nadd. |
|
3345 |
dest_nadd (nadd_mul x y) = (%n::nat. dest_nadd x (dest_nadd y n))" |
|
3346 |
by (import hollight NADD_MUL) |
|
3347 |
||
3348 |
lemma NADD_MUL_SYM: "ALL (x::nadd) y::nadd. nadd_eq (nadd_mul x y) (nadd_mul y x)" |
|
3349 |
by (import hollight NADD_MUL_SYM) |
|
3350 |
||
3351 |
lemma NADD_MUL_ASSOC: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3352 |
nadd_eq (nadd_mul x (nadd_mul y z)) (nadd_mul (nadd_mul x y) z)" |
|
3353 |
by (import hollight NADD_MUL_ASSOC) |
|
3354 |
||
17652 | 3355 |
lemma NADD_MUL_LID: "ALL x::nadd. nadd_eq (nadd_mul (nadd_of_num (NUMERAL_BIT1 0)) x) x" |
17644 | 3356 |
by (import hollight NADD_MUL_LID) |
3357 |
||
3358 |
lemma NADD_LDISTRIB: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3359 |
nadd_eq (nadd_mul x (nadd_add y z)) |
|
3360 |
(nadd_add (nadd_mul x y) (nadd_mul x z))" |
|
3361 |
by (import hollight NADD_LDISTRIB) |
|
3362 |
||
3363 |
lemma NADD_MUL_WELLDEF_LEMMA: "ALL (x::nadd) (y::nadd) y'::nadd. |
|
3364 |
nadd_eq y y' --> nadd_eq (nadd_mul x y) (nadd_mul x y')" |
|
3365 |
by (import hollight NADD_MUL_WELLDEF_LEMMA) |
|
3366 |
||
3367 |
lemma NADD_MUL_WELLDEF: "ALL (x::nadd) (x'::nadd) (y::nadd) y'::nadd. |
|
3368 |
nadd_eq x x' & nadd_eq y y' --> nadd_eq (nadd_mul x y) (nadd_mul x' y')" |
|
3369 |
by (import hollight NADD_MUL_WELLDEF) |
|
3370 |
||
3371 |
lemma NADD_OF_NUM_MUL: "ALL (x::nat) xa::nat. |
|
3372 |
nadd_eq (nadd_mul (nadd_of_num x) (nadd_of_num xa)) |
|
3373 |
(nadd_of_num (x * xa))" |
|
3374 |
by (import hollight NADD_OF_NUM_MUL) |
|
3375 |
||
17652 | 3376 |
lemma NADD_LE_0: "All (nadd_le (nadd_of_num 0))" |
17644 | 3377 |
by (import hollight NADD_LE_0) |
3378 |
||
3379 |
lemma NADD_EQ_IMP_LE: "ALL (x::nadd) y::nadd. nadd_eq x y --> nadd_le x y" |
|
3380 |
by (import hollight NADD_EQ_IMP_LE) |
|
3381 |
||
3382 |
lemma NADD_LE_LMUL: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3383 |
nadd_le y z --> nadd_le (nadd_mul x y) (nadd_mul x z)" |
|
3384 |
by (import hollight NADD_LE_LMUL) |
|
3385 |
||
3386 |
lemma NADD_LE_RMUL: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3387 |
nadd_le x y --> nadd_le (nadd_mul x z) (nadd_mul y z)" |
|
3388 |
by (import hollight NADD_LE_RMUL) |
|
3389 |
||
3390 |
lemma NADD_LE_RADD: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3391 |
nadd_le (nadd_add x z) (nadd_add y z) = nadd_le x y" |
|
3392 |
by (import hollight NADD_LE_RADD) |
|
3393 |
||
3394 |
lemma NADD_LE_LADD: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3395 |
nadd_le (nadd_add x y) (nadd_add x z) = nadd_le y z" |
|
3396 |
by (import hollight NADD_LE_LADD) |
|
3397 |
||
3398 |
lemma NADD_RDISTRIB: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3399 |
nadd_eq (nadd_mul (nadd_add x y) z) |
|
3400 |
(nadd_add (nadd_mul x z) (nadd_mul y z))" |
|
3401 |
by (import hollight NADD_RDISTRIB) |
|
3402 |
||
3403 |
lemma NADD_ARCH_MULT: "ALL (x::nadd) k::nat. |
|
17652 | 3404 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3405 |
(EX xa::nat. nadd_le (nadd_of_num k) (nadd_mul (nadd_of_num xa) x))" |
3406 |
by (import hollight NADD_ARCH_MULT) |
|
3407 |
||
3408 |
lemma NADD_ARCH_ZERO: "ALL (x::nadd) k::nadd. |
|
3409 |
(ALL n::nat. nadd_le (nadd_mul (nadd_of_num n) x) k) --> |
|
17652 | 3410 |
nadd_eq x (nadd_of_num 0)" |
17644 | 3411 |
by (import hollight NADD_ARCH_ZERO) |
3412 |
||
3413 |
lemma NADD_ARCH_LEMMA: "ALL (x::nadd) (y::nadd) z::nadd. |
|
3414 |
(ALL n::nat. |
|
3415 |
nadd_le (nadd_mul (nadd_of_num n) x) |
|
3416 |
(nadd_add (nadd_mul (nadd_of_num n) y) z)) --> |
|
3417 |
nadd_le x y" |
|
3418 |
by (import hollight NADD_ARCH_LEMMA) |
|
3419 |
||
3420 |
lemma NADD_COMPLETE: "ALL P::nadd => bool. |
|
3421 |
Ex P & (EX M::nadd. ALL x::nadd. P x --> nadd_le x M) --> |
|
3422 |
(EX M::nadd. |
|
3423 |
(ALL x::nadd. P x --> nadd_le x M) & |
|
3424 |
(ALL M'::nadd. (ALL x::nadd. P x --> nadd_le x M') --> nadd_le M M'))" |
|
3425 |
by (import hollight NADD_COMPLETE) |
|
3426 |
||
3427 |
lemma NADD_UBOUND: "ALL x::nadd. |
|
3428 |
EX (xa::nat) N::nat. ALL n::nat. <= N n --> <= (dest_nadd x n) (xa * n)" |
|
3429 |
by (import hollight NADD_UBOUND) |
|
3430 |
||
3431 |
lemma NADD_NONZERO: "ALL x::nadd. |
|
17652 | 3432 |
~ nadd_eq x (nadd_of_num 0) --> |
3433 |
(EX N::nat. ALL n::nat. <= N n --> dest_nadd x n ~= 0)" |
|
17644 | 3434 |
by (import hollight NADD_NONZERO) |
3435 |
||
3436 |
lemma NADD_LBOUND: "ALL x::nadd. |
|
17652 | 3437 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3438 |
(EX (A::nat) N::nat. ALL n::nat. <= N n --> <= n (A * dest_nadd x n))" |
3439 |
by (import hollight NADD_LBOUND) |
|
3440 |
||
3441 |
constdefs |
|
3442 |
nadd_rinv :: "nadd => nat => nat" |
|
3443 |
"nadd_rinv == %(u::nadd) n::nat. DIV (n * n) (dest_nadd u n)" |
|
3444 |
||
3445 |
lemma DEF_nadd_rinv: "nadd_rinv = (%(u::nadd) n::nat. DIV (n * n) (dest_nadd u n))" |
|
3446 |
by (import hollight DEF_nadd_rinv) |
|
3447 |
||
3448 |
lemma NADD_MUL_LINV_LEMMA0: "ALL x::nadd. |
|
17652 | 3449 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3450 |
(EX (xa::nat) B::nat. ALL i::nat. <= (nadd_rinv x i) (xa * i + B))" |
3451 |
by (import hollight NADD_MUL_LINV_LEMMA0) |
|
3452 |
||
3453 |
lemma NADD_MUL_LINV_LEMMA1: "ALL (x::nadd) n::nat. |
|
17652 | 3454 |
dest_nadd x n ~= 0 --> |
17644 | 3455 |
<= (dist (dest_nadd x n * nadd_rinv x n, n * n)) (dest_nadd x n)" |
3456 |
by (import hollight NADD_MUL_LINV_LEMMA1) |
|
3457 |
||
3458 |
lemma NADD_MUL_LINV_LEMMA2: "ALL x::nadd. |
|
17652 | 3459 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3460 |
(EX N::nat. |
3461 |
ALL n::nat. |
|
3462 |
<= N n --> |
|
3463 |
<= (dist (dest_nadd x n * nadd_rinv x n, n * n)) (dest_nadd x n))" |
|
3464 |
by (import hollight NADD_MUL_LINV_LEMMA2) |
|
3465 |
||
3466 |
lemma NADD_MUL_LINV_LEMMA3: "ALL x::nadd. |
|
17652 | 3467 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3468 |
(EX N::nat. |
3469 |
ALL (m::nat) n::nat. |
|
3470 |
<= N n --> |
|
3471 |
<= (dist |
|
3472 |
(m * (dest_nadd x m * (dest_nadd x n * nadd_rinv x n)), |
|
3473 |
m * (dest_nadd x m * (n * n)))) |
|
3474 |
(m * (dest_nadd x m * dest_nadd x n)))" |
|
3475 |
by (import hollight NADD_MUL_LINV_LEMMA3) |
|
3476 |
||
3477 |
lemma NADD_MUL_LINV_LEMMA4: "ALL x::nadd. |
|
17652 | 3478 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3479 |
(EX N::nat. |
3480 |
ALL (m::nat) n::nat. |
|
3481 |
<= N m & <= N n --> |
|
3482 |
<= (dest_nadd x m * dest_nadd x n * |
|
3483 |
dist (m * nadd_rinv x n, n * nadd_rinv x m)) |
|
3484 |
(m * n * dist (m * dest_nadd x n, n * dest_nadd x m) + |
|
3485 |
dest_nadd x m * dest_nadd x n * (m + n)))" |
|
3486 |
by (import hollight NADD_MUL_LINV_LEMMA4) |
|
3487 |
||
3488 |
lemma NADD_MUL_LINV_LEMMA5: "ALL x::nadd. |
|
17652 | 3489 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3490 |
(EX (B::nat) N::nat. |
3491 |
ALL (m::nat) n::nat. |
|
3492 |
<= N m & <= N n --> |
|
3493 |
<= (dest_nadd x m * dest_nadd x n * |
|
3494 |
dist (m * nadd_rinv x n, n * nadd_rinv x m)) |
|
3495 |
(B * (m * n * (m + n))))" |
|
3496 |
by (import hollight NADD_MUL_LINV_LEMMA5) |
|
3497 |
||
3498 |
lemma NADD_MUL_LINV_LEMMA6: "ALL x::nadd. |
|
17652 | 3499 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3500 |
(EX (B::nat) N::nat. |
3501 |
ALL (m::nat) n::nat. |
|
3502 |
<= N m & <= N n --> |
|
3503 |
<= (m * n * dist (m * nadd_rinv x n, n * nadd_rinv x m)) |
|
3504 |
(B * (m * n * (m + n))))" |
|
3505 |
by (import hollight NADD_MUL_LINV_LEMMA6) |
|
3506 |
||
3507 |
lemma NADD_MUL_LINV_LEMMA7: "ALL x::nadd. |
|
17652 | 3508 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3509 |
(EX (B::nat) N::nat. |
3510 |
ALL (m::nat) n::nat. |
|
3511 |
<= N m & <= N n --> |
|
3512 |
<= (dist (m * nadd_rinv x n, n * nadd_rinv x m)) (B * (m + n)))" |
|
3513 |
by (import hollight NADD_MUL_LINV_LEMMA7) |
|
3514 |
||
3515 |
lemma NADD_MUL_LINV_LEMMA7a: "ALL x::nadd. |
|
17652 | 3516 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3517 |
(ALL N::nat. |
3518 |
EX (A::nat) B::nat. |
|
3519 |
ALL (m::nat) n::nat. |
|
3520 |
<= m N --> |
|
3521 |
<= (dist (m * nadd_rinv x n, n * nadd_rinv x m)) (A * n + B))" |
|
3522 |
by (import hollight NADD_MUL_LINV_LEMMA7a) |
|
3523 |
||
3524 |
lemma NADD_MUL_LINV_LEMMA8: "ALL x::nadd. |
|
17652 | 3525 |
~ nadd_eq x (nadd_of_num 0) --> |
17644 | 3526 |
(EX B::nat. |
3527 |
ALL (m::nat) n::nat. |
|
3528 |
<= (dist (m * nadd_rinv x n, n * nadd_rinv x m)) (B * (m + n)))" |
|
3529 |
by (import hollight NADD_MUL_LINV_LEMMA8) |
|
3530 |
||
3531 |
constdefs |
|
3532 |
nadd_inv :: "nadd => nadd" |
|
3533 |
"nadd_inv == |
|
3534 |
%u::nadd. |
|
17652 | 3535 |
COND (nadd_eq u (nadd_of_num 0)) (nadd_of_num 0) (mk_nadd (nadd_rinv u))" |
17644 | 3536 |
|
3537 |
lemma DEF_nadd_inv: "nadd_inv = |
|
3538 |
(%u::nadd. |
|
17652 | 3539 |
COND (nadd_eq u (nadd_of_num 0)) (nadd_of_num 0) |
17644 | 3540 |
(mk_nadd (nadd_rinv u)))" |
3541 |
by (import hollight DEF_nadd_inv) |
|
3542 |
||
3543 |
lemma NADD_INV: "ALL x::nadd. |
|
3544 |
dest_nadd (nadd_inv x) = |
|
17652 | 3545 |
COND (nadd_eq x (nadd_of_num 0)) (%n::nat. 0) (nadd_rinv x)" |
17644 | 3546 |
by (import hollight NADD_INV) |
3547 |
||
3548 |
lemma NADD_MUL_LINV: "ALL x::nadd. |
|
17652 | 3549 |
~ nadd_eq x (nadd_of_num 0) --> |
3550 |
nadd_eq (nadd_mul (nadd_inv x) x) (nadd_of_num (NUMERAL_BIT1 0))" |
|
17644 | 3551 |
by (import hollight NADD_MUL_LINV) |
3552 |
||
17652 | 3553 |
lemma NADD_INV_0: "nadd_eq (nadd_inv (nadd_of_num 0)) (nadd_of_num 0)" |
17644 | 3554 |
by (import hollight NADD_INV_0) |
3555 |
||
3556 |
lemma NADD_INV_WELLDEF: "ALL (x::nadd) y::nadd. nadd_eq x y --> nadd_eq (nadd_inv x) (nadd_inv y)" |
|
3557 |
by (import hollight NADD_INV_WELLDEF) |
|
3558 |
||
3559 |
typedef (open) hreal = "{s::nadd => bool. EX x::nadd. s = nadd_eq x}" morphisms "dest_hreal" "mk_hreal" |
|
3560 |
apply (rule light_ex_imp_nonempty[where t="nadd_eq (x::nadd)"]) |
|
3561 |
by (import hollight TYDEF_hreal) |
|
3562 |
||
3563 |
syntax |
|
3564 |
dest_hreal :: _ |
|
3565 |
||
3566 |
syntax |
|
3567 |
mk_hreal :: _ |
|
3568 |
||
3569 |
lemmas "TYDEF_hreal_@intern" = typedef_hol2hollight |
|
3570 |
[where a="a :: hreal" and r=r , |
|
3571 |
OF type_definition_hreal] |
|
3572 |
||
3573 |
constdefs |
|
3574 |
hreal_of_num :: "nat => hreal" |
|
3575 |
"hreal_of_num == %m::nat. mk_hreal (nadd_eq (nadd_of_num m))" |
|
3576 |
||
3577 |
lemma DEF_hreal_of_num: "hreal_of_num = (%m::nat. mk_hreal (nadd_eq (nadd_of_num m)))" |
|
3578 |
by (import hollight DEF_hreal_of_num) |
|
3579 |
||
3580 |
constdefs |
|
3581 |
hreal_add :: "hreal => hreal => hreal" |
|
3582 |
"hreal_add == |
|
3583 |
%(x::hreal) y::hreal. |
|
3584 |
mk_hreal |
|
3585 |
(%u::nadd. |
|
3586 |
EX (xa::nadd) ya::nadd. |
|
3587 |
nadd_eq (nadd_add xa ya) u & dest_hreal x xa & dest_hreal y ya)" |
|
3588 |
||
3589 |
lemma DEF_hreal_add: "hreal_add = |
|
3590 |
(%(x::hreal) y::hreal. |
|
3591 |
mk_hreal |
|
3592 |
(%u::nadd. |
|
3593 |
EX (xa::nadd) ya::nadd. |
|
3594 |
nadd_eq (nadd_add xa ya) u & dest_hreal x xa & dest_hreal y ya))" |
|
3595 |
by (import hollight DEF_hreal_add) |
|
3596 |
||
3597 |
constdefs |
|
3598 |
hreal_mul :: "hreal => hreal => hreal" |
|
3599 |
"hreal_mul == |
|
3600 |
%(x::hreal) y::hreal. |
|
3601 |
mk_hreal |
|
3602 |
(%u::nadd. |
|
3603 |
EX (xa::nadd) ya::nadd. |
|
3604 |
nadd_eq (nadd_mul xa ya) u & dest_hreal x xa & dest_hreal y ya)" |
|
3605 |
||
3606 |
lemma DEF_hreal_mul: "hreal_mul = |
|
3607 |
(%(x::hreal) y::hreal. |
|
3608 |
mk_hreal |
|
3609 |
(%u::nadd. |
|
3610 |
EX (xa::nadd) ya::nadd. |
|
3611 |
nadd_eq (nadd_mul xa ya) u & dest_hreal x xa & dest_hreal y ya))" |
|
3612 |
by (import hollight DEF_hreal_mul) |
|
3613 |
||
3614 |
constdefs |
|
3615 |
hreal_le :: "hreal => hreal => bool" |
|
3616 |
"hreal_le == |
|
3617 |
%(x::hreal) y::hreal. |
|
3618 |
SOME u::bool. |
|
3619 |
EX (xa::nadd) ya::nadd. |
|
3620 |
nadd_le xa ya = u & dest_hreal x xa & dest_hreal y ya" |
|
3621 |
||
3622 |
lemma DEF_hreal_le: "hreal_le = |
|
3623 |
(%(x::hreal) y::hreal. |
|
3624 |
SOME u::bool. |
|
3625 |
EX (xa::nadd) ya::nadd. |
|
3626 |
nadd_le xa ya = u & dest_hreal x xa & dest_hreal y ya)" |
|
3627 |
by (import hollight DEF_hreal_le) |
|
3628 |
||
3629 |
constdefs |
|
3630 |
hreal_inv :: "hreal => hreal" |
|
3631 |
"hreal_inv == |
|
3632 |
%x::hreal. |
|
3633 |
mk_hreal |
|
3634 |
(%u::nadd. EX xa::nadd. nadd_eq (nadd_inv xa) u & dest_hreal x xa)" |
|
3635 |
||
3636 |
lemma DEF_hreal_inv: "hreal_inv = |
|
3637 |
(%x::hreal. |
|
3638 |
mk_hreal |
|
3639 |
(%u::nadd. EX xa::nadd. nadd_eq (nadd_inv xa) u & dest_hreal x xa))" |
|
3640 |
by (import hollight DEF_hreal_inv) |
|
3641 |
||
3642 |
lemma HREAL_LE_EXISTS_DEF: "ALL (m::hreal) n::hreal. hreal_le m n = (EX d::hreal. n = hreal_add m d)" |
|
3643 |
by (import hollight HREAL_LE_EXISTS_DEF) |
|
3644 |
||
3645 |
lemma HREAL_EQ_ADD_LCANCEL: "ALL (m::hreal) (n::hreal) p::hreal. |
|
3646 |
(hreal_add m n = hreal_add m p) = (n = p)" |
|
3647 |
by (import hollight HREAL_EQ_ADD_LCANCEL) |
|
3648 |
||
3649 |
lemma HREAL_EQ_ADD_RCANCEL: "ALL (x::hreal) (xa::hreal) xb::hreal. |
|
3650 |
(hreal_add x xb = hreal_add xa xb) = (x = xa)" |
|
3651 |
by (import hollight HREAL_EQ_ADD_RCANCEL) |
|
3652 |
||
3653 |
lemma HREAL_LE_ADD_LCANCEL: "ALL (x::hreal) (xa::hreal) xb::hreal. |
|
3654 |
hreal_le (hreal_add x xa) (hreal_add x xb) = hreal_le xa xb" |
|
3655 |
by (import hollight HREAL_LE_ADD_LCANCEL) |
|
3656 |
||
3657 |
lemma HREAL_LE_ADD_RCANCEL: "ALL (x::hreal) (xa::hreal) xb::hreal. |
|
3658 |
hreal_le (hreal_add x xb) (hreal_add xa xb) = hreal_le x xa" |
|
3659 |
by (import hollight HREAL_LE_ADD_RCANCEL) |
|
3660 |
||
17652 | 3661 |
lemma HREAL_ADD_RID: "ALL x::hreal. hreal_add x (hreal_of_num 0) = x" |
17644 | 3662 |
by (import hollight HREAL_ADD_RID) |
3663 |
||
3664 |
lemma HREAL_ADD_RDISTRIB: "ALL (x::hreal) (xa::hreal) xb::hreal. |
|
3665 |
hreal_mul (hreal_add x xa) xb = |
|
3666 |
hreal_add (hreal_mul x xb) (hreal_mul xa xb)" |
|
3667 |
by (import hollight HREAL_ADD_RDISTRIB) |
|
3668 |
||
17652 | 3669 |
lemma HREAL_MUL_LZERO: "ALL m::hreal. hreal_mul (hreal_of_num 0) m = hreal_of_num 0" |
17644 | 3670 |
by (import hollight HREAL_MUL_LZERO) |
3671 |
||
17652 | 3672 |
lemma HREAL_MUL_RZERO: "ALL x::hreal. hreal_mul x (hreal_of_num 0) = hreal_of_num 0" |
17644 | 3673 |
by (import hollight HREAL_MUL_RZERO) |
3674 |
||
3675 |
lemma HREAL_ADD_AC: "hreal_add (m::hreal) (n::hreal) = hreal_add n m & |
|
3676 |
hreal_add (hreal_add m n) (p::hreal) = hreal_add m (hreal_add n p) & |
|
3677 |
hreal_add m (hreal_add n p) = hreal_add n (hreal_add m p)" |
|
3678 |
by (import hollight HREAL_ADD_AC) |
|
3679 |
||
3680 |
lemma HREAL_LE_ADD2: "ALL (a::hreal) (b::hreal) (c::hreal) d::hreal. |
|
3681 |
hreal_le a b & hreal_le c d --> hreal_le (hreal_add a c) (hreal_add b d)" |
|
3682 |
by (import hollight HREAL_LE_ADD2) |
|
3683 |
||
3684 |
lemma HREAL_LE_MUL_RCANCEL_IMP: "ALL (a::hreal) (b::hreal) c::hreal. |
|
3685 |
hreal_le a b --> hreal_le (hreal_mul a c) (hreal_mul b c)" |
|
3686 |
by (import hollight HREAL_LE_MUL_RCANCEL_IMP) |
|
3687 |
||
3688 |
constdefs |
|
3689 |
treal_of_num :: "nat => hreal * hreal" |
|
17652 | 3690 |
"treal_of_num == %u::nat. (hreal_of_num u, hreal_of_num 0)" |
3691 |
||
3692 |
lemma DEF_treal_of_num: "treal_of_num = (%u::nat. (hreal_of_num u, hreal_of_num 0))" |
|
17644 | 3693 |
by (import hollight DEF_treal_of_num) |
3694 |
||
3695 |
constdefs |
|
3696 |
treal_neg :: "hreal * hreal => hreal * hreal" |
|
3697 |
"treal_neg == %u::hreal * hreal. (snd u, fst u)" |
|
3698 |
||
3699 |
lemma DEF_treal_neg: "treal_neg = (%u::hreal * hreal. (snd u, fst u))" |
|
3700 |
by (import hollight DEF_treal_neg) |
|
3701 |
||
3702 |
constdefs |
|
3703 |
treal_add :: "hreal * hreal => hreal * hreal => hreal * hreal" |
|
3704 |
"treal_add == |
|
3705 |
%(u::hreal * hreal) ua::hreal * hreal. |
|
3706 |
(hreal_add (fst u) (fst ua), hreal_add (snd u) (snd ua))" |
|
3707 |
||
3708 |
lemma DEF_treal_add: "treal_add = |
|
3709 |
(%(u::hreal * hreal) ua::hreal * hreal. |
|
3710 |
(hreal_add (fst u) (fst ua), hreal_add (snd u) (snd ua)))" |
|
3711 |
by (import hollight DEF_treal_add) |
|
3712 |
||
3713 |
constdefs |
|
3714 |
treal_mul :: "hreal * hreal => hreal * hreal => hreal * hreal" |
|
3715 |
"treal_mul == |
|
3716 |
%(u::hreal * hreal) ua::hreal * hreal. |
|
3717 |
(hreal_add (hreal_mul (fst u) (fst ua)) (hreal_mul (snd u) (snd ua)), |
|
3718 |
hreal_add (hreal_mul (fst u) (snd ua)) (hreal_mul (snd u) (fst ua)))" |
|
3719 |
||
3720 |
lemma DEF_treal_mul: "treal_mul = |
|
3721 |
(%(u::hreal * hreal) ua::hreal * hreal. |
|
3722 |
(hreal_add (hreal_mul (fst u) (fst ua)) (hreal_mul (snd u) (snd ua)), |
|
3723 |
hreal_add (hreal_mul (fst u) (snd ua)) (hreal_mul (snd u) (fst ua))))" |
|
3724 |
by (import hollight DEF_treal_mul) |
|
3725 |
||
3726 |
constdefs |
|
3727 |
treal_le :: "hreal * hreal => hreal * hreal => bool" |
|
3728 |
"treal_le == |
|
3729 |
%(u::hreal * hreal) ua::hreal * hreal. |
|
3730 |
hreal_le (hreal_add (fst u) (snd ua)) (hreal_add (fst ua) (snd u))" |
|
3731 |
||
3732 |
lemma DEF_treal_le: "treal_le = |
|
3733 |
(%(u::hreal * hreal) ua::hreal * hreal. |
|
3734 |
hreal_le (hreal_add (fst u) (snd ua)) (hreal_add (fst ua) (snd u)))" |
|
3735 |
by (import hollight DEF_treal_le) |
|
3736 |
||
3737 |
constdefs |
|
3738 |
treal_inv :: "hreal * hreal => hreal * hreal" |
|
3739 |
"treal_inv == |
|
3740 |
%u::hreal * hreal. |
|
17652 | 3741 |
COND (fst u = snd u) (hreal_of_num 0, hreal_of_num 0) |
17644 | 3742 |
(COND (hreal_le (snd u) (fst u)) |
3743 |
(hreal_inv (SOME d::hreal. fst u = hreal_add (snd u) d), |
|
17652 | 3744 |
hreal_of_num 0) |
3745 |
(hreal_of_num 0, |
|
17644 | 3746 |
hreal_inv (SOME d::hreal. snd u = hreal_add (fst u) d)))" |
3747 |
||
3748 |
lemma DEF_treal_inv: "treal_inv = |
|
3749 |
(%u::hreal * hreal. |
|
17652 | 3750 |
COND (fst u = snd u) (hreal_of_num 0, hreal_of_num 0) |
17644 | 3751 |
(COND (hreal_le (snd u) (fst u)) |
3752 |
(hreal_inv (SOME d::hreal. fst u = hreal_add (snd u) d), |
|
17652 | 3753 |
hreal_of_num 0) |
3754 |
(hreal_of_num 0, |
|
17644 | 3755 |
hreal_inv (SOME d::hreal. snd u = hreal_add (fst u) d))))" |
3756 |
by (import hollight DEF_treal_inv) |
|
3757 |
||
3758 |
constdefs |
|
3759 |
treal_eq :: "hreal * hreal => hreal * hreal => bool" |
|
3760 |
"treal_eq == |
|
3761 |
%(u::hreal * hreal) ua::hreal * hreal. |
|
3762 |
hreal_add (fst u) (snd ua) = hreal_add (fst ua) (snd u)" |
|
3763 |
||
3764 |
lemma DEF_treal_eq: "treal_eq = |
|
3765 |
(%(u::hreal * hreal) ua::hreal * hreal. |
|
3766 |
hreal_add (fst u) (snd ua) = hreal_add (fst ua) (snd u))" |
|
3767 |
by (import hollight DEF_treal_eq) |
|
3768 |
||
3769 |
lemma TREAL_EQ_REFL: "ALL x::hreal * hreal. treal_eq x x" |
|
3770 |
by (import hollight TREAL_EQ_REFL) |
|
3771 |
||
3772 |
lemma TREAL_EQ_SYM: "ALL (x::hreal * hreal) y::hreal * hreal. treal_eq x y = treal_eq y x" |
|
3773 |
by (import hollight TREAL_EQ_SYM) |
|
3774 |
||
3775 |
lemma TREAL_EQ_TRANS: "ALL (x::hreal * hreal) (y::hreal * hreal) z::hreal * hreal. |
|
3776 |
treal_eq x y & treal_eq y z --> treal_eq x z" |
|
3777 |
by (import hollight TREAL_EQ_TRANS) |
|
3778 |
||
3779 |
lemma TREAL_EQ_AP: "ALL (x::hreal * hreal) y::hreal * hreal. x = y --> treal_eq x y" |
|
3780 |
by (import hollight TREAL_EQ_AP) |
|
3781 |
||
3782 |
lemma TREAL_OF_NUM_EQ: "ALL (x::nat) xa::nat. treal_eq (treal_of_num x) (treal_of_num xa) = (x = xa)" |
|
3783 |
by (import hollight TREAL_OF_NUM_EQ) |
|
3784 |
||
3785 |
lemma TREAL_OF_NUM_LE: "ALL (x::nat) xa::nat. treal_le (treal_of_num x) (treal_of_num xa) = <= x xa" |
|
3786 |
by (import hollight TREAL_OF_NUM_LE) |
|
3787 |
||
3788 |
lemma TREAL_OF_NUM_ADD: "ALL (x::nat) xa::nat. |
|
3789 |
treal_eq (treal_add (treal_of_num x) (treal_of_num xa)) |
|
3790 |
(treal_of_num (x + xa))" |
|
3791 |
by (import hollight TREAL_OF_NUM_ADD) |
|
3792 |
||
3793 |
lemma TREAL_OF_NUM_MUL: "ALL (x::nat) xa::nat. |
|
3794 |
treal_eq (treal_mul (treal_of_num x) (treal_of_num xa)) |
|
3795 |
(treal_of_num (x * xa))" |
|
3796 |
by (import hollight TREAL_OF_NUM_MUL) |
|
3797 |
||
3798 |
lemma TREAL_ADD_SYM_EQ: "ALL (x::hreal * hreal) y::hreal * hreal. treal_add x y = treal_add y x" |
|
3799 |
by (import hollight TREAL_ADD_SYM_EQ) |
|
3800 |
||
3801 |
lemma TREAL_MUL_SYM_EQ: "ALL (x::hreal * hreal) y::hreal * hreal. treal_mul x y = treal_mul y x" |
|
3802 |
by (import hollight TREAL_MUL_SYM_EQ) |
|
3803 |
||
3804 |
lemma TREAL_ADD_SYM: "ALL (x::hreal * hreal) y::hreal * hreal. |
|
3805 |
treal_eq (treal_add x y) (treal_add y x)" |
|
3806 |
by (import hollight TREAL_ADD_SYM) |
|
3807 |
||
3808 |
lemma TREAL_ADD_ASSOC: "ALL (x::hreal * hreal) (y::hreal * hreal) z::hreal * hreal. |
|
3809 |
treal_eq (treal_add x (treal_add y z)) (treal_add (treal_add x y) z)" |
|
3810 |
by (import hollight TREAL_ADD_ASSOC) |
|
3811 |
||
17652 | 3812 |
lemma TREAL_ADD_LID: "ALL x::hreal * hreal. treal_eq (treal_add (treal_of_num 0) x) x" |
17644 | 3813 |
by (import hollight TREAL_ADD_LID) |
3814 |
||
17652 | 3815 |
lemma TREAL_ADD_LINV: "ALL x::hreal * hreal. treal_eq (treal_add (treal_neg x) x) (treal_of_num 0)" |
17644 | 3816 |
by (import hollight TREAL_ADD_LINV) |
3817 |
||
3818 |
lemma TREAL_MUL_SYM: "ALL (x::hreal * hreal) y::hreal * hreal. |
|
3819 |
treal_eq (treal_mul x y) (treal_mul y x)" |
|
3820 |
by (import hollight TREAL_MUL_SYM) |
|
3821 |
||
3822 |
lemma TREAL_MUL_ASSOC: "ALL (x::hreal * hreal) (y::hreal * hreal) z::hreal * hreal. |
|
3823 |
treal_eq (treal_mul x (treal_mul y z)) (treal_mul (treal_mul x y) z)" |
|
3824 |
by (import hollight TREAL_MUL_ASSOC) |
|
3825 |
||
3826 |
lemma TREAL_MUL_LID: "ALL x::hreal * hreal. |
|
17652 | 3827 |
treal_eq (treal_mul (treal_of_num (NUMERAL_BIT1 0)) x) x" |
17644 | 3828 |
by (import hollight TREAL_MUL_LID) |
3829 |
||
3830 |
lemma TREAL_ADD_LDISTRIB: "ALL (x::hreal * hreal) (y::hreal * hreal) z::hreal * hreal. |
|
3831 |
treal_eq (treal_mul x (treal_add y z)) |
|
3832 |
(treal_add (treal_mul x y) (treal_mul x z))" |
|
3833 |
by (import hollight TREAL_ADD_LDISTRIB) |
|
3834 |
||
3835 |
lemma TREAL_LE_REFL: "ALL x::hreal * hreal. treal_le x x" |
|
3836 |
by (import hollight TREAL_LE_REFL) |
|
3837 |
||
3838 |
lemma TREAL_LE_ANTISYM: "ALL (x::hreal * hreal) y::hreal * hreal. |
|
3839 |
(treal_le x y & treal_le y x) = treal_eq x y" |
|
3840 |
by (import hollight TREAL_LE_ANTISYM) |
|
3841 |
||
3842 |
lemma TREAL_LE_TRANS: "ALL (x::hreal * hreal) (y::hreal * hreal) z::hreal * hreal. |
|
3843 |
treal_le x y & treal_le y z --> treal_le x z" |
|
3844 |
by (import hollight TREAL_LE_TRANS) |
|
3845 |
||
3846 |
lemma TREAL_LE_TOTAL: "ALL (x::hreal * hreal) y::hreal * hreal. treal_le x y | treal_le y x" |
|
3847 |
by (import hollight TREAL_LE_TOTAL) |
|
3848 |
||
3849 |
lemma TREAL_LE_LADD_IMP: "ALL (x::hreal * hreal) (y::hreal * hreal) z::hreal * hreal. |
|
3850 |
treal_le y z --> treal_le (treal_add x y) (treal_add x z)" |
|
3851 |
by (import hollight TREAL_LE_LADD_IMP) |
|
3852 |
||
3853 |
lemma TREAL_LE_MUL: "ALL (x::hreal * hreal) y::hreal * hreal. |
|
17652 | 3854 |
treal_le (treal_of_num 0) x & treal_le (treal_of_num 0) y --> |
3855 |
treal_le (treal_of_num 0) (treal_mul x y)" |
|
17644 | 3856 |
by (import hollight TREAL_LE_MUL) |
3857 |
||
17652 | 3858 |
lemma TREAL_INV_0: "treal_eq (treal_inv (treal_of_num 0)) (treal_of_num 0)" |
17644 | 3859 |
by (import hollight TREAL_INV_0) |
3860 |
||
3861 |
lemma TREAL_MUL_LINV: "ALL x::hreal * hreal. |
|
17652 | 3862 |
~ treal_eq x (treal_of_num 0) --> |
3863 |
treal_eq (treal_mul (treal_inv x) x) (treal_of_num (NUMERAL_BIT1 0))" |
|
17644 | 3864 |
by (import hollight TREAL_MUL_LINV) |
3865 |
||
3866 |
lemma TREAL_OF_NUM_WELLDEF: "ALL (m::nat) n::nat. m = n --> treal_eq (treal_of_num m) (treal_of_num n)" |
|
3867 |
by (import hollight TREAL_OF_NUM_WELLDEF) |
|
3868 |
||
3869 |
lemma TREAL_NEG_WELLDEF: "ALL (x1::hreal * hreal) x2::hreal * hreal. |
|
3870 |
treal_eq x1 x2 --> treal_eq (treal_neg x1) (treal_neg x2)" |
|
3871 |
by (import hollight TREAL_NEG_WELLDEF) |
|
3872 |
||
3873 |
lemma TREAL_ADD_WELLDEFR: "ALL (x1::hreal * hreal) (x2::hreal * hreal) y::hreal * hreal. |
|
3874 |
treal_eq x1 x2 --> treal_eq (treal_add x1 y) (treal_add x2 y)" |
|
3875 |
by (import hollight TREAL_ADD_WELLDEFR) |
|
3876 |
||
3877 |
lemma TREAL_ADD_WELLDEF: "ALL (x1::hreal * hreal) (x2::hreal * hreal) (y1::hreal * hreal) |
|
3878 |
y2::hreal * hreal. |
|
3879 |
treal_eq x1 x2 & treal_eq y1 y2 --> |
|
3880 |
treal_eq (treal_add x1 y1) (treal_add x2 y2)" |
|
3881 |
by (import hollight TREAL_ADD_WELLDEF) |
|
3882 |
||
3883 |
lemma TREAL_MUL_WELLDEFR: "ALL (x1::hreal * hreal) (x2::hreal * hreal) y::hreal * hreal. |
|
3884 |
treal_eq x1 x2 --> treal_eq (treal_mul x1 y) (treal_mul x2 y)" |
|
3885 |
by (import hollight TREAL_MUL_WELLDEFR) |
|
3886 |
||
3887 |
lemma TREAL_MUL_WELLDEF: "ALL (x1::hreal * hreal) (x2::hreal * hreal) (y1::hreal * hreal) |
|
3888 |
y2::hreal * hreal. |
|
3889 |
treal_eq x1 x2 & treal_eq y1 y2 --> |
|
3890 |
treal_eq (treal_mul x1 y1) (treal_mul x2 y2)" |
|
3891 |
by (import hollight TREAL_MUL_WELLDEF) |
|
3892 |
||
3893 |
lemma TREAL_EQ_IMP_LE: "ALL (x::hreal * hreal) y::hreal * hreal. treal_eq x y --> treal_le x y" |
|
3894 |
by (import hollight TREAL_EQ_IMP_LE) |
|
3895 |
||
3896 |
lemma TREAL_LE_WELLDEF: "ALL (x1::hreal * hreal) (x2::hreal * hreal) (y1::hreal * hreal) |
|
3897 |
y2::hreal * hreal. |
|
3898 |
treal_eq x1 x2 & treal_eq y1 y2 --> treal_le x1 y1 = treal_le x2 y2" |
|
3899 |
by (import hollight TREAL_LE_WELLDEF) |
|
3900 |
||
3901 |
lemma TREAL_INV_WELLDEF: "ALL (x::hreal * hreal) y::hreal * hreal. |
|
3902 |
treal_eq x y --> treal_eq (treal_inv x) (treal_inv y)" |
|
3903 |
by (import hollight TREAL_INV_WELLDEF) |
|
3904 |
||
3905 |
typedef (open) real = "{s::hreal * hreal => bool. EX x::hreal * hreal. s = treal_eq x}" morphisms "dest_real" "mk_real" |
|
3906 |
apply (rule light_ex_imp_nonempty[where t="treal_eq (x::hreal * hreal)"]) |
|
3907 |
by (import hollight TYDEF_real) |
|
3908 |
||
3909 |
syntax |
|
3910 |
dest_real :: _ |
|
3911 |
||
3912 |
syntax |
|
3913 |
mk_real :: _ |
|
3914 |
||
3915 |
lemmas "TYDEF_real_@intern" = typedef_hol2hollight |
|
3916 |
[where a="a :: hollight.real" and r=r , |
|
3917 |
OF type_definition_real] |
|
3918 |
||
3919 |
constdefs |
|
3920 |
real_of_num :: "nat => hollight.real" |
|
3921 |
"real_of_num == %m::nat. mk_real (treal_eq (treal_of_num m))" |
|
3922 |
||
3923 |
lemma DEF_real_of_num: "real_of_num = (%m::nat. mk_real (treal_eq (treal_of_num m)))" |
|
3924 |
by (import hollight DEF_real_of_num) |
|
3925 |
||
3926 |
constdefs |
|
3927 |
real_neg :: "hollight.real => hollight.real" |
|
3928 |
"real_neg == |
|
3929 |
%x1::hollight.real. |
|
3930 |
mk_real |
|
3931 |
(%u::hreal * hreal. |
|
3932 |
EX x1a::hreal * hreal. |
|
3933 |
treal_eq (treal_neg x1a) u & dest_real x1 x1a)" |
|
3934 |
||
3935 |
lemma DEF_real_neg: "real_neg = |
|
3936 |
(%x1::hollight.real. |
|
3937 |
mk_real |
|
3938 |
(%u::hreal * hreal. |
|
3939 |
EX x1a::hreal * hreal. |
|
3940 |
treal_eq (treal_neg x1a) u & dest_real x1 x1a))" |
|
3941 |
by (import hollight DEF_real_neg) |
|
3942 |
||
3943 |
constdefs |
|
3944 |
real_add :: "hollight.real => hollight.real => hollight.real" |
|
3945 |
"real_add == |
|
3946 |
%(x1::hollight.real) y1::hollight.real. |
|
3947 |
mk_real |
|
3948 |
(%u::hreal * hreal. |
|
3949 |
EX (x1a::hreal * hreal) y1a::hreal * hreal. |
|
3950 |
treal_eq (treal_add x1a y1a) u & |
|
3951 |
dest_real x1 x1a & dest_real y1 y1a)" |
|
3952 |
||
3953 |
lemma DEF_real_add: "real_add = |
|
3954 |
(%(x1::hollight.real) y1::hollight.real. |
|
3955 |
mk_real |
|
3956 |
(%u::hreal * hreal. |
|
3957 |
EX (x1a::hreal * hreal) y1a::hreal * hreal. |
|
3958 |
treal_eq (treal_add x1a y1a) u & |
|
3959 |
dest_real x1 x1a & dest_real y1 y1a))" |
|
3960 |
by (import hollight DEF_real_add) |
|
3961 |
||
3962 |
constdefs |
|
3963 |
real_mul :: "hollight.real => hollight.real => hollight.real" |
|
3964 |
"real_mul == |
|
3965 |
%(x1::hollight.real) y1::hollight.real. |
|
3966 |
mk_real |
|
3967 |
(%u::hreal * hreal. |
|
3968 |
EX (x1a::hreal * hreal) y1a::hreal * hreal. |
|
3969 |
treal_eq (treal_mul x1a y1a) u & |
|
3970 |
dest_real x1 x1a & dest_real y1 y1a)" |
|
3971 |
||
3972 |
lemma DEF_real_mul: "real_mul = |
|
3973 |
(%(x1::hollight.real) y1::hollight.real. |
|
3974 |
mk_real |
|
3975 |
(%u::hreal * hreal. |
|
3976 |
EX (x1a::hreal * hreal) y1a::hreal * hreal. |
|
3977 |
treal_eq (treal_mul x1a y1a) u & |
|
3978 |
dest_real x1 x1a & dest_real y1 y1a))" |
|
3979 |
by (import hollight DEF_real_mul) |
|
3980 |
||
3981 |
constdefs |
|
3982 |
real_le :: "hollight.real => hollight.real => bool" |
|
3983 |
"real_le == |
|
3984 |
%(x1::hollight.real) y1::hollight.real. |
|
3985 |
SOME u::bool. |
|
3986 |
EX (x1a::hreal * hreal) y1a::hreal * hreal. |
|
3987 |
treal_le x1a y1a = u & dest_real x1 x1a & dest_real y1 y1a" |
|
3988 |
||
3989 |
lemma DEF_real_le: "real_le = |
|
3990 |
(%(x1::hollight.real) y1::hollight.real. |
|
3991 |
SOME u::bool. |
|
3992 |
EX (x1a::hreal * hreal) y1a::hreal * hreal. |
|
3993 |
treal_le x1a y1a = u & dest_real x1 x1a & dest_real y1 y1a)" |
|
3994 |
by (import hollight DEF_real_le) |
|
3995 |
||
3996 |
constdefs |
|
3997 |
real_inv :: "hollight.real => hollight.real" |
|
3998 |
"real_inv == |
|
3999 |
%x::hollight.real. |
|
4000 |
mk_real |
|
4001 |
(%u::hreal * hreal. |
|
4002 |
EX xa::hreal * hreal. treal_eq (treal_inv xa) u & dest_real x xa)" |
|
4003 |
||
4004 |
lemma DEF_real_inv: "real_inv = |
|
4005 |
(%x::hollight.real. |
|
4006 |
mk_real |
|
4007 |
(%u::hreal * hreal. |
|
4008 |
EX xa::hreal * hreal. treal_eq (treal_inv xa) u & dest_real x xa))" |
|
4009 |
by (import hollight DEF_real_inv) |
|
4010 |
||
4011 |
constdefs |
|
4012 |
real_sub :: "hollight.real => hollight.real => hollight.real" |
|
4013 |
"real_sub == %(u::hollight.real) ua::hollight.real. real_add u (real_neg ua)" |
|
4014 |
||
4015 |
lemma DEF_real_sub: "real_sub = (%(u::hollight.real) ua::hollight.real. real_add u (real_neg ua))" |
|
4016 |
by (import hollight DEF_real_sub) |
|
4017 |
||
4018 |
constdefs |
|
4019 |
real_lt :: "hollight.real => hollight.real => bool" |
|
4020 |
"real_lt == %(u::hollight.real) ua::hollight.real. ~ real_le ua u" |
|
4021 |
||
4022 |
lemma DEF_real_lt: "real_lt = (%(u::hollight.real) ua::hollight.real. ~ real_le ua u)" |
|
4023 |
by (import hollight DEF_real_lt) |
|
4024 |
||
4025 |
consts |
|
4026 |
real_ge :: "hollight.real => hollight.real => bool" |
|
4027 |
||
4028 |
defs |
|
4029 |
real_ge_def: "hollight.real_ge == %(u::hollight.real) ua::hollight.real. real_le ua u" |
|
4030 |
||
4031 |
lemma DEF_real_ge: "hollight.real_ge = (%(u::hollight.real) ua::hollight.real. real_le ua u)" |
|
4032 |
by (import hollight DEF_real_ge) |
|
4033 |
||
4034 |
consts |
|
4035 |
real_gt :: "hollight.real => hollight.real => bool" |
|
4036 |
||
4037 |
defs |
|
4038 |
real_gt_def: "hollight.real_gt == %(u::hollight.real) ua::hollight.real. real_lt ua u" |
|
4039 |
||
4040 |
lemma DEF_real_gt: "hollight.real_gt = (%(u::hollight.real) ua::hollight.real. real_lt ua u)" |
|
4041 |
by (import hollight DEF_real_gt) |
|
4042 |
||
4043 |
constdefs |
|
4044 |
real_abs :: "hollight.real => hollight.real" |
|
4045 |
"real_abs == |
|
17652 | 4046 |
%u::hollight.real. COND (real_le (real_of_num 0) u) u (real_neg u)" |
17644 | 4047 |
|
4048 |
lemma DEF_real_abs: "real_abs = |
|
17652 | 4049 |
(%u::hollight.real. COND (real_le (real_of_num 0) u) u (real_neg u))" |
17644 | 4050 |
by (import hollight DEF_real_abs) |
4051 |
||
4052 |
constdefs |
|
4053 |
real_pow :: "hollight.real => nat => hollight.real" |
|
4054 |
"real_pow == |
|
4055 |
SOME real_pow::hollight.real => nat => hollight.real. |
|
17652 | 4056 |
(ALL x::hollight.real. real_pow x 0 = real_of_num (NUMERAL_BIT1 0)) & |
17644 | 4057 |
(ALL (x::hollight.real) n::nat. |
4058 |
real_pow x (Suc n) = real_mul x (real_pow x n))" |
|
4059 |
||
4060 |
lemma DEF_real_pow: "real_pow = |
|
4061 |
(SOME real_pow::hollight.real => nat => hollight.real. |
|
17652 | 4062 |
(ALL x::hollight.real. real_pow x 0 = real_of_num (NUMERAL_BIT1 0)) & |
17644 | 4063 |
(ALL (x::hollight.real) n::nat. |
4064 |
real_pow x (Suc n) = real_mul x (real_pow x n)))" |
|
4065 |
by (import hollight DEF_real_pow) |
|
4066 |
||
4067 |
constdefs |
|
4068 |
real_div :: "hollight.real => hollight.real => hollight.real" |
|
4069 |
"real_div == %(u::hollight.real) ua::hollight.real. real_mul u (real_inv ua)" |
|
4070 |
||
4071 |
lemma DEF_real_div: "real_div = (%(u::hollight.real) ua::hollight.real. real_mul u (real_inv ua))" |
|
4072 |
by (import hollight DEF_real_div) |
|
4073 |
||
4074 |
constdefs |
|
4075 |
real_max :: "hollight.real => hollight.real => hollight.real" |
|
4076 |
"real_max == %(u::hollight.real) ua::hollight.real. COND (real_le u ua) ua u" |
|
4077 |
||
4078 |
lemma DEF_real_max: "real_max = (%(u::hollight.real) ua::hollight.real. COND (real_le u ua) ua u)" |
|
4079 |
by (import hollight DEF_real_max) |
|
4080 |
||
4081 |
constdefs |
|
4082 |
real_min :: "hollight.real => hollight.real => hollight.real" |
|
4083 |
"real_min == %(u::hollight.real) ua::hollight.real. COND (real_le u ua) u ua" |
|
4084 |
||
4085 |
lemma DEF_real_min: "real_min = (%(u::hollight.real) ua::hollight.real. COND (real_le u ua) u ua)" |
|
4086 |
by (import hollight DEF_real_min) |
|
4087 |
||
4088 |
lemma REAL_HREAL_LEMMA1: "EX x::hreal => hollight.real. |
|
4089 |
(ALL xa::hollight.real. |
|
17652 | 4090 |
real_le (real_of_num 0) xa = (EX y::hreal. xa = x y)) & |
17644 | 4091 |
(ALL (y::hreal) z::hreal. hreal_le y z = real_le (x y) (x z))" |
4092 |
by (import hollight REAL_HREAL_LEMMA1) |
|
4093 |
||
4094 |
lemma REAL_HREAL_LEMMA2: "EX (x::hollight.real => hreal) r::hreal => hollight.real. |
|
4095 |
(ALL xa::hreal. x (r xa) = xa) & |
|
17652 | 4096 |
(ALL xa::hollight.real. real_le (real_of_num 0) xa --> r (x xa) = xa) & |
4097 |
(ALL x::hreal. real_le (real_of_num 0) (r x)) & |
|
17644 | 4098 |
(ALL (x::hreal) y::hreal. hreal_le x y = real_le (r x) (r y))" |
4099 |
by (import hollight REAL_HREAL_LEMMA2) |
|
4100 |
||
4101 |
lemma REAL_COMPLETE_SOMEPOS: "ALL P::hollight.real => bool. |
|
17652 | 4102 |
(EX x::hollight.real. P x & real_le (real_of_num 0) x) & |
17644 | 4103 |
(EX M::hollight.real. ALL x::hollight.real. P x --> real_le x M) --> |
4104 |
(EX M::hollight.real. |
|
4105 |
(ALL x::hollight.real. P x --> real_le x M) & |
|
4106 |
(ALL M'::hollight.real. |
|
4107 |
(ALL x::hollight.real. P x --> real_le x M') --> real_le M M'))" |
|
4108 |
by (import hollight REAL_COMPLETE_SOMEPOS) |
|
4109 |
||
4110 |
lemma REAL_COMPLETE: "ALL P::hollight.real => bool. |
|
4111 |
Ex P & |
|
4112 |
(EX M::hollight.real. ALL x::hollight.real. P x --> real_le x M) --> |
|
4113 |
(EX M::hollight.real. |
|
4114 |
(ALL x::hollight.real. P x --> real_le x M) & |
|
4115 |
(ALL M'::hollight.real. |
|
4116 |
(ALL x::hollight.real. P x --> real_le x M') --> real_le M M'))" |
|
4117 |
by (import hollight REAL_COMPLETE) |
|
4118 |
||
4119 |
lemma REAL_ADD_AC: "real_add (m::hollight.real) (n::hollight.real) = real_add n m & |
|
4120 |
real_add (real_add m n) (p::hollight.real) = real_add m (real_add n p) & |
|
4121 |
real_add m (real_add n p) = real_add n (real_add m p)" |
|
4122 |
by (import hollight REAL_ADD_AC) |
|
4123 |
||
17652 | 4124 |
lemma REAL_ADD_RINV: "ALL x::hollight.real. real_add x (real_neg x) = real_of_num 0" |
17644 | 4125 |
by (import hollight REAL_ADD_RINV) |
4126 |
||
4127 |
lemma REAL_EQ_ADD_LCANCEL: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4128 |
(real_add x y = real_add x z) = (y = z)" |
|
4129 |
by (import hollight REAL_EQ_ADD_LCANCEL) |
|
4130 |
||
4131 |
lemma REAL_EQ_ADD_RCANCEL: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4132 |
(real_add x z = real_add y z) = (x = y)" |
|
4133 |
by (import hollight REAL_EQ_ADD_RCANCEL) |
|
4134 |
||
19093 | 4135 |
lemma REAL_MUL_RZERO: "ALL x::hollight.real. real_mul x (real_of_num 0) = real_of_num 0" |
4136 |
by (import hollight REAL_MUL_RZERO) |
|
4137 |
||
4138 |
lemma REAL_MUL_LZERO: "ALL x::hollight.real. real_mul (real_of_num 0) x = real_of_num 0" |
|
4139 |
by (import hollight REAL_MUL_LZERO) |
|
4140 |
||
17644 | 4141 |
lemma REAL_NEG_NEG: "ALL x::hollight.real. real_neg (real_neg x) = x" |
4142 |
by (import hollight REAL_NEG_NEG) |
|
4143 |
||
4144 |
lemma REAL_MUL_RNEG: "ALL (x::hollight.real) y::hollight.real. |
|
4145 |
real_mul x (real_neg y) = real_neg (real_mul x y)" |
|
4146 |
by (import hollight REAL_MUL_RNEG) |
|
4147 |
||
4148 |
lemma REAL_MUL_LNEG: "ALL (x::hollight.real) y::hollight.real. |
|
4149 |
real_mul (real_neg x) y = real_neg (real_mul x y)" |
|
4150 |
by (import hollight REAL_MUL_LNEG) |
|
4151 |
||
19093 | 4152 |
lemma REAL_NEG_ADD: "ALL (x::hollight.real) y::hollight.real. |
4153 |
real_neg (real_add x y) = real_add (real_neg x) (real_neg y)" |
|
4154 |
by (import hollight REAL_NEG_ADD) |
|
4155 |
||
17652 | 4156 |
lemma REAL_ADD_RID: "ALL x::hollight.real. real_add x (real_of_num 0) = x" |
17644 | 4157 |
by (import hollight REAL_ADD_RID) |
4158 |
||
19093 | 4159 |
lemma REAL_NEG_0: "real_neg (real_of_num 0) = real_of_num 0" |
4160 |
by (import hollight REAL_NEG_0) |
|
4161 |
||
17644 | 4162 |
lemma REAL_LE_LNEG: "ALL (x::hollight.real) y::hollight.real. |
17652 | 4163 |
real_le (real_neg x) y = real_le (real_of_num 0) (real_add x y)" |
17644 | 4164 |
by (import hollight REAL_LE_LNEG) |
4165 |
||
4166 |
lemma REAL_LE_NEG2: "ALL (x::hollight.real) y::hollight.real. |
|
4167 |
real_le (real_neg x) (real_neg y) = real_le y x" |
|
4168 |
by (import hollight REAL_LE_NEG2) |
|
4169 |
||
4170 |
lemma REAL_LE_RNEG: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4171 |
real_le x (real_neg y) = real_le (real_add x y) (real_of_num 0)" |
17644 | 4172 |
by (import hollight REAL_LE_RNEG) |
4173 |
||
4174 |
lemma REAL_OF_NUM_POW: "ALL (x::nat) n::nat. real_pow (real_of_num x) n = real_of_num (EXP x n)" |
|
4175 |
by (import hollight REAL_OF_NUM_POW) |
|
4176 |
||
4177 |
lemma REAL_POW_NEG: "ALL (x::hollight.real) n::nat. |
|
4178 |
real_pow (real_neg x) n = |
|
4179 |
COND (EVEN n) (real_pow x n) (real_neg (real_pow x n))" |
|
4180 |
by (import hollight REAL_POW_NEG) |
|
4181 |
||
4182 |
lemma REAL_ABS_NUM: "ALL x::nat. real_abs (real_of_num x) = real_of_num x" |
|
4183 |
by (import hollight REAL_ABS_NUM) |
|
4184 |
||
4185 |
lemma REAL_ABS_NEG: "ALL x::hollight.real. real_abs (real_neg x) = real_abs x" |
|
4186 |
by (import hollight REAL_ABS_NEG) |
|
4187 |
||
4188 |
lemma REAL_LTE_TOTAL: "ALL (x::hollight.real) xa::hollight.real. real_lt x xa | real_le xa x" |
|
4189 |
by (import hollight REAL_LTE_TOTAL) |
|
4190 |
||
4191 |
lemma REAL_LET_TOTAL: "ALL (x::hollight.real) xa::hollight.real. real_le x xa | real_lt xa x" |
|
4192 |
by (import hollight REAL_LET_TOTAL) |
|
4193 |
||
19093 | 4194 |
lemma REAL_LT_IMP_LE: "ALL (x::hollight.real) y::hollight.real. real_lt x y --> real_le x y" |
4195 |
by (import hollight REAL_LT_IMP_LE) |
|
4196 |
||
4197 |
lemma REAL_LTE_TRANS: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4198 |
real_lt x y & real_le y z --> real_lt x z" |
|
4199 |
by (import hollight REAL_LTE_TRANS) |
|
4200 |
||
17644 | 4201 |
lemma REAL_LET_TRANS: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
4202 |
real_le x y & real_lt y z --> real_lt x z" |
|
4203 |
by (import hollight REAL_LET_TRANS) |
|
4204 |
||
4205 |
lemma REAL_LT_TRANS: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4206 |
real_lt x y & real_lt y z --> real_lt x z" |
|
4207 |
by (import hollight REAL_LT_TRANS) |
|
4208 |
||
4209 |
lemma REAL_LE_ADD: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4210 |
real_le (real_of_num 0) x & real_le (real_of_num 0) y --> |
4211 |
real_le (real_of_num 0) (real_add x y)" |
|
17644 | 4212 |
by (import hollight REAL_LE_ADD) |
4213 |
||
4214 |
lemma REAL_LTE_ANTISYM: "ALL (x::hollight.real) y::hollight.real. ~ (real_lt x y & real_le y x)" |
|
4215 |
by (import hollight REAL_LTE_ANTISYM) |
|
4216 |
||
19093 | 4217 |
lemma REAL_SUB_LE: "ALL (x::hollight.real) xa::hollight.real. |
4218 |
real_le (real_of_num 0) (real_sub x xa) = real_le xa x" |
|
4219 |
by (import hollight REAL_SUB_LE) |
|
4220 |
||
4221 |
lemma REAL_NEG_SUB: "ALL (x::hollight.real) xa::hollight.real. |
|
4222 |
real_neg (real_sub x xa) = real_sub xa x" |
|
4223 |
by (import hollight REAL_NEG_SUB) |
|
4224 |
||
4225 |
lemma REAL_LE_LT: "ALL (x::hollight.real) xa::hollight.real. |
|
4226 |
real_le x xa = (real_lt x xa | x = xa)" |
|
4227 |
by (import hollight REAL_LE_LT) |
|
4228 |
||
4229 |
lemma REAL_SUB_LT: "ALL (x::hollight.real) xa::hollight.real. |
|
4230 |
real_lt (real_of_num 0) (real_sub x xa) = real_lt xa x" |
|
4231 |
by (import hollight REAL_SUB_LT) |
|
4232 |
||
4233 |
lemma REAL_NOT_LT: "ALL (x::hollight.real) xa::hollight.real. (~ real_lt x xa) = real_le xa x" |
|
4234 |
by (import hollight REAL_NOT_LT) |
|
4235 |
||
4236 |
lemma REAL_SUB_0: "ALL (x::hollight.real) y::hollight.real. |
|
4237 |
(real_sub x y = real_of_num 0) = (x = y)" |
|
4238 |
by (import hollight REAL_SUB_0) |
|
4239 |
||
4240 |
lemma REAL_LT_LE: "ALL (x::hollight.real) y::hollight.real. |
|
4241 |
real_lt x y = (real_le x y & x ~= y)" |
|
4242 |
by (import hollight REAL_LT_LE) |
|
4243 |
||
17644 | 4244 |
lemma REAL_LT_REFL: "ALL x::hollight.real. ~ real_lt x x" |
4245 |
by (import hollight REAL_LT_REFL) |
|
4246 |
||
19093 | 4247 |
lemma REAL_LTE_ADD: "ALL (x::hollight.real) y::hollight.real. |
4248 |
real_lt (real_of_num 0) x & real_le (real_of_num 0) y --> |
|
4249 |
real_lt (real_of_num 0) (real_add x y)" |
|
4250 |
by (import hollight REAL_LTE_ADD) |
|
4251 |
||
17644 | 4252 |
lemma REAL_LET_ADD: "ALL (x::hollight.real) y::hollight.real. |
17652 | 4253 |
real_le (real_of_num 0) x & real_lt (real_of_num 0) y --> |
4254 |
real_lt (real_of_num 0) (real_add x y)" |
|
17644 | 4255 |
by (import hollight REAL_LET_ADD) |
4256 |
||
19093 | 4257 |
lemma REAL_LT_ADD: "ALL (x::hollight.real) y::hollight.real. |
4258 |
real_lt (real_of_num 0) x & real_lt (real_of_num 0) y --> |
|
4259 |
real_lt (real_of_num 0) (real_add x y)" |
|
4260 |
by (import hollight REAL_LT_ADD) |
|
4261 |
||
17644 | 4262 |
lemma REAL_ENTIRE: "ALL (x::hollight.real) y::hollight.real. |
17652 | 4263 |
(real_mul x y = real_of_num 0) = (x = real_of_num 0 | y = real_of_num 0)" |
17644 | 4264 |
by (import hollight REAL_ENTIRE) |
4265 |
||
19093 | 4266 |
lemma REAL_LE_NEGTOTAL: "ALL x::hollight.real. |
4267 |
real_le (real_of_num 0) x | real_le (real_of_num 0) (real_neg x)" |
|
4268 |
by (import hollight REAL_LE_NEGTOTAL) |
|
4269 |
||
4270 |
lemma REAL_LE_SQUARE: "ALL x::hollight.real. real_le (real_of_num 0) (real_mul x x)" |
|
4271 |
by (import hollight REAL_LE_SQUARE) |
|
4272 |
||
4273 |
lemma REAL_MUL_RID: "ALL x::hollight.real. real_mul x (real_of_num (NUMERAL_BIT1 0)) = x" |
|
4274 |
by (import hollight REAL_MUL_RID) |
|
4275 |
||
17644 | 4276 |
lemma REAL_POW_2: "ALL x::hollight.real. |
17652 | 4277 |
real_pow x (NUMERAL_BIT0 (NUMERAL_BIT1 0)) = real_mul x x" |
17644 | 4278 |
by (import hollight REAL_POW_2) |
4279 |
||
4280 |
lemma REAL_POLY_CLAUSES: "(ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4281 |
real_add x (real_add y z) = real_add (real_add x y) z) & |
|
4282 |
(ALL (x::hollight.real) y::hollight.real. real_add x y = real_add y x) & |
|
17652 | 4283 |
(ALL x::hollight.real. real_add (real_of_num 0) x = x) & |
17644 | 4284 |
(ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
4285 |
real_mul x (real_mul y z) = real_mul (real_mul x y) z) & |
|
4286 |
(ALL (x::hollight.real) y::hollight.real. real_mul x y = real_mul y x) & |
|
17652 | 4287 |
(ALL x::hollight.real. real_mul (real_of_num (NUMERAL_BIT1 0)) x = x) & |
4288 |
(ALL x::hollight.real. real_mul (real_of_num 0) x = real_of_num 0) & |
|
17644 | 4289 |
(ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
4290 |
real_mul x (real_add xa xb) = |
|
4291 |
real_add (real_mul x xa) (real_mul x xb)) & |
|
17652 | 4292 |
(ALL x::hollight.real. real_pow x 0 = real_of_num (NUMERAL_BIT1 0)) & |
17644 | 4293 |
(ALL (x::hollight.real) xa::nat. |
4294 |
real_pow x (Suc xa) = real_mul x (real_pow x xa))" |
|
4295 |
by (import hollight REAL_POLY_CLAUSES) |
|
4296 |
||
4297 |
lemma REAL_POLY_NEG_CLAUSES: "(ALL x::hollight.real. |
|
17652 | 4298 |
real_neg x = real_mul (real_neg (real_of_num (NUMERAL_BIT1 0))) x) & |
17644 | 4299 |
(ALL (x::hollight.real) xa::hollight.real. |
4300 |
real_sub x xa = |
|
17652 | 4301 |
real_add x (real_mul (real_neg (real_of_num (NUMERAL_BIT1 0))) xa))" |
17644 | 4302 |
by (import hollight REAL_POLY_NEG_CLAUSES) |
4303 |
||
19093 | 4304 |
lemma REAL_POS: "ALL x::nat. real_le (real_of_num 0) (real_of_num x)" |
4305 |
by (import hollight REAL_POS) |
|
4306 |
||
17644 | 4307 |
lemma REAL_OF_NUM_LT: "ALL (x::nat) xa::nat. real_lt (real_of_num x) (real_of_num xa) = < x xa" |
4308 |
by (import hollight REAL_OF_NUM_LT) |
|
4309 |
||
4310 |
lemma REAL_OF_NUM_GE: "ALL (x::nat) xa::nat. |
|
4311 |
hollight.real_ge (real_of_num x) (real_of_num xa) = >= x xa" |
|
4312 |
by (import hollight REAL_OF_NUM_GE) |
|
4313 |
||
4314 |
lemma REAL_OF_NUM_GT: "ALL (x::nat) xa::nat. |
|
4315 |
hollight.real_gt (real_of_num x) (real_of_num xa) = > x xa" |
|
4316 |
by (import hollight REAL_OF_NUM_GT) |
|
4317 |
||
4318 |
lemma REAL_OF_NUM_SUC: "ALL x::nat. |
|
17652 | 4319 |
real_add (real_of_num x) (real_of_num (NUMERAL_BIT1 0)) = |
17644 | 4320 |
real_of_num (Suc x)" |
4321 |
by (import hollight REAL_OF_NUM_SUC) |
|
4322 |
||
4323 |
lemma REAL_OF_NUM_SUB: "ALL (m::nat) n::nat. |
|
4324 |
<= m n --> real_sub (real_of_num n) (real_of_num m) = real_of_num (n - m)" |
|
4325 |
by (import hollight REAL_OF_NUM_SUB) |
|
4326 |
||
4327 |
lemma REAL_MUL_AC: "real_mul (m::hollight.real) (n::hollight.real) = real_mul n m & |
|
4328 |
real_mul (real_mul m n) (p::hollight.real) = real_mul m (real_mul n p) & |
|
4329 |
real_mul m (real_mul n p) = real_mul n (real_mul m p)" |
|
4330 |
by (import hollight REAL_MUL_AC) |
|
4331 |
||
4332 |
lemma REAL_ADD_RDISTRIB: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4333 |
real_mul (real_add x y) z = real_add (real_mul x z) (real_mul y z)" |
|
4334 |
by (import hollight REAL_ADD_RDISTRIB) |
|
4335 |
||
4336 |
lemma REAL_LT_LADD_IMP: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4337 |
real_lt y z --> real_lt (real_add x y) (real_add x z)" |
|
4338 |
by (import hollight REAL_LT_LADD_IMP) |
|
4339 |
||
4340 |
lemma REAL_LT_MUL: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4341 |
real_lt (real_of_num 0) x & real_lt (real_of_num 0) y --> |
4342 |
real_lt (real_of_num 0) (real_mul x y)" |
|
17644 | 4343 |
by (import hollight REAL_LT_MUL) |
4344 |
||
4345 |
lemma REAL_EQ_ADD_LCANCEL_0: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4346 |
(real_add x y = x) = (y = real_of_num 0)" |
17644 | 4347 |
by (import hollight REAL_EQ_ADD_LCANCEL_0) |
4348 |
||
4349 |
lemma REAL_EQ_ADD_RCANCEL_0: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4350 |
(real_add x y = y) = (x = real_of_num 0)" |
17644 | 4351 |
by (import hollight REAL_EQ_ADD_RCANCEL_0) |
4352 |
||
19093 | 4353 |
lemma REAL_LNEG_UNIQ: "ALL (x::hollight.real) y::hollight.real. |
4354 |
(real_add x y = real_of_num 0) = (x = real_neg y)" |
|
4355 |
by (import hollight REAL_LNEG_UNIQ) |
|
4356 |
||
4357 |
lemma REAL_RNEG_UNIQ: "ALL (x::hollight.real) y::hollight.real. |
|
4358 |
(real_add x y = real_of_num 0) = (y = real_neg x)" |
|
4359 |
by (import hollight REAL_RNEG_UNIQ) |
|
4360 |
||
4361 |
lemma REAL_NEG_LMUL: "ALL (x::hollight.real) y::hollight.real. |
|
4362 |
real_neg (real_mul x y) = real_mul (real_neg x) y" |
|
4363 |
by (import hollight REAL_NEG_LMUL) |
|
4364 |
||
4365 |
lemma REAL_NEG_RMUL: "ALL (x::hollight.real) y::hollight.real. |
|
4366 |
real_neg (real_mul x y) = real_mul x (real_neg y)" |
|
4367 |
by (import hollight REAL_NEG_RMUL) |
|
4368 |
||
4369 |
lemma REAL_NEGNEG: "ALL x::hollight.real. real_neg (real_neg x) = x" |
|
4370 |
by (import hollight REAL_NEGNEG) |
|
4371 |
||
4372 |
lemma REAL_NEG_MUL2: "ALL (x::hollight.real) y::hollight.real. |
|
4373 |
real_mul (real_neg x) (real_neg y) = real_mul x y" |
|
4374 |
by (import hollight REAL_NEG_MUL2) |
|
4375 |
||
4376 |
lemma REAL_LT_LADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4377 |
real_lt (real_add x y) (real_add x z) = real_lt y z" |
|
4378 |
by (import hollight REAL_LT_LADD) |
|
4379 |
||
4380 |
lemma REAL_LT_RADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4381 |
real_lt (real_add x z) (real_add y z) = real_lt x y" |
|
4382 |
by (import hollight REAL_LT_RADD) |
|
4383 |
||
4384 |
lemma REAL_LT_ANTISYM: "ALL (x::hollight.real) y::hollight.real. ~ (real_lt x y & real_lt y x)" |
|
4385 |
by (import hollight REAL_LT_ANTISYM) |
|
4386 |
||
4387 |
lemma REAL_LT_GT: "ALL (x::hollight.real) y::hollight.real. real_lt x y --> ~ real_lt y x" |
|
4388 |
by (import hollight REAL_LT_GT) |
|
4389 |
||
17644 | 4390 |
lemma REAL_NOT_EQ: "ALL (x::hollight.real) y::hollight.real. |
4391 |
(x ~= y) = (real_lt x y | real_lt y x)" |
|
4392 |
by (import hollight REAL_NOT_EQ) |
|
4393 |
||
19093 | 4394 |
lemma REAL_LE_TOTAL: "ALL (x::hollight.real) y::hollight.real. real_le x y | real_le y x" |
4395 |
by (import hollight REAL_LE_TOTAL) |
|
4396 |
||
4397 |
lemma REAL_LE_REFL: "ALL x::hollight.real. real_le x x" |
|
4398 |
by (import hollight REAL_LE_REFL) |
|
4399 |
||
17644 | 4400 |
lemma REAL_LE_ANTISYM: "ALL (x::hollight.real) y::hollight.real. |
4401 |
(real_le x y & real_le y x) = (x = y)" |
|
4402 |
by (import hollight REAL_LE_ANTISYM) |
|
4403 |
||
4404 |
lemma REAL_LET_ANTISYM: "ALL (x::hollight.real) y::hollight.real. ~ (real_le x y & real_lt y x)" |
|
4405 |
by (import hollight REAL_LET_ANTISYM) |
|
4406 |
||
19093 | 4407 |
lemma REAL_NEG_LT0: "ALL x::hollight.real. |
4408 |
real_lt (real_neg x) (real_of_num 0) = real_lt (real_of_num 0) x" |
|
4409 |
by (import hollight REAL_NEG_LT0) |
|
4410 |
||
4411 |
lemma REAL_NEG_GT0: "ALL x::hollight.real. |
|
4412 |
real_lt (real_of_num 0) (real_neg x) = real_lt x (real_of_num 0)" |
|
4413 |
by (import hollight REAL_NEG_GT0) |
|
4414 |
||
4415 |
lemma REAL_NEG_LE0: "ALL x::hollight.real. |
|
4416 |
real_le (real_neg x) (real_of_num 0) = real_le (real_of_num 0) x" |
|
4417 |
by (import hollight REAL_NEG_LE0) |
|
4418 |
||
4419 |
lemma REAL_NEG_GE0: "ALL x::hollight.real. |
|
4420 |
real_le (real_of_num 0) (real_neg x) = real_le x (real_of_num 0)" |
|
4421 |
by (import hollight REAL_NEG_GE0) |
|
4422 |
||
17644 | 4423 |
lemma REAL_LT_TOTAL: "ALL (x::hollight.real) y::hollight.real. x = y | real_lt x y | real_lt y x" |
4424 |
by (import hollight REAL_LT_TOTAL) |
|
4425 |
||
19093 | 4426 |
lemma REAL_LT_NEGTOTAL: "ALL x::hollight.real. |
4427 |
x = real_of_num 0 | |
|
4428 |
real_lt (real_of_num 0) x | real_lt (real_of_num 0) (real_neg x)" |
|
4429 |
by (import hollight REAL_LT_NEGTOTAL) |
|
4430 |
||
17652 | 4431 |
lemma REAL_LE_01: "real_le (real_of_num 0) (real_of_num (NUMERAL_BIT1 0))" |
17644 | 4432 |
by (import hollight REAL_LE_01) |
4433 |
||
19093 | 4434 |
lemma REAL_LT_01: "real_lt (real_of_num 0) (real_of_num (NUMERAL_BIT1 0))" |
4435 |
by (import hollight REAL_LT_01) |
|
4436 |
||
4437 |
lemma REAL_LE_LADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4438 |
real_le (real_add x y) (real_add x z) = real_le y z" |
|
4439 |
by (import hollight REAL_LE_LADD) |
|
4440 |
||
4441 |
lemma REAL_LE_RADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4442 |
real_le (real_add x z) (real_add y z) = real_le x y" |
|
4443 |
by (import hollight REAL_LE_RADD) |
|
4444 |
||
4445 |
lemma REAL_LT_ADD2: "ALL (w::hollight.real) (x::hollight.real) (y::hollight.real) |
|
4446 |
z::hollight.real. |
|
4447 |
real_lt w x & real_lt y z --> real_lt (real_add w y) (real_add x z)" |
|
4448 |
by (import hollight REAL_LT_ADD2) |
|
4449 |
||
17644 | 4450 |
lemma REAL_LE_ADD2: "ALL (w::hollight.real) (x::hollight.real) (y::hollight.real) |
4451 |
z::hollight.real. |
|
4452 |
real_le w x & real_le y z --> real_le (real_add w y) (real_add x z)" |
|
4453 |
by (import hollight REAL_LE_ADD2) |
|
4454 |
||
4455 |
lemma REAL_LT_LNEG: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 4456 |
real_lt (real_neg x) xa = real_lt (real_of_num 0) (real_add x xa)" |
17644 | 4457 |
by (import hollight REAL_LT_LNEG) |
4458 |
||
4459 |
lemma REAL_LT_RNEG: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 4460 |
real_lt x (real_neg xa) = real_lt (real_add x xa) (real_of_num 0)" |
17644 | 4461 |
by (import hollight REAL_LT_RNEG) |
4462 |
||
19093 | 4463 |
lemma REAL_LT_ADDNEG: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
4464 |
real_lt y (real_add x (real_neg z)) = real_lt (real_add y z) x" |
|
4465 |
by (import hollight REAL_LT_ADDNEG) |
|
4466 |
||
4467 |
lemma REAL_LT_ADDNEG2: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4468 |
real_lt (real_add x (real_neg y)) z = real_lt x (real_add z y)" |
|
4469 |
by (import hollight REAL_LT_ADDNEG2) |
|
4470 |
||
4471 |
lemma REAL_LT_ADD1: "ALL (x::hollight.real) y::hollight.real. |
|
4472 |
real_le x y --> real_lt x (real_add y (real_of_num (NUMERAL_BIT1 0)))" |
|
4473 |
by (import hollight REAL_LT_ADD1) |
|
4474 |
||
4475 |
lemma REAL_SUB_ADD: "ALL (x::hollight.real) y::hollight.real. real_add (real_sub x y) y = x" |
|
4476 |
by (import hollight REAL_SUB_ADD) |
|
4477 |
||
4478 |
lemma REAL_SUB_ADD2: "ALL (x::hollight.real) y::hollight.real. real_add y (real_sub x y) = x" |
|
4479 |
by (import hollight REAL_SUB_ADD2) |
|
4480 |
||
4481 |
lemma REAL_SUB_REFL: "ALL x::hollight.real. real_sub x x = real_of_num 0" |
|
4482 |
by (import hollight REAL_SUB_REFL) |
|
4483 |
||
4484 |
lemma REAL_LE_DOUBLE: "ALL x::hollight.real. |
|
4485 |
real_le (real_of_num 0) (real_add x x) = real_le (real_of_num 0) x" |
|
4486 |
by (import hollight REAL_LE_DOUBLE) |
|
4487 |
||
4488 |
lemma REAL_LE_NEGL: "ALL x::hollight.real. real_le (real_neg x) x = real_le (real_of_num 0) x" |
|
4489 |
by (import hollight REAL_LE_NEGL) |
|
4490 |
||
4491 |
lemma REAL_LE_NEGR: "ALL x::hollight.real. real_le x (real_neg x) = real_le x (real_of_num 0)" |
|
4492 |
by (import hollight REAL_LE_NEGR) |
|
4493 |
||
17652 | 4494 |
lemma REAL_NEG_EQ_0: "ALL x::hollight.real. (real_neg x = real_of_num 0) = (x = real_of_num 0)" |
17644 | 4495 |
by (import hollight REAL_NEG_EQ_0) |
4496 |
||
4497 |
lemma REAL_ADD_SUB: "ALL (x::hollight.real) y::hollight.real. real_sub (real_add x y) x = y" |
|
4498 |
by (import hollight REAL_ADD_SUB) |
|
4499 |
||
19093 | 4500 |
lemma REAL_NEG_EQ: "ALL (x::hollight.real) y::hollight.real. (real_neg x = y) = (x = real_neg y)" |
4501 |
by (import hollight REAL_NEG_EQ) |
|
4502 |
||
4503 |
lemma REAL_NEG_MINUS1: "ALL x::hollight.real. |
|
4504 |
real_neg x = real_mul (real_neg (real_of_num (NUMERAL_BIT1 0))) x" |
|
4505 |
by (import hollight REAL_NEG_MINUS1) |
|
4506 |
||
4507 |
lemma REAL_LT_IMP_NE: "ALL (x::hollight.real) y::hollight.real. real_lt x y --> x ~= y" |
|
4508 |
by (import hollight REAL_LT_IMP_NE) |
|
4509 |
||
17644 | 4510 |
lemma REAL_LE_ADDR: "ALL (x::hollight.real) y::hollight.real. |
17652 | 4511 |
real_le x (real_add x y) = real_le (real_of_num 0) y" |
17644 | 4512 |
by (import hollight REAL_LE_ADDR) |
4513 |
||
4514 |
lemma REAL_LE_ADDL: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4515 |
real_le y (real_add x y) = real_le (real_of_num 0) x" |
17644 | 4516 |
by (import hollight REAL_LE_ADDL) |
4517 |
||
4518 |
lemma REAL_LT_ADDR: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4519 |
real_lt x (real_add x y) = real_lt (real_of_num 0) y" |
17644 | 4520 |
by (import hollight REAL_LT_ADDR) |
4521 |
||
4522 |
lemma REAL_LT_ADDL: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4523 |
real_lt y (real_add x y) = real_lt (real_of_num 0) x" |
17644 | 4524 |
by (import hollight REAL_LT_ADDL) |
4525 |
||
19093 | 4526 |
lemma REAL_SUB_SUB: "ALL (x::hollight.real) y::hollight.real. |
4527 |
real_sub (real_sub x y) x = real_neg y" |
|
4528 |
by (import hollight REAL_SUB_SUB) |
|
4529 |
||
4530 |
lemma REAL_LT_ADD_SUB: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4531 |
real_lt (real_add x y) z = real_lt x (real_sub z y)" |
|
4532 |
by (import hollight REAL_LT_ADD_SUB) |
|
4533 |
||
4534 |
lemma REAL_LT_SUB_RADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4535 |
real_lt (real_sub x y) z = real_lt x (real_add z y)" |
|
4536 |
by (import hollight REAL_LT_SUB_RADD) |
|
4537 |
||
4538 |
lemma REAL_LT_SUB_LADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4539 |
real_lt x (real_sub y z) = real_lt (real_add x z) y" |
|
4540 |
by (import hollight REAL_LT_SUB_LADD) |
|
4541 |
||
4542 |
lemma REAL_LE_SUB_LADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4543 |
real_le x (real_sub y z) = real_le (real_add x z) y" |
|
4544 |
by (import hollight REAL_LE_SUB_LADD) |
|
4545 |
||
4546 |
lemma REAL_LE_SUB_RADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4547 |
real_le (real_sub x y) z = real_le x (real_add z y)" |
|
4548 |
by (import hollight REAL_LE_SUB_RADD) |
|
4549 |
||
4550 |
lemma REAL_LT_NEG: "ALL (x::hollight.real) y::hollight.real. |
|
4551 |
real_lt (real_neg x) (real_neg y) = real_lt y x" |
|
4552 |
by (import hollight REAL_LT_NEG) |
|
4553 |
||
4554 |
lemma REAL_LE_NEG: "ALL (x::hollight.real) y::hollight.real. |
|
4555 |
real_le (real_neg x) (real_neg y) = real_le y x" |
|
4556 |
by (import hollight REAL_LE_NEG) |
|
4557 |
||
17644 | 4558 |
lemma REAL_ADD2_SUB2: "ALL (a::hollight.real) (b::hollight.real) (c::hollight.real) |
4559 |
d::hollight.real. |
|
4560 |
real_sub (real_add a b) (real_add c d) = |
|
4561 |
real_add (real_sub a c) (real_sub b d)" |
|
4562 |
by (import hollight REAL_ADD2_SUB2) |
|
4563 |
||
19093 | 4564 |
lemma REAL_SUB_LZERO: "ALL x::hollight.real. real_sub (real_of_num 0) x = real_neg x" |
4565 |
by (import hollight REAL_SUB_LZERO) |
|
4566 |
||
4567 |
lemma REAL_SUB_RZERO: "ALL x::hollight.real. real_sub x (real_of_num 0) = x" |
|
4568 |
by (import hollight REAL_SUB_RZERO) |
|
4569 |
||
17644 | 4570 |
lemma REAL_LET_ADD2: "ALL (w::hollight.real) (x::hollight.real) (y::hollight.real) |
4571 |
z::hollight.real. |
|
4572 |
real_le w x & real_lt y z --> real_lt (real_add w y) (real_add x z)" |
|
4573 |
by (import hollight REAL_LET_ADD2) |
|
4574 |
||
19093 | 4575 |
lemma REAL_LTE_ADD2: "ALL (w::hollight.real) (x::hollight.real) (y::hollight.real) |
4576 |
z::hollight.real. |
|
4577 |
real_lt w x & real_le y z --> real_lt (real_add w y) (real_add x z)" |
|
4578 |
by (import hollight REAL_LTE_ADD2) |
|
4579 |
||
4580 |
lemma REAL_SUB_LNEG: "ALL (x::hollight.real) y::hollight.real. |
|
4581 |
real_sub (real_neg x) y = real_neg (real_add x y)" |
|
4582 |
by (import hollight REAL_SUB_LNEG) |
|
4583 |
||
4584 |
lemma REAL_SUB_RNEG: "ALL (x::hollight.real) y::hollight.real. |
|
4585 |
real_sub x (real_neg y) = real_add x y" |
|
4586 |
by (import hollight REAL_SUB_RNEG) |
|
4587 |
||
4588 |
lemma REAL_SUB_NEG2: "ALL (x::hollight.real) y::hollight.real. |
|
4589 |
real_sub (real_neg x) (real_neg y) = real_sub y x" |
|
4590 |
by (import hollight REAL_SUB_NEG2) |
|
4591 |
||
4592 |
lemma REAL_SUB_TRIANGLE: "ALL (a::hollight.real) (b::hollight.real) c::hollight.real. |
|
4593 |
real_add (real_sub a b) (real_sub b c) = real_sub a c" |
|
4594 |
by (import hollight REAL_SUB_TRIANGLE) |
|
4595 |
||
17644 | 4596 |
lemma REAL_EQ_SUB_LADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
4597 |
(x = real_sub y z) = (real_add x z = y)" |
|
4598 |
by (import hollight REAL_EQ_SUB_LADD) |
|
4599 |
||
4600 |
lemma REAL_EQ_SUB_RADD: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4601 |
(real_sub x y = z) = (x = real_add z y)" |
|
4602 |
by (import hollight REAL_EQ_SUB_RADD) |
|
4603 |
||
19093 | 4604 |
lemma REAL_SUB_SUB2: "ALL (x::hollight.real) y::hollight.real. real_sub x (real_sub x y) = y" |
4605 |
by (import hollight REAL_SUB_SUB2) |
|
4606 |
||
17644 | 4607 |
lemma REAL_ADD_SUB2: "ALL (x::hollight.real) y::hollight.real. |
4608 |
real_sub x (real_add x y) = real_neg y" |
|
4609 |
by (import hollight REAL_ADD_SUB2) |
|
4610 |
||
4611 |
lemma REAL_EQ_IMP_LE: "ALL (x::hollight.real) y::hollight.real. x = y --> real_le x y" |
|
4612 |
by (import hollight REAL_EQ_IMP_LE) |
|
4613 |
||
19093 | 4614 |
lemma REAL_POS_NZ: "ALL x::hollight.real. real_lt (real_of_num 0) x --> x ~= real_of_num 0" |
4615 |
by (import hollight REAL_POS_NZ) |
|
4616 |
||
17644 | 4617 |
lemma REAL_DIFFSQ: "ALL (x::hollight.real) y::hollight.real. |
4618 |
real_mul (real_add x y) (real_sub x y) = |
|
4619 |
real_sub (real_mul x x) (real_mul y y)" |
|
4620 |
by (import hollight REAL_DIFFSQ) |
|
4621 |
||
4622 |
lemma REAL_EQ_NEG2: "ALL (x::hollight.real) y::hollight.real. (real_neg x = real_neg y) = (x = y)" |
|
4623 |
by (import hollight REAL_EQ_NEG2) |
|
4624 |
||
4625 |
lemma REAL_LT_NEG2: "ALL (x::hollight.real) y::hollight.real. |
|
4626 |
real_lt (real_neg x) (real_neg y) = real_lt y x" |
|
4627 |
by (import hollight REAL_LT_NEG2) |
|
4628 |
||
19093 | 4629 |
lemma REAL_SUB_LDISTRIB: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
4630 |
real_mul x (real_sub y z) = real_sub (real_mul x y) (real_mul x z)" |
|
4631 |
by (import hollight REAL_SUB_LDISTRIB) |
|
4632 |
||
4633 |
lemma REAL_SUB_RDISTRIB: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4634 |
real_mul (real_sub x y) z = real_sub (real_mul x z) (real_mul y z)" |
|
4635 |
by (import hollight REAL_SUB_RDISTRIB) |
|
4636 |
||
17652 | 4637 |
lemma REAL_ABS_ZERO: "ALL x::hollight.real. (real_abs x = real_of_num 0) = (x = real_of_num 0)" |
17644 | 4638 |
by (import hollight REAL_ABS_ZERO) |
4639 |
||
17652 | 4640 |
lemma REAL_ABS_0: "real_abs (real_of_num 0) = real_of_num 0" |
17644 | 4641 |
by (import hollight REAL_ABS_0) |
4642 |
||
17652 | 4643 |
lemma REAL_ABS_1: "real_abs (real_of_num (NUMERAL_BIT1 0)) = real_of_num (NUMERAL_BIT1 0)" |
17644 | 4644 |
by (import hollight REAL_ABS_1) |
4645 |
||
4646 |
lemma REAL_ABS_TRIANGLE: "ALL (x::hollight.real) y::hollight.real. |
|
4647 |
real_le (real_abs (real_add x y)) (real_add (real_abs x) (real_abs y))" |
|
4648 |
by (import hollight REAL_ABS_TRIANGLE) |
|
4649 |
||
4650 |
lemma REAL_ABS_TRIANGLE_LE: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4651 |
real_le (real_add (real_abs x) (real_abs (real_sub y x))) z --> |
|
4652 |
real_le (real_abs y) z" |
|
4653 |
by (import hollight REAL_ABS_TRIANGLE_LE) |
|
4654 |
||
4655 |
lemma REAL_ABS_TRIANGLE_LT: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4656 |
real_lt (real_add (real_abs x) (real_abs (real_sub y x))) z --> |
|
4657 |
real_lt (real_abs y) z" |
|
4658 |
by (import hollight REAL_ABS_TRIANGLE_LT) |
|
4659 |
||
17652 | 4660 |
lemma REAL_ABS_POS: "ALL x::hollight.real. real_le (real_of_num 0) (real_abs x)" |
17644 | 4661 |
by (import hollight REAL_ABS_POS) |
4662 |
||
4663 |
lemma REAL_ABS_SUB: "ALL (x::hollight.real) y::hollight.real. |
|
4664 |
real_abs (real_sub x y) = real_abs (real_sub y x)" |
|
4665 |
by (import hollight REAL_ABS_SUB) |
|
4666 |
||
4667 |
lemma REAL_ABS_NZ: "ALL x::hollight.real. |
|
17652 | 4668 |
(x ~= real_of_num 0) = real_lt (real_of_num 0) (real_abs x)" |
17644 | 4669 |
by (import hollight REAL_ABS_NZ) |
4670 |
||
4671 |
lemma REAL_ABS_ABS: "ALL x::hollight.real. real_abs (real_abs x) = real_abs x" |
|
4672 |
by (import hollight REAL_ABS_ABS) |
|
4673 |
||
4674 |
lemma REAL_ABS_LE: "ALL x::hollight.real. real_le x (real_abs x)" |
|
4675 |
by (import hollight REAL_ABS_LE) |
|
4676 |
||
17652 | 4677 |
lemma REAL_ABS_REFL: "ALL x::hollight.real. (real_abs x = x) = real_le (real_of_num 0) x" |
17644 | 4678 |
by (import hollight REAL_ABS_REFL) |
4679 |
||
4680 |
lemma REAL_ABS_BETWEEN: "ALL (x::hollight.real) (y::hollight.real) d::hollight.real. |
|
17652 | 4681 |
(real_lt (real_of_num 0) d & |
17644 | 4682 |
real_lt (real_sub x d) y & real_lt y (real_add x d)) = |
4683 |
real_lt (real_abs (real_sub y x)) d" |
|
4684 |
by (import hollight REAL_ABS_BETWEEN) |
|
4685 |
||
4686 |
lemma REAL_ABS_BOUND: "ALL (x::hollight.real) (y::hollight.real) d::hollight.real. |
|
4687 |
real_lt (real_abs (real_sub x y)) d --> real_lt y (real_add x d)" |
|
4688 |
by (import hollight REAL_ABS_BOUND) |
|
4689 |
||
4690 |
lemma REAL_ABS_STILLNZ: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4691 |
real_lt (real_abs (real_sub x y)) (real_abs y) --> x ~= real_of_num 0" |
17644 | 4692 |
by (import hollight REAL_ABS_STILLNZ) |
4693 |
||
4694 |
lemma REAL_ABS_CASES: "ALL x::hollight.real. |
|
17652 | 4695 |
x = real_of_num 0 | real_lt (real_of_num 0) (real_abs x)" |
17644 | 4696 |
by (import hollight REAL_ABS_CASES) |
4697 |
||
4698 |
lemma REAL_ABS_BETWEEN1: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4699 |
real_lt x z & real_lt (real_abs (real_sub y x)) (real_sub z x) --> |
|
4700 |
real_lt y z" |
|
4701 |
by (import hollight REAL_ABS_BETWEEN1) |
|
4702 |
||
4703 |
lemma REAL_ABS_SIGN: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4704 |
real_lt (real_abs (real_sub x y)) y --> real_lt (real_of_num 0) x" |
17644 | 4705 |
by (import hollight REAL_ABS_SIGN) |
4706 |
||
4707 |
lemma REAL_ABS_SIGN2: "ALL (x::hollight.real) y::hollight.real. |
|
4708 |
real_lt (real_abs (real_sub x y)) (real_neg y) --> |
|
17652 | 4709 |
real_lt x (real_of_num 0)" |
17644 | 4710 |
by (import hollight REAL_ABS_SIGN2) |
4711 |
||
4712 |
lemma REAL_ABS_CIRCLE: "ALL (x::hollight.real) (y::hollight.real) h::hollight.real. |
|
4713 |
real_lt (real_abs h) (real_sub (real_abs y) (real_abs x)) --> |
|
4714 |
real_lt (real_abs (real_add x h)) (real_abs y)" |
|
4715 |
by (import hollight REAL_ABS_CIRCLE) |
|
4716 |
||
19093 | 4717 |
lemma REAL_SUB_ABS: "ALL (x::hollight.real) y::hollight.real. |
4718 |
real_le (real_sub (real_abs x) (real_abs y)) (real_abs (real_sub x y))" |
|
4719 |
by (import hollight REAL_SUB_ABS) |
|
4720 |
||
17644 | 4721 |
lemma REAL_ABS_SUB_ABS: "ALL (x::hollight.real) y::hollight.real. |
4722 |
real_le (real_abs (real_sub (real_abs x) (real_abs y))) |
|
4723 |
(real_abs (real_sub x y))" |
|
4724 |
by (import hollight REAL_ABS_SUB_ABS) |
|
4725 |
||
4726 |
lemma REAL_ABS_BETWEEN2: "ALL (x0::hollight.real) (x::hollight.real) (y0::hollight.real) |
|
4727 |
y::hollight.real. |
|
4728 |
real_lt x0 y0 & |
|
4729 |
real_lt |
|
17652 | 4730 |
(real_mul (real_of_num (NUMERAL_BIT0 (NUMERAL_BIT1 0))) |
17644 | 4731 |
(real_abs (real_sub x x0))) |
4732 |
(real_sub y0 x0) & |
|
4733 |
real_lt |
|
17652 | 4734 |
(real_mul (real_of_num (NUMERAL_BIT0 (NUMERAL_BIT1 0))) |
17644 | 4735 |
(real_abs (real_sub y y0))) |
4736 |
(real_sub y0 x0) --> |
|
4737 |
real_lt x y" |
|
4738 |
by (import hollight REAL_ABS_BETWEEN2) |
|
4739 |
||
4740 |
lemma REAL_ABS_BOUNDS: "ALL (x::hollight.real) k::hollight.real. |
|
4741 |
real_le (real_abs x) k = (real_le (real_neg k) x & real_le x k)" |
|
4742 |
by (import hollight REAL_ABS_BOUNDS) |
|
4743 |
||
4744 |
lemma REAL_MIN_MAX: "ALL (x::hollight.real) y::hollight.real. |
|
4745 |
real_min x y = real_neg (real_max (real_neg x) (real_neg y))" |
|
4746 |
by (import hollight REAL_MIN_MAX) |
|
4747 |
||
4748 |
lemma REAL_MAX_MIN: "ALL (x::hollight.real) y::hollight.real. |
|
4749 |
real_max x y = real_neg (real_min (real_neg x) (real_neg y))" |
|
4750 |
by (import hollight REAL_MAX_MIN) |
|
4751 |
||
4752 |
lemma REAL_MAX_MAX: "ALL (x::hollight.real) y::hollight.real. |
|
4753 |
real_le x (real_max x y) & real_le y (real_max x y)" |
|
4754 |
by (import hollight REAL_MAX_MAX) |
|
4755 |
||
4756 |
lemma REAL_MIN_MIN: "ALL (x::hollight.real) y::hollight.real. |
|
4757 |
real_le (real_min x y) x & real_le (real_min x y) y" |
|
4758 |
by (import hollight REAL_MIN_MIN) |
|
4759 |
||
4760 |
lemma REAL_MAX_SYM: "ALL (x::hollight.real) y::hollight.real. real_max x y = real_max y x" |
|
4761 |
by (import hollight REAL_MAX_SYM) |
|
4762 |
||
4763 |
lemma REAL_MIN_SYM: "ALL (x::hollight.real) y::hollight.real. real_min x y = real_min y x" |
|
4764 |
by (import hollight REAL_MIN_SYM) |
|
4765 |
||
4766 |
lemma REAL_LE_MAX: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4767 |
real_le z (real_max x y) = (real_le z x | real_le z y)" |
|
4768 |
by (import hollight REAL_LE_MAX) |
|
4769 |
||
4770 |
lemma REAL_LE_MIN: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4771 |
real_le z (real_min x y) = (real_le z x & real_le z y)" |
|
4772 |
by (import hollight REAL_LE_MIN) |
|
4773 |
||
4774 |
lemma REAL_LT_MAX: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4775 |
real_lt z (real_max x y) = (real_lt z x | real_lt z y)" |
|
4776 |
by (import hollight REAL_LT_MAX) |
|
4777 |
||
4778 |
lemma REAL_LT_MIN: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4779 |
real_lt z (real_min x y) = (real_lt z x & real_lt z y)" |
|
4780 |
by (import hollight REAL_LT_MIN) |
|
4781 |
||
4782 |
lemma REAL_MAX_LE: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4783 |
real_le (real_max x y) z = (real_le x z & real_le y z)" |
|
4784 |
by (import hollight REAL_MAX_LE) |
|
4785 |
||
4786 |
lemma REAL_MIN_LE: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4787 |
real_le (real_min x y) z = (real_le x z | real_le y z)" |
|
4788 |
by (import hollight REAL_MIN_LE) |
|
4789 |
||
4790 |
lemma REAL_MAX_LT: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4791 |
real_lt (real_max x y) z = (real_lt x z & real_lt y z)" |
|
4792 |
by (import hollight REAL_MAX_LT) |
|
4793 |
||
4794 |
lemma REAL_MIN_LT: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4795 |
real_lt (real_min x y) z = (real_lt x z | real_lt y z)" |
|
4796 |
by (import hollight REAL_MIN_LT) |
|
4797 |
||
4798 |
lemma REAL_MAX_ASSOC: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4799 |
real_max x (real_max y z) = real_max (real_max x y) z" |
|
4800 |
by (import hollight REAL_MAX_ASSOC) |
|
4801 |
||
4802 |
lemma REAL_MIN_ASSOC: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
4803 |
real_min x (real_min y z) = real_min (real_min x y) z" |
|
4804 |
by (import hollight REAL_MIN_ASSOC) |
|
4805 |
||
4806 |
lemma REAL_MAX_ACI: "real_max (x::hollight.real) (y::hollight.real) = real_max y x & |
|
4807 |
real_max (real_max x y) (z::hollight.real) = real_max x (real_max y z) & |
|
4808 |
real_max x (real_max y z) = real_max y (real_max x z) & |
|
4809 |
real_max x x = x & real_max x (real_max x y) = real_max x y" |
|
4810 |
by (import hollight REAL_MAX_ACI) |
|
4811 |
||
4812 |
lemma REAL_MIN_ACI: "real_min (x::hollight.real) (y::hollight.real) = real_min y x & |
|
4813 |
real_min (real_min x y) (z::hollight.real) = real_min x (real_min y z) & |
|
4814 |
real_min x (real_min y z) = real_min y (real_min x z) & |
|
4815 |
real_min x x = x & real_min x (real_min x y) = real_min x y" |
|
4816 |
by (import hollight REAL_MIN_ACI) |
|
4817 |
||
4818 |
lemma REAL_ABS_MUL: "ALL (x::hollight.real) y::hollight.real. |
|
4819 |
real_abs (real_mul x y) = real_mul (real_abs x) (real_abs y)" |
|
4820 |
by (import hollight REAL_ABS_MUL) |
|
4821 |
||
4822 |
lemma REAL_POW_LE: "ALL (x::hollight.real) n::nat. |
|
17652 | 4823 |
real_le (real_of_num 0) x --> real_le (real_of_num 0) (real_pow x n)" |
17644 | 4824 |
by (import hollight REAL_POW_LE) |
4825 |
||
4826 |
lemma REAL_POW_LT: "ALL (x::hollight.real) n::nat. |
|
17652 | 4827 |
real_lt (real_of_num 0) x --> real_lt (real_of_num 0) (real_pow x n)" |
17644 | 4828 |
by (import hollight REAL_POW_LT) |
4829 |
||
4830 |
lemma REAL_ABS_POW: "ALL (x::hollight.real) n::nat. |
|
4831 |
real_abs (real_pow x n) = real_pow (real_abs x) n" |
|
4832 |
by (import hollight REAL_ABS_POW) |
|
4833 |
||
4834 |
lemma REAL_LE_LMUL: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 4835 |
real_le (real_of_num 0) x & real_le xa xb --> |
17644 | 4836 |
real_le (real_mul x xa) (real_mul x xb)" |
4837 |
by (import hollight REAL_LE_LMUL) |
|
4838 |
||
4839 |
lemma REAL_LE_RMUL: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
17652 | 4840 |
real_le x y & real_le (real_of_num 0) z --> |
17644 | 4841 |
real_le (real_mul x z) (real_mul y z)" |
4842 |
by (import hollight REAL_LE_RMUL) |
|
4843 |
||
4844 |
lemma REAL_LT_LMUL: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 4845 |
real_lt (real_of_num 0) x & real_lt xa xb --> |
17644 | 4846 |
real_lt (real_mul x xa) (real_mul x xb)" |
4847 |
by (import hollight REAL_LT_LMUL) |
|
4848 |
||
4849 |
lemma REAL_LT_RMUL: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
17652 | 4850 |
real_lt x y & real_lt (real_of_num 0) z --> |
17644 | 4851 |
real_lt (real_mul x z) (real_mul y z)" |
4852 |
by (import hollight REAL_LT_RMUL) |
|
4853 |
||
4854 |
lemma REAL_EQ_MUL_LCANCEL: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
17652 | 4855 |
(real_mul x y = real_mul x z) = (x = real_of_num 0 | y = z)" |
17644 | 4856 |
by (import hollight REAL_EQ_MUL_LCANCEL) |
4857 |
||
4858 |
lemma REAL_EQ_MUL_RCANCEL: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 4859 |
(real_mul x xb = real_mul xa xb) = (x = xa | xb = real_of_num 0)" |
17644 | 4860 |
by (import hollight REAL_EQ_MUL_RCANCEL) |
4861 |
||
4862 |
lemma REAL_MUL_LINV_UNIQ: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 4863 |
real_mul x y = real_of_num (NUMERAL_BIT1 0) --> real_inv y = x" |
17644 | 4864 |
by (import hollight REAL_MUL_LINV_UNIQ) |
4865 |
||
4866 |
lemma REAL_MUL_RINV_UNIQ: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 4867 |
real_mul x xa = real_of_num (NUMERAL_BIT1 0) --> real_inv x = xa" |
17644 | 4868 |
by (import hollight REAL_MUL_RINV_UNIQ) |
4869 |
||
4870 |
lemma REAL_INV_INV: "ALL x::hollight.real. real_inv (real_inv x) = x" |
|
4871 |
by (import hollight REAL_INV_INV) |
|
4872 |
||
17652 | 4873 |
lemma REAL_INV_EQ_0: "ALL x::hollight.real. (real_inv x = real_of_num 0) = (x = real_of_num 0)" |
17644 | 4874 |
by (import hollight REAL_INV_EQ_0) |
4875 |
||
4876 |
lemma REAL_LT_INV: "ALL x::hollight.real. |
|
17652 | 4877 |
real_lt (real_of_num 0) x --> real_lt (real_of_num 0) (real_inv x)" |
17644 | 4878 |
by (import hollight REAL_LT_INV) |
4879 |
||
4880 |
lemma REAL_LT_INV_EQ: "ALL x::hollight.real. |
|
17652 | 4881 |
real_lt (real_of_num 0) (real_inv x) = real_lt (real_of_num 0) x" |
17644 | 4882 |
by (import hollight REAL_LT_INV_EQ) |
4883 |
||
4884 |
lemma REAL_INV_NEG: "ALL x::hollight.real. real_inv (real_neg x) = real_neg (real_inv x)" |
|
4885 |
by (import hollight REAL_INV_NEG) |
|
4886 |
||
4887 |
lemma REAL_LE_INV_EQ: "ALL x::hollight.real. |
|
17652 | 4888 |
real_le (real_of_num 0) (real_inv x) = real_le (real_of_num 0) x" |
17644 | 4889 |
by (import hollight REAL_LE_INV_EQ) |
4890 |
||
4891 |
lemma REAL_LE_INV: "ALL x::hollight.real. |
|
17652 | 4892 |
real_le (real_of_num 0) x --> real_le (real_of_num 0) (real_inv x)" |
17644 | 4893 |
by (import hollight REAL_LE_INV) |
4894 |
||
19093 | 4895 |
lemma REAL_MUL_RINV: "ALL x::hollight.real. |
4896 |
x ~= real_of_num 0 --> |
|
4897 |
real_mul x (real_inv x) = real_of_num (NUMERAL_BIT1 0)" |
|
4898 |
by (import hollight REAL_MUL_RINV) |
|
4899 |
||
17652 | 4900 |
lemma REAL_INV_1: "real_inv (real_of_num (NUMERAL_BIT1 0)) = real_of_num (NUMERAL_BIT1 0)" |
17644 | 4901 |
by (import hollight REAL_INV_1) |
4902 |
||
17652 | 4903 |
lemma REAL_DIV_1: "ALL x::hollight.real. real_div x (real_of_num (NUMERAL_BIT1 0)) = x" |
17644 | 4904 |
by (import hollight REAL_DIV_1) |
4905 |
||
4906 |
lemma REAL_DIV_REFL: "ALL x::hollight.real. |
|
17652 | 4907 |
x ~= real_of_num 0 --> real_div x x = real_of_num (NUMERAL_BIT1 0)" |
17644 | 4908 |
by (import hollight REAL_DIV_REFL) |
4909 |
||
4910 |
lemma REAL_DIV_RMUL: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 4911 |
xa ~= real_of_num 0 --> real_mul (real_div x xa) xa = x" |
17644 | 4912 |
by (import hollight REAL_DIV_RMUL) |
4913 |
||
4914 |
lemma REAL_DIV_LMUL: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 4915 |
xa ~= real_of_num 0 --> real_mul xa (real_div x xa) = x" |
17644 | 4916 |
by (import hollight REAL_DIV_LMUL) |
4917 |
||
4918 |
lemma REAL_ABS_INV: "ALL x::hollight.real. real_abs (real_inv x) = real_inv (real_abs x)" |
|
4919 |
by (import hollight REAL_ABS_INV) |
|
4920 |
||
4921 |
lemma REAL_ABS_DIV: "ALL (x::hollight.real) xa::hollight.real. |
|
4922 |
real_abs (real_div x xa) = real_div (real_abs x) (real_abs xa)" |
|
4923 |
by (import hollight REAL_ABS_DIV) |
|
4924 |
||
4925 |
lemma REAL_INV_MUL: "ALL (x::hollight.real) y::hollight.real. |
|
4926 |
real_inv (real_mul x y) = real_mul (real_inv x) (real_inv y)" |
|
4927 |
by (import hollight REAL_INV_MUL) |
|
4928 |
||
4929 |
lemma REAL_INV_DIV: "ALL (x::hollight.real) xa::hollight.real. |
|
4930 |
real_inv (real_div x xa) = real_div xa x" |
|
4931 |
by (import hollight REAL_INV_DIV) |
|
4932 |
||
4933 |
lemma REAL_POW_MUL: "ALL (x::hollight.real) (y::hollight.real) n::nat. |
|
4934 |
real_pow (real_mul x y) n = real_mul (real_pow x n) (real_pow y n)" |
|
4935 |
by (import hollight REAL_POW_MUL) |
|
4936 |
||
4937 |
lemma REAL_POW_INV: "ALL (x::hollight.real) n::nat. |
|
4938 |
real_pow (real_inv x) n = real_inv (real_pow x n)" |
|
4939 |
by (import hollight REAL_POW_INV) |
|
4940 |
||
4941 |
lemma REAL_POW_DIV: "ALL (x::hollight.real) (xa::hollight.real) xb::nat. |
|
4942 |
real_pow (real_div x xa) xb = real_div (real_pow x xb) (real_pow xa xb)" |
|
4943 |
by (import hollight REAL_POW_DIV) |
|
4944 |
||
4945 |
lemma REAL_POW_ADD: "ALL (x::hollight.real) (m::nat) n::nat. |
|
4946 |
real_pow x (m + n) = real_mul (real_pow x m) (real_pow x n)" |
|
4947 |
by (import hollight REAL_POW_ADD) |
|
4948 |
||
4949 |
lemma REAL_POW_NZ: "ALL (x::hollight.real) n::nat. |
|
17652 | 4950 |
x ~= real_of_num 0 --> real_pow x n ~= real_of_num 0" |
17644 | 4951 |
by (import hollight REAL_POW_NZ) |
4952 |
||
4953 |
lemma REAL_POW_SUB: "ALL (x::hollight.real) (m::nat) n::nat. |
|
17652 | 4954 |
x ~= real_of_num 0 & <= m n --> |
17644 | 4955 |
real_pow x (n - m) = real_div (real_pow x n) (real_pow x m)" |
4956 |
by (import hollight REAL_POW_SUB) |
|
4957 |
||
17652 | 4958 |
lemma REAL_LT_IMP_NZ: "ALL x::hollight.real. real_lt (real_of_num 0) x --> x ~= real_of_num 0" |
17644 | 4959 |
by (import hollight REAL_LT_IMP_NZ) |
4960 |
||
4961 |
lemma REAL_LT_LCANCEL_IMP: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
17652 | 4962 |
real_lt (real_of_num 0) x & real_lt (real_mul x y) (real_mul x z) --> |
17644 | 4963 |
real_lt y z" |
4964 |
by (import hollight REAL_LT_LCANCEL_IMP) |
|
4965 |
||
4966 |
lemma REAL_LT_RCANCEL_IMP: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 4967 |
real_lt (real_of_num 0) xb & real_lt (real_mul x xb) (real_mul xa xb) --> |
17644 | 4968 |
real_lt x xa" |
4969 |
by (import hollight REAL_LT_RCANCEL_IMP) |
|
4970 |
||
4971 |
lemma REAL_LE_LCANCEL_IMP: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
17652 | 4972 |
real_lt (real_of_num 0) x & real_le (real_mul x y) (real_mul x z) --> |
17644 | 4973 |
real_le y z" |
4974 |
by (import hollight REAL_LE_LCANCEL_IMP) |
|
4975 |
||
4976 |
lemma REAL_LE_RCANCEL_IMP: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 4977 |
real_lt (real_of_num 0) xb & real_le (real_mul x xb) (real_mul xa xb) --> |
17644 | 4978 |
real_le x xa" |
4979 |
by (import hollight REAL_LE_RCANCEL_IMP) |
|
4980 |
||
19093 | 4981 |
lemma REAL_LE_RMUL_EQ: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
4982 |
real_lt (real_of_num 0) z --> |
|
4983 |
real_le (real_mul x z) (real_mul y z) = real_le x y" |
|
4984 |
by (import hollight REAL_LE_RMUL_EQ) |
|
4985 |
||
17644 | 4986 |
lemma REAL_LE_LMUL_EQ: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
17652 | 4987 |
real_lt (real_of_num 0) z --> |
17644 | 4988 |
real_le (real_mul z x) (real_mul z y) = real_le x y" |
4989 |
by (import hollight REAL_LE_LMUL_EQ) |
|
4990 |
||
19093 | 4991 |
lemma REAL_LT_RMUL_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
4992 |
real_lt (real_of_num 0) xb --> |
|
4993 |
real_lt (real_mul x xb) (real_mul xa xb) = real_lt x xa" |
|
4994 |
by (import hollight REAL_LT_RMUL_EQ) |
|
4995 |
||
4996 |
lemma REAL_LT_LMUL_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
4997 |
real_lt (real_of_num 0) xb --> |
|
4998 |
real_lt (real_mul xb x) (real_mul xb xa) = real_lt x xa" |
|
4999 |
by (import hollight REAL_LT_LMUL_EQ) |
|
5000 |
||
17644 | 5001 |
lemma REAL_LE_RDIV_EQ: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
17652 | 5002 |
real_lt (real_of_num 0) z --> |
17644 | 5003 |
real_le x (real_div y z) = real_le (real_mul x z) y" |
5004 |
by (import hollight REAL_LE_RDIV_EQ) |
|
5005 |
||
5006 |
lemma REAL_LE_LDIV_EQ: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
17652 | 5007 |
real_lt (real_of_num 0) z --> |
17644 | 5008 |
real_le (real_div x z) y = real_le x (real_mul y z)" |
5009 |
by (import hollight REAL_LE_LDIV_EQ) |
|
5010 |
||
5011 |
lemma REAL_LT_RDIV_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 5012 |
real_lt (real_of_num 0) xb --> |
17644 | 5013 |
real_lt x (real_div xa xb) = real_lt (real_mul x xb) xa" |
5014 |
by (import hollight REAL_LT_RDIV_EQ) |
|
5015 |
||
5016 |
lemma REAL_LT_LDIV_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 5017 |
real_lt (real_of_num 0) xb --> |
17644 | 5018 |
real_lt (real_div x xb) xa = real_lt x (real_mul xa xb)" |
5019 |
by (import hollight REAL_LT_LDIV_EQ) |
|
5020 |
||
5021 |
lemma REAL_EQ_RDIV_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 5022 |
real_lt (real_of_num 0) xb --> |
17644 | 5023 |
(x = real_div xa xb) = (real_mul x xb = xa)" |
5024 |
by (import hollight REAL_EQ_RDIV_EQ) |
|
5025 |
||
5026 |
lemma REAL_EQ_LDIV_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 5027 |
real_lt (real_of_num 0) xb --> |
17644 | 5028 |
(real_div x xb = xa) = (x = real_mul xa xb)" |
5029 |
by (import hollight REAL_EQ_LDIV_EQ) |
|
5030 |
||
5031 |
lemma REAL_LT_DIV2_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 5032 |
real_lt (real_of_num 0) xb --> |
17644 | 5033 |
real_lt (real_div x xb) (real_div xa xb) = real_lt x xa" |
5034 |
by (import hollight REAL_LT_DIV2_EQ) |
|
5035 |
||
5036 |
lemma REAL_LE_DIV2_EQ: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 5037 |
real_lt (real_of_num 0) xb --> |
17644 | 5038 |
real_le (real_div x xb) (real_div xa xb) = real_le x xa" |
5039 |
by (import hollight REAL_LE_DIV2_EQ) |
|
5040 |
||
5041 |
lemma REAL_MUL_2: "ALL x::hollight.real. |
|
17652 | 5042 |
real_mul (real_of_num (NUMERAL_BIT0 (NUMERAL_BIT1 0))) x = real_add x x" |
17644 | 5043 |
by (import hollight REAL_MUL_2) |
5044 |
||
5045 |
lemma REAL_POW_EQ_0: "ALL (x::hollight.real) n::nat. |
|
17652 | 5046 |
(real_pow x n = real_of_num 0) = (x = real_of_num 0 & n ~= 0)" |
17644 | 5047 |
by (import hollight REAL_POW_EQ_0) |
5048 |
||
5049 |
lemma REAL_LE_MUL2: "ALL (w::hollight.real) (x::hollight.real) (y::hollight.real) |
|
5050 |
z::hollight.real. |
|
17652 | 5051 |
real_le (real_of_num 0) w & |
5052 |
real_le w x & real_le (real_of_num 0) y & real_le y z --> |
|
17644 | 5053 |
real_le (real_mul w y) (real_mul x z)" |
5054 |
by (import hollight REAL_LE_MUL2) |
|
5055 |
||
5056 |
lemma REAL_LT_MUL2: "ALL (w::hollight.real) (x::hollight.real) (y::hollight.real) |
|
5057 |
z::hollight.real. |
|
17652 | 5058 |
real_le (real_of_num 0) w & |
5059 |
real_lt w x & real_le (real_of_num 0) y & real_lt y z --> |
|
17644 | 5060 |
real_lt (real_mul w y) (real_mul x z)" |
5061 |
by (import hollight REAL_LT_MUL2) |
|
5062 |
||
5063 |
lemma REAL_LT_SQUARE: "ALL x::hollight.real. |
|
17652 | 5064 |
real_lt (real_of_num 0) (real_mul x x) = (x ~= real_of_num 0)" |
17644 | 5065 |
by (import hollight REAL_LT_SQUARE) |
5066 |
||
5067 |
lemma REAL_INV_LE_1: "ALL x::hollight.real. |
|
17652 | 5068 |
real_le (real_of_num (NUMERAL_BIT1 0)) x --> |
5069 |
real_le (real_inv x) (real_of_num (NUMERAL_BIT1 0))" |
|
17644 | 5070 |
by (import hollight REAL_INV_LE_1) |
5071 |
||
5072 |
lemma REAL_POW_LE_1: "ALL (n::nat) x::hollight.real. |
|
17652 | 5073 |
real_le (real_of_num (NUMERAL_BIT1 0)) x --> |
5074 |
real_le (real_of_num (NUMERAL_BIT1 0)) (real_pow x n)" |
|
17644 | 5075 |
by (import hollight REAL_POW_LE_1) |
5076 |
||
5077 |
lemma REAL_POW_1_LE: "ALL (n::nat) x::hollight.real. |
|
17652 | 5078 |
real_le (real_of_num 0) x & real_le x (real_of_num (NUMERAL_BIT1 0)) --> |
5079 |
real_le (real_pow x n) (real_of_num (NUMERAL_BIT1 0))" |
|
17644 | 5080 |
by (import hollight REAL_POW_1_LE) |
5081 |
||
17652 | 5082 |
lemma REAL_POW_1: "ALL x::hollight.real. real_pow x (NUMERAL_BIT1 0) = x" |
17644 | 5083 |
by (import hollight REAL_POW_1) |
5084 |
||
5085 |
lemma REAL_POW_ONE: "ALL n::nat. |
|
17652 | 5086 |
real_pow (real_of_num (NUMERAL_BIT1 0)) n = real_of_num (NUMERAL_BIT1 0)" |
17644 | 5087 |
by (import hollight REAL_POW_ONE) |
5088 |
||
5089 |
lemma REAL_LT_INV2: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 5090 |
real_lt (real_of_num 0) x & real_lt x y --> |
17644 | 5091 |
real_lt (real_inv y) (real_inv x)" |
5092 |
by (import hollight REAL_LT_INV2) |
|
5093 |
||
5094 |
lemma REAL_LE_INV2: "ALL (x::hollight.real) y::hollight.real. |
|
17652 | 5095 |
real_lt (real_of_num 0) x & real_le x y --> |
17644 | 5096 |
real_le (real_inv y) (real_inv x)" |
5097 |
by (import hollight REAL_LE_INV2) |
|
5098 |
||
5099 |
lemma REAL_INV_1_LE: "ALL x::hollight.real. |
|
17652 | 5100 |
real_lt (real_of_num 0) x & real_le x (real_of_num (NUMERAL_BIT1 0)) --> |
5101 |
real_le (real_of_num (NUMERAL_BIT1 0)) (real_inv x)" |
|
17644 | 5102 |
by (import hollight REAL_INV_1_LE) |
5103 |
||
5104 |
lemma REAL_SUB_INV: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 5105 |
x ~= real_of_num 0 & xa ~= real_of_num 0 --> |
17644 | 5106 |
real_sub (real_inv x) (real_inv xa) = |
5107 |
real_div (real_sub xa x) (real_mul x xa)" |
|
5108 |
by (import hollight REAL_SUB_INV) |
|
5109 |
||
5110 |
lemma REAL_DOWN: "ALL d::hollight.real. |
|
17652 | 5111 |
real_lt (real_of_num 0) d --> |
5112 |
(EX x::hollight.real. real_lt (real_of_num 0) x & real_lt x d)" |
|
17644 | 5113 |
by (import hollight REAL_DOWN) |
5114 |
||
5115 |
lemma REAL_DOWN2: "ALL (d1::hollight.real) d2::hollight.real. |
|
17652 | 5116 |
real_lt (real_of_num 0) d1 & real_lt (real_of_num 0) d2 --> |
17644 | 5117 |
(EX e::hollight.real. |
17652 | 5118 |
real_lt (real_of_num 0) e & real_lt e d1 & real_lt e d2)" |
17644 | 5119 |
by (import hollight REAL_DOWN2) |
5120 |
||
5121 |
lemma REAL_POW_LE2: "ALL (n::nat) (x::hollight.real) y::hollight.real. |
|
17652 | 5122 |
real_le (real_of_num 0) x & real_le x y --> |
17644 | 5123 |
real_le (real_pow x n) (real_pow y n)" |
5124 |
by (import hollight REAL_POW_LE2) |
|
5125 |
||
5126 |
lemma REAL_POW_MONO: "ALL (m::nat) (n::nat) x::hollight.real. |
|
17652 | 5127 |
real_le (real_of_num (NUMERAL_BIT1 0)) x & <= m n --> |
17644 | 5128 |
real_le (real_pow x m) (real_pow x n)" |
5129 |
by (import hollight REAL_POW_MONO) |
|
5130 |
||
5131 |
lemma REAL_POW_LT2: "ALL (n::nat) (x::hollight.real) y::hollight.real. |
|
17652 | 5132 |
n ~= 0 & real_le (real_of_num 0) x & real_lt x y --> |
17644 | 5133 |
real_lt (real_pow x n) (real_pow y n)" |
5134 |
by (import hollight REAL_POW_LT2) |
|
5135 |
||
5136 |
lemma REAL_POW_MONO_LT: "ALL (m::nat) (n::nat) x::hollight.real. |
|
17652 | 5137 |
real_lt (real_of_num (NUMERAL_BIT1 0)) x & < m n --> |
17644 | 5138 |
real_lt (real_pow x m) (real_pow x n)" |
5139 |
by (import hollight REAL_POW_MONO_LT) |
|
5140 |
||
5141 |
lemma REAL_POW_POW: "ALL (x::hollight.real) (m::nat) n::nat. |
|
5142 |
real_pow (real_pow x m) n = real_pow x (m * n)" |
|
5143 |
by (import hollight REAL_POW_POW) |
|
5144 |
||
5145 |
lemma REAL_EQ_RCANCEL_IMP: "ALL (x::hollight.real) (y::hollight.real) z::hollight.real. |
|
17652 | 5146 |
z ~= real_of_num 0 & real_mul x z = real_mul y z --> x = y" |
17644 | 5147 |
by (import hollight REAL_EQ_RCANCEL_IMP) |
5148 |
||
5149 |
lemma REAL_EQ_LCANCEL_IMP: "ALL (x::hollight.real) (xa::hollight.real) xb::hollight.real. |
|
17652 | 5150 |
xb ~= real_of_num 0 & real_mul xb x = real_mul xb xa --> x = xa" |
17644 | 5151 |
by (import hollight REAL_EQ_LCANCEL_IMP) |
5152 |
||
5153 |
lemma REAL_LT_DIV: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 5154 |
real_lt (real_of_num 0) x & real_lt (real_of_num 0) xa --> |
5155 |
real_lt (real_of_num 0) (real_div x xa)" |
|
17644 | 5156 |
by (import hollight REAL_LT_DIV) |
5157 |
||
5158 |
lemma REAL_LE_DIV: "ALL (x::hollight.real) xa::hollight.real. |
|
17652 | 5159 |
real_le (real_of_num 0) x & real_le (real_of_num 0) xa --> |
5160 |
real_le (real_of_num 0) (real_div x xa)" |
|
17644 | 5161 |
by (import hollight REAL_LE_DIV) |
5162 |
||
5163 |
lemma REAL_DIV_POW2: "ALL (x::hollight.real) (m::nat) n::nat. |
|
17652 | 5164 |
x ~= real_of_num 0 --> |
17644 | 5165 |
real_div (real_pow x m) (real_pow x n) = |
5166 |
COND (<= n m) (real_pow x (m - n)) (real_inv (real_pow x (n - m)))" |
|
5167 |
by (import hollight REAL_DIV_POW2) |
|
5168 |
||
5169 |
lemma REAL_DIV_POW2_ALT: "ALL (x::hollight.real) (m::nat) n::nat. |
|
17652 | 5170 |
x ~= real_of_num 0 --> |
17644 | 5171 |
real_div (real_pow x m) (real_pow x n) = |
5172 |
COND (< n m) (real_pow x (m - n)) (real_inv (real_pow x (n - m)))" |
|
5173 |
by (import hollight REAL_DIV_POW2_ALT) |
|
5174 |
||
5175 |
lemma REAL_LT_POW2: "ALL x::nat. |
|
17652 | 5176 |
real_lt (real_of_num 0) |
5177 |
(real_pow (real_of_num (NUMERAL_BIT0 (NUMERAL_BIT1 0))) x)" |
|
17644 | 5178 |
by (import hollight REAL_LT_POW2) |
5179 |
||
5180 |
lemma REAL_LE_POW2: "ALL n::nat. |
|
17652 | 5181 |
real_le (real_of_num (NUMERAL_BIT1 0)) |
5182 |
(real_pow (real_of_num (NUMERAL_BIT0 (NUMERAL_BIT1 0))) n)" |
|
17644 | 5183 |
by (import hollight REAL_LE_POW2) |
5184 |
||
5185 |
lemma REAL_POW2_ABS: "ALL x::hollight.real. |
|
17652 | 5186 |
real_pow (real_abs x) (NUMERAL_BIT0 (NUMERAL_BIT1 0)) = |
5187 |
real_pow x (NUMERAL_BIT0 (NUMERAL_BIT1 0))" |
|
17644 | 5188 |
by (import hollight REAL_POW2_ABS) |
5189 |
||
5190 |
lemma REAL_LE_SQUARE_ABS: "ALL (x::hollight.real) y::hollight.real. |
|
5191 |
real_le (real_abs x) (real_abs y) = |
|
17652 | 5192 |
real_le (real_pow x (NUMERAL_BIT0 (NUMERAL_BIT1 0))) |
5193 |
(real_pow y (NUMERAL_BIT0 (NUMERAL_BIT1 0)))" |
|
17644 | 5194 |
by (import hollight REAL_LE_SQUARE_ABS) |
5195 |
||
19093 | 5196 |
lemma REAL_SOS_EQ_0: "ALL (x::hollight.real) y::hollight.real. |
5197 |
(real_add (real_pow x (NUMERAL_BIT0 (NUMERAL_BIT1 0))) |
|
5198 |
(real_pow y (NUMERAL_BIT0 (NUMERAL_BIT1 0))) = |
|
5199 |
real_of_num 0) = |
|
5200 |
(x = real_of_num 0 & y = real_of_num 0)" |
|
5201 |
by (import hollight REAL_SOS_EQ_0) |
|
5202 |
||
17644 | 5203 |
lemma REAL_WLOG_LE: "(ALL (x::hollight.real) y::hollight.real. |
5204 |
(P::hollight.real => hollight.real => bool) x y = P y x) & |
|
5205 |
(ALL (x::hollight.real) y::hollight.real. real_le x y --> P x y) --> |
|
5206 |
(ALL x::hollight.real. All (P x))" |
|
5207 |
by (import hollight REAL_WLOG_LE) |
|
5208 |
||
5209 |
lemma REAL_WLOG_LT: "(ALL x::hollight.real. (P::hollight.real => hollight.real => bool) x x) & |
|
5210 |
(ALL (x::hollight.real) y::hollight.real. P x y = P y x) & |
|
5211 |
(ALL (x::hollight.real) y::hollight.real. real_lt x y --> P x y) --> |
|
5212 |
(ALL x::hollight.real. All (P x))" |
|
5213 |
by (import hollight REAL_WLOG_LT) |
|
5214 |
||
5215 |
constdefs |
|
5216 |
mod_real :: "hollight.real => hollight.real => hollight.real => bool" |
|
5217 |
"mod_real == |
|
5218 |
%(u::hollight.real) (ua::hollight.real) ub::hollight.real. |
|
5219 |
EX q::hollight.real. real_sub ua ub = real_mul q u" |
|
5220 |
||
5221 |
lemma DEF_mod_real: "mod_real = |
|
5222 |
(%(u::hollight.real) (ua::hollight.real) ub::hollight.real. |
|
5223 |
EX q::hollight.real. real_sub ua ub = real_mul q u)" |
|
5224 |
by (import hollight DEF_mod_real) |
|
5225 |
||
5226 |
constdefs |
|
5227 |
DECIMAL :: "nat => nat => hollight.real" |
|
5228 |
"DECIMAL == %(u::nat) ua::nat. real_div (real_of_num u) (real_of_num ua)" |
|
5229 |
||
5230 |
lemma DEF_DECIMAL: "DECIMAL = (%(u::nat) ua::nat. real_div (real_of_num u) (real_of_num ua))" |
|
5231 |
by (import hollight DEF_DECIMAL) |
|
5232 |
||
17652 | 5233 |
lemma RAT_LEMMA1: "(y1::hollight.real) ~= real_of_num 0 & |
5234 |
(y2::hollight.real) ~= real_of_num 0 --> |
|
17644 | 5235 |
real_add (real_div (x1::hollight.real) y1) |
5236 |
(real_div (x2::hollight.real) y2) = |
|
5237 |
real_mul (real_add (real_mul x1 y2) (real_mul x2 y1)) |
|
5238 |
(real_mul (real_inv y1) (real_inv y2))" |
|
5239 |
by (import hollight RAT_LEMMA1) |
|
5240 |
||
17652 | 5241 |
lemma RAT_LEMMA2: "real_lt (real_of_num 0) (y1::hollight.real) & |
5242 |
real_lt (real_of_num 0) (y2::hollight.real) --> |
|
17644 | 5243 |
real_add (real_div (x1::hollight.real) y1) |
5244 |
(real_div (x2::hollight.real) y2) = |
|
5245 |
real_mul (real_add (real_mul x1 y2) (real_mul x2 y1)) |
|
5246 |
(real_mul (real_inv y1) (real_inv y2))" |
|
5247 |
by (import hollight RAT_LEMMA2) |
|
5248 |
||
17652 | 5249 |
lemma RAT_LEMMA3: "real_lt (real_of_num 0) (y1::hollight.real) & |
5250 |
real_lt (real_of_num 0) (y2::hollight.real) --> |
|
17644 | 5251 |
real_sub (real_div (x1::hollight.real) y1) |
5252 |
(real_div (x2::hollight.real) y2) = |
|
5253 |
real_mul (real_sub (real_mul x1 y2) (real_mul x2 y1)) |
|
5254 |
(real_mul (real_inv y1) (real_inv y2))" |
|
5255 |
by (import hollight RAT_LEMMA3) |
|
5256 |
||
17652 | 5257 |
lemma RAT_LEMMA4: "real_lt (real_of_num 0) (y1::hollight.real) & |
5258 |
real_lt (real_of_num 0) (y2::hollight.real) --> |
|
17644 | 5259 |
real_le (real_div (x1::hollight.real) y1) |
5260 |
(real_div (x2::hollight.real) y2) = |
|
5261 |
real_le (real_mul x1 y2) (real_mul x2 y1)" |
|
5262 |
by (import hollight RAT_LEMMA4) |
|
5263 |
||
17652 | 5264 |
lemma RAT_LEMMA5: "real_lt (real_of_num 0) (y1::hollight.real) & |
5265 |
real_lt (real_of_num 0) (y2::hollight.real) --> |
|
17644 | 5266 |
(real_div (x1::hollight.real) y1 = real_div (x2::hollight.real) y2) = |
5267 |
(real_mul x1 y2 = real_mul x2 y1)" |
|
5268 |
by (import hollight RAT_LEMMA5) |
|
5269 |
||
5270 |
constdefs |
|
5271 |
is_int :: "hollight.real => bool" |
|
5272 |
"is_int == |
|
5273 |
%u::hollight.real. |
|
5274 |
EX n::nat. u = real_of_num n | u = real_neg (real_of_num n)" |
|
5275 |
||
5276 |
lemma DEF_is_int: "is_int = |
|
5277 |
(%u::hollight.real. |
|
5278 |
EX n::nat. u = real_of_num n | u = real_neg (real_of_num n))" |
|
5279 |
by (import hollight DEF_is_int) |
|
5280 |
||
5281 |
typedef (open) int = "Collect is_int" morphisms "dest_int" "mk_int" |
|
17652 | 5282 |
apply (rule light_ex_imp_nonempty[where t="real_of_num (NUMERAL 0)"]) |
17644 | 5283 |
by (import hollight TYDEF_int) |
5284 |
||
5285 |
syntax |
|
5286 |
dest_int :: _ |
|
5287 |
||
5288 |
syntax |
|
5289 |
mk_int :: _ |
|
5290 |
||
5291 |
lemmas "TYDEF_int_@intern" = typedef_hol2hollight |
|
5292 |
[where a="a :: hollight.int" and r=r , |
|
5293 |
OF type_definition_int] |
|
5294 |
||
5295 |
lemma dest_int_rep: "ALL x::hollight.int. |
|
5296 |
EX n::nat. |
|
5297 |
dest_int x = real_of_num n | dest_int x = real_neg (real_of_num n)" |
|
5298 |
by (import hollight dest_int_rep) |
|
5299 |
||
5300 |
constdefs |
|
5301 |
int_le :: "hollight.int => hollight.int => bool" |
|
5302 |
"int_le == |
|
5303 |
%(u::hollight.int) ua::hollight.int. real_le (dest_int u) (dest_int ua)" |
|
5304 |
||
5305 |
lemma DEF_int_le: "int_le = |
|
5306 |
(%(u::hollight.int) ua::hollight.int. real_le (dest_int u) (dest_int ua))" |
|
5307 |
by (import hollight DEF_int_le) |
|
5308 |
||
5309 |
constdefs |
|
5310 |
int_lt :: "hollight.int => hollight.int => bool" |
|
5311 |
"int_lt == |
|
5312 |
%(u::hollight.int) ua::hollight.int. real_lt (dest_int u) (dest_int ua)" |
|
5313 |
||
5314 |
lemma DEF_int_lt: "int_lt = |
|
5315 |
(%(u::hollight.int) ua::hollight.int. real_lt (dest_int u) (dest_int ua))" |
|
5316 |
by (import hollight DEF_int_lt) |
|
5317 |
||
5318 |
constdefs |
|
5319 |
int_ge :: "hollight.int => hollight.int => bool" |
|
5320 |
"int_ge == |
|
5321 |
%(u::hollight.int) ua::hollight.int. |
|
5322 |
hollight.real_ge (dest_int u) (dest_int ua)" |
|
5323 |
||
5324 |
lemma DEF_int_ge: "int_ge = |
|
5325 |
(%(u::hollight.int) ua::hollight.int. |
|
5326 |
hollight.real_ge (dest_int u) (dest_int ua))" |
|
5327 |
by (import hollight DEF_int_ge) |
|
5328 |
||
5329 |
constdefs |
|
5330 |
int_gt :: "hollight.int => hollight.int => bool" |
|
5331 |
"int_gt == |
|
5332 |
%(u::hollight.int) ua::hollight.int. |
|
5333 |
hollight.real_gt (dest_int u) (dest_int ua)" |
|
5334 |
||
5335 |
lemma DEF_int_gt: "int_gt = |
|
5336 |
(%(u::hollight.int) ua::hollight.int. |
|
5337 |
hollight.real_gt (dest_int u) (dest_int ua))" |
|
5338 |
by (import hollight DEF_int_gt) |
|
5339 |
||
5340 |
constdefs |
|
5341 |
int_of_num :: "nat => hollight.int" |
|
5342 |
"int_of_num == %u::nat. mk_int (real_of_num u)" |
|
5343 |
||
5344 |
lemma DEF_int_of_num: "int_of_num = (%u::nat. mk_int (real_of_num u))" |
|
5345 |
by (import hollight DEF_int_of_num) |
|
5346 |
||
5347 |
lemma int_of_num_th: "ALL x::nat. dest_int (int_of_num x) = real_of_num x" |
|
5348 |
by (import hollight int_of_num_th) |
|
5349 |
||
5350 |
constdefs |
|
5351 |
int_neg :: "hollight.int => hollight.int" |
|
5352 |
"int_neg == %u::hollight.int. mk_int (real_neg (dest_int u))" |
|
5353 |
||
5354 |
lemma DEF_int_neg: "int_neg = (%u::hollight.int. mk_int (real_neg (dest_int u)))" |
|
5355 |
by (import hollight DEF_int_neg) |
|
5356 |
||
5357 |
lemma int_neg_th: "ALL x::hollight.int. dest_int (int_neg x) = real_neg (dest_int x)" |
|
5358 |
by (import hollight int_neg_th) |
|
5359 |
||
5360 |
constdefs |
|
5361 |
int_add :: "hollight.int => hollight.int => hollight.int" |
|
5362 |
"int_add == |
|
5363 |
%(u::hollight.int) ua::hollight.int. |
|
5364 |
mk_int (real_add (dest_int u) (dest_int ua))" |
|
5365 |
||
5366 |
lemma DEF_int_add: "int_add = |
|
5367 |
(%(u::hollight.int) ua::hollight.int. |
|
5368 |
mk_int (real_add (dest_int u) (dest_int ua)))" |
|
5369 |
by (import hollight DEF_int_add) |
|
5370 |
||
5371 |
lemma int_add_th: "ALL (x::hollight.int) xa::hollight.int. |
|
5372 |
dest_int (int_add x xa) = real_add (dest_int x) (dest_int xa)" |
|
5373 |
by (import hollight int_add_th) |
|
5374 |
||
5375 |
constdefs |
|
5376 |
int_sub :: "hollight.int => hollight.int => hollight.int" |
|
5377 |
"int_sub == |
|
5378 |
%(u::hollight.int) ua::hollight.int. |
|
5379 |
mk_int (real_sub (dest_int u) (dest_int ua))" |
|
5380 |
||
5381 |
lemma DEF_int_sub: "int_sub = |
|
5382 |
(%(u::hollight.int) ua::hollight.int. |
|
5383 |
mk_int (real_sub (dest_int u) (dest_int ua)))" |
|
5384 |
by (import hollight DEF_int_sub) |
|
5385 |
||
5386 |
lemma int_sub_th: "ALL (x::hollight.int) xa::hollight.int. |
|
5387 |
dest_int (int_sub x xa) = real_sub (dest_int x) (dest_int xa)" |
|
5388 |
by (import hollight int_sub_th) |
|
5389 |
||
5390 |
constdefs |
|
5391 |
int_mul :: "hollight.int => hollight.int => hollight.int" |
|
5392 |
"int_mul == |
|
5393 |
%(u::hollight.int) ua::hollight.int. |
|
5394 |
mk_int (real_mul (dest_int u) (dest_int ua))" |
|
5395 |
||
5396 |
lemma DEF_int_mul: "int_mul = |
|
5397 |
(%(u::hollight.int) ua::hollight.int. |
|
5398 |
mk_int (real_mul (dest_int u) (dest_int ua)))" |
|
5399 |
by (import hollight DEF_int_mul) |
|
5400 |
||
5401 |
lemma int_mul_th: "ALL (x::hollight.int) y::hollight.int. |
|
5402 |
dest_int (int_mul x y) = real_mul (dest_int x) (dest_int y)" |
|
5403 |
by (import hollight int_mul_th) |
|
5404 |
||
5405 |
constdefs |
|
5406 |
int_abs :: "hollight.int => hollight.int" |
|
5407 |
"int_abs == %u::hollight.int. mk_int (real_abs (dest_int u))" |
|
5408 |
||
5409 |
lemma DEF_int_abs: "int_abs = (%u::hollight.int. mk_int (real_abs (dest_int u)))" |
|
5410 |
by (import hollight DEF_int_abs) |
|
5411 |
||
5412 |
lemma int_abs_th: "ALL x::hollight.int. dest_int (int_abs x) = real_abs (dest_int x)" |
|
5413 |
by (import hollight int_abs_th) |
|
5414 |
||
5415 |
constdefs |
|
5416 |
int_max :: "hollight.int => hollight.int => hollight.int" |
|
5417 |
"int_max == |
|
5418 |
%(u::hollight.int) ua::hollight.int. |
|
5419 |
mk_int (real_max (dest_int u) (dest_int ua))" |
|
5420 |
||
5421 |
lemma DEF_int_max: "int_max = |
|
5422 |
(%(u::hollight.int) ua::hollight.int. |
|
5423 |
mk_int (real_max (dest_int u) (dest_int ua)))" |
|
5424 |
by (import hollight DEF_int_max) |
|
5425 |
||
5426 |
lemma int_max_th: "ALL (x::hollight.int) y::hollight.int. |
|
5427 |
dest_int (int_max x y) = real_max (dest_int x) (dest_int y)" |
|
5428 |
by (import hollight int_max_th) |
|
5429 |
||
5430 |
constdefs |
|
5431 |
int_min :: "hollight.int => hollight.int => hollight.int" |
|
5432 |
"int_min == |
|
5433 |
%(u::hollight.int) ua::hollight.int. |
|
5434 |
mk_int (real_min (dest_int u) (dest_int ua))" |
|
5435 |
||
5436 |
lemma DEF_int_min: "int_min = |
|
5437 |
(%(u::hollight.int) ua::hollight.int. |
|
5438 |
mk_int (real_min (dest_int u) (dest_int ua)))" |
|
5439 |
by (import hollight DEF_int_min) |
|
5440 |
||
5441 |
lemma int_min_th: "ALL (x::hollight.int) y::hollight.int. |
|
5442 |
dest_int (int_min x y) = real_min (dest_int x) (dest_int y)" |
|
5443 |
by (import hollight int_min_th) |
|
5444 |
||
5445 |
constdefs |
|
5446 |
int_pow :: "hollight.int => nat => hollight.int" |
|
5447 |
"int_pow == %(u::hollight.int) ua::nat. mk_int (real_pow (dest_int u) ua)" |
|
5448 |
||
5449 |
lemma DEF_int_pow: "int_pow = (%(u::hollight.int) ua::nat. mk_int (real_pow (dest_int u) ua))" |
|
5450 |
by (import hollight DEF_int_pow) |
|
5451 |
||
5452 |
lemma int_pow_th: "ALL (x::hollight.int) xa::nat. |
|
5453 |
dest_int (int_pow x xa) = real_pow (dest_int x) xa" |
|
5454 |
by (import hollight int_pow_th) |
|
5455 |
||
5456 |
lemma INT_IMAGE: "ALL x::hollight.int. |
|
5457 |
(EX n::nat. x = int_of_num n) | (EX n::nat. x = int_neg (int_of_num n))" |
|
5458 |
by (import hollight INT_IMAGE) |
|
5459 |
||
5460 |
lemma INT_LT_DISCRETE: "ALL (x::hollight.int) y::hollight.int. |
|
17652 | 5461 |
int_lt x y = int_le (int_add x (int_of_num (NUMERAL_BIT1 0))) y" |
17644 | 5462 |
by (import hollight INT_LT_DISCRETE) |
5463 |
||
5464 |
lemma INT_GT_DISCRETE: "ALL (x::hollight.int) xa::hollight.int. |
|
17652 | 5465 |
int_gt x xa = int_ge x (int_add xa (int_of_num (NUMERAL_BIT1 0)))" |
17644 | 5466 |
by (import hollight INT_GT_DISCRETE) |
5467 |
||
5468 |
lemma INT_FORALL_POS: "(ALL n::nat. (P::hollight.int => bool) (int_of_num n)) = |
|
17652 | 5469 |
(ALL i::hollight.int. int_le (int_of_num 0) i --> P i)" |
17644 | 5470 |
by (import hollight INT_FORALL_POS) |
5471 |
||
5472 |
lemma INT_ABS_MUL_1: "ALL (x::hollight.int) y::hollight.int. |
|
17652 | 5473 |
(int_abs (int_mul x y) = int_of_num (NUMERAL_BIT1 0)) = |
5474 |
(int_abs x = int_of_num (NUMERAL_BIT1 0) & |
|
5475 |
int_abs y = int_of_num (NUMERAL_BIT1 0))" |
|
17644 | 5476 |
by (import hollight INT_ABS_MUL_1) |
5477 |
||
17652 | 5478 |
lemma INT_POW: "int_pow (x::hollight.int) 0 = int_of_num (NUMERAL_BIT1 0) & |
17644 | 5479 |
(ALL xa::nat. int_pow x (Suc xa) = int_mul x (int_pow x xa))" |
5480 |
by (import hollight INT_POW) |
|
5481 |
||
5482 |
lemma INT_ABS: "ALL x::hollight.int. |
|
17652 | 5483 |
int_abs x = COND (int_le (int_of_num 0) x) x (int_neg x)" |
17644 | 5484 |
by (import hollight INT_ABS) |
5485 |
||
5486 |
lemma INT_GE: "ALL (x::hollight.int) xa::hollight.int. int_ge x xa = int_le xa x" |
|
5487 |
by (import hollight INT_GE) |
|
5488 |
||
5489 |
lemma INT_GT: "ALL (x::hollight.int) xa::hollight.int. int_gt x xa = int_lt xa x" |
|
5490 |
by (import hollight INT_GT) |
|
5491 |
||
5492 |
lemma INT_LT: "ALL (x::hollight.int) xa::hollight.int. int_lt x xa = (~ int_le xa x)" |
|
5493 |
by (import hollight INT_LT) |
|
5494 |
||
5495 |
lemma INT_ARCH: "ALL (x::hollight.int) d::hollight.int. |
|
17652 | 5496 |
d ~= int_of_num 0 --> (EX c::hollight.int. int_lt x (int_mul c d))" |
17644 | 5497 |
by (import hollight INT_ARCH) |
5498 |
||
5499 |
constdefs |
|
5500 |
mod_int :: "hollight.int => hollight.int => hollight.int => bool" |
|
5501 |
"mod_int == |
|
5502 |
%(u::hollight.int) (ua::hollight.int) ub::hollight.int. |
|
5503 |
EX q::hollight.int. int_sub ua ub = int_mul q u" |
|
5504 |
||
5505 |
lemma DEF_mod_int: "mod_int = |
|
5506 |
(%(u::hollight.int) (ua::hollight.int) ub::hollight.int. |
|
5507 |
EX q::hollight.int. int_sub ua ub = int_mul q u)" |
|
5508 |
by (import hollight DEF_mod_int) |
|
5509 |
||
5510 |
constdefs |
|
17652 | 5511 |
IN :: "'A => ('A => bool) => bool" |
17644 | 5512 |
"IN == %(u::'A::type) ua::'A::type => bool. ua u" |
5513 |
||
5514 |
lemma DEF_IN: "IN = (%(u::'A::type) ua::'A::type => bool. ua u)" |
|
5515 |
by (import hollight DEF_IN) |
|
5516 |
||
5517 |
lemma EXTENSION: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
5518 |
(x = xa) = (ALL xb::'A::type. IN xb x = IN xb xa)" |
|
5519 |
by (import hollight EXTENSION) |
|
5520 |
||
5521 |
constdefs |
|
17652 | 5522 |
GSPEC :: "('A => bool) => 'A => bool" |
17644 | 5523 |
"GSPEC == %u::'A::type => bool. u" |
5524 |
||
5525 |
lemma DEF_GSPEC: "GSPEC = (%u::'A::type => bool. u)" |
|
5526 |
by (import hollight DEF_GSPEC) |
|
5527 |
||
5528 |
constdefs |
|
19093 | 5529 |
SETSPEC :: "'q_37056 => bool => 'q_37056 => bool" |
5530 |
"SETSPEC == %(u::'q_37056::type) (ua::bool) ub::'q_37056::type. ua & u = ub" |
|
5531 |
||
5532 |
lemma DEF_SETSPEC: "SETSPEC = (%(u::'q_37056::type) (ua::bool) ub::'q_37056::type. ua & u = ub)" |
|
17644 | 5533 |
by (import hollight DEF_SETSPEC) |
5534 |
||
19093 | 5535 |
lemma IN_ELIM_THM: "(ALL (P::(bool => 'q_37089::type => bool) => bool) x::'q_37089::type. |
5536 |
IN x (GSPEC (%v::'q_37089::type. P (SETSPEC v))) = |
|
5537 |
P (%(p::bool) t::'q_37089::type. p & x = t)) & |
|
5538 |
(ALL (p::'q_37120::type => bool) x::'q_37120::type. |
|
17644 | 5539 |
IN x |
19093 | 5540 |
(GSPEC (%v::'q_37120::type. EX y::'q_37120::type. SETSPEC v (p y) y)) = |
17644 | 5541 |
p x) & |
19093 | 5542 |
(ALL (P::(bool => 'q_37148::type => bool) => bool) x::'q_37148::type. |
5543 |
GSPEC (%v::'q_37148::type. P (SETSPEC v)) x = |
|
5544 |
P (%(p::bool) t::'q_37148::type. p & x = t)) & |
|
5545 |
(ALL (p::'q_37177::type => bool) x::'q_37177::type. |
|
5546 |
GSPEC (%v::'q_37177::type. EX y::'q_37177::type. SETSPEC v (p y) y) x = |
|
17644 | 5547 |
p x) & |
19093 | 5548 |
(ALL (p::'q_37194::type => bool) x::'q_37194::type. IN x p = p x)" |
17644 | 5549 |
by (import hollight IN_ELIM_THM) |
5550 |
||
5551 |
constdefs |
|
17652 | 5552 |
EMPTY :: "'A => bool" |
17644 | 5553 |
"EMPTY == %x::'A::type. False" |
5554 |
||
5555 |
lemma DEF_EMPTY: "EMPTY = (%x::'A::type. False)" |
|
5556 |
by (import hollight DEF_EMPTY) |
|
5557 |
||
5558 |
constdefs |
|
17652 | 5559 |
INSERT :: "'A => ('A => bool) => 'A => bool" |
17644 | 5560 |
"INSERT == %(u::'A::type) (ua::'A::type => bool) y::'A::type. IN y ua | y = u" |
5561 |
||
5562 |
lemma DEF_INSERT: "INSERT = |
|
5563 |
(%(u::'A::type) (ua::'A::type => bool) y::'A::type. IN y ua | y = u)" |
|
5564 |
by (import hollight DEF_INSERT) |
|
5565 |
||
5566 |
consts |
|
17652 | 5567 |
UNIV :: "'A => bool" |
17644 | 5568 |
|
5569 |
defs |
|
5570 |
UNIV_def: "hollight.UNIV == %x::'A::type. True" |
|
5571 |
||
5572 |
lemma DEF_UNIV: "hollight.UNIV = (%x::'A::type. True)" |
|
5573 |
by (import hollight DEF_UNIV) |
|
5574 |
||
5575 |
consts |
|
17652 | 5576 |
UNION :: "('A => bool) => ('A => bool) => 'A => bool" |
17644 | 5577 |
|
5578 |
defs |
|
5579 |
UNION_def: "hollight.UNION == |
|
5580 |
%(u::'A::type => bool) ua::'A::type => bool. |
|
5581 |
GSPEC (%ub::'A::type. EX x::'A::type. SETSPEC ub (IN x u | IN x ua) x)" |
|
5582 |
||
5583 |
lemma DEF_UNION: "hollight.UNION = |
|
5584 |
(%(u::'A::type => bool) ua::'A::type => bool. |
|
5585 |
GSPEC (%ub::'A::type. EX x::'A::type. SETSPEC ub (IN x u | IN x ua) x))" |
|
5586 |
by (import hollight DEF_UNION) |
|
5587 |
||
5588 |
constdefs |
|
17652 | 5589 |
UNIONS :: "(('A => bool) => bool) => 'A => bool" |
17644 | 5590 |
"UNIONS == |
5591 |
%u::('A::type => bool) => bool. |
|
5592 |
GSPEC |
|
5593 |
(%ua::'A::type. |
|
5594 |
EX x::'A::type. |
|
5595 |
SETSPEC ua (EX ua::'A::type => bool. IN ua u & IN x ua) x)" |
|
5596 |
||
5597 |
lemma DEF_UNIONS: "UNIONS = |
|
5598 |
(%u::('A::type => bool) => bool. |
|
5599 |
GSPEC |
|
5600 |
(%ua::'A::type. |
|
5601 |
EX x::'A::type. |
|
5602 |
SETSPEC ua (EX ua::'A::type => bool. IN ua u & IN x ua) x))" |
|
5603 |
by (import hollight DEF_UNIONS) |
|
5604 |
||
5605 |
consts |
|
17652 | 5606 |
INTER :: "('A => bool) => ('A => bool) => 'A => bool" |
17644 | 5607 |
|
5608 |
defs |
|
5609 |
INTER_def: "hollight.INTER == |
|
5610 |
%(u::'A::type => bool) ua::'A::type => bool. |
|
5611 |
GSPEC (%ub::'A::type. EX x::'A::type. SETSPEC ub (IN x u & IN x ua) x)" |
|
5612 |
||
5613 |
lemma DEF_INTER: "hollight.INTER = |
|
5614 |
(%(u::'A::type => bool) ua::'A::type => bool. |
|
5615 |
GSPEC (%ub::'A::type. EX x::'A::type. SETSPEC ub (IN x u & IN x ua) x))" |
|
5616 |
by (import hollight DEF_INTER) |
|
5617 |
||
5618 |
constdefs |
|
17652 | 5619 |
INTERS :: "(('A => bool) => bool) => 'A => bool" |
17644 | 5620 |
"INTERS == |
5621 |
%u::('A::type => bool) => bool. |
|
5622 |
GSPEC |
|
5623 |
(%ua::'A::type. |
|
5624 |
EX x::'A::type. |
|
5625 |
SETSPEC ua (ALL ua::'A::type => bool. IN ua u --> IN x ua) x)" |
|
5626 |
||
5627 |
lemma DEF_INTERS: "INTERS = |
|
5628 |
(%u::('A::type => bool) => bool. |
|
5629 |
GSPEC |
|
5630 |
(%ua::'A::type. |
|
5631 |
EX x::'A::type. |
|
5632 |
SETSPEC ua (ALL ua::'A::type => bool. IN ua u --> IN x ua) x))" |
|
5633 |
by (import hollight DEF_INTERS) |
|
5634 |
||
5635 |
constdefs |
|
17652 | 5636 |
DIFF :: "('A => bool) => ('A => bool) => 'A => bool" |
17644 | 5637 |
"DIFF == |
5638 |
%(u::'A::type => bool) ua::'A::type => bool. |
|
5639 |
GSPEC (%ub::'A::type. EX x::'A::type. SETSPEC ub (IN x u & ~ IN x ua) x)" |
|
5640 |
||
5641 |
lemma DEF_DIFF: "DIFF = |
|
5642 |
(%(u::'A::type => bool) ua::'A::type => bool. |
|
5643 |
GSPEC |
|
5644 |
(%ub::'A::type. EX x::'A::type. SETSPEC ub (IN x u & ~ IN x ua) x))" |
|
5645 |
by (import hollight DEF_DIFF) |
|
5646 |
||
5647 |
lemma INSERT: "INSERT (x::'A::type) (s::'A::type => bool) = |
|
5648 |
GSPEC (%u::'A::type. EX y::'A::type. SETSPEC u (IN y s | y = x) y)" |
|
5649 |
by (import hollight INSERT) |
|
5650 |
||
5651 |
constdefs |
|
17652 | 5652 |
DELETE :: "('A => bool) => 'A => 'A => bool" |
17644 | 5653 |
"DELETE == |
5654 |
%(u::'A::type => bool) ua::'A::type. |
|
5655 |
GSPEC (%ub::'A::type. EX y::'A::type. SETSPEC ub (IN y u & y ~= ua) y)" |
|
5656 |
||
5657 |
lemma DEF_DELETE: "DELETE = |
|
5658 |
(%(u::'A::type => bool) ua::'A::type. |
|
5659 |
GSPEC (%ub::'A::type. EX y::'A::type. SETSPEC ub (IN y u & y ~= ua) y))" |
|
5660 |
by (import hollight DEF_DELETE) |
|
5661 |
||
5662 |
constdefs |
|
17652 | 5663 |
SUBSET :: "('A => bool) => ('A => bool) => bool" |
17644 | 5664 |
"SUBSET == |
5665 |
%(u::'A::type => bool) ua::'A::type => bool. |
|
5666 |
ALL x::'A::type. IN x u --> IN x ua" |
|
5667 |
||
5668 |
lemma DEF_SUBSET: "SUBSET = |
|
5669 |
(%(u::'A::type => bool) ua::'A::type => bool. |
|
5670 |
ALL x::'A::type. IN x u --> IN x ua)" |
|
5671 |
by (import hollight DEF_SUBSET) |
|
5672 |
||
5673 |
constdefs |
|
17652 | 5674 |
PSUBSET :: "('A => bool) => ('A => bool) => bool" |
17644 | 5675 |
"PSUBSET == |
5676 |
%(u::'A::type => bool) ua::'A::type => bool. SUBSET u ua & u ~= ua" |
|
5677 |
||
5678 |
lemma DEF_PSUBSET: "PSUBSET = |
|
5679 |
(%(u::'A::type => bool) ua::'A::type => bool. SUBSET u ua & u ~= ua)" |
|
5680 |
by (import hollight DEF_PSUBSET) |
|
5681 |
||
5682 |
constdefs |
|
17652 | 5683 |
DISJOINT :: "('A => bool) => ('A => bool) => bool" |
17644 | 5684 |
"DISJOINT == |
5685 |
%(u::'A::type => bool) ua::'A::type => bool. hollight.INTER u ua = EMPTY" |
|
5686 |
||
5687 |
lemma DEF_DISJOINT: "DISJOINT = |
|
5688 |
(%(u::'A::type => bool) ua::'A::type => bool. hollight.INTER u ua = EMPTY)" |
|
5689 |
by (import hollight DEF_DISJOINT) |
|
5690 |
||
5691 |
constdefs |
|
17652 | 5692 |
SING :: "('A => bool) => bool" |
17644 | 5693 |
"SING == %u::'A::type => bool. EX x::'A::type. u = INSERT x EMPTY" |
5694 |
||
5695 |
lemma DEF_SING: "SING = (%u::'A::type => bool. EX x::'A::type. u = INSERT x EMPTY)" |
|
5696 |
by (import hollight DEF_SING) |
|
5697 |
||
5698 |
constdefs |
|
17652 | 5699 |
FINITE :: "('A => bool) => bool" |
17644 | 5700 |
"FINITE == |
5701 |
%a::'A::type => bool. |
|
5702 |
ALL FINITE'::('A::type => bool) => bool. |
|
5703 |
(ALL a::'A::type => bool. |
|
5704 |
a = EMPTY | |
|
5705 |
(EX (x::'A::type) s::'A::type => bool. |
|
5706 |
a = INSERT x s & FINITE' s) --> |
|
5707 |
FINITE' a) --> |
|
5708 |
FINITE' a" |
|
5709 |
||
5710 |
lemma DEF_FINITE: "FINITE = |
|
5711 |
(%a::'A::type => bool. |
|
5712 |
ALL FINITE'::('A::type => bool) => bool. |
|
5713 |
(ALL a::'A::type => bool. |
|
5714 |
a = EMPTY | |
|
5715 |
(EX (x::'A::type) s::'A::type => bool. |
|
5716 |
a = INSERT x s & FINITE' s) --> |
|
5717 |
FINITE' a) --> |
|
5718 |
FINITE' a)" |
|
5719 |
by (import hollight DEF_FINITE) |
|
5720 |
||
5721 |
constdefs |
|
17652 | 5722 |
INFINITE :: "('A => bool) => bool" |
17644 | 5723 |
"INFINITE == %u::'A::type => bool. ~ FINITE u" |
5724 |
||
5725 |
lemma DEF_INFINITE: "INFINITE = (%u::'A::type => bool. ~ FINITE u)" |
|
5726 |
by (import hollight DEF_INFINITE) |
|
5727 |
||
5728 |
constdefs |
|
17652 | 5729 |
IMAGE :: "('A => 'B) => ('A => bool) => 'B => bool" |
17644 | 5730 |
"IMAGE == |
5731 |
%(u::'A::type => 'B::type) ua::'A::type => bool. |
|
5732 |
GSPEC |
|
5733 |
(%ub::'B::type. |
|
5734 |
EX y::'B::type. SETSPEC ub (EX x::'A::type. IN x ua & y = u x) y)" |
|
5735 |
||
5736 |
lemma DEF_IMAGE: "IMAGE = |
|
5737 |
(%(u::'A::type => 'B::type) ua::'A::type => bool. |
|
5738 |
GSPEC |
|
5739 |
(%ub::'B::type. |
|
5740 |
EX y::'B::type. SETSPEC ub (EX x::'A::type. IN x ua & y = u x) y))" |
|
5741 |
by (import hollight DEF_IMAGE) |
|
5742 |
||
5743 |
constdefs |
|
17652 | 5744 |
INJ :: "('A => 'B) => ('A => bool) => ('B => bool) => bool" |
17644 | 5745 |
"INJ == |
5746 |
%(u::'A::type => 'B::type) (ua::'A::type => bool) ub::'B::type => bool. |
|
5747 |
(ALL x::'A::type. IN x ua --> IN (u x) ub) & |
|
5748 |
(ALL (x::'A::type) y::'A::type. IN x ua & IN y ua & u x = u y --> x = y)" |
|
5749 |
||
5750 |
lemma DEF_INJ: "INJ = |
|
5751 |
(%(u::'A::type => 'B::type) (ua::'A::type => bool) ub::'B::type => bool. |
|
5752 |
(ALL x::'A::type. IN x ua --> IN (u x) ub) & |
|
5753 |
(ALL (x::'A::type) y::'A::type. |
|
5754 |
IN x ua & IN y ua & u x = u y --> x = y))" |
|
5755 |
by (import hollight DEF_INJ) |
|
5756 |
||
5757 |
constdefs |
|
17652 | 5758 |
SURJ :: "('A => 'B) => ('A => bool) => ('B => bool) => bool" |
17644 | 5759 |
"SURJ == |
5760 |
%(u::'A::type => 'B::type) (ua::'A::type => bool) ub::'B::type => bool. |
|
5761 |
(ALL x::'A::type. IN x ua --> IN (u x) ub) & |
|
5762 |
(ALL x::'B::type. IN x ub --> (EX y::'A::type. IN y ua & u y = x))" |
|
5763 |
||
5764 |
lemma DEF_SURJ: "SURJ = |
|
5765 |
(%(u::'A::type => 'B::type) (ua::'A::type => bool) ub::'B::type => bool. |
|
5766 |
(ALL x::'A::type. IN x ua --> IN (u x) ub) & |
|
5767 |
(ALL x::'B::type. IN x ub --> (EX y::'A::type. IN y ua & u y = x)))" |
|
5768 |
by (import hollight DEF_SURJ) |
|
5769 |
||
5770 |
constdefs |
|
17652 | 5771 |
BIJ :: "('A => 'B) => ('A => bool) => ('B => bool) => bool" |
17644 | 5772 |
"BIJ == |
5773 |
%(u::'A::type => 'B::type) (ua::'A::type => bool) ub::'B::type => bool. |
|
5774 |
INJ u ua ub & SURJ u ua ub" |
|
5775 |
||
5776 |
lemma DEF_BIJ: "BIJ = |
|
5777 |
(%(u::'A::type => 'B::type) (ua::'A::type => bool) ub::'B::type => bool. |
|
5778 |
INJ u ua ub & SURJ u ua ub)" |
|
5779 |
by (import hollight DEF_BIJ) |
|
5780 |
||
5781 |
constdefs |
|
17652 | 5782 |
CHOICE :: "('A => bool) => 'A" |
17644 | 5783 |
"CHOICE == %u::'A::type => bool. SOME x::'A::type. IN x u" |
5784 |
||
5785 |
lemma DEF_CHOICE: "CHOICE = (%u::'A::type => bool. SOME x::'A::type. IN x u)" |
|
5786 |
by (import hollight DEF_CHOICE) |
|
5787 |
||
5788 |
constdefs |
|
17652 | 5789 |
REST :: "('A => bool) => 'A => bool" |
17644 | 5790 |
"REST == %u::'A::type => bool. DELETE u (CHOICE u)" |
5791 |
||
5792 |
lemma DEF_REST: "REST = (%u::'A::type => bool. DELETE u (CHOICE u))" |
|
5793 |
by (import hollight DEF_REST) |
|
5794 |
||
5795 |
constdefs |
|
19093 | 5796 |
CARD_GE :: "('q_37693 => bool) => ('q_37690 => bool) => bool" |
17644 | 5797 |
"CARD_GE == |
19093 | 5798 |
%(u::'q_37693::type => bool) ua::'q_37690::type => bool. |
5799 |
EX f::'q_37693::type => 'q_37690::type. |
|
5800 |
ALL y::'q_37690::type. |
|
5801 |
IN y ua --> (EX x::'q_37693::type. IN x u & y = f x)" |
|
17644 | 5802 |
|
5803 |
lemma DEF_CARD_GE: "CARD_GE = |
|
19093 | 5804 |
(%(u::'q_37693::type => bool) ua::'q_37690::type => bool. |
5805 |
EX f::'q_37693::type => 'q_37690::type. |
|
5806 |
ALL y::'q_37690::type. |
|
5807 |
IN y ua --> (EX x::'q_37693::type. IN x u & y = f x))" |
|
17644 | 5808 |
by (import hollight DEF_CARD_GE) |
5809 |
||
5810 |
constdefs |
|
19093 | 5811 |
CARD_LE :: "('q_37702 => bool) => ('q_37701 => bool) => bool" |
17644 | 5812 |
"CARD_LE == |
19093 | 5813 |
%(u::'q_37702::type => bool) ua::'q_37701::type => bool. CARD_GE ua u" |
17644 | 5814 |
|
5815 |
lemma DEF_CARD_LE: "CARD_LE = |
|
19093 | 5816 |
(%(u::'q_37702::type => bool) ua::'q_37701::type => bool. CARD_GE ua u)" |
17644 | 5817 |
by (import hollight DEF_CARD_LE) |
5818 |
||
5819 |
constdefs |
|
19093 | 5820 |
CARD_EQ :: "('q_37712 => bool) => ('q_37713 => bool) => bool" |
17644 | 5821 |
"CARD_EQ == |
19093 | 5822 |
%(u::'q_37712::type => bool) ua::'q_37713::type => bool. |
17644 | 5823 |
CARD_LE u ua & CARD_LE ua u" |
5824 |
||
5825 |
lemma DEF_CARD_EQ: "CARD_EQ = |
|
19093 | 5826 |
(%(u::'q_37712::type => bool) ua::'q_37713::type => bool. |
17644 | 5827 |
CARD_LE u ua & CARD_LE ua u)" |
5828 |
by (import hollight DEF_CARD_EQ) |
|
5829 |
||
5830 |
constdefs |
|
19093 | 5831 |
CARD_GT :: "('q_37727 => bool) => ('q_37728 => bool) => bool" |
17644 | 5832 |
"CARD_GT == |
19093 | 5833 |
%(u::'q_37727::type => bool) ua::'q_37728::type => bool. |
17644 | 5834 |
CARD_GE u ua & ~ CARD_GE ua u" |
5835 |
||
5836 |
lemma DEF_CARD_GT: "CARD_GT = |
|
19093 | 5837 |
(%(u::'q_37727::type => bool) ua::'q_37728::type => bool. |
17644 | 5838 |
CARD_GE u ua & ~ CARD_GE ua u)" |
5839 |
by (import hollight DEF_CARD_GT) |
|
5840 |
||
5841 |
constdefs |
|
19093 | 5842 |
CARD_LT :: "('q_37743 => bool) => ('q_37744 => bool) => bool" |
17644 | 5843 |
"CARD_LT == |
19093 | 5844 |
%(u::'q_37743::type => bool) ua::'q_37744::type => bool. |
17644 | 5845 |
CARD_LE u ua & ~ CARD_LE ua u" |
5846 |
||
5847 |
lemma DEF_CARD_LT: "CARD_LT = |
|
19093 | 5848 |
(%(u::'q_37743::type => bool) ua::'q_37744::type => bool. |
17644 | 5849 |
CARD_LE u ua & ~ CARD_LE ua u)" |
5850 |
by (import hollight DEF_CARD_LT) |
|
5851 |
||
5852 |
constdefs |
|
19093 | 5853 |
COUNTABLE :: "('q_37757 => bool) => bool" |
5854 |
"(op ==::(('q_37757::type => bool) => bool) |
|
5855 |
=> (('q_37757::type => bool) => bool) => prop) |
|
5856 |
(COUNTABLE::('q_37757::type => bool) => bool) |
|
5857 |
((CARD_GE::(nat => bool) => ('q_37757::type => bool) => bool) |
|
17644 | 5858 |
(hollight.UNIV::nat => bool))" |
5859 |
||
19093 | 5860 |
lemma DEF_COUNTABLE: "(op =::(('q_37757::type => bool) => bool) |
5861 |
=> (('q_37757::type => bool) => bool) => bool) |
|
5862 |
(COUNTABLE::('q_37757::type => bool) => bool) |
|
5863 |
((CARD_GE::(nat => bool) => ('q_37757::type => bool) => bool) |
|
17644 | 5864 |
(hollight.UNIV::nat => bool))" |
5865 |
by (import hollight DEF_COUNTABLE) |
|
5866 |
||
5867 |
lemma NOT_IN_EMPTY: "ALL x::'A::type. ~ IN x EMPTY" |
|
5868 |
by (import hollight NOT_IN_EMPTY) |
|
5869 |
||
5870 |
lemma IN_UNIV: "ALL x::'A::type. IN x hollight.UNIV" |
|
5871 |
by (import hollight IN_UNIV) |
|
5872 |
||
5873 |
lemma IN_UNION: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type. |
|
5874 |
IN xb (hollight.UNION x xa) = (IN xb x | IN xb xa)" |
|
5875 |
by (import hollight IN_UNION) |
|
5876 |
||
5877 |
lemma IN_UNIONS: "ALL (x::('A::type => bool) => bool) xa::'A::type. |
|
5878 |
IN xa (UNIONS x) = (EX t::'A::type => bool. IN t x & IN xa t)" |
|
5879 |
by (import hollight IN_UNIONS) |
|
5880 |
||
5881 |
lemma IN_INTER: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type. |
|
5882 |
IN xb (hollight.INTER x xa) = (IN xb x & IN xb xa)" |
|
5883 |
by (import hollight IN_INTER) |
|
5884 |
||
5885 |
lemma IN_INTERS: "ALL (x::('A::type => bool) => bool) xa::'A::type. |
|
5886 |
IN xa (INTERS x) = (ALL t::'A::type => bool. IN t x --> IN xa t)" |
|
5887 |
by (import hollight IN_INTERS) |
|
5888 |
||
5889 |
lemma IN_DIFF: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type. |
|
5890 |
IN xb (DIFF x xa) = (IN xb x & ~ IN xb xa)" |
|
5891 |
by (import hollight IN_DIFF) |
|
5892 |
||
5893 |
lemma IN_INSERT: "ALL (x::'A::type) (xa::'A::type) xb::'A::type => bool. |
|
5894 |
IN x (INSERT xa xb) = (x = xa | IN x xb)" |
|
5895 |
by (import hollight IN_INSERT) |
|
5896 |
||
5897 |
lemma IN_DELETE: "ALL (x::'A::type => bool) (xa::'A::type) xb::'A::type. |
|
5898 |
IN xa (DELETE x xb) = (IN xa x & xa ~= xb)" |
|
5899 |
by (import hollight IN_DELETE) |
|
5900 |
||
5901 |
lemma IN_SING: "ALL (x::'A::type) xa::'A::type. IN x (INSERT xa EMPTY) = (x = xa)" |
|
5902 |
by (import hollight IN_SING) |
|
5903 |
||
5904 |
lemma IN_IMAGE: "ALL (x::'B::type) (xa::'A::type => bool) xb::'A::type => 'B::type. |
|
5905 |
IN x (IMAGE xb xa) = (EX xc::'A::type. x = xb xc & IN xc xa)" |
|
5906 |
by (import hollight IN_IMAGE) |
|
5907 |
||
5908 |
lemma IN_REST: "ALL (x::'A::type) xa::'A::type => bool. |
|
5909 |
IN x (REST xa) = (IN x xa & x ~= CHOICE xa)" |
|
5910 |
by (import hollight IN_REST) |
|
5911 |
||
5912 |
lemma CHOICE_DEF: "ALL x::'A::type => bool. x ~= EMPTY --> IN (CHOICE x) x" |
|
5913 |
by (import hollight CHOICE_DEF) |
|
5914 |
||
5915 |
lemma NOT_EQUAL_SETS: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
5916 |
(x ~= xa) = (EX xb::'A::type. IN xb xa = (~ IN xb x))" |
|
5917 |
by (import hollight NOT_EQUAL_SETS) |
|
5918 |
||
5919 |
lemma MEMBER_NOT_EMPTY: "ALL x::'A::type => bool. (EX xa::'A::type. IN xa x) = (x ~= EMPTY)" |
|
5920 |
by (import hollight MEMBER_NOT_EMPTY) |
|
5921 |
||
5922 |
lemma UNIV_NOT_EMPTY: "(Not::bool => bool) |
|
5923 |
((op =::('A::type => bool) => ('A::type => bool) => bool) |
|
5924 |
(hollight.UNIV::'A::type => bool) (EMPTY::'A::type => bool))" |
|
5925 |
by (import hollight UNIV_NOT_EMPTY) |
|
5926 |
||
5927 |
lemma EMPTY_NOT_UNIV: "(Not::bool => bool) |
|
5928 |
((op =::('A::type => bool) => ('A::type => bool) => bool) |
|
5929 |
(EMPTY::'A::type => bool) (hollight.UNIV::'A::type => bool))" |
|
5930 |
by (import hollight EMPTY_NOT_UNIV) |
|
5931 |
||
5932 |
lemma EQ_UNIV: "(ALL x::'A::type. IN x (s::'A::type => bool)) = (s = hollight.UNIV)" |
|
5933 |
by (import hollight EQ_UNIV) |
|
5934 |
||
5935 |
lemma SUBSET_TRANS: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
5936 |
SUBSET x xa & SUBSET xa xb --> SUBSET x xb" |
|
5937 |
by (import hollight SUBSET_TRANS) |
|
5938 |
||
5939 |
lemma SUBSET_REFL: "ALL x::'A::type => bool. SUBSET x x" |
|
5940 |
by (import hollight SUBSET_REFL) |
|
5941 |
||
5942 |
lemma SUBSET_ANTISYM: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
5943 |
SUBSET x xa & SUBSET xa x --> x = xa" |
|
5944 |
by (import hollight SUBSET_ANTISYM) |
|
5945 |
||
5946 |
lemma EMPTY_SUBSET: "(All::(('A::type => bool) => bool) => bool) |
|
5947 |
((SUBSET::('A::type => bool) => ('A::type => bool) => bool) |
|
5948 |
(EMPTY::'A::type => bool))" |
|
5949 |
by (import hollight EMPTY_SUBSET) |
|
5950 |
||
5951 |
lemma SUBSET_EMPTY: "ALL x::'A::type => bool. SUBSET x EMPTY = (x = EMPTY)" |
|
5952 |
by (import hollight SUBSET_EMPTY) |
|
5953 |
||
5954 |
lemma SUBSET_UNIV: "ALL x::'A::type => bool. SUBSET x hollight.UNIV" |
|
5955 |
by (import hollight SUBSET_UNIV) |
|
5956 |
||
5957 |
lemma UNIV_SUBSET: "ALL x::'A::type => bool. SUBSET hollight.UNIV x = (x = hollight.UNIV)" |
|
5958 |
by (import hollight UNIV_SUBSET) |
|
5959 |
||
5960 |
lemma PSUBSET_TRANS: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
5961 |
PSUBSET x xa & PSUBSET xa xb --> PSUBSET x xb" |
|
5962 |
by (import hollight PSUBSET_TRANS) |
|
5963 |
||
5964 |
lemma PSUBSET_SUBSET_TRANS: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
5965 |
PSUBSET x xa & SUBSET xa xb --> PSUBSET x xb" |
|
5966 |
by (import hollight PSUBSET_SUBSET_TRANS) |
|
5967 |
||
5968 |
lemma SUBSET_PSUBSET_TRANS: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
5969 |
SUBSET x xa & PSUBSET xa xb --> PSUBSET x xb" |
|
5970 |
by (import hollight SUBSET_PSUBSET_TRANS) |
|
5971 |
||
5972 |
lemma PSUBSET_IRREFL: "ALL x::'A::type => bool. ~ PSUBSET x x" |
|
5973 |
by (import hollight PSUBSET_IRREFL) |
|
5974 |
||
5975 |
lemma NOT_PSUBSET_EMPTY: "ALL x::'A::type => bool. ~ PSUBSET x EMPTY" |
|
5976 |
by (import hollight NOT_PSUBSET_EMPTY) |
|
5977 |
||
5978 |
lemma NOT_UNIV_PSUBSET: "ALL x::'A::type => bool. ~ PSUBSET hollight.UNIV x" |
|
5979 |
by (import hollight NOT_UNIV_PSUBSET) |
|
5980 |
||
5981 |
lemma PSUBSET_UNIV: "ALL x::'A::type => bool. |
|
5982 |
PSUBSET x hollight.UNIV = (EX xa::'A::type. ~ IN xa x)" |
|
5983 |
by (import hollight PSUBSET_UNIV) |
|
5984 |
||
5985 |
lemma UNION_ASSOC: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
5986 |
hollight.UNION (hollight.UNION x xa) xb = |
|
5987 |
hollight.UNION x (hollight.UNION xa xb)" |
|
5988 |
by (import hollight UNION_ASSOC) |
|
5989 |
||
5990 |
lemma UNION_IDEMPOT: "ALL x::'A::type => bool. hollight.UNION x x = x" |
|
5991 |
by (import hollight UNION_IDEMPOT) |
|
5992 |
||
5993 |
lemma UNION_COMM: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
5994 |
hollight.UNION x xa = hollight.UNION xa x" |
|
5995 |
by (import hollight UNION_COMM) |
|
5996 |
||
5997 |
lemma SUBSET_UNION: "(ALL (x::'A::type => bool) xa::'A::type => bool. |
|
5998 |
SUBSET x (hollight.UNION x xa)) & |
|
5999 |
(ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6000 |
SUBSET x (hollight.UNION xa x))" |
|
6001 |
by (import hollight SUBSET_UNION) |
|
6002 |
||
6003 |
lemma SUBSET_UNION_ABSORPTION: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6004 |
SUBSET x xa = (hollight.UNION x xa = xa)" |
|
6005 |
by (import hollight SUBSET_UNION_ABSORPTION) |
|
6006 |
||
6007 |
lemma UNION_EMPTY: "(ALL x::'A::type => bool. hollight.UNION EMPTY x = x) & |
|
6008 |
(ALL x::'A::type => bool. hollight.UNION x EMPTY = x)" |
|
6009 |
by (import hollight UNION_EMPTY) |
|
6010 |
||
6011 |
lemma UNION_UNIV: "(ALL x::'A::type => bool. hollight.UNION hollight.UNIV x = hollight.UNIV) & |
|
6012 |
(ALL x::'A::type => bool. hollight.UNION x hollight.UNIV = hollight.UNIV)" |
|
6013 |
by (import hollight UNION_UNIV) |
|
6014 |
||
6015 |
lemma EMPTY_UNION: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6016 |
(hollight.UNION x xa = EMPTY) = (x = EMPTY & xa = EMPTY)" |
|
6017 |
by (import hollight EMPTY_UNION) |
|
6018 |
||
19093 | 6019 |
lemma UNION_SUBSET: "ALL (x::'q_38594::type => bool) (xa::'q_38594::type => bool) |
6020 |
xb::'q_38594::type => bool. |
|
17644 | 6021 |
SUBSET (hollight.UNION x xa) xb = (SUBSET x xb & SUBSET xa xb)" |
6022 |
by (import hollight UNION_SUBSET) |
|
6023 |
||
6024 |
lemma INTER_ASSOC: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
6025 |
hollight.INTER (hollight.INTER x xa) xb = |
|
6026 |
hollight.INTER x (hollight.INTER xa xb)" |
|
6027 |
by (import hollight INTER_ASSOC) |
|
6028 |
||
6029 |
lemma INTER_IDEMPOT: "ALL x::'A::type => bool. hollight.INTER x x = x" |
|
6030 |
by (import hollight INTER_IDEMPOT) |
|
6031 |
||
6032 |
lemma INTER_COMM: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6033 |
hollight.INTER x xa = hollight.INTER xa x" |
|
6034 |
by (import hollight INTER_COMM) |
|
6035 |
||
6036 |
lemma INTER_SUBSET: "(ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6037 |
SUBSET (hollight.INTER x xa) x) & |
|
6038 |
(ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6039 |
SUBSET (hollight.INTER xa x) x)" |
|
6040 |
by (import hollight INTER_SUBSET) |
|
6041 |
||
6042 |
lemma SUBSET_INTER_ABSORPTION: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6043 |
SUBSET x xa = (hollight.INTER x xa = x)" |
|
6044 |
by (import hollight SUBSET_INTER_ABSORPTION) |
|
6045 |
||
6046 |
lemma INTER_EMPTY: "(ALL x::'A::type => bool. hollight.INTER EMPTY x = EMPTY) & |
|
6047 |
(ALL x::'A::type => bool. hollight.INTER x EMPTY = EMPTY)" |
|
6048 |
by (import hollight INTER_EMPTY) |
|
6049 |
||
6050 |
lemma INTER_UNIV: "(ALL x::'A::type => bool. hollight.INTER hollight.UNIV x = x) & |
|
6051 |
(ALL x::'A::type => bool. hollight.INTER x hollight.UNIV = x)" |
|
6052 |
by (import hollight INTER_UNIV) |
|
6053 |
||
6054 |
lemma UNION_OVER_INTER: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
6055 |
hollight.INTER x (hollight.UNION xa xb) = |
|
6056 |
hollight.UNION (hollight.INTER x xa) (hollight.INTER x xb)" |
|
6057 |
by (import hollight UNION_OVER_INTER) |
|
6058 |
||
6059 |
lemma INTER_OVER_UNION: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
6060 |
hollight.UNION x (hollight.INTER xa xb) = |
|
6061 |
hollight.INTER (hollight.UNION x xa) (hollight.UNION x xb)" |
|
6062 |
by (import hollight INTER_OVER_UNION) |
|
6063 |
||
6064 |
lemma IN_DISJOINT: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6065 |
DISJOINT x xa = (~ (EX xb::'A::type. IN xb x & IN xb xa))" |
|
6066 |
by (import hollight IN_DISJOINT) |
|
6067 |
||
6068 |
lemma DISJOINT_SYM: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6069 |
DISJOINT x xa = DISJOINT xa x" |
|
6070 |
by (import hollight DISJOINT_SYM) |
|
6071 |
||
6072 |
lemma DISJOINT_EMPTY: "ALL x::'A::type => bool. DISJOINT EMPTY x & DISJOINT x EMPTY" |
|
6073 |
by (import hollight DISJOINT_EMPTY) |
|
6074 |
||
6075 |
lemma DISJOINT_EMPTY_REFL: "ALL x::'A::type => bool. (x = EMPTY) = DISJOINT x x" |
|
6076 |
by (import hollight DISJOINT_EMPTY_REFL) |
|
6077 |
||
6078 |
lemma DISJOINT_UNION: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type => bool. |
|
6079 |
DISJOINT (hollight.UNION x xa) xb = (DISJOINT x xb & DISJOINT xa xb)" |
|
6080 |
by (import hollight DISJOINT_UNION) |
|
6081 |
||
6082 |
lemma DIFF_EMPTY: "ALL x::'A::type => bool. DIFF x EMPTY = x" |
|
6083 |
by (import hollight DIFF_EMPTY) |
|
6084 |
||
6085 |
lemma EMPTY_DIFF: "ALL x::'A::type => bool. DIFF EMPTY x = EMPTY" |
|
6086 |
by (import hollight EMPTY_DIFF) |
|
6087 |
||
6088 |
lemma DIFF_UNIV: "ALL x::'A::type => bool. DIFF x hollight.UNIV = EMPTY" |
|
6089 |
by (import hollight DIFF_UNIV) |
|
6090 |
||
6091 |
lemma DIFF_DIFF: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6092 |
DIFF (DIFF x xa) xa = DIFF x xa" |
|
6093 |
by (import hollight DIFF_DIFF) |
|
6094 |
||
6095 |
lemma DIFF_EQ_EMPTY: "ALL x::'A::type => bool. DIFF x x = EMPTY" |
|
6096 |
by (import hollight DIFF_EQ_EMPTY) |
|
6097 |
||
19093 | 6098 |
lemma SUBSET_DIFF: "ALL (x::'q_39012::type => bool) xa::'q_39012::type => bool. |
17644 | 6099 |
SUBSET (DIFF x xa) x" |
6100 |
by (import hollight SUBSET_DIFF) |
|
6101 |
||
6102 |
lemma COMPONENT: "ALL (x::'A::type) s::'A::type => bool. IN x (INSERT x s)" |
|
6103 |
by (import hollight COMPONENT) |
|
6104 |
||
6105 |
lemma DECOMPOSITION: "ALL (s::'A::type => bool) x::'A::type. |
|
6106 |
IN x s = (EX t::'A::type => bool. s = INSERT x t & ~ IN x t)" |
|
6107 |
by (import hollight DECOMPOSITION) |
|
6108 |
||
6109 |
lemma SET_CASES: "ALL s::'A::type => bool. |
|
6110 |
s = EMPTY | |
|
6111 |
(EX (x::'A::type) t::'A::type => bool. s = INSERT x t & ~ IN x t)" |
|
6112 |
by (import hollight SET_CASES) |
|
6113 |
||
6114 |
lemma ABSORPTION: "ALL (x::'A::type) xa::'A::type => bool. IN x xa = (INSERT x xa = xa)" |
|
6115 |
by (import hollight ABSORPTION) |
|
6116 |
||
6117 |
lemma INSERT_INSERT: "ALL (x::'A::type) xa::'A::type => bool. INSERT x (INSERT x xa) = INSERT x xa" |
|
6118 |
by (import hollight INSERT_INSERT) |
|
6119 |
||
6120 |
lemma INSERT_COMM: "ALL (x::'A::type) (xa::'A::type) xb::'A::type => bool. |
|
6121 |
INSERT x (INSERT xa xb) = INSERT xa (INSERT x xb)" |
|
6122 |
by (import hollight INSERT_COMM) |
|
6123 |
||
6124 |
lemma INSERT_UNIV: "ALL x::'A::type. INSERT x hollight.UNIV = hollight.UNIV" |
|
6125 |
by (import hollight INSERT_UNIV) |
|
6126 |
||
6127 |
lemma NOT_INSERT_EMPTY: "ALL (x::'A::type) xa::'A::type => bool. INSERT x xa ~= EMPTY" |
|
6128 |
by (import hollight NOT_INSERT_EMPTY) |
|
6129 |
||
6130 |
lemma NOT_EMPTY_INSERT: "ALL (x::'A::type) xa::'A::type => bool. EMPTY ~= INSERT x xa" |
|
6131 |
by (import hollight NOT_EMPTY_INSERT) |
|
6132 |
||
6133 |
lemma INSERT_UNION: "ALL (x::'A::type) (s::'A::type => bool) t::'A::type => bool. |
|
6134 |
hollight.UNION (INSERT x s) t = |
|
6135 |
COND (IN x t) (hollight.UNION s t) (INSERT x (hollight.UNION s t))" |
|
6136 |
by (import hollight INSERT_UNION) |
|
6137 |
||
6138 |
lemma INSERT_UNION_EQ: "ALL (x::'A::type) (xa::'A::type => bool) xb::'A::type => bool. |
|
6139 |
hollight.UNION (INSERT x xa) xb = INSERT x (hollight.UNION xa xb)" |
|
6140 |
by (import hollight INSERT_UNION_EQ) |
|
6141 |
||
6142 |
lemma INSERT_INTER: "ALL (x::'A::type) (s::'A::type => bool) t::'A::type => bool. |
|
6143 |
hollight.INTER (INSERT x s) t = |
|
6144 |
COND (IN x t) (INSERT x (hollight.INTER s t)) (hollight.INTER s t)" |
|
6145 |
by (import hollight INSERT_INTER) |
|
6146 |
||
6147 |
lemma DISJOINT_INSERT: "ALL (x::'A::type) (xa::'A::type => bool) xb::'A::type => bool. |
|
6148 |
DISJOINT (INSERT x xa) xb = (DISJOINT xa xb & ~ IN x xb)" |
|
6149 |
by (import hollight DISJOINT_INSERT) |
|
6150 |
||
6151 |
lemma INSERT_SUBSET: "ALL (x::'A::type) (xa::'A::type => bool) xb::'A::type => bool. |
|
6152 |
SUBSET (INSERT x xa) xb = (IN x xb & SUBSET xa xb)" |
|
6153 |
by (import hollight INSERT_SUBSET) |
|
6154 |
||
6155 |
lemma SUBSET_INSERT: "ALL (x::'A::type) xa::'A::type => bool. |
|
6156 |
~ IN x xa --> |
|
6157 |
(ALL xb::'A::type => bool. SUBSET xa (INSERT x xb) = SUBSET xa xb)" |
|
6158 |
by (import hollight SUBSET_INSERT) |
|
6159 |
||
6160 |
lemma INSERT_DIFF: "ALL (s::'A::type => bool) (t::'A::type => bool) x::'A::type. |
|
6161 |
DIFF (INSERT x s) t = COND (IN x t) (DIFF s t) (INSERT x (DIFF s t))" |
|
6162 |
by (import hollight INSERT_DIFF) |
|
6163 |
||
19093 | 6164 |
lemma INSERT_AC: "INSERT (x::'q_39468::type) |
6165 |
(INSERT (y::'q_39468::type) (s::'q_39468::type => bool)) = |
|
17644 | 6166 |
INSERT y (INSERT x s) & |
6167 |
INSERT x (INSERT x s) = INSERT x s" |
|
6168 |
by (import hollight INSERT_AC) |
|
6169 |
||
19093 | 6170 |
lemma INTER_ACI: "hollight.INTER (p::'q_39535::type => bool) (q::'q_39535::type => bool) = |
17644 | 6171 |
hollight.INTER q p & |
19093 | 6172 |
hollight.INTER (hollight.INTER p q) (r::'q_39535::type => bool) = |
17644 | 6173 |
hollight.INTER p (hollight.INTER q r) & |
6174 |
hollight.INTER p (hollight.INTER q r) = |
|
6175 |
hollight.INTER q (hollight.INTER p r) & |
|
6176 |
hollight.INTER p p = p & |
|
6177 |
hollight.INTER p (hollight.INTER p q) = hollight.INTER p q" |
|
6178 |
by (import hollight INTER_ACI) |
|
6179 |
||
19093 | 6180 |
lemma UNION_ACI: "hollight.UNION (p::'q_39601::type => bool) (q::'q_39601::type => bool) = |
17644 | 6181 |
hollight.UNION q p & |
19093 | 6182 |
hollight.UNION (hollight.UNION p q) (r::'q_39601::type => bool) = |
17644 | 6183 |
hollight.UNION p (hollight.UNION q r) & |
6184 |
hollight.UNION p (hollight.UNION q r) = |
|
6185 |
hollight.UNION q (hollight.UNION p r) & |
|
6186 |
hollight.UNION p p = p & |
|
6187 |
hollight.UNION p (hollight.UNION p q) = hollight.UNION p q" |
|
6188 |
by (import hollight UNION_ACI) |
|
6189 |
||
6190 |
lemma DELETE_NON_ELEMENT: "ALL (x::'A::type) xa::'A::type => bool. (~ IN x xa) = (DELETE xa x = xa)" |
|
6191 |
by (import hollight DELETE_NON_ELEMENT) |
|
6192 |
||
6193 |
lemma IN_DELETE_EQ: "ALL (s::'A::type => bool) (x::'A::type) x'::'A::type. |
|
6194 |
(IN x s = IN x' s) = (IN x (DELETE s x') = IN x' (DELETE s x))" |
|
6195 |
by (import hollight IN_DELETE_EQ) |
|
6196 |
||
6197 |
lemma EMPTY_DELETE: "ALL x::'A::type. DELETE EMPTY x = EMPTY" |
|
6198 |
by (import hollight EMPTY_DELETE) |
|
6199 |
||
6200 |
lemma DELETE_DELETE: "ALL (x::'A::type) xa::'A::type => bool. DELETE (DELETE xa x) x = DELETE xa x" |
|
6201 |
by (import hollight DELETE_DELETE) |
|
6202 |
||
6203 |
lemma DELETE_COMM: "ALL (x::'A::type) (xa::'A::type) xb::'A::type => bool. |
|
6204 |
DELETE (DELETE xb x) xa = DELETE (DELETE xb xa) x" |
|
6205 |
by (import hollight DELETE_COMM) |
|
6206 |
||
6207 |
lemma DELETE_SUBSET: "ALL (x::'A::type) xa::'A::type => bool. SUBSET (DELETE xa x) xa" |
|
6208 |
by (import hollight DELETE_SUBSET) |
|
6209 |
||
6210 |
lemma SUBSET_DELETE: "ALL (x::'A::type) (xa::'A::type => bool) xb::'A::type => bool. |
|
6211 |
SUBSET xa (DELETE xb x) = (~ IN x xa & SUBSET xa xb)" |
|
6212 |
by (import hollight SUBSET_DELETE) |
|
6213 |
||
6214 |
lemma SUBSET_INSERT_DELETE: "ALL (x::'A::type) (xa::'A::type => bool) xb::'A::type => bool. |
|
6215 |
SUBSET xa (INSERT x xb) = SUBSET (DELETE xa x) xb" |
|
6216 |
by (import hollight SUBSET_INSERT_DELETE) |
|
6217 |
||
6218 |
lemma DIFF_INSERT: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type. |
|
6219 |
DIFF x (INSERT xb xa) = DIFF (DELETE x xb) xa" |
|
6220 |
by (import hollight DIFF_INSERT) |
|
6221 |
||
6222 |
lemma PSUBSET_INSERT_SUBSET: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6223 |
PSUBSET x xa = (EX xb::'A::type. ~ IN xb x & SUBSET (INSERT xb x) xa)" |
|
6224 |
by (import hollight PSUBSET_INSERT_SUBSET) |
|
6225 |
||
6226 |
lemma PSUBSET_MEMBER: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6227 |
PSUBSET x xa = (SUBSET x xa & (EX y::'A::type. IN y xa & ~ IN y x))" |
|
6228 |
by (import hollight PSUBSET_MEMBER) |
|
6229 |
||
6230 |
lemma DELETE_INSERT: "ALL (x::'A::type) (y::'A::type) s::'A::type => bool. |
|
6231 |
DELETE (INSERT x s) y = COND (x = y) (DELETE s y) (INSERT x (DELETE s y))" |
|
6232 |
by (import hollight DELETE_INSERT) |
|
6233 |
||
6234 |
lemma INSERT_DELETE: "ALL (x::'A::type) xa::'A::type => bool. |
|
6235 |
IN x xa --> INSERT x (DELETE xa x) = xa" |
|
6236 |
by (import hollight INSERT_DELETE) |
|
6237 |
||
6238 |
lemma DELETE_INTER: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type. |
|
6239 |
hollight.INTER (DELETE x xb) xa = DELETE (hollight.INTER x xa) xb" |
|
6240 |
by (import hollight DELETE_INTER) |
|
6241 |
||
6242 |
lemma DISJOINT_DELETE_SYM: "ALL (x::'A::type => bool) (xa::'A::type => bool) xb::'A::type. |
|
6243 |
DISJOINT (DELETE x xb) xa = DISJOINT (DELETE xa xb) x" |
|
6244 |
by (import hollight DISJOINT_DELETE_SYM) |
|
6245 |
||
19093 | 6246 |
lemma UNIONS_0: "(op =::('q_40008::type => bool) => ('q_40008::type => bool) => bool) |
6247 |
((UNIONS::(('q_40008::type => bool) => bool) => 'q_40008::type => bool) |
|
6248 |
(EMPTY::('q_40008::type => bool) => bool)) |
|
6249 |
(EMPTY::'q_40008::type => bool)" |
|
17644 | 6250 |
by (import hollight UNIONS_0) |
6251 |
||
19093 | 6252 |
lemma UNIONS_1: "UNIONS (INSERT (s::'q_40014::type => bool) EMPTY) = s" |
17644 | 6253 |
by (import hollight UNIONS_1) |
6254 |
||
6255 |
lemma UNIONS_2: "UNIONS |
|
19093 | 6256 |
(INSERT (s::'q_40034::type => bool) |
6257 |
(INSERT (t::'q_40034::type => bool) EMPTY)) = |
|
17644 | 6258 |
hollight.UNION s t" |
6259 |
by (import hollight UNIONS_2) |
|
6260 |
||
6261 |
lemma UNIONS_INSERT: "UNIONS |
|
19093 | 6262 |
(INSERT (s::'q_40048::type => bool) |
6263 |
(u::('q_40048::type => bool) => bool)) = |
|
17644 | 6264 |
hollight.UNION s (UNIONS u)" |
6265 |
by (import hollight UNIONS_INSERT) |
|
6266 |
||
19093 | 6267 |
lemma FORALL_IN_UNIONS: "ALL (x::'q_40090::type => bool) xa::('q_40090::type => bool) => bool. |
6268 |
(ALL xb::'q_40090::type. IN xb (UNIONS xa) --> x xb) = |
|
6269 |
(ALL (t::'q_40090::type => bool) xb::'q_40090::type. |
|
17644 | 6270 |
IN t xa & IN xb t --> x xb)" |
6271 |
by (import hollight FORALL_IN_UNIONS) |
|
6272 |
||
19093 | 6273 |
lemma EMPTY_UNIONS: "ALL x::('q_40116::type => bool) => bool. |
17644 | 6274 |
(UNIONS x = EMPTY) = |
19093 | 6275 |
(ALL xa::'q_40116::type => bool. IN xa x --> xa = EMPTY)" |
17644 | 6276 |
by (import hollight EMPTY_UNIONS) |
6277 |
||
19093 | 6278 |
lemma INTERS_0: "(op =::('q_40124::type => bool) => ('q_40124::type => bool) => bool) |
6279 |
((INTERS::(('q_40124::type => bool) => bool) => 'q_40124::type => bool) |
|
6280 |
(EMPTY::('q_40124::type => bool) => bool)) |
|
6281 |
(hollight.UNIV::'q_40124::type => bool)" |
|
6282 |
by (import hollight INTERS_0) |
|
6283 |
||
6284 |
lemma INTERS_1: "INTERS (INSERT (s::'q_40130::type => bool) EMPTY) = s" |
|
6285 |
by (import hollight INTERS_1) |
|
6286 |
||
6287 |
lemma INTERS_2: "INTERS |
|
6288 |
(INSERT (s::'q_40150::type => bool) |
|
6289 |
(INSERT (t::'q_40150::type => bool) EMPTY)) = |
|
6290 |
hollight.INTER s t" |
|
6291 |
by (import hollight INTERS_2) |
|
6292 |
||
6293 |
lemma INTERS_INSERT: "INTERS |
|
6294 |
(INSERT (s::'q_40164::type => bool) |
|
6295 |
(u::('q_40164::type => bool) => bool)) = |
|
6296 |
hollight.INTER s (INTERS u)" |
|
6297 |
by (import hollight INTERS_INSERT) |
|
6298 |
||
6299 |
lemma IMAGE_CLAUSES: "IMAGE (f::'q_40190::type => 'q_40194::type) EMPTY = EMPTY & |
|
6300 |
IMAGE f (INSERT (x::'q_40190::type) (s::'q_40190::type => bool)) = |
|
17644 | 6301 |
INSERT (f x) (IMAGE f s)" |
6302 |
by (import hollight IMAGE_CLAUSES) |
|
6303 |
||
19093 | 6304 |
lemma IMAGE_UNION: "ALL (x::'q_40217::type => 'q_40228::type) (xa::'q_40217::type => bool) |
6305 |
xb::'q_40217::type => bool. |
|
17644 | 6306 |
IMAGE x (hollight.UNION xa xb) = hollight.UNION (IMAGE x xa) (IMAGE x xb)" |
6307 |
by (import hollight IMAGE_UNION) |
|
6308 |
||
19093 | 6309 |
lemma IMAGE_o: "ALL (x::'q_40261::type => 'q_40257::type) |
6310 |
(xa::'q_40252::type => 'q_40261::type) xb::'q_40252::type => bool. |
|
17644 | 6311 |
IMAGE (x o xa) xb = IMAGE x (IMAGE xa xb)" |
6312 |
by (import hollight IMAGE_o) |
|
6313 |
||
19093 | 6314 |
lemma IMAGE_SUBSET: "ALL (x::'q_40279::type => 'q_40290::type) (xa::'q_40279::type => bool) |
6315 |
xb::'q_40279::type => bool. |
|
17644 | 6316 |
SUBSET xa xb --> SUBSET (IMAGE x xa) (IMAGE x xb)" |
6317 |
by (import hollight IMAGE_SUBSET) |
|
6318 |
||
19093 | 6319 |
lemma IMAGE_DIFF_INJ: "(ALL (x::'q_40321::type) y::'q_40321::type. |
6320 |
(f::'q_40321::type => 'q_40332::type) x = f y --> x = y) --> |
|
6321 |
IMAGE f (DIFF (s::'q_40321::type => bool) (t::'q_40321::type => bool)) = |
|
17644 | 6322 |
DIFF (IMAGE f s) (IMAGE f t)" |
6323 |
by (import hollight IMAGE_DIFF_INJ) |
|
6324 |
||
19093 | 6325 |
lemma IMAGE_DELETE_INJ: "(ALL x::'q_40367::type. |
6326 |
(f::'q_40367::type => 'q_40366::type) x = f (a::'q_40367::type) --> |
|
17644 | 6327 |
x = a) --> |
19093 | 6328 |
IMAGE f (DELETE (s::'q_40367::type => bool) a) = DELETE (IMAGE f s) (f a)" |
17644 | 6329 |
by (import hollight IMAGE_DELETE_INJ) |
6330 |
||
19093 | 6331 |
lemma IMAGE_EQ_EMPTY: "ALL (x::'q_40390::type => 'q_40386::type) xa::'q_40390::type => bool. |
17644 | 6332 |
(IMAGE x xa = EMPTY) = (xa = EMPTY)" |
6333 |
by (import hollight IMAGE_EQ_EMPTY) |
|
6334 |
||
19093 | 6335 |
lemma FORALL_IN_IMAGE: "ALL (x::'q_40426::type => 'q_40425::type) xa::'q_40426::type => bool. |
6336 |
(ALL xb::'q_40425::type. |
|
6337 |
IN xb (IMAGE x xa) --> (P::'q_40425::type => bool) xb) = |
|
6338 |
(ALL xb::'q_40426::type. IN xb xa --> P (x xb))" |
|
17644 | 6339 |
by (import hollight FORALL_IN_IMAGE) |
6340 |
||
19093 | 6341 |
lemma EXISTS_IN_IMAGE: "ALL (x::'q_40462::type => 'q_40461::type) xa::'q_40462::type => bool. |
6342 |
(EX xb::'q_40461::type. |
|
6343 |
IN xb (IMAGE x xa) & (P::'q_40461::type => bool) xb) = |
|
6344 |
(EX xb::'q_40462::type. IN xb xa & P (x xb))" |
|
17644 | 6345 |
by (import hollight EXISTS_IN_IMAGE) |
6346 |
||
6347 |
lemma SUBSET_IMAGE: "ALL (f::'A::type => 'B::type) (s::'B::type => bool) t::'A::type => bool. |
|
6348 |
SUBSET s (IMAGE f t) = |
|
6349 |
(EX x::'A::type => bool. SUBSET x t & s = IMAGE f x)" |
|
6350 |
by (import hollight SUBSET_IMAGE) |
|
6351 |
||
19093 | 6352 |
lemma IMAGE_CONST: "ALL (s::'q_40548::type => bool) c::'q_40553::type. |
6353 |
IMAGE (%x::'q_40548::type. c) s = COND (s = EMPTY) EMPTY (INSERT c EMPTY)" |
|
17644 | 6354 |
by (import hollight IMAGE_CONST) |
6355 |
||
19093 | 6356 |
lemma SIMPLE_IMAGE: "ALL (x::'q_40581::type => 'q_40585::type) xa::'q_40581::type => bool. |
17644 | 6357 |
GSPEC |
19093 | 6358 |
(%u::'q_40585::type. |
6359 |
EX xb::'q_40581::type. SETSPEC u (IN xb xa) (x xb)) = |
|
17644 | 6360 |
IMAGE x xa" |
6361 |
by (import hollight SIMPLE_IMAGE) |
|
6362 |
||
19093 | 6363 |
lemma EMPTY_GSPEC: "GSPEC (%u::'q_40602::type. Ex (SETSPEC u False)) = EMPTY" |
17644 | 6364 |
by (import hollight EMPTY_GSPEC) |
6365 |
||
19093 | 6366 |
lemma IN_ELIM_PAIR_THM: "ALL (x::'q_40648::type => 'q_40647::type => bool) (xa::'q_40648::type) |
6367 |
xb::'q_40647::type. |
|
6368 |
IN (xa, xb) |
|
6369 |
(GSPEC |
|
6370 |
(%xa::'q_40648::type * 'q_40647::type. |
|
6371 |
EX (xb::'q_40648::type) y::'q_40647::type. |
|
6372 |
SETSPEC xa (x xb y) (xb, y))) = |
|
6373 |
x xa xb" |
|
6374 |
by (import hollight IN_ELIM_PAIR_THM) |
|
6375 |
||
17644 | 6376 |
lemma FINITE_INDUCT_STRONG: "ALL P::('A::type => bool) => bool. |
6377 |
P EMPTY & |
|
6378 |
(ALL (x::'A::type) s::'A::type => bool. |
|
6379 |
P s & ~ IN x s & FINITE s --> P (INSERT x s)) --> |
|
6380 |
(ALL s::'A::type => bool. FINITE s --> P s)" |
|
6381 |
by (import hollight FINITE_INDUCT_STRONG) |
|
6382 |
||
6383 |
lemma FINITE_SUBSET: "ALL (x::'A::type => bool) t::'A::type => bool. |
|
6384 |
FINITE t & SUBSET x t --> FINITE x" |
|
6385 |
by (import hollight FINITE_SUBSET) |
|
6386 |
||
6387 |
lemma FINITE_UNION_IMP: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6388 |
FINITE x & FINITE xa --> FINITE (hollight.UNION x xa)" |
|
6389 |
by (import hollight FINITE_UNION_IMP) |
|
6390 |
||
6391 |
lemma FINITE_UNION: "ALL (s::'A::type => bool) t::'A::type => bool. |
|
6392 |
FINITE (hollight.UNION s t) = (FINITE s & FINITE t)" |
|
6393 |
by (import hollight FINITE_UNION) |
|
6394 |
||
6395 |
lemma FINITE_INTER: "ALL (s::'A::type => bool) t::'A::type => bool. |
|
6396 |
FINITE s | FINITE t --> FINITE (hollight.INTER s t)" |
|
6397 |
by (import hollight FINITE_INTER) |
|
6398 |
||
6399 |
lemma FINITE_INSERT: "ALL (s::'A::type => bool) x::'A::type. FINITE (INSERT x s) = FINITE s" |
|
6400 |
by (import hollight FINITE_INSERT) |
|
6401 |
||
6402 |
lemma FINITE_DELETE_IMP: "ALL (s::'A::type => bool) x::'A::type. FINITE s --> FINITE (DELETE s x)" |
|
6403 |
by (import hollight FINITE_DELETE_IMP) |
|
6404 |
||
6405 |
lemma FINITE_DELETE: "ALL (s::'A::type => bool) x::'A::type. FINITE (DELETE s x) = FINITE s" |
|
6406 |
by (import hollight FINITE_DELETE) |
|
6407 |
||
19093 | 6408 |
lemma FINITE_UNIONS: "ALL s::('q_40983::type => bool) => bool. |
17644 | 6409 |
FINITE s --> |
19093 | 6410 |
FINITE (UNIONS s) = (ALL t::'q_40983::type => bool. IN t s --> FINITE t)" |
17644 | 6411 |
by (import hollight FINITE_UNIONS) |
6412 |
||
6413 |
lemma FINITE_IMAGE_EXPAND: "ALL (f::'A::type => 'B::type) s::'A::type => bool. |
|
6414 |
FINITE s --> |
|
6415 |
FINITE |
|
6416 |
(GSPEC |
|
6417 |
(%u::'B::type. |
|
6418 |
EX y::'B::type. SETSPEC u (EX x::'A::type. IN x s & y = f x) y))" |
|
6419 |
by (import hollight FINITE_IMAGE_EXPAND) |
|
6420 |
||
6421 |
lemma FINITE_IMAGE: "ALL (x::'A::type => 'B::type) xa::'A::type => bool. |
|
6422 |
FINITE xa --> FINITE (IMAGE x xa)" |
|
6423 |
by (import hollight FINITE_IMAGE) |
|
6424 |
||
6425 |
lemma FINITE_IMAGE_INJ_GENERAL: "ALL (f::'A::type => 'B::type) (x::'B::type => bool) s::'A::type => bool. |
|
6426 |
(ALL (x::'A::type) y::'A::type. IN x s & IN y s & f x = f y --> x = y) & |
|
6427 |
FINITE x --> |
|
6428 |
FINITE |
|
6429 |
(GSPEC |
|
6430 |
(%u::'A::type. EX xa::'A::type. SETSPEC u (IN xa s & IN (f xa) x) xa))" |
|
6431 |
by (import hollight FINITE_IMAGE_INJ_GENERAL) |
|
6432 |
||
6433 |
lemma FINITE_IMAGE_INJ: "ALL (f::'A::type => 'B::type) A::'B::type => bool. |
|
6434 |
(ALL (x::'A::type) y::'A::type. f x = f y --> x = y) & FINITE A --> |
|
6435 |
FINITE (GSPEC (%u::'A::type. EX x::'A::type. SETSPEC u (IN (f x) A) x))" |
|
6436 |
by (import hollight FINITE_IMAGE_INJ) |
|
6437 |
||
6438 |
lemma INFINITE_IMAGE_INJ: "ALL f::'A::type => 'B::type. |
|
6439 |
(ALL (x::'A::type) y::'A::type. f x = f y --> x = y) --> |
|
6440 |
(ALL s::'A::type => bool. INFINITE s --> INFINITE (IMAGE f s))" |
|
6441 |
by (import hollight INFINITE_IMAGE_INJ) |
|
6442 |
||
19093 | 6443 |
lemma INFINITE_NONEMPTY: "ALL s::'q_41466::type => bool. INFINITE s --> s ~= EMPTY" |
17644 | 6444 |
by (import hollight INFINITE_NONEMPTY) |
6445 |
||
6446 |
lemma INFINITE_DIFF_FINITE: "ALL (s::'A::type => bool) t::'A::type => bool. |
|
6447 |
INFINITE s & FINITE t --> INFINITE (DIFF s t)" |
|
6448 |
by (import hollight INFINITE_DIFF_FINITE) |
|
6449 |
||
6450 |
lemma FINITE_SUBSET_IMAGE: "ALL (f::'A::type => 'B::type) (s::'A::type => bool) t::'B::type => bool. |
|
6451 |
(FINITE t & SUBSET t (IMAGE f s)) = |
|
6452 |
(EX x::'A::type => bool. FINITE x & SUBSET x s & t = IMAGE f x)" |
|
6453 |
by (import hollight FINITE_SUBSET_IMAGE) |
|
6454 |
||
6455 |
lemma FINITE_SUBSET_IMAGE_IMP: "ALL (f::'A::type => 'B::type) (s::'A::type => bool) t::'B::type => bool. |
|
6456 |
FINITE t & SUBSET t (IMAGE f s) --> |
|
6457 |
(EX s'::'A::type => bool. |
|
6458 |
FINITE s' & SUBSET s' s & SUBSET t (IMAGE f s'))" |
|
6459 |
by (import hollight FINITE_SUBSET_IMAGE_IMP) |
|
6460 |
||
6461 |
lemma FINITE_SUBSETS: "ALL s::'A::type => bool. |
|
6462 |
FINITE s --> |
|
6463 |
FINITE |
|
6464 |
(GSPEC |
|
6465 |
(%u::'A::type => bool. |
|
6466 |
EX t::'A::type => bool. SETSPEC u (SUBSET t s) t))" |
|
6467 |
by (import hollight FINITE_SUBSETS) |
|
6468 |
||
19093 | 6469 |
lemma FINITE_DIFF: "ALL (s::'q_41764::type => bool) t::'q_41764::type => bool. |
17644 | 6470 |
FINITE s --> FINITE (DIFF s t)" |
6471 |
by (import hollight FINITE_DIFF) |
|
6472 |
||
6473 |
constdefs |
|
19093 | 6474 |
FINREC :: "('q_41824 => 'q_41823 => 'q_41823) |
6475 |
=> 'q_41823 => ('q_41824 => bool) => 'q_41823 => nat => bool" |
|
17644 | 6476 |
"FINREC == |
19093 | 6477 |
SOME FINREC::('q_41824::type => 'q_41823::type => 'q_41823::type) |
6478 |
=> 'q_41823::type |
|
6479 |
=> ('q_41824::type => bool) |
|
6480 |
=> 'q_41823::type => nat => bool. |
|
6481 |
(ALL (f::'q_41824::type => 'q_41823::type => 'q_41823::type) |
|
6482 |
(s::'q_41824::type => bool) (a::'q_41823::type) b::'q_41823::type. |
|
17652 | 6483 |
FINREC f b s a 0 = (s = EMPTY & a = b)) & |
19093 | 6484 |
(ALL (b::'q_41823::type) (s::'q_41824::type => bool) (n::nat) |
6485 |
(a::'q_41823::type) |
|
6486 |
f::'q_41824::type => 'q_41823::type => 'q_41823::type. |
|
17644 | 6487 |
FINREC f b s a (Suc n) = |
19093 | 6488 |
(EX (x::'q_41824::type) c::'q_41823::type. |
17644 | 6489 |
IN x s & FINREC f b (DELETE s x) c n & a = f x c))" |
6490 |
||
6491 |
lemma DEF_FINREC: "FINREC = |
|
19093 | 6492 |
(SOME FINREC::('q_41824::type => 'q_41823::type => 'q_41823::type) |
6493 |
=> 'q_41823::type |
|
6494 |
=> ('q_41824::type => bool) |
|
6495 |
=> 'q_41823::type => nat => bool. |
|
6496 |
(ALL (f::'q_41824::type => 'q_41823::type => 'q_41823::type) |
|
6497 |
(s::'q_41824::type => bool) (a::'q_41823::type) b::'q_41823::type. |
|
17652 | 6498 |
FINREC f b s a 0 = (s = EMPTY & a = b)) & |
19093 | 6499 |
(ALL (b::'q_41823::type) (s::'q_41824::type => bool) (n::nat) |
6500 |
(a::'q_41823::type) |
|
6501 |
f::'q_41824::type => 'q_41823::type => 'q_41823::type. |
|
17644 | 6502 |
FINREC f b s a (Suc n) = |
19093 | 6503 |
(EX (x::'q_41824::type) c::'q_41823::type. |
17644 | 6504 |
IN x s & FINREC f b (DELETE s x) c n & a = f x c)))" |
6505 |
by (import hollight DEF_FINREC) |
|
6506 |
||
19093 | 6507 |
lemma FINREC_1_LEMMA: "ALL (x::'q_41869::type => 'q_41868::type => 'q_41868::type) |
6508 |
(xa::'q_41868::type) (xb::'q_41869::type => bool) xc::'q_41868::type. |
|
17652 | 6509 |
FINREC x xa xb xc (Suc 0) = |
19093 | 6510 |
(EX xd::'q_41869::type. xb = INSERT xd EMPTY & xc = x xd xa)" |
17644 | 6511 |
by (import hollight FINREC_1_LEMMA) |
6512 |
||
6513 |
lemma FINREC_SUC_LEMMA: "ALL (f::'A::type => 'B::type => 'B::type) b::'B::type. |
|
6514 |
(ALL (x::'A::type) (y::'A::type) s::'B::type. |
|
6515 |
x ~= y --> f x (f y s) = f y (f x s)) --> |
|
6516 |
(ALL (n::nat) (s::'A::type => bool) z::'B::type. |
|
6517 |
FINREC f b s z (Suc n) --> |
|
6518 |
(ALL x::'A::type. |
|
6519 |
IN x s --> |
|
6520 |
(EX w::'B::type. FINREC f b (DELETE s x) w n & z = f x w)))" |
|
6521 |
by (import hollight FINREC_SUC_LEMMA) |
|
6522 |
||
6523 |
lemma FINREC_UNIQUE_LEMMA: "ALL (f::'A::type => 'B::type => 'B::type) b::'B::type. |
|
6524 |
(ALL (x::'A::type) (y::'A::type) s::'B::type. |
|
6525 |
x ~= y --> f x (f y s) = f y (f x s)) --> |
|
6526 |
(ALL (n1::nat) (n2::nat) (s::'A::type => bool) (a1::'B::type) |
|
6527 |
a2::'B::type. |
|
6528 |
FINREC f b s a1 n1 & FINREC f b s a2 n2 --> a1 = a2 & n1 = n2)" |
|
6529 |
by (import hollight FINREC_UNIQUE_LEMMA) |
|
6530 |
||
6531 |
lemma FINREC_EXISTS_LEMMA: "ALL (f::'A::type => 'B::type => 'B::type) (b::'B::type) s::'A::type => bool. |
|
6532 |
FINITE s --> (EX a::'B::type. Ex (FINREC f b s a))" |
|
6533 |
by (import hollight FINREC_EXISTS_LEMMA) |
|
6534 |
||
6535 |
lemma FINREC_FUN_LEMMA: "ALL (P::'A::type => bool) R::'A::type => 'B::type => 'C::type => bool. |
|
6536 |
(ALL s::'A::type. P s --> (EX a::'B::type. Ex (R s a))) & |
|
6537 |
(ALL (n1::'C::type) (n2::'C::type) (s::'A::type) (a1::'B::type) |
|
6538 |
a2::'B::type. R s a1 n1 & R s a2 n2 --> a1 = a2 & n1 = n2) --> |
|
6539 |
(EX x::'A::type => 'B::type. |
|
6540 |
ALL (s::'A::type) a::'B::type. P s --> Ex (R s a) = (x s = a))" |
|
6541 |
by (import hollight FINREC_FUN_LEMMA) |
|
6542 |
||
6543 |
lemma FINREC_FUN: "ALL (f::'A::type => 'B::type => 'B::type) b::'B::type. |
|
6544 |
(ALL (x::'A::type) (y::'A::type) s::'B::type. |
|
6545 |
x ~= y --> f x (f y s) = f y (f x s)) --> |
|
6546 |
(EX g::('A::type => bool) => 'B::type. |
|
6547 |
g EMPTY = b & |
|
6548 |
(ALL (s::'A::type => bool) x::'A::type. |
|
6549 |
FINITE s & IN x s --> g s = f x (g (DELETE s x))))" |
|
6550 |
by (import hollight FINREC_FUN) |
|
6551 |
||
6552 |
lemma SET_RECURSION_LEMMA: "ALL (f::'A::type => 'B::type => 'B::type) b::'B::type. |
|
6553 |
(ALL (x::'A::type) (y::'A::type) s::'B::type. |
|
6554 |
x ~= y --> f x (f y s) = f y (f x s)) --> |
|
6555 |
(EX g::('A::type => bool) => 'B::type. |
|
6556 |
g EMPTY = b & |
|
6557 |
(ALL (x::'A::type) s::'A::type => bool. |
|
6558 |
FINITE s --> g (INSERT x s) = COND (IN x s) (g s) (f x (g s))))" |
|
6559 |
by (import hollight SET_RECURSION_LEMMA) |
|
6560 |
||
6561 |
constdefs |
|
19093 | 6562 |
ITSET :: "('q_42525 => 'q_42524 => 'q_42524) |
6563 |
=> ('q_42525 => bool) => 'q_42524 => 'q_42524" |
|
17644 | 6564 |
"ITSET == |
19093 | 6565 |
%(u::'q_42525::type => 'q_42524::type => 'q_42524::type) |
6566 |
(ua::'q_42525::type => bool) ub::'q_42524::type. |
|
6567 |
(SOME g::('q_42525::type => bool) => 'q_42524::type. |
|
17644 | 6568 |
g EMPTY = ub & |
19093 | 6569 |
(ALL (x::'q_42525::type) s::'q_42525::type => bool. |
17644 | 6570 |
FINITE s --> g (INSERT x s) = COND (IN x s) (g s) (u x (g s)))) |
6571 |
ua" |
|
6572 |
||
6573 |
lemma DEF_ITSET: "ITSET = |
|
19093 | 6574 |
(%(u::'q_42525::type => 'q_42524::type => 'q_42524::type) |
6575 |
(ua::'q_42525::type => bool) ub::'q_42524::type. |
|
6576 |
(SOME g::('q_42525::type => bool) => 'q_42524::type. |
|
17644 | 6577 |
g EMPTY = ub & |
19093 | 6578 |
(ALL (x::'q_42525::type) s::'q_42525::type => bool. |
17644 | 6579 |
FINITE s --> g (INSERT x s) = COND (IN x s) (g s) (u x (g s)))) |
6580 |
ua)" |
|
6581 |
by (import hollight DEF_ITSET) |
|
6582 |
||
6583 |
lemma FINITE_RECURSION: "ALL (f::'A::type => 'B::type => 'B::type) b::'B::type. |
|
6584 |
(ALL (x::'A::type) (y::'A::type) s::'B::type. |
|
6585 |
x ~= y --> f x (f y s) = f y (f x s)) --> |
|
6586 |
ITSET f EMPTY b = b & |
|
6587 |
(ALL (x::'A::type) xa::'A::type => bool. |
|
6588 |
FINITE xa --> |
|
6589 |
ITSET f (INSERT x xa) b = |
|
6590 |
COND (IN x xa) (ITSET f xa b) (f x (ITSET f xa b)))" |
|
6591 |
by (import hollight FINITE_RECURSION) |
|
6592 |
||
6593 |
lemma FINITE_RECURSION_DELETE: "ALL (f::'A::type => 'B::type => 'B::type) b::'B::type. |
|
6594 |
(ALL (x::'A::type) (y::'A::type) s::'B::type. |
|
6595 |
x ~= y --> f x (f y s) = f y (f x s)) --> |
|
6596 |
ITSET f EMPTY b = b & |
|
6597 |
(ALL (x::'A::type) s::'A::type => bool. |
|
6598 |
FINITE s --> |
|
6599 |
ITSET f s b = |
|
6600 |
COND (IN x s) (f x (ITSET f (DELETE s x) b)) |
|
6601 |
(ITSET f (DELETE s x) b))" |
|
6602 |
by (import hollight FINITE_RECURSION_DELETE) |
|
6603 |
||
19093 | 6604 |
lemma ITSET_EQ: "ALL (x::'q_42830::type => bool) |
6605 |
(xa::'q_42830::type => 'q_42831::type => 'q_42831::type) |
|
6606 |
(xb::'q_42830::type => 'q_42831::type => 'q_42831::type) |
|
6607 |
xc::'q_42831::type. |
|
17644 | 6608 |
FINITE x & |
19093 | 6609 |
(ALL xc::'q_42830::type. IN xc x --> xa xc = xb xc) & |
6610 |
(ALL (x::'q_42830::type) (y::'q_42830::type) s::'q_42831::type. |
|
17644 | 6611 |
x ~= y --> xa x (xa y s) = xa y (xa x s)) & |
19093 | 6612 |
(ALL (x::'q_42830::type) (y::'q_42830::type) s::'q_42831::type. |
17644 | 6613 |
x ~= y --> xb x (xb y s) = xb y (xb x s)) --> |
6614 |
ITSET xa x xc = ITSET xb x xc" |
|
6615 |
by (import hollight ITSET_EQ) |
|
6616 |
||
19093 | 6617 |
lemma SUBSET_RESTRICT: "ALL (x::'q_42864::type => bool) xa::'q_42864::type => bool. |
17644 | 6618 |
SUBSET |
6619 |
(GSPEC |
|
19093 | 6620 |
(%u::'q_42864::type. |
6621 |
EX xb::'q_42864::type. SETSPEC u (IN xb x & xa xb) xb)) |
|
17644 | 6622 |
x" |
6623 |
by (import hollight SUBSET_RESTRICT) |
|
6624 |
||
19093 | 6625 |
lemma FINITE_RESTRICT: "ALL (s::'A::type => bool) p::'q_42882::type. |
17644 | 6626 |
FINITE s --> |
6627 |
FINITE |
|
6628 |
(GSPEC |
|
6629 |
(%u::'A::type. |
|
6630 |
EX x::'A::type. SETSPEC u (IN x s & (P::'A::type => bool) x) x))" |
|
6631 |
by (import hollight FINITE_RESTRICT) |
|
6632 |
||
6633 |
constdefs |
|
19093 | 6634 |
CARD :: "('q_42918 => bool) => nat" |
6635 |
"CARD == %u::'q_42918::type => bool. ITSET (%x::'q_42918::type. Suc) u 0" |
|
6636 |
||
6637 |
lemma DEF_CARD: "CARD = (%u::'q_42918::type => bool. ITSET (%x::'q_42918::type. Suc) u 0)" |
|
17644 | 6638 |
by (import hollight DEF_CARD) |
6639 |
||
6640 |
lemma CARD_CLAUSES: "(op &::bool => bool => bool) |
|
6641 |
((op =::nat => nat => bool) |
|
6642 |
((CARD::('A::type => bool) => nat) (EMPTY::'A::type => bool)) (0::nat)) |
|
6643 |
((All::('A::type => bool) => bool) |
|
6644 |
(%x::'A::type. |
|
6645 |
(All::(('A::type => bool) => bool) => bool) |
|
6646 |
(%s::'A::type => bool. |
|
6647 |
(op -->::bool => bool => bool) |
|
6648 |
((FINITE::('A::type => bool) => bool) s) |
|
6649 |
((op =::nat => nat => bool) |
|
6650 |
((CARD::('A::type => bool) => nat) |
|
6651 |
((INSERT::'A::type |
|
6652 |
=> ('A::type => bool) => 'A::type => bool) |
|
6653 |
x s)) |
|
6654 |
((COND::bool => nat => nat => nat) |
|
6655 |
((IN::'A::type => ('A::type => bool) => bool) x s) |
|
6656 |
((CARD::('A::type => bool) => nat) s) |
|
6657 |
((Suc::nat => nat) |
|
6658 |
((CARD::('A::type => bool) => nat) s)))))))" |
|
6659 |
by (import hollight CARD_CLAUSES) |
|
6660 |
||
6661 |
lemma CARD_UNION: "ALL (x::'A::type => bool) xa::'A::type => bool. |
|
6662 |
FINITE x & FINITE xa & hollight.INTER x xa = EMPTY --> |
|
6663 |
CARD (hollight.UNION x xa) = CARD x + CARD xa" |
|
6664 |
by (import hollight CARD_UNION) |
|
6665 |
||
6666 |
lemma CARD_DELETE: "ALL (x::'A::type) s::'A::type => bool. |
|
6667 |
FINITE s --> |
|
17652 | 6668 |
CARD (DELETE s x) = COND (IN x s) (CARD s - NUMERAL_BIT1 0) (CARD s)" |
17644 | 6669 |
by (import hollight CARD_DELETE) |
6670 |
||
19093 | 6671 |
lemma CARD_UNION_EQ: "ALL (s::'q_43163::type => bool) (t::'q_43163::type => bool) |
6672 |
u::'q_43163::type => bool. |
|
17644 | 6673 |
FINITE u & hollight.INTER s t = EMPTY & hollight.UNION s t = u --> |
6674 |
CARD s + CARD t = CARD u" |
|
6675 |
by (import hollight CARD_UNION_EQ) |
|
6676 |
||
6677 |
constdefs |
|
19093 | 6678 |
HAS_SIZE :: "('q_43199 => bool) => nat => bool" |
6679 |
"HAS_SIZE == %(u::'q_43199::type => bool) ua::nat. FINITE u & CARD u = ua" |
|
6680 |
||
6681 |
lemma DEF_HAS_SIZE: "HAS_SIZE = (%(u::'q_43199::type => bool) ua::nat. FINITE u & CARD u = ua)" |
|
17644 | 6682 |
by (import hollight DEF_HAS_SIZE) |
6683 |
||
19093 | 6684 |
lemma HAS_SIZE_CARD: "ALL (x::'q_43218::type => bool) xa::nat. HAS_SIZE x xa --> CARD x = xa" |
17644 | 6685 |
by (import hollight HAS_SIZE_CARD) |
6686 |
||
19093 | 6687 |
lemma HAS_SIZE_0: "ALL (s::'A::type => bool) n::'q_43234::type. HAS_SIZE s 0 = (s = EMPTY)" |
17644 | 6688 |
by (import hollight HAS_SIZE_0) |
6689 |
||
6690 |
lemma HAS_SIZE_SUC: "ALL (s::'A::type => bool) n::nat. |
|
6691 |
HAS_SIZE s (Suc n) = |
|
6692 |
(s ~= EMPTY & (ALL x::'A::type. IN x s --> HAS_SIZE (DELETE s x) n))" |
|
6693 |
by (import hollight HAS_SIZE_SUC) |
|
6694 |
||
19093 | 6695 |
lemma HAS_SIZE_UNION: "ALL (x::'q_43356::type => bool) (xa::'q_43356::type => bool) (xb::nat) |
17644 | 6696 |
xc::nat. |
6697 |
HAS_SIZE x xb & HAS_SIZE xa xc & DISJOINT x xa --> |
|
6698 |
HAS_SIZE (hollight.UNION x xa) (xb + xc)" |
|
6699 |
by (import hollight HAS_SIZE_UNION) |
|
6700 |
||
6701 |
lemma HAS_SIZE_UNIONS: "ALL (x::'A::type => bool) (xa::'A::type => 'B::type => bool) (xb::nat) |
|
6702 |
xc::nat. |
|
6703 |
HAS_SIZE x xb & |
|
6704 |
(ALL xb::'A::type. IN xb x --> HAS_SIZE (xa xb) xc) & |
|
6705 |
(ALL (xb::'A::type) y::'A::type. |
|
6706 |
IN xb x & IN y x & xb ~= y --> DISJOINT (xa xb) (xa y)) --> |
|
6707 |
HAS_SIZE |
|
6708 |
(UNIONS |
|
6709 |
(GSPEC |
|
6710 |
(%u::'B::type => bool. |
|
6711 |
EX xb::'A::type. SETSPEC u (IN xb x) (xa xb)))) |
|
6712 |
(xb * xc)" |
|
6713 |
by (import hollight HAS_SIZE_UNIONS) |
|
6714 |
||
19093 | 6715 |
lemma HAS_SIZE_CLAUSES: "HAS_SIZE (s::'q_43604::type => bool) 0 = (s = EMPTY) & |
17644 | 6716 |
HAS_SIZE s (Suc (n::nat)) = |
19093 | 6717 |
(EX (a::'q_43604::type) t::'q_43604::type => bool. |
17644 | 6718 |
HAS_SIZE t n & ~ IN a t & s = INSERT a t)" |
6719 |
by (import hollight HAS_SIZE_CLAUSES) |
|
6720 |
||
6721 |
lemma CARD_SUBSET_EQ: "ALL (a::'A::type => bool) b::'A::type => bool. |
|
6722 |
FINITE b & SUBSET a b & CARD a = CARD b --> a = b" |
|
6723 |
by (import hollight CARD_SUBSET_EQ) |
|
6724 |
||
6725 |
lemma CARD_SUBSET: "ALL (a::'A::type => bool) b::'A::type => bool. |
|
6726 |
SUBSET a b & FINITE b --> <= (CARD a) (CARD b)" |
|
6727 |
by (import hollight CARD_SUBSET) |
|
6728 |
||
6729 |
lemma CARD_SUBSET_LE: "ALL (a::'A::type => bool) b::'A::type => bool. |
|
6730 |
FINITE b & SUBSET a b & <= (CARD b) (CARD a) --> a = b" |
|
6731 |
by (import hollight CARD_SUBSET_LE) |
|
6732 |
||
19093 | 6733 |
lemma CARD_EQ_0: "ALL s::'q_43920::type => bool. FINITE s --> (CARD s = 0) = (s = EMPTY)" |
17644 | 6734 |
by (import hollight CARD_EQ_0) |
6735 |
||
6736 |
lemma CARD_PSUBSET: "ALL (a::'A::type => bool) b::'A::type => bool. |
|
6737 |
PSUBSET a b & FINITE b --> < (CARD a) (CARD b)" |
|
6738 |
by (import hollight CARD_PSUBSET) |
|
6739 |
||
6740 |
lemma CARD_UNION_LE: "ALL (s::'A::type => bool) t::'A::type => bool. |
|
6741 |
FINITE s & FINITE t --> <= (CARD (hollight.UNION s t)) (CARD s + CARD t)" |
|
6742 |
by (import hollight CARD_UNION_LE) |
|
6743 |
||
6744 |
lemma CARD_UNIONS_LE: "ALL (x::'A::type => bool) (xa::'A::type => 'B::type => bool) (xb::nat) |
|
6745 |
xc::nat. |
|
6746 |
HAS_SIZE x xb & |
|
6747 |
(ALL xb::'A::type. IN xb x --> FINITE (xa xb) & <= (CARD (xa xb)) xc) --> |
|
6748 |
<= (CARD |
|
6749 |
(UNIONS |
|
6750 |
(GSPEC |
|
6751 |
(%u::'B::type => bool. |
|
6752 |
EX xb::'A::type. SETSPEC u (IN xb x) (xa xb))))) |
|
6753 |
(xb * xc)" |
|
6754 |
by (import hollight CARD_UNIONS_LE) |
|
6755 |
||
6756 |
lemma CARD_IMAGE_INJ: "ALL (f::'A::type => 'B::type) x::'A::type => bool. |
|
6757 |
(ALL (xa::'A::type) y::'A::type. |
|
6758 |
IN xa x & IN y x & f xa = f y --> xa = y) & |
|
6759 |
FINITE x --> |
|
6760 |
CARD (IMAGE f x) = CARD x" |
|
6761 |
by (import hollight CARD_IMAGE_INJ) |
|
6762 |
||
6763 |
lemma HAS_SIZE_IMAGE_INJ: "ALL (x::'A::type => 'B::type) (xa::'A::type => bool) xb::nat. |
|
6764 |
(ALL (xb::'A::type) y::'A::type. |
|
6765 |
IN xb xa & IN y xa & x xb = x y --> xb = y) & |
|
6766 |
HAS_SIZE xa xb --> |
|
6767 |
HAS_SIZE (IMAGE x xa) xb" |
|
6768 |
by (import hollight HAS_SIZE_IMAGE_INJ) |
|
6769 |
||
6770 |
lemma CARD_IMAGE_LE: "ALL (f::'A::type => 'B::type) s::'A::type => bool. |
|
6771 |
FINITE s --> <= (CARD (IMAGE f s)) (CARD s)" |
|
6772 |
by (import hollight CARD_IMAGE_LE) |
|
6773 |
||
6774 |
lemma CHOOSE_SUBSET: "ALL s::'A::type => bool. |
|
6775 |
FINITE s --> |
|
6776 |
(ALL n::nat. |
|
6777 |
<= n (CARD s) --> |
|
6778 |
(EX t::'A::type => bool. SUBSET t s & HAS_SIZE t n))" |
|
6779 |
by (import hollight CHOOSE_SUBSET) |
|
6780 |
||
6781 |
lemma HAS_SIZE_PRODUCT_DEPENDENT: "ALL (x::'A::type => bool) (xa::nat) (xb::'A::type => 'B::type => bool) |
|
6782 |
xc::nat. |
|
6783 |
HAS_SIZE x xa & (ALL xa::'A::type. IN xa x --> HAS_SIZE (xb xa) xc) --> |
|
6784 |
HAS_SIZE |
|
6785 |
(GSPEC |
|
6786 |
(%u::'A::type * 'B::type. |
|
6787 |
EX (xa::'A::type) y::'B::type. |
|
6788 |
SETSPEC u (IN xa x & IN y (xb xa)) (xa, y))) |
|
6789 |
(xa * xc)" |
|
6790 |
by (import hollight HAS_SIZE_PRODUCT_DEPENDENT) |
|
6791 |
||
6792 |
lemma FINITE_PRODUCT_DEPENDENT: "ALL (x::'A::type => bool) xa::'A::type => 'B::type => bool. |
|
6793 |
FINITE x & (ALL xb::'A::type. IN xb x --> FINITE (xa xb)) --> |
|
6794 |
FINITE |
|
6795 |
(GSPEC |
|
6796 |
(%u::'A::type * 'B::type. |
|
6797 |
EX (xb::'A::type) y::'B::type. |
|
6798 |
SETSPEC u (IN xb x & IN y (xa xb)) (xb, y)))" |
|
6799 |
by (import hollight FINITE_PRODUCT_DEPENDENT) |
|
6800 |
||
6801 |
lemma FINITE_PRODUCT: "ALL (x::'A::type => bool) xa::'B::type => bool. |
|
6802 |
FINITE x & FINITE xa --> |
|
6803 |
FINITE |
|
6804 |
(GSPEC |
|
6805 |
(%u::'A::type * 'B::type. |
|
6806 |
EX (xb::'A::type) y::'B::type. |
|
6807 |
SETSPEC u (IN xb x & IN y xa) (xb, y)))" |
|
6808 |
by (import hollight FINITE_PRODUCT) |
|
6809 |
||
6810 |
lemma CARD_PRODUCT: "ALL (s::'A::type => bool) t::'B::type => bool. |
|
6811 |
FINITE s & FINITE t --> |
|
6812 |
CARD |
|
6813 |
(GSPEC |
|
6814 |
(%u::'A::type * 'B::type. |
|
6815 |
EX (x::'A::type) y::'B::type. |
|
6816 |
SETSPEC u (IN x s & IN y t) (x, y))) = |
|
6817 |
CARD s * CARD t" |
|
6818 |
by (import hollight CARD_PRODUCT) |
|
6819 |
||
6820 |
lemma HAS_SIZE_PRODUCT: "ALL (x::'A::type => bool) (xa::nat) (xb::'B::type => bool) xc::nat. |
|
6821 |
HAS_SIZE x xa & HAS_SIZE xb xc --> |
|
6822 |
HAS_SIZE |
|
6823 |
(GSPEC |
|
6824 |
(%u::'A::type * 'B::type. |
|
6825 |
EX (xa::'A::type) y::'B::type. |
|
6826 |
SETSPEC u (IN xa x & IN y xb) (xa, y))) |
|
6827 |
(xa * xc)" |
|
6828 |
by (import hollight HAS_SIZE_PRODUCT) |
|
6829 |
||
6830 |
lemma HAS_SIZE_FUNSPACE: "ALL (d::'B::type) (n::nat) (t::'B::type => bool) (m::nat) |
|
6831 |
s::'A::type => bool. |
|
6832 |
HAS_SIZE s m & HAS_SIZE t n --> |
|
6833 |
HAS_SIZE |
|
6834 |
(GSPEC |
|
6835 |
(%u::'A::type => 'B::type. |
|
6836 |
EX f::'A::type => 'B::type. |
|
6837 |
SETSPEC u |
|
6838 |
((ALL x::'A::type. IN x s --> IN (f x) t) & |
|
6839 |
(ALL x::'A::type. ~ IN x s --> f x = d)) |
|
6840 |
f)) |
|
6841 |
(EXP n m)" |
|
6842 |
by (import hollight HAS_SIZE_FUNSPACE) |
|
6843 |
||
19093 | 6844 |
lemma CARD_FUNSPACE: "ALL (s::'q_45275::type => bool) t::'q_45272::type => bool. |
17644 | 6845 |
FINITE s & FINITE t --> |
6846 |
CARD |
|
6847 |
(GSPEC |
|
19093 | 6848 |
(%u::'q_45275::type => 'q_45272::type. |
6849 |
EX f::'q_45275::type => 'q_45272::type. |
|
17644 | 6850 |
SETSPEC u |
19093 | 6851 |
((ALL x::'q_45275::type. IN x s --> IN (f x) t) & |
6852 |
(ALL x::'q_45275::type. |
|
6853 |
~ IN x s --> f x = (d::'q_45272::type))) |
|
17644 | 6854 |
f)) = |
6855 |
EXP (CARD t) (CARD s)" |
|
6856 |
by (import hollight CARD_FUNSPACE) |
|
6857 |
||
19093 | 6858 |
lemma FINITE_FUNSPACE: "ALL (s::'q_45341::type => bool) t::'q_45338::type => bool. |
17644 | 6859 |
FINITE s & FINITE t --> |
6860 |
FINITE |
|
6861 |
(GSPEC |
|
19093 | 6862 |
(%u::'q_45341::type => 'q_45338::type. |
6863 |
EX f::'q_45341::type => 'q_45338::type. |
|
17644 | 6864 |
SETSPEC u |
19093 | 6865 |
((ALL x::'q_45341::type. IN x s --> IN (f x) t) & |
6866 |
(ALL x::'q_45341::type. |
|
6867 |
~ IN x s --> f x = (d::'q_45338::type))) |
|
17644 | 6868 |
f))" |
6869 |
by (import hollight FINITE_FUNSPACE) |
|
6870 |
||
6871 |
lemma HAS_SIZE_POWERSET: "ALL (s::'A::type => bool) n::nat. |
|
6872 |
HAS_SIZE s n --> |
|
6873 |
HAS_SIZE |
|
6874 |
(GSPEC |
|
6875 |
(%u::'A::type => bool. |
|
6876 |
EX t::'A::type => bool. SETSPEC u (SUBSET t s) t)) |
|
17652 | 6877 |
(EXP (NUMERAL_BIT0 (NUMERAL_BIT1 0)) n)" |
17644 | 6878 |
by (import hollight HAS_SIZE_POWERSET) |
6879 |
||
6880 |
lemma CARD_POWERSET: "ALL s::'A::type => bool. |
|
6881 |
FINITE s --> |
|
6882 |
CARD |
|
6883 |
(GSPEC |
|
6884 |
(%u::'A::type => bool. |
|
6885 |
EX t::'A::type => bool. SETSPEC u (SUBSET t s) t)) = |
|
17652 | 6886 |
EXP (NUMERAL_BIT0 (NUMERAL_BIT1 0)) (CARD s)" |
17644 | 6887 |
by (import hollight CARD_POWERSET) |
6888 |
||
6889 |
lemma FINITE_POWERSET: "ALL s::'A::type => bool. |
|
6890 |
FINITE s --> |
|
6891 |
FINITE |
|
6892 |
(GSPEC |
|
6893 |
(%u::'A::type => bool. |
|
6894 |
EX t::'A::type => bool. SETSPEC u (SUBSET t s) t))" |
|
6895 |
by (import hollight FINITE_POWERSET) |
|
6896 |
||
6897 |
lemma CARD_GE_REFL: "ALL s::'A::type => bool. CARD_GE s s" |
|
6898 |
by (import hollight CARD_GE_REFL) |
|
6899 |
||
6900 |
lemma CARD_GE_TRANS: "ALL (s::'A::type => bool) (t::'B::type => bool) u::'C::type => bool. |
|
6901 |
CARD_GE s t & CARD_GE t u --> CARD_GE s u" |
|
6902 |
by (import hollight CARD_GE_TRANS) |
|
6903 |
||
6904 |
lemma FINITE_HAS_SIZE_LEMMA: "ALL s::'A::type => bool. |
|
6905 |
FINITE s --> |
|
6906 |
(EX n::nat. CARD_GE (GSPEC (%u::nat. EX x::nat. SETSPEC u (< x n) x)) s)" |
|
6907 |
by (import hollight FINITE_HAS_SIZE_LEMMA) |
|
6908 |
||
6909 |
lemma HAS_SIZE_NUMSEG_LT: "ALL n::nat. HAS_SIZE (GSPEC (%u::nat. EX m::nat. SETSPEC u (< m n) m)) n" |
|
6910 |
by (import hollight HAS_SIZE_NUMSEG_LT) |
|
6911 |
||
6912 |
lemma CARD_NUMSEG_LT: "ALL x::nat. CARD (GSPEC (%u::nat. EX m::nat. SETSPEC u (< m x) m)) = x" |
|
6913 |
by (import hollight CARD_NUMSEG_LT) |
|
6914 |
||
6915 |
lemma FINITE_NUMSEG_LT: "ALL x::nat. FINITE (GSPEC (%u::nat. EX m::nat. SETSPEC u (< m x) m))" |
|
6916 |
by (import hollight FINITE_NUMSEG_LT) |
|
6917 |
||
6918 |
lemma HAS_SIZE_NUMSEG_LE: "ALL x::nat. |
|
6919 |
HAS_SIZE (GSPEC (%xa::nat. EX xb::nat. SETSPEC xa (<= xb x) xb)) |
|
17652 | 6920 |
(x + NUMERAL_BIT1 0)" |
17644 | 6921 |
by (import hollight HAS_SIZE_NUMSEG_LE) |
6922 |
||
6923 |
lemma FINITE_NUMSEG_LE: "ALL x::nat. FINITE (GSPEC (%u::nat. EX m::nat. SETSPEC u (<= m x) m))" |
|
6924 |
by (import hollight FINITE_NUMSEG_LE) |
|
6925 |
||
6926 |
lemma CARD_NUMSEG_LE: "ALL x::nat. |
|
6927 |
CARD (GSPEC (%u::nat. EX m::nat. SETSPEC u (<= m x) m)) = |
|
17652 | 6928 |
x + NUMERAL_BIT1 0" |
17644 | 6929 |
by (import hollight CARD_NUMSEG_LE) |
6930 |
||
6931 |
lemma num_FINITE: "ALL s::nat => bool. FINITE s = (EX a::nat. ALL x::nat. IN x s --> <= x a)" |
|
6932 |
by (import hollight num_FINITE) |
|
6933 |
||
6934 |
lemma num_FINITE_AVOID: "ALL s::nat => bool. FINITE s --> (EX a::nat. ~ IN a s)" |
|
6935 |
by (import hollight num_FINITE_AVOID) |
|
6936 |
||
6937 |
lemma num_INFINITE: "(INFINITE::(nat => bool) => bool) (hollight.UNIV::nat => bool)" |
|
6938 |
by (import hollight num_INFINITE) |
|
6939 |
||
6940 |
lemma HAS_SIZE_INDEX: "ALL (x::'A::type => bool) n::nat. |
|
6941 |
HAS_SIZE x n --> |
|
6942 |
(EX f::nat => 'A::type. |
|
6943 |
(ALL m::nat. < m n --> IN (f m) x) & |
|
6944 |
(ALL xa::'A::type. IN xa x --> (EX! m::nat. < m n & f m = xa)))" |
|
6945 |
by (import hollight HAS_SIZE_INDEX) |
|
6946 |
||
6947 |
constdefs |
|
19093 | 6948 |
set_of_list :: "'q_45968 hollight.list => 'q_45968 => bool" |
17644 | 6949 |
"set_of_list == |
19093 | 6950 |
SOME set_of_list::'q_45968::type hollight.list => 'q_45968::type => bool. |
17644 | 6951 |
set_of_list NIL = EMPTY & |
19093 | 6952 |
(ALL (h::'q_45968::type) t::'q_45968::type hollight.list. |
17644 | 6953 |
set_of_list (CONS h t) = INSERT h (set_of_list t))" |
6954 |
||
6955 |
lemma DEF_set_of_list: "set_of_list = |
|
19093 | 6956 |
(SOME set_of_list::'q_45968::type hollight.list => 'q_45968::type => bool. |
17644 | 6957 |
set_of_list NIL = EMPTY & |
19093 | 6958 |
(ALL (h::'q_45968::type) t::'q_45968::type hollight.list. |
17644 | 6959 |
set_of_list (CONS h t) = INSERT h (set_of_list t)))" |
6960 |
by (import hollight DEF_set_of_list) |
|
6961 |
||
6962 |
constdefs |
|
19093 | 6963 |
list_of_set :: "('q_45986 => bool) => 'q_45986 hollight.list" |
17644 | 6964 |
"list_of_set == |
19093 | 6965 |
%u::'q_45986::type => bool. |
6966 |
SOME l::'q_45986::type hollight.list. |
|
17644 | 6967 |
set_of_list l = u & LENGTH l = CARD u" |
6968 |
||
6969 |
lemma DEF_list_of_set: "list_of_set = |
|
19093 | 6970 |
(%u::'q_45986::type => bool. |
6971 |
SOME l::'q_45986::type hollight.list. |
|
17644 | 6972 |
set_of_list l = u & LENGTH l = CARD u)" |
6973 |
by (import hollight DEF_list_of_set) |
|
6974 |
||
6975 |
lemma LIST_OF_SET_PROPERTIES: "ALL x::'A::type => bool. |
|
6976 |
FINITE x --> |
|
6977 |
set_of_list (list_of_set x) = x & LENGTH (list_of_set x) = CARD x" |
|
6978 |
by (import hollight LIST_OF_SET_PROPERTIES) |
|
6979 |
||
19093 | 6980 |
lemma SET_OF_LIST_OF_SET: "ALL s::'q_46035::type => bool. FINITE s --> set_of_list (list_of_set s) = s" |
17644 | 6981 |
by (import hollight SET_OF_LIST_OF_SET) |
6982 |
||
19093 | 6983 |
lemma LENGTH_LIST_OF_SET: "ALL s::'q_46051::type => bool. FINITE s --> LENGTH (list_of_set s) = CARD s" |
17644 | 6984 |
by (import hollight LENGTH_LIST_OF_SET) |
6985 |
||
6986 |
lemma MEM_LIST_OF_SET: "ALL s::'A::type => bool. |
|
6987 |
FINITE s --> (ALL x::'A::type. MEM x (list_of_set s) = IN x s)" |
|
6988 |
by (import hollight MEM_LIST_OF_SET) |
|
6989 |
||
19093 | 6990 |
lemma FINITE_SET_OF_LIST: "ALL l::'q_46096::type hollight.list. FINITE (set_of_list l)" |
17644 | 6991 |
by (import hollight FINITE_SET_OF_LIST) |
6992 |
||
19093 | 6993 |
lemma IN_SET_OF_LIST: "ALL (x::'q_46114::type) l::'q_46114::type hollight.list. |
17644 | 6994 |
IN x (set_of_list l) = MEM x l" |
6995 |
by (import hollight IN_SET_OF_LIST) |
|
6996 |
||
19093 | 6997 |
lemma SET_OF_LIST_APPEND: "ALL (x::'q_46139::type hollight.list) xa::'q_46139::type hollight.list. |
17644 | 6998 |
set_of_list (APPEND x xa) = |
6999 |
hollight.UNION (set_of_list x) (set_of_list xa)" |
|
7000 |
by (import hollight SET_OF_LIST_APPEND) |
|
7001 |
||
7002 |
constdefs |
|
19093 | 7003 |
pairwise :: "('q_46198 => 'q_46198 => bool) => ('q_46198 => bool) => bool" |
17644 | 7004 |
"pairwise == |
19093 | 7005 |
%(u::'q_46198::type => 'q_46198::type => bool) ua::'q_46198::type => bool. |
7006 |
ALL (x::'q_46198::type) y::'q_46198::type. |
|
17644 | 7007 |
IN x ua & IN y ua & x ~= y --> u x y" |
7008 |
||
7009 |
lemma DEF_pairwise: "pairwise = |
|
19093 | 7010 |
(%(u::'q_46198::type => 'q_46198::type => bool) ua::'q_46198::type => bool. |
7011 |
ALL (x::'q_46198::type) y::'q_46198::type. |
|
17644 | 7012 |
IN x ua & IN y ua & x ~= y --> u x y)" |
7013 |
by (import hollight DEF_pairwise) |
|
7014 |
||
7015 |
constdefs |
|
19093 | 7016 |
PAIRWISE :: "('q_46220 => 'q_46220 => bool) => 'q_46220 hollight.list => bool" |
17644 | 7017 |
"PAIRWISE == |
19093 | 7018 |
SOME PAIRWISE::('q_46220::type => 'q_46220::type => bool) |
7019 |
=> 'q_46220::type hollight.list => bool. |
|
7020 |
(ALL r::'q_46220::type => 'q_46220::type => bool. |
|
17644 | 7021 |
PAIRWISE r NIL = True) & |
19093 | 7022 |
(ALL (h::'q_46220::type) (r::'q_46220::type => 'q_46220::type => bool) |
7023 |
t::'q_46220::type hollight.list. |
|
17644 | 7024 |
PAIRWISE r (CONS h t) = (ALL_list (r h) t & PAIRWISE r t))" |
7025 |
||
7026 |
lemma DEF_PAIRWISE: "PAIRWISE = |
|
19093 | 7027 |
(SOME PAIRWISE::('q_46220::type => 'q_46220::type => bool) |
7028 |
=> 'q_46220::type hollight.list => bool. |
|
7029 |
(ALL r::'q_46220::type => 'q_46220::type => bool. |
|
17644 | 7030 |
PAIRWISE r NIL = True) & |
19093 | 7031 |
(ALL (h::'q_46220::type) (r::'q_46220::type => 'q_46220::type => bool) |
7032 |
t::'q_46220::type hollight.list. |
|
17644 | 7033 |
PAIRWISE r (CONS h t) = (ALL_list (r h) t & PAIRWISE r t)))" |
7034 |
by (import hollight DEF_PAIRWISE) |
|
7035 |
||
7036 |
typedef (open) ('A) finite_image = "(Collect::('A::type => bool) => 'A::type set) |
|
7037 |
(%x::'A::type. |
|
7038 |
(op |::bool => bool => bool) |
|
7039 |
((op =::'A::type => 'A::type => bool) x |
|
7040 |
((Eps::('A::type => bool) => 'A::type) (%z::'A::type. True::bool))) |
|
7041 |
((FINITE::('A::type => bool) => bool) |
|
7042 |
(hollight.UNIV::'A::type => bool)))" morphisms "dest_finite_image" "mk_finite_image" |
|
7043 |
apply (rule light_ex_imp_nonempty[where t="(Eps::('A::type => bool) => 'A::type) |
|
7044 |
(%x::'A::type. |
|
7045 |
(op |::bool => bool => bool) |
|
7046 |
((op =::'A::type => 'A::type => bool) x |
|
7047 |
((Eps::('A::type => bool) => 'A::type) (%z::'A::type. True::bool))) |
|
7048 |
((FINITE::('A::type => bool) => bool) |
|
7049 |
(hollight.UNIV::'A::type => bool)))"]) |
|
7050 |
by (import hollight TYDEF_finite_image) |
|
7051 |
||
7052 |
syntax |
|
7053 |
dest_finite_image :: _ |
|
7054 |
||
7055 |
syntax |
|
7056 |
mk_finite_image :: _ |
|
7057 |
||
7058 |
lemmas "TYDEF_finite_image_@intern" = typedef_hol2hollight |
|
17652 | 7059 |
[where a="a :: 'A finite_image" and r=r , |
17644 | 7060 |
OF type_definition_finite_image] |
7061 |
||
7062 |
lemma FINITE_IMAGE_IMAGE: "(op =::('A::type finite_image => bool) |
|
7063 |
=> ('A::type finite_image => bool) => bool) |
|
7064 |
(hollight.UNIV::'A::type finite_image => bool) |
|
7065 |
((IMAGE::('A::type => 'A::type finite_image) |
|
7066 |
=> ('A::type => bool) => 'A::type finite_image => bool) |
|
7067 |
(mk_finite_image::'A::type => 'A::type finite_image) |
|
7068 |
((COND::bool |
|
7069 |
=> ('A::type => bool) => ('A::type => bool) => 'A::type => bool) |
|
7070 |
((FINITE::('A::type => bool) => bool) |
|
7071 |
(hollight.UNIV::'A::type => bool)) |
|
7072 |
(hollight.UNIV::'A::type => bool) |
|
7073 |
((INSERT::'A::type => ('A::type => bool) => 'A::type => bool) |
|
7074 |
((Eps::('A::type => bool) => 'A::type) (%z::'A::type. True::bool)) |
|
7075 |
(EMPTY::'A::type => bool))))" |
|
7076 |
by (import hollight FINITE_IMAGE_IMAGE) |
|
7077 |
||
7078 |
constdefs |
|
17652 | 7079 |
dimindex :: "('A => bool) => nat" |
17644 | 7080 |
"(op ==::(('A::type => bool) => nat) => (('A::type => bool) => nat) => prop) |
7081 |
(dimindex::('A::type => bool) => nat) |
|
7082 |
(%u::'A::type => bool. |
|
7083 |
(COND::bool => nat => nat => nat) |
|
7084 |
((FINITE::('A::type => bool) => bool) |
|
7085 |
(hollight.UNIV::'A::type => bool)) |
|
7086 |
((CARD::('A::type => bool) => nat) (hollight.UNIV::'A::type => bool)) |
|
7087 |
((NUMERAL_BIT1::nat => nat) (0::nat)))" |
|
7088 |
||
7089 |
lemma DEF_dimindex: "(op =::(('A::type => bool) => nat) => (('A::type => bool) => nat) => bool) |
|
7090 |
(dimindex::('A::type => bool) => nat) |
|
7091 |
(%u::'A::type => bool. |
|
7092 |
(COND::bool => nat => nat => nat) |
|
7093 |
((FINITE::('A::type => bool) => bool) |
|
7094 |
(hollight.UNIV::'A::type => bool)) |
|
7095 |
((CARD::('A::type => bool) => nat) (hollight.UNIV::'A::type => bool)) |
|
7096 |
((NUMERAL_BIT1::nat => nat) (0::nat)))" |
|
7097 |
by (import hollight DEF_dimindex) |
|
7098 |
||
7099 |
lemma HAS_SIZE_FINITE_IMAGE: "(All::(('A::type => bool) => bool) => bool) |
|
7100 |
(%s::'A::type => bool. |
|
7101 |
(HAS_SIZE::('A::type finite_image => bool) => nat => bool) |
|
7102 |
(hollight.UNIV::'A::type finite_image => bool) |
|
7103 |
((dimindex::('A::type => bool) => nat) s))" |
|
7104 |
by (import hollight HAS_SIZE_FINITE_IMAGE) |
|
7105 |
||
7106 |
lemma CARD_FINITE_IMAGE: "(All::(('A::type => bool) => bool) => bool) |
|
7107 |
(%s::'A::type => bool. |
|
7108 |
(op =::nat => nat => bool) |
|
7109 |
((CARD::('A::type finite_image => bool) => nat) |
|
7110 |
(hollight.UNIV::'A::type finite_image => bool)) |
|
7111 |
((dimindex::('A::type => bool) => nat) s))" |
|
7112 |
by (import hollight CARD_FINITE_IMAGE) |
|
7113 |
||
7114 |
lemma FINITE_FINITE_IMAGE: "(FINITE::('A::type finite_image => bool) => bool) |
|
7115 |
(hollight.UNIV::'A::type finite_image => bool)" |
|
7116 |
by (import hollight FINITE_FINITE_IMAGE) |
|
7117 |
||
17652 | 7118 |
lemma DIMINDEX_NONZERO: "ALL s::'A::type => bool. dimindex s ~= 0" |
17644 | 7119 |
by (import hollight DIMINDEX_NONZERO) |
7120 |
||
17652 | 7121 |
lemma DIMINDEX_GE_1: "ALL x::'A::type => bool. <= (NUMERAL_BIT1 0) (dimindex x)" |
17644 | 7122 |
by (import hollight DIMINDEX_GE_1) |
7123 |
||
7124 |
lemma DIMINDEX_FINITE_IMAGE: "ALL (s::'A::type finite_image => bool) t::'A::type => bool. |
|
7125 |
dimindex s = dimindex t" |
|
7126 |
by (import hollight DIMINDEX_FINITE_IMAGE) |
|
7127 |
||
7128 |
constdefs |
|
17652 | 7129 |
finite_index :: "nat => 'A" |
17644 | 7130 |
"(op ==::(nat => 'A::type) => (nat => 'A::type) => prop) |
7131 |
(finite_index::nat => 'A::type) |
|
7132 |
((Eps::((nat => 'A::type) => bool) => nat => 'A::type) |
|
7133 |
(%f::nat => 'A::type. |
|
7134 |
(All::('A::type => bool) => bool) |
|
7135 |
(%x::'A::type. |
|
7136 |
(Ex1::(nat => bool) => bool) |
|
7137 |
(%n::nat. |
|
7138 |
(op &::bool => bool => bool) |
|
7139 |
((<=::nat => nat => bool) |
|
7140 |
((NUMERAL_BIT1::nat => nat) (0::nat)) n) |
|
7141 |
((op &::bool => bool => bool) |
|
7142 |
((<=::nat => nat => bool) n |
|
7143 |
((dimindex::('A::type => bool) => nat) |
|
7144 |
(hollight.UNIV::'A::type => bool))) |
|
7145 |
((op =::'A::type => 'A::type => bool) (f n) x))))))" |
|
7146 |
||
7147 |
lemma DEF_finite_index: "(op =::(nat => 'A::type) => (nat => 'A::type) => bool) |
|
7148 |
(finite_index::nat => 'A::type) |
|
7149 |
((Eps::((nat => 'A::type) => bool) => nat => 'A::type) |
|
7150 |
(%f::nat => 'A::type. |
|
7151 |
(All::('A::type => bool) => bool) |
|
7152 |
(%x::'A::type. |
|
7153 |
(Ex1::(nat => bool) => bool) |
|
7154 |
(%n::nat. |
|
7155 |
(op &::bool => bool => bool) |
|
7156 |
((<=::nat => nat => bool) |
|
7157 |
((NUMERAL_BIT1::nat => nat) (0::nat)) n) |
|
7158 |
((op &::bool => bool => bool) |
|
7159 |
((<=::nat => nat => bool) n |
|
7160 |
((dimindex::('A::type => bool) => nat) |
|
7161 |
(hollight.UNIV::'A::type => bool))) |
|
7162 |
((op =::'A::type => 'A::type => bool) (f n) x))))))" |
|
7163 |
by (import hollight DEF_finite_index) |
|
7164 |
||
7165 |
lemma FINITE_INDEX_WORKS_FINITE: "(op -->::bool => bool => bool) |
|
7166 |
((FINITE::('N::type => bool) => bool) (hollight.UNIV::'N::type => bool)) |
|
7167 |
((All::('N::type => bool) => bool) |
|
7168 |
(%x::'N::type. |
|
7169 |
(Ex1::(nat => bool) => bool) |
|
7170 |
(%xa::nat. |
|
7171 |
(op &::bool => bool => bool) |
|
7172 |
((<=::nat => nat => bool) ((NUMERAL_BIT1::nat => nat) (0::nat)) |
|
7173 |
xa) |
|
7174 |
((op &::bool => bool => bool) |
|
7175 |
((<=::nat => nat => bool) xa |
|
7176 |
((dimindex::('N::type => bool) => nat) |
|
7177 |
(hollight.UNIV::'N::type => bool))) |
|
7178 |
((op =::'N::type => 'N::type => bool) |
|
7179 |
((finite_index::nat => 'N::type) xa) x)))))" |
|
7180 |
by (import hollight FINITE_INDEX_WORKS_FINITE) |
|
7181 |
||
7182 |
lemma FINITE_INDEX_WORKS: "(All::('A::type finite_image => bool) => bool) |
|
7183 |
(%i::'A::type finite_image. |
|
7184 |
(Ex1::(nat => bool) => bool) |
|
7185 |
(%n::nat. |
|
7186 |
(op &::bool => bool => bool) |
|
7187 |
((<=::nat => nat => bool) ((NUMERAL_BIT1::nat => nat) (0::nat)) |
|
7188 |
n) |
|
7189 |
((op &::bool => bool => bool) |
|
7190 |
((<=::nat => nat => bool) n |
|
7191 |
((dimindex::('A::type => bool) => nat) |
|
7192 |
(hollight.UNIV::'A::type => bool))) |
|
7193 |
((op =::'A::type finite_image => 'A::type finite_image => bool) |
|
7194 |
((finite_index::nat => 'A::type finite_image) n) i))))" |
|
7195 |
by (import hollight FINITE_INDEX_WORKS) |
|
7196 |
||
7197 |
lemma FINITE_INDEX_INJ: "(All::(nat => bool) => bool) |
|
7198 |
(%x::nat. |
|
7199 |
(All::(nat => bool) => bool) |
|
7200 |
(%xa::nat. |
|
7201 |
(op -->::bool => bool => bool) |
|
7202 |
((op &::bool => bool => bool) |
|
7203 |
((<=::nat => nat => bool) ((NUMERAL_BIT1::nat => nat) (0::nat)) |
|
7204 |
x) |
|
7205 |
((op &::bool => bool => bool) |
|
7206 |
((<=::nat => nat => bool) x |
|
7207 |
((dimindex::('A::type => bool) => nat) |
|
7208 |
(hollight.UNIV::'A::type => bool))) |
|
7209 |
((op &::bool => bool => bool) |
|
7210 |
((<=::nat => nat => bool) |
|
7211 |
((NUMERAL_BIT1::nat => nat) (0::nat)) xa) |
|
7212 |
((<=::nat => nat => bool) xa |
|
7213 |
((dimindex::('A::type => bool) => nat) |
|
7214 |
(hollight.UNIV::'A::type => bool)))))) |
|
7215 |
((op =::bool => bool => bool) |
|
7216 |
((op =::'A::type => 'A::type => bool) |
|
7217 |
((finite_index::nat => 'A::type) x) |
|
7218 |
((finite_index::nat => 'A::type) xa)) |
|
7219 |
((op =::nat => nat => bool) x xa))))" |
|
7220 |
by (import hollight FINITE_INDEX_INJ) |
|
7221 |
||
7222 |
lemma FORALL_FINITE_INDEX: "(op =::bool => bool => bool) |
|
7223 |
((All::('N::type finite_image => bool) => bool) |
|
7224 |
(P::'N::type finite_image => bool)) |
|
7225 |
((All::(nat => bool) => bool) |
|
7226 |
(%i::nat. |
|
7227 |
(op -->::bool => bool => bool) |
|
7228 |
((op &::bool => bool => bool) |
|
7229 |
((<=::nat => nat => bool) ((NUMERAL_BIT1::nat => nat) (0::nat)) i) |
|
7230 |
((<=::nat => nat => bool) i |
|
7231 |
((dimindex::('N::type => bool) => nat) |
|
7232 |
(hollight.UNIV::'N::type => bool)))) |
|
7233 |
(P ((finite_index::nat => 'N::type finite_image) i))))" |
|
7234 |
by (import hollight FORALL_FINITE_INDEX) |
|
7235 |
||
7236 |
typedef (open) ('A, 'B) cart = "(Collect::(('B::type finite_image => 'A::type) => bool) |
|
7237 |
=> ('B::type finite_image => 'A::type) set) |
|
7238 |
(%f::'B::type finite_image => 'A::type. True::bool)" morphisms "dest_cart" "mk_cart" |
|
7239 |
apply (rule light_ex_imp_nonempty[where t="(Eps::(('B::type finite_image => 'A::type) => bool) |
|
7240 |
=> 'B::type finite_image => 'A::type) |
|
7241 |
(%f::'B::type finite_image => 'A::type. True::bool)"]) |
|
7242 |
by (import hollight TYDEF_cart) |
|
7243 |
||
7244 |
syntax |
|
7245 |
dest_cart :: _ |
|
7246 |
||
7247 |
syntax |
|
7248 |
mk_cart :: _ |
|
7249 |
||
7250 |
lemmas "TYDEF_cart_@intern" = typedef_hol2hollight |
|
17652 | 7251 |
[where a="a :: ('A, 'B) cart" and r=r , |
17644 | 7252 |
OF type_definition_cart] |
7253 |
||
7254 |
consts |
|
19093 | 7255 |
"$" :: "('q_46627, 'q_46634) cart => nat => 'q_46627" ("$") |
17644 | 7256 |
|
7257 |
defs |
|
7258 |
"$_def": "$ == |
|
19093 | 7259 |
%(u::('q_46627::type, 'q_46634::type) cart) ua::nat. |
17644 | 7260 |
dest_cart u (finite_index ua)" |
7261 |
||
7262 |
lemma "DEF_$": "$ = |
|
19093 | 7263 |
(%(u::('q_46627::type, 'q_46634::type) cart) ua::nat. |
17644 | 7264 |
dest_cart u (finite_index ua))" |
7265 |
by (import hollight "DEF_$") |
|
7266 |
||
7267 |
lemma CART_EQ: "(All::(('A::type, 'B::type) cart => bool) => bool) |
|
7268 |
(%x::('A::type, 'B::type) cart. |
|
7269 |
(All::(('A::type, 'B::type) cart => bool) => bool) |
|
7270 |
(%y::('A::type, 'B::type) cart. |
|
7271 |
(op =::bool => bool => bool) |
|
7272 |
((op =::('A::type, 'B::type) cart |
|
7273 |
=> ('A::type, 'B::type) cart => bool) |
|
7274 |
x y) |
|
7275 |
((All::(nat => bool) => bool) |
|
7276 |
(%xa::nat. |
|
7277 |
(op -->::bool => bool => bool) |
|
7278 |
((op &::bool => bool => bool) |
|
7279 |
((<=::nat => nat => bool) |
|
7280 |
((NUMERAL_BIT1::nat => nat) (0::nat)) xa) |
|
7281 |
((<=::nat => nat => bool) xa |
|
7282 |
((dimindex::('B::type => bool) => nat) |
|
7283 |
(hollight.UNIV::'B::type => bool)))) |
|
7284 |
((op =::'A::type => 'A::type => bool) |
|
7285 |
(($::('A::type, 'B::type) cart => nat => 'A::type) x xa) |
|
7286 |
(($::('A::type, 'B::type) cart => nat => 'A::type) y |
|
7287 |
xa))))))" |
|
7288 |
by (import hollight CART_EQ) |
|
7289 |
||
7290 |
constdefs |
|
17652 | 7291 |
lambda :: "(nat => 'A) => ('A, 'B) cart" |
17644 | 7292 |
"(op ==::((nat => 'A::type) => ('A::type, 'B::type) cart) |
7293 |
=> ((nat => 'A::type) => ('A::type, 'B::type) cart) => prop) |
|
7294 |
(lambda::(nat => 'A::type) => ('A::type, 'B::type) cart) |
|
7295 |
(%u::nat => 'A::type. |
|
7296 |
(Eps::(('A::type, 'B::type) cart => bool) => ('A::type, 'B::type) cart) |
|
7297 |
(%f::('A::type, 'B::type) cart. |
|
7298 |
(All::(nat => bool) => bool) |
|
7299 |
(%i::nat. |
|
7300 |
(op -->::bool => bool => bool) |
|
7301 |
((op &::bool => bool => bool) |
|
7302 |
((<=::nat => nat => bool) |
|
7303 |
((NUMERAL_BIT1::nat => nat) (0::nat)) i) |
|
7304 |
((<=::nat => nat => bool) i |
|
7305 |
((dimindex::('B::type => bool) => nat) |
|
7306 |
(hollight.UNIV::'B::type => bool)))) |
|
7307 |
((op =::'A::type => 'A::type => bool) |
|
7308 |
(($::('A::type, 'B::type) cart => nat => 'A::type) f i) |
|
7309 |
(u i)))))" |
|
7310 |
||
7311 |
lemma DEF_lambda: "(op =::((nat => 'A::type) => ('A::type, 'B::type) cart) |
|
7312 |
=> ((nat => 'A::type) => ('A::type, 'B::type) cart) => bool) |
|
7313 |
(lambda::(nat => 'A::type) => ('A::type, 'B::type) cart) |
|
7314 |
(%u::nat => 'A::type. |
|
7315 |
(Eps::(('A::type, 'B::type) cart => bool) => ('A::type, 'B::type) cart) |
|
7316 |
(%f::('A::type, 'B::type) cart. |
|
7317 |
(All::(nat => bool) => bool) |
|
7318 |
(%i::nat. |
|
7319 |
(op -->::bool => bool => bool) |
|
7320 |
((op &::bool => bool => bool) |
|
7321 |
((<=::nat => nat => bool) |
|
7322 |
((NUMERAL_BIT1::nat => nat) (0::nat)) i) |
|
7323 |
((<=::nat => nat => bool) i |
|
7324 |
((dimindex::('B::type => bool) => nat) |
|
7325 |
(hollight.UNIV::'B::type => bool)))) |
|
7326 |
((op =::'A::type => 'A::type => bool) |
|
7327 |
(($::('A::type, 'B::type) cart => nat => 'A::type) f i) |
|
7328 |
(u i)))))" |
|
7329 |
by (import hollight DEF_lambda) |
|
7330 |
||
7331 |
lemma LAMBDA_BETA: "(All::(nat => bool) => bool) |
|
7332 |
(%x::nat. |
|
7333 |
(op -->::bool => bool => bool) |
|
7334 |
((op &::bool => bool => bool) |
|
7335 |
((<=::nat => nat => bool) ((NUMERAL_BIT1::nat => nat) (0::nat)) x) |
|
7336 |
((<=::nat => nat => bool) x |
|
7337 |
((dimindex::('B::type => bool) => nat) |
|
7338 |
(hollight.UNIV::'B::type => bool)))) |
|
7339 |
((op =::'A::type => 'A::type => bool) |
|
7340 |
(($::('A::type, 'B::type) cart => nat => 'A::type) |
|
7341 |
((lambda::(nat => 'A::type) => ('A::type, 'B::type) cart) |
|
7342 |
(g::nat => 'A::type)) |
|
7343 |
x) |
|
7344 |
(g x)))" |
|
7345 |
by (import hollight LAMBDA_BETA) |
|
7346 |
||
7347 |
lemma LAMBDA_UNIQUE: "(All::(('A::type, 'B::type) cart => bool) => bool) |
|
7348 |
(%x::('A::type, 'B::type) cart. |
|
7349 |
(All::((nat => 'A::type) => bool) => bool) |
|
7350 |
(%xa::nat => 'A::type. |
|
7351 |
(op =::bool => bool => bool) |
|
7352 |
((All::(nat => bool) => bool) |
|
7353 |
(%i::nat. |
|
7354 |
(op -->::bool => bool => bool) |
|
7355 |
((op &::bool => bool => bool) |
|
7356 |
((<=::nat => nat => bool) |
|
7357 |
((NUMERAL_BIT1::nat => nat) (0::nat)) i) |
|
7358 |
((<=::nat => nat => bool) i |
|
7359 |
((dimindex::('B::type => bool) => nat) |
|
7360 |
(hollight.UNIV::'B::type => bool)))) |
|
7361 |
((op =::'A::type => 'A::type => bool) |
|
7362 |
(($::('A::type, 'B::type) cart => nat => 'A::type) x i) |
|
7363 |
(xa i)))) |
|
7364 |
((op =::('A::type, 'B::type) cart |
|
7365 |
=> ('A::type, 'B::type) cart => bool) |
|
7366 |
((lambda::(nat => 'A::type) => ('A::type, 'B::type) cart) xa) |
|
7367 |
x)))" |
|
7368 |
by (import hollight LAMBDA_UNIQUE) |
|
7369 |
||
19093 | 7370 |
lemma LAMBDA_ETA: "ALL x::('q_46825::type, 'q_46829::type) cart. lambda ($ x) = x" |
17644 | 7371 |
by (import hollight LAMBDA_ETA) |
7372 |
||
19093 | 7373 |
typedef (open) ('A, 'B) finite_sum = "(Collect::('A::type finite_image + 'B::type finite_image => bool) |
7374 |
=> ('A::type finite_image + 'B::type finite_image) set) |
|
7375 |
(%x::'A::type finite_image + 'B::type finite_image. True::bool)" morphisms "dest_finite_sum" "mk_finite_sum" |
|
7376 |
apply (rule light_ex_imp_nonempty[where t="(Eps::('A::type finite_image + 'B::type finite_image => bool) |
|
7377 |
=> 'A::type finite_image + 'B::type finite_image) |
|
7378 |
(%x::'A::type finite_image + 'B::type finite_image. True::bool)"]) |
|
17644 | 7379 |
by (import hollight TYDEF_finite_sum) |
7380 |
||
7381 |
syntax |
|
7382 |
dest_finite_sum :: _ |
|
7383 |
||
7384 |
syntax |
|
7385 |
mk_finite_sum :: _ |
|
7386 |
||
7387 |
lemmas "TYDEF_finite_sum_@intern" = typedef_hol2hollight |
|
17652 | 7388 |
[where a="a :: ('A, 'B) finite_sum" and r=r , |
17644 | 7389 |
OF type_definition_finite_sum] |
7390 |
||
7391 |
constdefs |
|
17652 | 7392 |
pastecart :: "('A, 'M) cart => ('A, 'N) cart => ('A, ('M, 'N) finite_sum) cart" |
17644 | 7393 |
"(op ==::(('A::type, 'M::type) cart |
7394 |
=> ('A::type, 'N::type) cart |
|
7395 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7396 |
=> (('A::type, 'M::type) cart |
|
7397 |
=> ('A::type, 'N::type) cart |
|
7398 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7399 |
=> prop) |
|
7400 |
(pastecart::('A::type, 'M::type) cart |
|
7401 |
=> ('A::type, 'N::type) cart |
|
7402 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7403 |
(%(u::('A::type, 'M::type) cart) ua::('A::type, 'N::type) cart. |
|
7404 |
(lambda::(nat => 'A::type) |
|
7405 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7406 |
(%i::nat. |
|
7407 |
(COND::bool => 'A::type => 'A::type => 'A::type) |
|
7408 |
((<=::nat => nat => bool) i |
|
7409 |
((dimindex::('M::type => bool) => nat) |
|
7410 |
(hollight.UNIV::'M::type => bool))) |
|
7411 |
(($::('A::type, 'M::type) cart => nat => 'A::type) u i) |
|
7412 |
(($::('A::type, 'N::type) cart => nat => 'A::type) ua |
|
7413 |
((op -::nat => nat => nat) i |
|
7414 |
((dimindex::('M::type => bool) => nat) |
|
7415 |
(hollight.UNIV::'M::type => bool))))))" |
|
7416 |
||
7417 |
lemma DEF_pastecart: "(op =::(('A::type, 'M::type) cart |
|
7418 |
=> ('A::type, 'N::type) cart |
|
7419 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7420 |
=> (('A::type, 'M::type) cart |
|
7421 |
=> ('A::type, 'N::type) cart |
|
7422 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7423 |
=> bool) |
|
7424 |
(pastecart::('A::type, 'M::type) cart |
|
7425 |
=> ('A::type, 'N::type) cart |
|
7426 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7427 |
(%(u::('A::type, 'M::type) cart) ua::('A::type, 'N::type) cart. |
|
7428 |
(lambda::(nat => 'A::type) |
|
7429 |
=> ('A::type, ('M::type, 'N::type) finite_sum) cart) |
|
7430 |
(%i::nat. |
|
7431 |
(COND::bool => 'A::type => 'A::type => 'A::type) |
|
7432 |
((<=::nat => nat => bool) i |
|
7433 |
((dimindex::('M::type => bool) => nat) |
|
7434 |
(hollight.UNIV::'M::type => bool))) |
|
7435 |
(($::('A::type, 'M::type) cart => nat => 'A::type) u i) |
|
7436 |
(($::('A::type, 'N::type) cart => nat => 'A::type) ua |
|
7437 |
((op -::nat => nat => nat) i |
|
7438 |
((dimindex::('M::type => bool) => nat) |
|
7439 |
(hollight.UNIV::'M::type => bool))))))" |
|
7440 |
by (import hollight DEF_pastecart) |
|
7441 |
||
7442 |
constdefs |
|
17652 | 7443 |
fstcart :: "('A, ('M, 'N) finite_sum) cart => ('A, 'M) cart" |
17644 | 7444 |
"fstcart == |
7445 |
%u::('A::type, ('M::type, 'N::type) finite_sum) cart. lambda ($ u)" |
|
7446 |
||
7447 |
lemma DEF_fstcart: "fstcart = |
|
7448 |
(%u::('A::type, ('M::type, 'N::type) finite_sum) cart. lambda ($ u))" |
|
7449 |
by (import hollight DEF_fstcart) |
|
7450 |
||
7451 |
constdefs |
|
17652 | 7452 |
sndcart :: "('A, ('M, 'N) finite_sum) cart => ('A, 'N) cart" |
17644 | 7453 |
"(op ==::(('A::type, ('M::type, 'N::type) finite_sum) cart |
7454 |
=> ('A::type, 'N::type) cart) |
|
7455 |
=> (('A::type, ('M::type, 'N::type) finite_sum) cart |
|
7456 |
=> ('A::type, 'N::type) cart) |
|
7457 |
=> prop) |
|
7458 |
(sndcart::('A::type, ('M::type, 'N::type) finite_sum) cart |
|
7459 |
=> ('A::type, 'N::type) cart) |
|
7460 |
(%u::('A::type, ('M::type, 'N::type) finite_sum) cart. |
|
7461 |
(lambda::(nat => 'A::type) => ('A::type, 'N::type) cart) |
|
7462 |
(%i::nat. |
|
7463 |
($::('A::type, ('M::type, 'N::type) finite_sum) cart |
|
7464 |
=> nat => 'A::type) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
7465 |
u ((HOL.plus::nat => nat => nat) i |
17644 | 7466 |
((dimindex::('M::type => bool) => nat) |
7467 |
(hollight.UNIV::'M::type => bool)))))" |
|
7468 |
||
7469 |
lemma DEF_sndcart: "(op =::(('A::type, ('M::type, 'N::type) finite_sum) cart |
|
7470 |
=> ('A::type, 'N::type) cart) |
|
7471 |
=> (('A::type, ('M::type, 'N::type) finite_sum) cart |
|
7472 |
=> ('A::type, 'N::type) cart) |
|
7473 |
=> bool) |
|
7474 |
(sndcart::('A::type, ('M::type, 'N::type) finite_sum) cart |
|
7475 |
=> ('A::type, 'N::type) cart) |
|
7476 |
(%u::('A::type, ('M::type, 'N::type) finite_sum) cart. |
|
7477 |
(lambda::(nat => 'A::type) => ('A::type, 'N::type) cart) |
|
7478 |
(%i::nat. |
|
7479 |
($::('A::type, ('M::type, 'N::type) finite_sum) cart |
|
7480 |
=> nat => 'A::type) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
7481 |
u ((HOL.plus::nat => nat => nat) i |
17644 | 7482 |
((dimindex::('M::type => bool) => nat) |
7483 |
(hollight.UNIV::'M::type => bool)))))" |
|
7484 |
by (import hollight DEF_sndcart) |
|
7485 |
||
7486 |
lemma DIMINDEX_HAS_SIZE_FINITE_SUM: "(HAS_SIZE::(('M::type, 'N::type) finite_sum => bool) => nat => bool) |
|
7487 |
(hollight.UNIV::('M::type, 'N::type) finite_sum => bool) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
7488 |
((HOL.plus::nat => nat => nat) |
17644 | 7489 |
((dimindex::('M::type => bool) => nat) (hollight.UNIV::'M::type => bool)) |
7490 |
((dimindex::('N::type => bool) => nat) |
|
7491 |
(hollight.UNIV::'N::type => bool)))" |
|
7492 |
by (import hollight DIMINDEX_HAS_SIZE_FINITE_SUM) |
|
7493 |
||
7494 |
lemma DIMINDEX_FINITE_SUM: "(op =::nat => nat => bool) |
|
7495 |
((dimindex::(('M::type, 'N::type) finite_sum => bool) => nat) |
|
7496 |
(hollight.UNIV::('M::type, 'N::type) finite_sum => bool)) |
|
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
7497 |
((HOL.plus::nat => nat => nat) |
17644 | 7498 |
((dimindex::('M::type => bool) => nat) (hollight.UNIV::'M::type => bool)) |
7499 |
((dimindex::('N::type => bool) => nat) |
|
7500 |
(hollight.UNIV::'N::type => bool)))" |
|
7501 |
by (import hollight DIMINDEX_FINITE_SUM) |
|
7502 |
||
7503 |
lemma FSTCART_PASTECART: "ALL (x::('A::type, 'M::type) cart) xa::('A::type, 'N::type) cart. |
|
7504 |
fstcart (pastecart x xa) = x" |
|
7505 |
by (import hollight FSTCART_PASTECART) |
|
7506 |
||
7507 |
lemma SNDCART_PASTECART: "ALL (x::('A::type, 'M::type) cart) xa::('A::type, 'N::type) cart. |
|
7508 |
sndcart (pastecart x xa) = xa" |
|
7509 |
by (import hollight SNDCART_PASTECART) |
|
7510 |
||
19093 | 7511 |
lemma PASTECART_FST_SND: "ALL x::('q_47149::type, ('q_47146::type, 'q_47144::type) finite_sum) cart. |
17644 | 7512 |
pastecart (fstcart x) (sndcart x) = x" |
7513 |
by (import hollight PASTECART_FST_SND) |
|
7514 |
||
19093 | 7515 |
lemma PASTECART_EQ: "ALL (x::('q_47187::type, ('q_47177::type, 'q_47188::type) finite_sum) cart) |
7516 |
y::('q_47187::type, ('q_47177::type, 'q_47188::type) finite_sum) cart. |
|
17644 | 7517 |
(x = y) = (fstcart x = fstcart y & sndcart x = sndcart y)" |
7518 |
by (import hollight PASTECART_EQ) |
|
7519 |
||
19093 | 7520 |
lemma FORALL_PASTECART: "All (P::('q_47208::type, ('q_47209::type, 'q_47210::type) finite_sum) cart |
17644 | 7521 |
=> bool) = |
19093 | 7522 |
(ALL (x::('q_47208::type, 'q_47209::type) cart) |
7523 |
y::('q_47208::type, 'q_47210::type) cart. P (pastecart x y))" |
|
17644 | 7524 |
by (import hollight FORALL_PASTECART) |
7525 |
||
19093 | 7526 |
lemma EXISTS_PASTECART: "Ex (P::('q_47230::type, ('q_47231::type, 'q_47232::type) finite_sum) cart |
17644 | 7527 |
=> bool) = |
19093 | 7528 |
(EX (x::('q_47230::type, 'q_47231::type) cart) |
7529 |
y::('q_47230::type, 'q_47232::type) cart. P (pastecart x y))" |
|
17644 | 7530 |
by (import hollight EXISTS_PASTECART) |
7531 |
||
7532 |
lemma SURJECTIVE_IFF_INJECTIVE_GEN: "ALL (s::'A::type => bool) (t::'B::type => bool) f::'A::type => 'B::type. |
|
7533 |
FINITE s & FINITE t & CARD s = CARD t & SUBSET (IMAGE f s) t --> |
|
7534 |
(ALL y::'B::type. IN y t --> (EX x::'A::type. IN x s & f x = y)) = |
|
7535 |
(ALL (x::'A::type) y::'A::type. IN x s & IN y s & f x = f y --> x = y)" |
|
7536 |
by (import hollight SURJECTIVE_IFF_INJECTIVE_GEN) |
|
7537 |
||
7538 |
lemma SURJECTIVE_IFF_INJECTIVE: "ALL (x::'A::type => bool) xa::'A::type => 'A::type. |
|
7539 |
FINITE x & SUBSET (IMAGE xa x) x --> |
|
7540 |
(ALL y::'A::type. IN y x --> (EX xb::'A::type. IN xb x & xa xb = y)) = |
|
7541 |
(ALL (xb::'A::type) y::'A::type. |
|
7542 |
IN xb x & IN y x & xa xb = xa y --> xb = y)" |
|
7543 |
by (import hollight SURJECTIVE_IFF_INJECTIVE) |
|
7544 |
||
7545 |
lemma IMAGE_IMP_INJECTIVE_GEN: "ALL (s::'A::type => bool) (t::'B::type => bool) f::'A::type => 'B::type. |
|
7546 |
FINITE s & CARD s = CARD t & IMAGE f s = t --> |
|
7547 |
(ALL (x::'A::type) y::'A::type. IN x s & IN y s & f x = f y --> x = y)" |
|
7548 |
by (import hollight IMAGE_IMP_INJECTIVE_GEN) |
|
7549 |
||
19093 | 7550 |
lemma IMAGE_IMP_INJECTIVE: "ALL (s::'q_47557::type => bool) f::'q_47557::type => 'q_47557::type. |
17644 | 7551 |
FINITE s & IMAGE f s = s --> |
19093 | 7552 |
(ALL (x::'q_47557::type) y::'q_47557::type. |
17644 | 7553 |
IN x s & IN y s & f x = f y --> x = y)" |
7554 |
by (import hollight IMAGE_IMP_INJECTIVE) |
|
7555 |
||
7556 |
lemma CARD_LE_INJ: "ALL (x::'A::type => bool) xa::'B::type => bool. |
|
7557 |
FINITE x & FINITE xa & <= (CARD x) (CARD xa) --> |
|
7558 |
(EX f::'A::type => 'B::type. |
|
7559 |
SUBSET (IMAGE f x) xa & |
|
7560 |
(ALL (xa::'A::type) y::'A::type. |
|
7561 |
IN xa x & IN y x & f xa = f y --> xa = y))" |
|
7562 |
by (import hollight CARD_LE_INJ) |
|
7563 |
||
19093 | 7564 |
lemma FORALL_IN_CLAUSES: "(ALL x::'q_47663::type => bool. |
7565 |
(ALL xa::'q_47663::type. IN xa EMPTY --> x xa) = True) & |
|
7566 |
(ALL (x::'q_47703::type => bool) (xa::'q_47703::type) |
|
7567 |
xb::'q_47703::type => bool. |
|
7568 |
(ALL xc::'q_47703::type. IN xc (INSERT xa xb) --> x xc) = |
|
7569 |
(x xa & (ALL xa::'q_47703::type. IN xa xb --> x xa)))" |
|
17644 | 7570 |
by (import hollight FORALL_IN_CLAUSES) |
7571 |
||
19093 | 7572 |
lemma EXISTS_IN_CLAUSES: "(ALL x::'q_47723::type => bool. |
7573 |
(EX xa::'q_47723::type. IN xa EMPTY & x xa) = False) & |
|
7574 |
(ALL (x::'q_47763::type => bool) (xa::'q_47763::type) |
|
7575 |
xb::'q_47763::type => bool. |
|
7576 |
(EX xc::'q_47763::type. IN xc (INSERT xa xb) & x xc) = |
|
7577 |
(x xa | (EX xa::'q_47763::type. IN xa xb & x xa)))" |
|
17644 | 7578 |
by (import hollight EXISTS_IN_CLAUSES) |
7579 |
||
19093 | 7580 |
lemma SURJECTIVE_ON_RIGHT_INVERSE: "ALL (x::'q_47819::type => 'q_47820::type) xa::'q_47820::type => bool. |
7581 |
(ALL xb::'q_47820::type. |
|
17644 | 7582 |
IN xb xa --> |
19093 | 7583 |
(EX xa::'q_47819::type. |
7584 |
IN xa (s::'q_47819::type => bool) & x xa = xb)) = |
|
7585 |
(EX g::'q_47820::type => 'q_47819::type. |
|
7586 |
ALL y::'q_47820::type. IN y xa --> IN (g y) s & x (g y) = y)" |
|
17644 | 7587 |
by (import hollight SURJECTIVE_ON_RIGHT_INVERSE) |
7588 |
||
19093 | 7589 |
lemma INJECTIVE_ON_LEFT_INVERSE: "ALL (x::'q_47913::type => 'q_47916::type) xa::'q_47913::type => bool. |
7590 |
(ALL (xb::'q_47913::type) y::'q_47913::type. |
|
17644 | 7591 |
IN xb xa & IN y xa & x xb = x y --> xb = y) = |
19093 | 7592 |
(EX xb::'q_47916::type => 'q_47913::type. |
7593 |
ALL xc::'q_47913::type. IN xc xa --> xb (x xc) = xc)" |
|
17644 | 7594 |
by (import hollight INJECTIVE_ON_LEFT_INVERSE) |
7595 |
||
19093 | 7596 |
lemma SURJECTIVE_RIGHT_INVERSE: "(ALL y::'q_47941::type. |
7597 |
EX x::'q_47944::type. (f::'q_47944::type => 'q_47941::type) x = y) = |
|
7598 |
(EX g::'q_47941::type => 'q_47944::type. ALL y::'q_47941::type. f (g y) = y)" |
|
17644 | 7599 |
by (import hollight SURJECTIVE_RIGHT_INVERSE) |
7600 |
||
19093 | 7601 |
lemma INJECTIVE_LEFT_INVERSE: "(ALL (x::'q_47978::type) xa::'q_47978::type. |
7602 |
(f::'q_47978::type => 'q_47981::type) x = f xa --> x = xa) = |
|
7603 |
(EX g::'q_47981::type => 'q_47978::type. ALL x::'q_47978::type. g (f x) = x)" |
|
17644 | 7604 |
by (import hollight INJECTIVE_LEFT_INVERSE) |
7605 |
||
19093 | 7606 |
lemma FUNCTION_FACTORS_RIGHT: "ALL (x::'q_48017::type => 'q_48018::type) |
7607 |
xa::'q_48005::type => 'q_48018::type. |
|
7608 |
(ALL xb::'q_48017::type. EX y::'q_48005::type. xa y = x xb) = |
|
7609 |
(EX xb::'q_48017::type => 'q_48005::type. x = xa o xb)" |
|
17644 | 7610 |
by (import hollight FUNCTION_FACTORS_RIGHT) |
7611 |
||
19093 | 7612 |
lemma FUNCTION_FACTORS_LEFT: "ALL (x::'q_48090::type => 'q_48091::type) |
7613 |
xa::'q_48090::type => 'q_48070::type. |
|
7614 |
(ALL (xb::'q_48090::type) y::'q_48090::type. |
|
17644 | 7615 |
xa xb = xa y --> x xb = x y) = |
19093 | 7616 |
(EX xb::'q_48070::type => 'q_48091::type. x = xb o xa)" |
17644 | 7617 |
by (import hollight FUNCTION_FACTORS_LEFT) |
7618 |
||
7619 |
constdefs |
|
7620 |
dotdot :: "nat => nat => nat => bool" |
|
7621 |
"dotdot == |
|
7622 |
%(u::nat) ua::nat. |
|
7623 |
GSPEC (%ub::nat. EX x::nat. SETSPEC ub (<= u x & <= x ua) x)" |
|
7624 |
||
7625 |
lemma DEF__dot__dot_: "dotdot = |
|
7626 |
(%(u::nat) ua::nat. |
|
7627 |
GSPEC (%ub::nat. EX x::nat. SETSPEC ub (<= u x & <= x ua) x))" |
|
7628 |
by (import hollight DEF__dot__dot_) |
|
7629 |
||
7630 |
lemma FINITE_NUMSEG: "ALL (m::nat) n::nat. FINITE (dotdot m n)" |
|
7631 |
by (import hollight FINITE_NUMSEG) |
|
7632 |
||
19093 | 7633 |
lemma NUMSEG_COMBINE_R: "ALL (x::'q_48166::type) (p::nat) m::nat. |
17644 | 7634 |
<= m p & <= p (n::nat) --> |
17652 | 7635 |
hollight.UNION (dotdot m p) (dotdot (p + NUMERAL_BIT1 0) n) = dotdot m n" |
17644 | 7636 |
by (import hollight NUMSEG_COMBINE_R) |
7637 |
||
19093 | 7638 |
lemma NUMSEG_COMBINE_L: "ALL (x::'q_48204::type) (p::nat) m::nat. |
17644 | 7639 |
<= m p & <= p (n::nat) --> |
17652 | 7640 |
hollight.UNION (dotdot m (p - NUMERAL_BIT1 0)) (dotdot p n) = dotdot m n" |
17644 | 7641 |
by (import hollight NUMSEG_COMBINE_L) |
7642 |
||
7643 |
lemma NUMSEG_LREC: "ALL (x::nat) xa::nat. |
|
17652 | 7644 |
<= x xa --> INSERT x (dotdot (x + NUMERAL_BIT1 0) xa) = dotdot x xa" |
17644 | 7645 |
by (import hollight NUMSEG_LREC) |
7646 |
||
7647 |
lemma NUMSEG_RREC: "ALL (x::nat) xa::nat. |
|
17652 | 7648 |
<= x xa --> INSERT xa (dotdot x (xa - NUMERAL_BIT1 0)) = dotdot x xa" |
17644 | 7649 |
by (import hollight NUMSEG_RREC) |
7650 |
||
7651 |
lemma NUMSEG_REC: "ALL (x::nat) xa::nat. |
|
7652 |
<= x (Suc xa) --> dotdot x (Suc xa) = INSERT (Suc xa) (dotdot x xa)" |
|
7653 |
by (import hollight NUMSEG_REC) |
|
7654 |
||
7655 |
lemma IN_NUMSEG: "ALL (x::nat) (xa::nat) xb::nat. IN xb (dotdot x xa) = (<= x xb & <= xb xa)" |
|
7656 |
by (import hollight IN_NUMSEG) |
|
7657 |
||
7658 |
lemma NUMSEG_SING: "ALL x::nat. dotdot x x = INSERT x EMPTY" |
|
7659 |
by (import hollight NUMSEG_SING) |
|
7660 |
||
7661 |
lemma NUMSEG_EMPTY: "ALL (x::nat) xa::nat. (dotdot x xa = EMPTY) = < xa x" |
|
7662 |
by (import hollight NUMSEG_EMPTY) |
|
7663 |
||
17652 | 7664 |
lemma CARD_NUMSEG_LEMMA: "ALL (m::nat) d::nat. CARD (dotdot m (m + d)) = d + NUMERAL_BIT1 0" |
17644 | 7665 |
by (import hollight CARD_NUMSEG_LEMMA) |
7666 |
||
17652 | 7667 |
lemma CARD_NUMSEG: "ALL (m::nat) n::nat. CARD (dotdot m n) = n + NUMERAL_BIT1 0 - m" |
17644 | 7668 |
by (import hollight CARD_NUMSEG) |
7669 |
||
17652 | 7670 |
lemma HAS_SIZE_NUMSEG: "ALL (x::nat) xa::nat. HAS_SIZE (dotdot x xa) (xa + NUMERAL_BIT1 0 - x)" |
17644 | 7671 |
by (import hollight HAS_SIZE_NUMSEG) |
7672 |
||
17652 | 7673 |
lemma CARD_NUMSEG_1: "ALL x::nat. CARD (dotdot (NUMERAL_BIT1 0) x) = x" |
17644 | 7674 |
by (import hollight CARD_NUMSEG_1) |
7675 |
||
17652 | 7676 |
lemma HAS_SIZE_NUMSEG_1: "ALL x::nat. HAS_SIZE (dotdot (NUMERAL_BIT1 0) x) x" |
17644 | 7677 |
by (import hollight HAS_SIZE_NUMSEG_1) |
7678 |
||
17652 | 7679 |
lemma NUMSEG_CLAUSES: "(ALL m::nat. dotdot m 0 = COND (m = 0) (INSERT 0 EMPTY) EMPTY) & |
17644 | 7680 |
(ALL (m::nat) n::nat. |
7681 |
dotdot m (Suc n) = |
|
7682 |
COND (<= m (Suc n)) (INSERT (Suc n) (dotdot m n)) (dotdot m n))" |
|
7683 |
by (import hollight NUMSEG_CLAUSES) |
|
7684 |
||
7685 |
lemma FINITE_INDEX_NUMSEG: "ALL s::'A::type => bool. |
|
7686 |
FINITE s = |
|
7687 |
(EX f::nat => 'A::type. |
|
7688 |
(ALL (i::nat) j::nat. |
|
17652 | 7689 |
IN i (dotdot (NUMERAL_BIT1 0) (CARD s)) & |
7690 |
IN j (dotdot (NUMERAL_BIT1 0) (CARD s)) & f i = f j --> |
|
17644 | 7691 |
i = j) & |
17652 | 7692 |
s = IMAGE f (dotdot (NUMERAL_BIT1 0) (CARD s)))" |
17644 | 7693 |
by (import hollight FINITE_INDEX_NUMSEG) |
7694 |
||
7695 |
lemma FINITE_INDEX_NUMBERS: "ALL s::'A::type => bool. |
|
7696 |
FINITE s = |
|
7697 |
(EX (k::nat => bool) f::nat => 'A::type. |
|
7698 |
(ALL (i::nat) j::nat. IN i k & IN j k & f i = f j --> i = j) & |
|
7699 |
FINITE k & s = IMAGE f k)" |
|
7700 |
by (import hollight FINITE_INDEX_NUMBERS) |
|
7701 |
||
7702 |
lemma DISJOINT_NUMSEG: "ALL (x::nat) (xa::nat) (xb::nat) xc::nat. |
|
7703 |
DISJOINT (dotdot x xa) (dotdot xb xc) = |
|
7704 |
(< xa xb | < xc x | < xa x | < xc xb)" |
|
7705 |
by (import hollight DISJOINT_NUMSEG) |
|
7706 |
||
7707 |
lemma NUMSEG_ADD_SPLIT: "ALL (x::nat) (xa::nat) xb::nat. |
|
17652 | 7708 |
<= x (xa + NUMERAL_BIT1 0) --> |
17644 | 7709 |
dotdot x (xa + xb) = |
17652 | 7710 |
hollight.UNION (dotdot x xa) (dotdot (xa + NUMERAL_BIT1 0) (xa + xb))" |
17644 | 7711 |
by (import hollight NUMSEG_ADD_SPLIT) |
7712 |
||
7713 |
lemma NUMSEG_OFFSET_IMAGE: "ALL (x::nat) (xa::nat) xb::nat. |
|
7714 |
dotdot (x + xb) (xa + xb) = IMAGE (%i::nat. i + xb) (dotdot x xa)" |
|
7715 |
by (import hollight NUMSEG_OFFSET_IMAGE) |
|
7716 |
||
7717 |
lemma SUBSET_NUMSEG: "ALL (m::nat) (n::nat) (p::nat) q::nat. |
|
7718 |
SUBSET (dotdot m n) (dotdot p q) = (< n m | <= p m & <= n q)" |
|
7719 |
by (import hollight SUBSET_NUMSEG) |
|
7720 |
||
7721 |
constdefs |
|
19093 | 7722 |
neutral :: "('q_48985 => 'q_48985 => 'q_48985) => 'q_48985" |
17644 | 7723 |
"neutral == |
19093 | 7724 |
%u::'q_48985::type => 'q_48985::type => 'q_48985::type. |
7725 |
SOME x::'q_48985::type. ALL y::'q_48985::type. u x y = y & u y x = y" |
|
17644 | 7726 |
|
7727 |
lemma DEF_neutral: "neutral = |
|
19093 | 7728 |
(%u::'q_48985::type => 'q_48985::type => 'q_48985::type. |
7729 |
SOME x::'q_48985::type. ALL y::'q_48985::type. u x y = y & u y x = y)" |
|
17644 | 7730 |
by (import hollight DEF_neutral) |
7731 |
||
7732 |
constdefs |
|
17652 | 7733 |
monoidal :: "('A => 'A => 'A) => bool" |
17644 | 7734 |
"monoidal == |
7735 |
%u::'A::type => 'A::type => 'A::type. |
|
7736 |
(ALL (x::'A::type) y::'A::type. u x y = u y x) & |
|
7737 |
(ALL (x::'A::type) (y::'A::type) z::'A::type. |
|
7738 |
u x (u y z) = u (u x y) z) & |
|
7739 |
(ALL x::'A::type. u (neutral u) x = x)" |
|
7740 |
||
7741 |
lemma DEF_monoidal: "monoidal = |
|
7742 |
(%u::'A::type => 'A::type => 'A::type. |
|
7743 |
(ALL (x::'A::type) y::'A::type. u x y = u y x) & |
|
7744 |
(ALL (x::'A::type) (y::'A::type) z::'A::type. |
|
7745 |
u x (u y z) = u (u x y) z) & |
|
7746 |
(ALL x::'A::type. u (neutral u) x = x))" |
|
7747 |
by (import hollight DEF_monoidal) |
|
7748 |
||
7749 |
constdefs |
|
17652 | 7750 |
support :: "('B => 'B => 'B) => ('A => 'B) => ('A => bool) => 'A => bool" |
17644 | 7751 |
"support == |
7752 |
%(u::'B::type => 'B::type => 'B::type) (ua::'A::type => 'B::type) |
|
7753 |
ub::'A::type => bool. |
|
7754 |
GSPEC |
|
7755 |
(%uc::'A::type. |
|
7756 |
EX x::'A::type. SETSPEC uc (IN x ub & ua x ~= neutral u) x)" |
|
7757 |
||
7758 |
lemma DEF_support: "support = |
|
7759 |
(%(u::'B::type => 'B::type => 'B::type) (ua::'A::type => 'B::type) |
|
7760 |
ub::'A::type => bool. |
|
7761 |
GSPEC |
|
7762 |
(%uc::'A::type. |
|
7763 |
EX x::'A::type. SETSPEC uc (IN x ub & ua x ~= neutral u) x))" |
|
7764 |
by (import hollight DEF_support) |
|
7765 |
||
7766 |
constdefs |
|
19093 | 7767 |
iterate :: "('q_49090 => 'q_49090 => 'q_49090) |
7768 |
=> ('A => bool) => ('A => 'q_49090) => 'q_49090" |
|
17644 | 7769 |
"iterate == |
19093 | 7770 |
%(u::'q_49090::type => 'q_49090::type => 'q_49090::type) |
7771 |
(ua::'A::type => bool) ub::'A::type => 'q_49090::type. |
|
17644 | 7772 |
ITSET (%x::'A::type. u (ub x)) (support u ub ua) (neutral u)" |
7773 |
||
7774 |
lemma DEF_iterate: "iterate = |
|
19093 | 7775 |
(%(u::'q_49090::type => 'q_49090::type => 'q_49090::type) |
7776 |
(ua::'A::type => bool) ub::'A::type => 'q_49090::type. |
|
17644 | 7777 |
ITSET (%x::'A::type. u (ub x)) (support u ub ua) (neutral u))" |
7778 |
by (import hollight DEF_iterate) |
|
7779 |
||
19093 | 7780 |
lemma IN_SUPPORT: "ALL (x::'q_49133::type => 'q_49133::type => 'q_49133::type) |
7781 |
(xa::'q_49136::type => 'q_49133::type) (xb::'q_49136::type) |
|
7782 |
xc::'q_49136::type => bool. |
|
17644 | 7783 |
IN xb (support x xa xc) = (IN xb xc & xa xb ~= neutral x)" |
7784 |
by (import hollight IN_SUPPORT) |
|
7785 |
||
19093 | 7786 |
lemma SUPPORT_SUPPORT: "ALL (x::'q_49158::type => 'q_49158::type => 'q_49158::type) |
7787 |
(xa::'q_49169::type => 'q_49158::type) xb::'q_49169::type => bool. |
|
17644 | 7788 |
support x xa (support x xa xb) = support x xa xb" |
7789 |
by (import hollight SUPPORT_SUPPORT) |
|
7790 |
||
19093 | 7791 |
lemma SUPPORT_EMPTY: "ALL (x::'q_49194::type => 'q_49194::type => 'q_49194::type) |
7792 |
(xa::'q_49208::type => 'q_49194::type) xb::'q_49208::type => bool. |
|
7793 |
(ALL xc::'q_49208::type. IN xc xb --> xa xc = neutral x) = |
|
17644 | 7794 |
(support x xa xb = EMPTY)" |
7795 |
by (import hollight SUPPORT_EMPTY) |
|
7796 |
||
19093 | 7797 |
lemma SUPPORT_SUBSET: "ALL (x::'q_49228::type => 'q_49228::type => 'q_49228::type) |
7798 |
(xa::'q_49229::type => 'q_49228::type) xb::'q_49229::type => bool. |
|
17644 | 7799 |
SUBSET (support x xa xb) xb" |
7800 |
by (import hollight SUPPORT_SUBSET) |
|
7801 |
||
19093 | 7802 |
lemma FINITE_SUPPORT: "ALL (u::'q_49252::type => 'q_49252::type => 'q_49252::type) |
7803 |
(f::'q_49246::type => 'q_49252::type) s::'q_49246::type => bool. |
|
17644 | 7804 |
FINITE s --> FINITE (support u f s)" |
7805 |
by (import hollight FINITE_SUPPORT) |
|
7806 |
||
19093 | 7807 |
lemma SUPPORT_CLAUSES: "(ALL x::'q_49270::type => 'q_49300::type. |
7808 |
support (u_4247::'q_49300::type => 'q_49300::type => 'q_49300::type) x |
|
17644 | 7809 |
EMPTY = |
7810 |
EMPTY) & |
|
19093 | 7811 |
(ALL (x::'q_49318::type => 'q_49300::type) (xa::'q_49318::type) |
7812 |
xb::'q_49318::type => bool. |
|
7813 |
support u_4247 x (INSERT xa xb) = |
|
7814 |
COND (x xa = neutral u_4247) (support u_4247 x xb) |
|
7815 |
(INSERT xa (support u_4247 x xb))) & |
|
7816 |
(ALL (x::'q_49351::type => 'q_49300::type) (xa::'q_49351::type) |
|
7817 |
xb::'q_49351::type => bool. |
|
7818 |
support u_4247 x (DELETE xb xa) = DELETE (support u_4247 x xb) xa) & |
|
7819 |
(ALL (x::'q_49389::type => 'q_49300::type) (xa::'q_49389::type => bool) |
|
7820 |
xb::'q_49389::type => bool. |
|
7821 |
support u_4247 x (hollight.UNION xa xb) = |
|
7822 |
hollight.UNION (support u_4247 x xa) (support u_4247 x xb)) & |
|
7823 |
(ALL (x::'q_49427::type => 'q_49300::type) (xa::'q_49427::type => bool) |
|
7824 |
xb::'q_49427::type => bool. |
|
7825 |
support u_4247 x (hollight.INTER xa xb) = |
|
7826 |
hollight.INTER (support u_4247 x xa) (support u_4247 x xb)) & |
|
7827 |
(ALL (x::'q_49463::type => 'q_49300::type) (xa::'q_49463::type => bool) |
|
7828 |
xb::'q_49463::type => bool. |
|
7829 |
support u_4247 x (DIFF xa xb) = |
|
7830 |
DIFF (support u_4247 x xa) (support u_4247 x xb))" |
|
17644 | 7831 |
by (import hollight SUPPORT_CLAUSES) |
7832 |
||
19093 | 7833 |
lemma ITERATE_SUPPORT: "ALL (x::'q_49484::type => 'q_49484::type => 'q_49484::type) |
7834 |
(xa::'q_49485::type => 'q_49484::type) xb::'q_49485::type => bool. |
|
17644 | 7835 |
FINITE (support x xa xb) --> |
7836 |
iterate x (support x xa xb) xa = iterate x xb xa" |
|
7837 |
by (import hollight ITERATE_SUPPORT) |
|
7838 |
||
19093 | 7839 |
lemma SUPPORT_DELTA: "ALL (x::'q_49529::type => 'q_49529::type => 'q_49529::type) |
7840 |
(xa::'q_49557::type => bool) (xb::'q_49557::type => 'q_49529::type) |
|
7841 |
xc::'q_49557::type. |
|
7842 |
support x (%xa::'q_49557::type. COND (xa = xc) (xb xa) (neutral x)) xa = |
|
17644 | 7843 |
COND (IN xc xa) (support x xb (INSERT xc EMPTY)) EMPTY" |
7844 |
by (import hollight SUPPORT_DELTA) |
|
7845 |
||
19093 | 7846 |
lemma FINITE_SUPPORT_DELTA: "ALL (x::'q_49578::type => 'q_49578::type => 'q_49578::type) |
7847 |
(xa::'q_49587::type => 'q_49578::type) xb::'q_49587::type. |
|
17644 | 7848 |
FINITE |
19093 | 7849 |
(support x (%xc::'q_49587::type. COND (xc = xb) (xa xc) (neutral x)) |
7850 |
(s::'q_49587::type => bool))" |
|
17644 | 7851 |
by (import hollight FINITE_SUPPORT_DELTA) |
7852 |
||
19093 | 7853 |
lemma ITERATE_CLAUSES_GEN: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7854 |
monoidal u_4247 --> |
|
7855 |
(ALL f::'A::type => 'B::type. iterate u_4247 EMPTY f = neutral u_4247) & |
|
17644 | 7856 |
(ALL (f::'A::type => 'B::type) (x::'A::type) s::'A::type => bool. |
19093 | 7857 |
monoidal u_4247 & FINITE (support u_4247 f s) --> |
7858 |
iterate u_4247 (INSERT x s) f = |
|
7859 |
COND (IN x s) (iterate u_4247 s f) |
|
7860 |
(u_4247 (f x) (iterate u_4247 s f)))" |
|
17644 | 7861 |
by (import hollight ITERATE_CLAUSES_GEN) |
7862 |
||
19093 | 7863 |
lemma ITERATE_CLAUSES: "ALL x::'q_49755::type => 'q_49755::type => 'q_49755::type. |
17644 | 7864 |
monoidal x --> |
19093 | 7865 |
(ALL f::'q_49713::type => 'q_49755::type. |
17644 | 7866 |
iterate x EMPTY f = neutral x) & |
19093 | 7867 |
(ALL (f::'q_49757::type => 'q_49755::type) (xa::'q_49757::type) |
7868 |
s::'q_49757::type => bool. |
|
17644 | 7869 |
FINITE s --> |
7870 |
iterate x (INSERT xa s) f = |
|
7871 |
COND (IN xa s) (iterate x s f) (x (f xa) (iterate x s f)))" |
|
7872 |
by (import hollight ITERATE_CLAUSES) |
|
7873 |
||
19093 | 7874 |
lemma ITERATE_UNION: "ALL u_4247::'q_49843::type => 'q_49843::type => 'q_49843::type. |
7875 |
monoidal u_4247 --> |
|
7876 |
(ALL (f::'q_49828::type => 'q_49843::type) (s::'q_49828::type => bool) |
|
7877 |
x::'q_49828::type => bool. |
|
17644 | 7878 |
FINITE s & FINITE x & DISJOINT s x --> |
19093 | 7879 |
iterate u_4247 (hollight.UNION s x) f = |
7880 |
u_4247 (iterate u_4247 s f) (iterate u_4247 x f))" |
|
17644 | 7881 |
by (import hollight ITERATE_UNION) |
7882 |
||
19093 | 7883 |
lemma ITERATE_UNION_GEN: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7884 |
monoidal u_4247 --> |
|
17644 | 7885 |
(ALL (f::'A::type => 'B::type) (s::'A::type => bool) t::'A::type => bool. |
19093 | 7886 |
FINITE (support u_4247 f s) & |
7887 |
FINITE (support u_4247 f t) & |
|
7888 |
DISJOINT (support u_4247 f s) (support u_4247 f t) --> |
|
7889 |
iterate u_4247 (hollight.UNION s t) f = |
|
7890 |
u_4247 (iterate u_4247 s f) (iterate u_4247 t f))" |
|
17644 | 7891 |
by (import hollight ITERATE_UNION_GEN) |
7892 |
||
19093 | 7893 |
lemma ITERATE_DIFF: "ALL u::'q_49986::type => 'q_49986::type => 'q_49986::type. |
17644 | 7894 |
monoidal u --> |
19093 | 7895 |
(ALL (f::'q_49982::type => 'q_49986::type) (s::'q_49982::type => bool) |
7896 |
t::'q_49982::type => bool. |
|
17644 | 7897 |
FINITE s & SUBSET t s --> |
7898 |
u (iterate u (DIFF s t) f) (iterate u t f) = iterate u s f)" |
|
7899 |
by (import hollight ITERATE_DIFF) |
|
7900 |
||
19093 | 7901 |
lemma ITERATE_DIFF_GEN: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7902 |
monoidal u_4247 --> |
|
17644 | 7903 |
(ALL (f::'A::type => 'B::type) (s::'A::type => bool) t::'A::type => bool. |
19093 | 7904 |
FINITE (support u_4247 f s) & |
7905 |
SUBSET (support u_4247 f t) (support u_4247 f s) --> |
|
7906 |
u_4247 (iterate u_4247 (DIFF s t) f) (iterate u_4247 t f) = |
|
7907 |
iterate u_4247 s f)" |
|
17644 | 7908 |
by (import hollight ITERATE_DIFF_GEN) |
7909 |
||
19093 | 7910 |
lemma ITERATE_CLOSED: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7911 |
monoidal u_4247 --> |
|
17644 | 7912 |
(ALL P::'B::type => bool. |
19093 | 7913 |
P (neutral u_4247) & |
7914 |
(ALL (x::'B::type) y::'B::type. P x & P y --> P (u_4247 x y)) --> |
|
17644 | 7915 |
(ALL (f::'A::type => 'B::type) x::'A::type => bool. |
7916 |
FINITE x & (ALL xa::'A::type. IN xa x --> P (f xa)) --> |
|
19093 | 7917 |
P (iterate u_4247 x f)))" |
17644 | 7918 |
by (import hollight ITERATE_CLOSED) |
7919 |
||
19093 | 7920 |
lemma ITERATE_CLOSED_GEN: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7921 |
monoidal u_4247 --> |
|
17644 | 7922 |
(ALL P::'B::type => bool. |
19093 | 7923 |
P (neutral u_4247) & |
7924 |
(ALL (x::'B::type) y::'B::type. P x & P y --> P (u_4247 x y)) --> |
|
17644 | 7925 |
(ALL (f::'A::type => 'B::type) s::'A::type => bool. |
19093 | 7926 |
FINITE (support u_4247 f s) & |
7927 |
(ALL x::'A::type. IN x s & f x ~= neutral u_4247 --> P (f x)) --> |
|
7928 |
P (iterate u_4247 s f)))" |
|
17644 | 7929 |
by (import hollight ITERATE_CLOSED_GEN) |
7930 |
||
19093 | 7931 |
lemma ITERATE_RELATED: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7932 |
monoidal u_4247 --> |
|
17644 | 7933 |
(ALL R::'B::type => 'B::type => bool. |
19093 | 7934 |
R (neutral u_4247) (neutral u_4247) & |
17644 | 7935 |
(ALL (x1::'B::type) (y1::'B::type) (x2::'B::type) y2::'B::type. |
19093 | 7936 |
R x1 x2 & R y1 y2 --> R (u_4247 x1 y1) (u_4247 x2 y2)) --> |
17644 | 7937 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) |
7938 |
x::'A::type => bool. |
|
7939 |
FINITE x & (ALL xa::'A::type. IN xa x --> R (f xa) (g xa)) --> |
|
19093 | 7940 |
R (iterate u_4247 x f) (iterate u_4247 x g)))" |
17644 | 7941 |
by (import hollight ITERATE_RELATED) |
7942 |
||
19093 | 7943 |
lemma ITERATE_EQ_NEUTRAL: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7944 |
monoidal u_4247 --> |
|
17644 | 7945 |
(ALL (f::'A::type => 'B::type) s::'A::type => bool. |
19093 | 7946 |
(ALL x::'A::type. IN x s --> f x = neutral u_4247) --> |
7947 |
iterate u_4247 s f = neutral u_4247)" |
|
17644 | 7948 |
by (import hollight ITERATE_EQ_NEUTRAL) |
7949 |
||
7950 |
lemma ITERATE_SING: "ALL x::'B::type => 'B::type => 'B::type. |
|
7951 |
monoidal x --> |
|
7952 |
(ALL (f::'A::type => 'B::type) xa::'A::type. |
|
7953 |
iterate x (INSERT xa EMPTY) f = f xa)" |
|
7954 |
by (import hollight ITERATE_SING) |
|
7955 |
||
19093 | 7956 |
lemma ITERATE_DELTA: "ALL u_4247::'q_50438::type => 'q_50438::type => 'q_50438::type. |
7957 |
monoidal u_4247 --> |
|
7958 |
(ALL (x::'q_50457::type => 'q_50438::type) (xa::'q_50457::type) |
|
7959 |
xb::'q_50457::type => bool. |
|
7960 |
iterate u_4247 xb |
|
7961 |
(%xb::'q_50457::type. COND (xb = xa) (x xb) (neutral u_4247)) = |
|
7962 |
COND (IN xa xb) (x xa) (neutral u_4247))" |
|
17644 | 7963 |
by (import hollight ITERATE_DELTA) |
7964 |
||
19093 | 7965 |
lemma ITERATE_IMAGE: "ALL u_4247::'q_50536::type => 'q_50536::type => 'q_50536::type. |
7966 |
monoidal u_4247 --> |
|
7967 |
(ALL (f::'q_50535::type => 'q_50507::type) |
|
7968 |
(g::'q_50507::type => 'q_50536::type) x::'q_50535::type => bool. |
|
17644 | 7969 |
FINITE x & |
19093 | 7970 |
(ALL (xa::'q_50535::type) y::'q_50535::type. |
17644 | 7971 |
IN xa x & IN y x & f xa = f y --> xa = y) --> |
19093 | 7972 |
iterate u_4247 (IMAGE f x) g = iterate u_4247 x (g o f))" |
17644 | 7973 |
by (import hollight ITERATE_IMAGE) |
7974 |
||
19093 | 7975 |
lemma ITERATE_BIJECTION: "ALL u_4247::'B::type => 'B::type => 'B::type. |
7976 |
monoidal u_4247 --> |
|
7977 |
(ALL (f::'A::type => 'B::type) (p::'A::type => 'A::type) |
|
7978 |
s::'A::type => bool. |
|
7979 |
FINITE s & |
|
7980 |
(ALL x::'A::type. IN x s --> IN (p x) s) & |
|
7981 |
(ALL y::'A::type. IN y s --> (EX! x::'A::type. IN x s & p x = y)) --> |
|
7982 |
iterate u_4247 s f = iterate u_4247 s (f o p))" |
|
7983 |
by (import hollight ITERATE_BIJECTION) |
|
7984 |
||
7985 |
lemma ITERATE_ITERATE_PRODUCT: "ALL u_4247::'C::type => 'C::type => 'C::type. |
|
7986 |
monoidal u_4247 --> |
|
7987 |
(ALL (x::'A::type => bool) (xa::'A::type => 'B::type => bool) |
|
7988 |
xb::'A::type => 'B::type => 'C::type. |
|
7989 |
FINITE x & (ALL i::'A::type. IN i x --> FINITE (xa i)) --> |
|
7990 |
iterate u_4247 x (%i::'A::type. iterate u_4247 (xa i) (xb i)) = |
|
7991 |
iterate u_4247 |
|
7992 |
(GSPEC |
|
7993 |
(%u::'A::type * 'B::type. |
|
7994 |
EX (i::'A::type) j::'B::type. |
|
7995 |
SETSPEC u (IN i x & IN j (xa i)) (i, j))) |
|
7996 |
(GABS |
|
7997 |
(%f::'A::type * 'B::type => 'C::type. |
|
7998 |
ALL (i::'A::type) j::'B::type. GEQ (f (i, j)) (xb i j))))" |
|
7999 |
by (import hollight ITERATE_ITERATE_PRODUCT) |
|
8000 |
||
8001 |
lemma ITERATE_EQ: "ALL u_4247::'q_50867::type => 'q_50867::type => 'q_50867::type. |
|
8002 |
monoidal u_4247 --> |
|
8003 |
(ALL (f::'q_50871::type => 'q_50867::type) |
|
8004 |
(g::'q_50871::type => 'q_50867::type) x::'q_50871::type => bool. |
|
8005 |
FINITE x & (ALL xa::'q_50871::type. IN xa x --> f xa = g xa) --> |
|
8006 |
iterate u_4247 x f = iterate u_4247 x g)" |
|
8007 |
by (import hollight ITERATE_EQ) |
|
8008 |
||
8009 |
lemma ITERATE_EQ_GENERAL: "ALL u_4247::'C::type => 'C::type => 'C::type. |
|
8010 |
monoidal u_4247 --> |
|
8011 |
(ALL (s::'A::type => bool) (t::'B::type => bool) |
|
8012 |
(f::'A::type => 'C::type) (g::'B::type => 'C::type) |
|
8013 |
h::'A::type => 'B::type. |
|
8014 |
FINITE s & |
|
8015 |
(ALL y::'B::type. IN y t --> (EX! x::'A::type. IN x s & h x = y)) & |
|
8016 |
(ALL x::'A::type. IN x s --> IN (h x) t & g (h x) = f x) --> |
|
8017 |
iterate u_4247 s f = iterate u_4247 t g)" |
|
8018 |
by (import hollight ITERATE_EQ_GENERAL) |
|
8019 |
||
8020 |
constdefs |
|
8021 |
nsum :: "('q_51017 => bool) => ('q_51017 => nat) => nat" |
|
8022 |
"(op ==::(('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
|
8023 |
=> (('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
|
17644 | 8024 |
=> prop) |
19093 | 8025 |
(nsum::('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
17644 | 8026 |
((iterate::(nat => nat => nat) |
19093 | 8027 |
=> ('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
8028 |
(HOL.plus::nat => nat => nat))" |
17644 | 8029 |
|
19093 | 8030 |
lemma DEF_nsum: "(op =::(('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
8031 |
=> (('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
|
17644 | 8032 |
=> bool) |
19093 | 8033 |
(nsum::('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
17644 | 8034 |
((iterate::(nat => nat => nat) |
19093 | 8035 |
=> ('q_51017::type => bool) => ('q_51017::type => nat) => nat) |
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
8036 |
(HOL.plus::nat => nat => nat))" |
17644 | 8037 |
by (import hollight DEF_nsum) |
8038 |
||
17652 | 8039 |
lemma NEUTRAL_ADD: "(op =::nat => nat => bool) |
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
8040 |
((neutral::(nat => nat => nat) => nat) (HOL.plus::nat => nat => nat)) (0::nat)" |
17644 | 8041 |
by (import hollight NEUTRAL_ADD) |
8042 |
||
17652 | 8043 |
lemma NEUTRAL_MUL: "neutral op * = NUMERAL_BIT1 0" |
17644 | 8044 |
by (import hollight NEUTRAL_MUL) |
8045 |
||
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
8046 |
lemma MONOIDAL_ADD: "(monoidal::(nat => nat => nat) => bool) (HOL.plus::nat => nat => nat)" |
17644 | 8047 |
by (import hollight MONOIDAL_ADD) |
8048 |
||
8049 |
lemma MONOIDAL_MUL: "(monoidal::(nat => nat => nat) => bool) (op *::nat => nat => nat)" |
|
8050 |
by (import hollight MONOIDAL_MUL) |
|
8051 |
||
19093 | 8052 |
lemma NSUM_CLAUSES: "(ALL x::'q_51055::type => nat. nsum EMPTY x = 0) & |
8053 |
(ALL (x::'q_51094::type) (xa::'q_51094::type => nat) |
|
8054 |
xb::'q_51094::type => bool. |
|
17644 | 8055 |
FINITE xb --> |
8056 |
nsum (INSERT x xb) xa = COND (IN x xb) (nsum xb xa) (xa x + nsum xb xa))" |
|
8057 |
by (import hollight NSUM_CLAUSES) |
|
8058 |
||
19093 | 8059 |
lemma NSUM_UNION: "ALL (x::'q_51120::type => nat) (xa::'q_51120::type => bool) |
8060 |
xb::'q_51120::type => bool. |
|
17644 | 8061 |
FINITE xa & FINITE xb & DISJOINT xa xb --> |
8062 |
nsum (hollight.UNION xa xb) x = nsum xa x + nsum xb x" |
|
8063 |
by (import hollight NSUM_UNION) |
|
8064 |
||
19093 | 8065 |
lemma NSUM_DIFF: "ALL (f::'q_51175::type => nat) (s::'q_51175::type => bool) |
8066 |
t::'q_51175::type => bool. |
|
17644 | 8067 |
FINITE s & SUBSET t s --> nsum (DIFF s t) f = nsum s f - nsum t f" |
8068 |
by (import hollight NSUM_DIFF) |
|
8069 |
||
19093 | 8070 |
lemma NSUM_SUPPORT: "ALL (x::'q_51214::type => nat) xa::'q_51214::type => bool. |
19233
77ca20b0ed77
renamed HOL + - * etc. to HOL.plus HOL.minus HOL.times etc.
haftmann
parents:
19093
diff
changeset
|
8071 |
FINITE (support HOL.plus x xa) --> nsum (support HOL.plus x xa) x = nsum xa x" |
17644 | 8072 |
by (import hollight NSUM_SUPPORT) |
8073 |
||
19093 | 8074 |
lemma NSUM_ADD: "ALL (f::'q_51260::type => nat) (g::'q_51260::type => nat) |
8075 |
s::'q_51260::type => bool. |
|
8076 |
FINITE s --> nsum s (%x::'q_51260::type. f x + g x) = nsum s f + nsum s g" |
|
17644 | 8077 |
by (import hollight NSUM_ADD) |
8078 |
||
19093 | 8079 |
lemma NSUM_CMUL: "ALL (f::'q_51298::type => nat) (c::nat) s::'q_51298::type => bool. |
8080 |
FINITE s --> nsum s (%x::'q_51298::type. c * f x) = c * nsum s f" |
|
17644 | 8081 |
by (import hollight NSUM_CMUL) |
8082 |
||
19093 | 8083 |
lemma NSUM_LE: "ALL (x::'q_51337::type => nat) (xa::'q_51337::type => nat) |
8084 |
xb::'q_51337::type => bool. |
|
8085 |
FINITE xb & (ALL xc::'q_51337::type. IN xc xb --> <= (x xc) (xa xc)) --> |
|
17644 | 8086 |
<= (nsum xb x) (nsum xb xa)" |
8087 |
by (import hollight NSUM_LE) |
|
8088 |
||
8089 |
lemma NSUM_LT: "ALL (f::'A::type => nat) (g::'A::type => nat) s::'A::type => bool. |
|
8090 |
FINITE s & |
|
8091 |
(ALL x::'A::type. IN x s --> <= (f x) (g x)) & |
|
8092 |
(EX x::'A::type. IN x s & < (f x) (g x)) --> |
|
8093 |
< (nsum s f) (nsum s g)" |
|
8094 |
by (import hollight NSUM_LT) |
|
8095 |
||
19093 | 8096 |
lemma NSUM_LT_ALL: "ALL (f::'q_51459::type => nat) (g::'q_51459::type => nat) |
8097 |
s::'q_51459::type => bool. |
|
17644 | 8098 |
FINITE s & |
19093 | 8099 |
s ~= EMPTY & (ALL x::'q_51459::type. IN x s --> < (f x) (g x)) --> |
17644 | 8100 |
< (nsum s f) (nsum s g)" |
8101 |
by (import hollight NSUM_LT_ALL) |
|
8102 |
||
19093 | 8103 |
lemma NSUM_EQ: "ALL (x::'q_51501::type => nat) (xa::'q_51501::type => nat) |
8104 |
xb::'q_51501::type => bool. |
|
8105 |
FINITE xb & (ALL xc::'q_51501::type. IN xc xb --> x xc = xa xc) --> |
|
17644 | 8106 |
nsum xb x = nsum xb xa" |
8107 |
by (import hollight NSUM_EQ) |
|
8108 |
||
19093 | 8109 |
lemma NSUM_CONST: "ALL (c::nat) s::'q_51531::type => bool. |
8110 |
FINITE s --> nsum s (%n::'q_51531::type. c) = CARD s * c" |
|
17644 | 8111 |
by (import hollight NSUM_CONST) |
8112 |
||
8113 |
lemma NSUM_EQ_0: "ALL (x::'A::type => nat) xa::'A::type => bool. |
|
17652 | 8114 |
(ALL xb::'A::type. IN xb xa --> x xb = 0) --> nsum xa x = 0" |
17644 | 8115 |
by (import hollight NSUM_EQ_0) |
8116 |
||
17652 | 8117 |
lemma NSUM_0: "ALL x::'A::type => bool. nsum x (%n::'A::type. 0) = 0" |
17644 | 8118 |
by (import hollight NSUM_0) |
8119 |
||
19093 | 8120 |
lemma NSUM_POS_LE: "ALL (x::'q_51610::type => nat) xa::'q_51610::type => bool. |
8121 |
FINITE xa & (ALL xb::'q_51610::type. IN xb xa --> <= 0 (x xb)) --> |
|
17652 | 8122 |
<= 0 (nsum xa x)" |
17644 | 8123 |
by (import hollight NSUM_POS_LE) |
8124 |
||
8125 |
lemma NSUM_POS_BOUND: "ALL (f::'A::type => nat) (b::nat) x::'A::type => bool. |
|
8126 |
FINITE x & |
|
17652 | 8127 |
(ALL xa::'A::type. IN xa x --> <= 0 (f xa)) & <= (nsum x f) b --> |
17644 | 8128 |
(ALL xa::'A::type. IN xa x --> <= (f xa) b)" |
8129 |
by (import hollight NSUM_POS_BOUND) |
|
8130 |
||
19093 | 8131 |
lemma NSUM_POS_EQ_0: "ALL (x::'q_51745::type => nat) xa::'q_51745::type => bool. |
17644 | 8132 |
FINITE xa & |
19093 | 8133 |
(ALL xb::'q_51745::type. IN xb xa --> <= 0 (x xb)) & nsum xa x = 0 --> |
8134 |
(ALL xb::'q_51745::type. IN xb xa --> x xb = 0)" |
|
17644 | 8135 |
by (import hollight NSUM_POS_EQ_0) |
8136 |
||
19093 | 8137 |
lemma NSUM_SING: "ALL (x::'q_51765::type => nat) xa::'q_51765::type. |
17644 | 8138 |
nsum (INSERT xa EMPTY) x = x xa" |
8139 |
by (import hollight NSUM_SING) |
|
8140 |
||
8141 |
lemma NSUM_DELTA: "ALL (x::'A::type => bool) xa::'A::type. |
|
17652 | 8142 |
nsum x (%x::'A::type. COND (x = xa) (b::nat) 0) = COND (IN xa x) b 0" |
17644 | 8143 |
by (import hollight NSUM_DELTA) |
8144 |
||
8145 |
lemma NSUM_SWAP: "ALL (f::'A::type => 'B::type => nat) (x::'A::type => bool) |
|
8146 |
xa::'B::type => bool. |
|
8147 |
FINITE x & FINITE xa --> |
|
8148 |
nsum x (%i::'A::type. nsum xa (f i)) = |
|
8149 |
nsum xa (%j::'B::type. nsum x (%i::'A::type. f i j))" |
|
8150 |
by (import hollight NSUM_SWAP) |
|
8151 |
||
19093 | 8152 |
lemma NSUM_IMAGE: "ALL (x::'q_51905::type => 'q_51881::type) (xa::'q_51881::type => nat) |
8153 |
xb::'q_51905::type => bool. |
|
17644 | 8154 |
FINITE xb & |
19093 | 8155 |
(ALL (xa::'q_51905::type) y::'q_51905::type. |
17644 | 8156 |
IN xa xb & IN y xb & x xa = x y --> xa = y) --> |
8157 |
nsum (IMAGE x xb) xa = nsum xb (xa o x)" |
|
8158 |
by (import hollight NSUM_IMAGE) |
|
8159 |
||
8160 |
lemma NSUM_SUPERSET: "ALL (f::'A::type => nat) (u::'A::type => bool) v::'A::type => bool. |
|
8161 |
FINITE u & |
|
17652 | 8162 |
SUBSET u v & (ALL x::'A::type. IN x v & ~ IN x u --> f x = 0) --> |
17644 | 8163 |
nsum v f = nsum u f" |
8164 |
by (import hollight NSUM_SUPERSET) |
|
8165 |
||
8166 |
lemma NSUM_UNION_RZERO: "ALL (f::'A::type => nat) (u::'A::type => bool) v::'A::type => bool. |
|
17652 | 8167 |
FINITE u & (ALL x::'A::type. IN x v & ~ IN x u --> f x = 0) --> |
17644 | 8168 |
nsum (hollight.UNION u v) f = nsum u f" |
8169 |
by (import hollight NSUM_UNION_RZERO) |
|
8170 |
||
8171 |
lemma NSUM_UNION_LZERO: "ALL (f::'A::type => nat) (u::'A::type => bool) v::'A::type => bool. |
|
17652 | 8172 |
FINITE v & (ALL x::'A::type. IN x u & ~ IN x v --> f x = 0) --> |
17644 | 8173 |
nsum (hollight.UNION u v) f = nsum v f" |
8174 |
by (import hollight NSUM_UNION_LZERO) |
|
8175 |
||
19093 | 8176 |
lemma NSUM_RESTRICT: "ALL (f::'q_52126::type => nat) s::'q_52126::type => bool. |
17644 | 8177 |
FINITE s --> |
19093 | 8178 |
nsum s (%x::'q_52126::type. COND (IN x s) (f x) 0) = nsum s f" |
17644 | 8179 |
by (import hollight NSUM_RESTRICT) |
8180 |
||
8181 |
lemma NSUM_BOUND: "ALL (x::'A::type => bool) (xa::'A::type => nat) xb::nat. |
|
8182 |
FINITE x & (ALL xc::'A::type. IN xc x --> <= (xa xc) xb) --> |
|
8183 |
<= (nsum x xa) (CARD x * xb)" |
|
8184 |
by (import hollight NSUM_BOUND) |
|
8185 |
||
19093 | 8186 |
lemma NSUM_BOUND_GEN: "ALL (x::'A::type => bool) (xa::'q_52201::type) b::nat. |
17644 | 8187 |
FINITE x & |
8188 |
x ~= EMPTY & |
|
8189 |
(ALL xa::'A::type. |
|
8190 |
IN xa x --> <= ((f::'A::type => nat) xa) (DIV b (CARD x))) --> |
|
8191 |
<= (nsum x f) b" |
|
8192 |
by (import hollight NSUM_BOUND_GEN) |
|
8193 |
||
8194 |
lemma NSUM_BOUND_LT: "ALL (s::'A::type => bool) (f::'A::type => nat) b::nat. |
|
8195 |
FINITE s & |
|
8196 |
(ALL x::'A::type. IN x s --> <= (f x) b) & |
|
8197 |
(EX x::'A::type. IN x s & < (f x) b) --> |
|
8198 |
< (nsum s f) (CARD s * b)" |
|
8199 |
by (import hollight NSUM_BOUND_LT) |
|
8200 |
||
19093 | 8201 |
lemma NSUM_BOUND_LT_ALL: "ALL (s::'q_52344::type => bool) (f::'q_52344::type => nat) b::nat. |
8202 |
FINITE s & s ~= EMPTY & (ALL x::'q_52344::type. IN x s --> < (f x) b) --> |
|
17644 | 8203 |
< (nsum s f) (CARD s * b)" |
8204 |
by (import hollight NSUM_BOUND_LT_ALL) |
|
8205 |
||
19093 | 8206 |
lemma NSUM_BOUND_LT_GEN: "ALL (s::'A::type => bool) (t::'q_52386::type) b::nat. |
17644 | 8207 |
FINITE s & |
8208 |
s ~= EMPTY & |
|
8209 |
(ALL x::'A::type. |
|
8210 |
IN x s --> < ((f::'A::type => nat) x) (DIV b (CARD s))) --> |
|
8211 |
< (nsum s f) b" |
|
8212 |
by (import hollight NSUM_BOUND_LT_GEN) |
|
8213 |
||
19093 | 8214 |
lemma NSUM_UNION_EQ: "ALL (s::'q_52445::type => bool) (t::'q_52445::type => bool) |
8215 |
u::'q_52445::type => bool. |
|
17644 | 8216 |
FINITE u & hollight.INTER s t = EMPTY & hollight.UNION s t = u --> |
19093 | 8217 |
nsum s (f::'q_52445::type => nat) + nsum t f = nsum u f" |
17644 | 8218 |
by (import hollight NSUM_UNION_EQ) |
8219 |
||
8220 |
lemma NSUM_EQ_SUPERSET: "ALL (f::'A::type => nat) (s::'A::type => bool) t::'A::type => bool. |
|
8221 |
FINITE t & |
|
8222 |
SUBSET t s & |
|
8223 |
(ALL x::'A::type. IN x t --> f x = (g::'A::type => nat) x) & |
|
17652 | 8224 |
(ALL x::'A::type. IN x s & ~ IN x t --> f x = 0) --> |
17644 | 8225 |
nsum s f = nsum t g" |
8226 |
by (import hollight NSUM_EQ_SUPERSET) |
|
8227 |
||
19093 | 8228 |
lemma NSUM_RESTRICT_SET: "ALL (s::'A::type => bool) (f::'A::type => nat) r::'q_52556::type. |
17644 | 8229 |
FINITE s --> |
8230 |
nsum |
|
8231 |
(GSPEC |
|
8232 |
(%u::'A::type. |
|
8233 |
EX x::'A::type. SETSPEC u (IN x s & (P::'A::type => bool) x) x)) |
|
8234 |
f = |
|
17652 | 8235 |
nsum s (%x::'A::type. COND (P x) (f x) 0)" |
17644 | 8236 |
by (import hollight NSUM_RESTRICT_SET) |
8237 |
||
19093 | 8238 |
lemma NSUM_NSUM_RESTRICT: "ALL (R::'q_52685::type => 'q_52684::type => bool) |
8239 |
(f::'q_52685::type => 'q_52684::type => nat) (s::'q_52685::type => bool) |
|
8240 |
t::'q_52684::type => bool. |
|
17644 | 8241 |
FINITE s & FINITE t --> |
8242 |
nsum s |
|
19093 | 8243 |
(%x::'q_52685::type. |
17644 | 8244 |
nsum |
8245 |
(GSPEC |
|
19093 | 8246 |
(%u::'q_52684::type. |
8247 |
EX y::'q_52684::type. SETSPEC u (IN y t & R x y) y)) |
|
17644 | 8248 |
(f x)) = |
8249 |
nsum t |
|
19093 | 8250 |
(%y::'q_52684::type. |
17644 | 8251 |
nsum |
8252 |
(GSPEC |
|
19093 | 8253 |
(%u::'q_52685::type. |
8254 |
EX x::'q_52685::type. SETSPEC u (IN x s & R x y) x)) |
|
8255 |
(%x::'q_52685::type. f x y))" |
|
17644 | 8256 |
by (import hollight NSUM_NSUM_RESTRICT) |
8257 |
||
19093 | 8258 |
lemma CARD_EQ_NSUM: "ALL x::'q_52704::type => bool. |
8259 |
FINITE x --> CARD x = nsum x (%x::'q_52704::type. NUMERAL_BIT1 0)" |
|
17644 | 8260 |
by (import hollight CARD_EQ_NSUM) |
8261 |
||
8262 |
lemma NSUM_MULTICOUNT_GEN: "ALL (R::'A::type => 'B::type => bool) (s::'A::type => bool) |
|
8263 |
(t::'B::type => bool) k::'B::type => nat. |
|
8264 |
FINITE s & |
|
8265 |
FINITE t & |
|
8266 |
(ALL j::'B::type. |
|
8267 |
IN j t --> |
|
8268 |
CARD |
|
8269 |
(GSPEC |
|
8270 |
(%u::'A::type. EX i::'A::type. SETSPEC u (IN i s & R i j) i)) = |
|
8271 |
k j) --> |
|
8272 |
nsum s |
|
8273 |
(%i::'A::type. |
|
8274 |
CARD |
|
8275 |
(GSPEC |
|
8276 |
(%u::'B::type. EX j::'B::type. SETSPEC u (IN j t & R i j) j))) = |
|
8277 |
nsum t k" |
|
8278 |
by (import hollight NSUM_MULTICOUNT_GEN) |
|
8279 |
||
8280 |
lemma NSUM_MULTICOUNT: "ALL (R::'A::type => 'B::type => bool) (s::'A::type => bool) |
|
8281 |
(t::'B::type => bool) k::nat. |
|
8282 |
FINITE s & |
|
8283 |
FINITE t & |
|
8284 |
(ALL j::'B::type. |
|
8285 |
IN j t --> |
|
8286 |
CARD |
|
8287 |
(GSPEC |
|
8288 |
(%u::'A::type. EX i::'A::type. SETSPEC u (IN i s & R i j) i)) = |
|
8289 |
k) --> |
|
8290 |
nsum s |
|
8291 |
(%i::'A::type. |
|
8292 |
CARD |
|
8293 |
(GSPEC |
|
8294 |
(%u::'B::type. EX j::'B::type. SETSPEC u (IN j t & R i j) j))) = |
|
8295 |
k * CARD t" |
|
8296 |
by (import hollight NSUM_MULTICOUNT) |
|
8297 |
||
8298 |
lemma NSUM_IMAGE_GEN: "ALL (f::'A::type => 'B::type) (g::'A::type => nat) s::'A::type => bool. |
|
8299 |
FINITE s --> |
|
8300 |
nsum s g = |
|
8301 |
nsum (IMAGE f s) |
|
8302 |
(%y::'B::type. |
|
8303 |
nsum |
|
8304 |
(GSPEC |
|
8305 |
(%u::'A::type. EX x::'A::type. SETSPEC u (IN x s & f x = y) x)) |
|
8306 |
g)" |
|
8307 |
by (import hollight NSUM_IMAGE_GEN) |
|
8308 |
||
8309 |
lemma NSUM_SUBSET: "ALL (u::'A::type => bool) (v::'A::type => bool) f::'A::type => nat. |
|
17652 | 8310 |
FINITE u & FINITE v & (ALL x::'A::type. IN x (DIFF u v) --> f x = 0) --> |
17644 | 8311 |
<= (nsum u f) (nsum v f)" |
8312 |
by (import hollight NSUM_SUBSET) |
|
8313 |
||
19093 | 8314 |
lemma NSUM_SUBSET_SIMPLE: "ALL (u::'q_53164::type => bool) (v::'q_53164::type => bool) |
8315 |
f::'q_53164::type => nat. |
|
17644 | 8316 |
FINITE v & SUBSET u v --> <= (nsum u f) (nsum v f)" |
8317 |
by (import hollight NSUM_SUBSET_SIMPLE) |
|
8318 |
||
8319 |
lemma NSUM_ADD_NUMSEG: "ALL (x::nat => nat) (xa::nat => nat) (xb::nat) xc::nat. |
|
8320 |
nsum (dotdot xb xc) (%i::nat. x i + xa i) = |
|
8321 |
nsum (dotdot xb xc) x + nsum (dotdot xb xc) xa" |
|
8322 |
by (import hollight NSUM_ADD_NUMSEG) |
|
8323 |
||
8324 |
lemma NSUM_CMUL_NUMSEG: "ALL (x::nat => nat) (xa::nat) (xb::nat) xc::nat. |
|
8325 |
nsum (dotdot xb xc) (%i::nat. xa * x i) = xa * nsum (dotdot xb xc) x" |
|
8326 |
by (import hollight NSUM_CMUL_NUMSEG) |
|
8327 |
||
8328 |
lemma NSUM_LE_NUMSEG: "ALL (x::nat => nat) (xa::nat => nat) (xb::nat) xc::nat. |
|
8329 |
(ALL i::nat. <= xb i & <= i xc --> <= (x i) (xa i)) --> |
|
8330 |
<= (nsum (dotdot xb xc) x) (nsum (dotdot xb xc) xa)" |
|
8331 |
by (import hollight NSUM_LE_NUMSEG) |
|
8332 |
||
8333 |
lemma NSUM_EQ_NUMSEG: "ALL (f::nat => nat) (g::nat => nat) (m::nat) n::nat. |
|
8334 |
(ALL i::nat. <= m i & <= i n --> f i = g i) --> |
|
8335 |
nsum (dotdot m n) f = nsum (dotdot m n) g" |
|
8336 |
by (import hollight NSUM_EQ_NUMSEG) |
|
8337 |
||
8338 |
lemma NSUM_CONST_NUMSEG: "ALL (x::nat) (xa::nat) xb::nat. |
|
17652 | 8339 |
nsum (dotdot xa xb) (%n::nat. x) = (xb + NUMERAL_BIT1 0 - xa) * x" |
17644 | 8340 |
by (import hollight NSUM_CONST_NUMSEG) |
8341 |
||
19093 | 8342 |
lemma NSUM_EQ_0_NUMSEG: "ALL (x::nat => nat) xa::'q_53403::type. |
17652 | 8343 |
(ALL i::nat. <= (m::nat) i & <= i (n::nat) --> x i = 0) --> |
8344 |
nsum (dotdot m n) x = 0" |
|
17644 | 8345 |
by (import hollight NSUM_EQ_0_NUMSEG) |
8346 |
||
17652 | 8347 |
lemma NSUM_TRIV_NUMSEG: "ALL (f::nat => nat) (m::nat) n::nat. < n m --> nsum (dotdot m n) f = 0" |
17644 | 8348 |
by (import hollight NSUM_TRIV_NUMSEG) |
8349 |
||
8350 |
lemma NSUM_POS_LE_NUMSEG: "ALL (x::nat) (xa::nat) xb::nat => nat. |
|
17652 | 8351 |
(ALL p::nat. <= x p & <= p xa --> <= 0 (xb p)) --> |
8352 |
<= 0 (nsum (dotdot x xa) xb)" |
|
17644 | 8353 |
by (import hollight NSUM_POS_LE_NUMSEG) |
8354 |
||
8355 |
lemma NSUM_POS_EQ_0_NUMSEG: "ALL (f::nat => nat) (m::nat) n::nat. |
|
17652 | 8356 |
(ALL p::nat. <= m p & <= p n --> <= 0 (f p)) & |
8357 |
nsum (dotdot m n) f = 0 --> |
|
8358 |
(ALL p::nat. <= m p & <= p n --> f p = 0)" |
|
17644 | 8359 |
by (import hollight NSUM_POS_EQ_0_NUMSEG) |
8360 |
||
8361 |
lemma NSUM_SING_NUMSEG: "ALL (x::nat => nat) xa::nat. nsum (dotdot xa xa) x = x xa" |
|
8362 |
by (import hollight NSUM_SING_NUMSEG) |
|
8363 |
||
17652 | 8364 |
lemma NSUM_CLAUSES_NUMSEG: "(ALL x::nat. nsum (dotdot x 0) (f::nat => nat) = COND (x = 0) (f 0) 0) & |
17644 | 8365 |
(ALL (x::nat) xa::nat. |
8366 |
nsum (dotdot x (Suc xa)) f = |
|
8367 |
COND (<= x (Suc xa)) (nsum (dotdot x xa) f + f (Suc xa)) |
|
8368 |
(nsum (dotdot x xa) f))" |
|
8369 |
by (import hollight NSUM_CLAUSES_NUMSEG) |
|
8370 |
||
8371 |
lemma NSUM_SWAP_NUMSEG: "ALL (a::nat) (b::nat) (c::nat) (d::nat) f::nat => nat => nat. |
|
8372 |
nsum (dotdot a b) (%i::nat. nsum (dotdot c d) (f i)) = |
|
8373 |
nsum (dotdot c d) (%j::nat. nsum (dotdot a b) (%i::nat. f i j))" |
|
8374 |
by (import hollight NSUM_SWAP_NUMSEG) |
|
8375 |
||
8376 |
lemma NSUM_ADD_SPLIT: "ALL (x::nat => nat) (xa::nat) (xb::nat) xc::nat. |
|
17652 | 8377 |
<= xa (xb + NUMERAL_BIT1 0) --> |
17644 | 8378 |
nsum (dotdot xa (xb + xc)) x = |
17652 | 8379 |
nsum (dotdot xa xb) x + nsum (dotdot (xb + NUMERAL_BIT1 0) (xb + xc)) x" |
17644 | 8380 |
by (import hollight NSUM_ADD_SPLIT) |
8381 |
||
8382 |
lemma NSUM_OFFSET: "ALL (x::nat => nat) (xa::nat) xb::nat. |
|
8383 |
nsum (dotdot (xa + xb) ((n::nat) + xb)) x = |
|
8384 |
nsum (dotdot xa n) (%i::nat. x (i + xb))" |
|
8385 |
by (import hollight NSUM_OFFSET) |
|
8386 |
||
8387 |
lemma NSUM_OFFSET_0: "ALL (x::nat => nat) (xa::nat) xb::nat. |
|
8388 |
<= xa xb --> |
|
17652 | 8389 |
nsum (dotdot xa xb) x = nsum (dotdot 0 (xb - xa)) (%i::nat. x (i + xa))" |
17644 | 8390 |
by (import hollight NSUM_OFFSET_0) |
8391 |
||
8392 |
lemma NSUM_CLAUSES_LEFT: "ALL (x::nat => nat) (xa::nat) xb::nat. |
|
8393 |
<= xa xb --> |
|
17652 | 8394 |
nsum (dotdot xa xb) x = x xa + nsum (dotdot (xa + NUMERAL_BIT1 0) xb) x" |
17644 | 8395 |
by (import hollight NSUM_CLAUSES_LEFT) |
8396 |
||
8397 |
lemma NSUM_CLAUSES_RIGHT: "ALL (f::nat => nat) (m::nat) n::nat. |
|
17652 | 8398 |
< 0 n & <= m n --> |
8399 |
nsum (dotdot m n) f = nsum (dotdot m (n - NUMERAL_BIT1 0)) f + f n" |
|
17644 | 8400 |
by (import hollight NSUM_CLAUSES_RIGHT) |
8401 |
||
19093 | 8402 |
lemma NSUM_BIJECTION: "ALL (x::'A::type => nat) (xa::'A::type => 'A::type) xb::'A::type => bool. |
8403 |
FINITE xb & |
|
8404 |
(ALL x::'A::type. IN x xb --> IN (xa x) xb) & |
|
8405 |
(ALL y::'A::type. IN y xb --> (EX! x::'A::type. IN x xb & xa x = y)) --> |
|
8406 |
nsum xb x = nsum xb (x o xa)" |
|
8407 |
by (import hollight NSUM_BIJECTION) |
|
8408 |
||
8409 |
lemma NSUM_NSUM_PRODUCT: "ALL (x::'A::type => bool) (xa::'A::type => 'B::type => bool) |
|
8410 |
xb::'A::type => 'B::type => nat. |
|
8411 |
FINITE x & (ALL i::'A::type. IN i x --> FINITE (xa i)) --> |
|
8412 |
nsum x (%x::'A::type. nsum (xa x) (xb x)) = |
|
8413 |
nsum |
|
8414 |
(GSPEC |
|
8415 |
(%u::'A::type * 'B::type. |
|
8416 |
EX (i::'A::type) j::'B::type. |
|
8417 |
SETSPEC u (IN i x & IN j (xa i)) (i, j))) |
|
8418 |
(GABS |
|
8419 |
(%f::'A::type * 'B::type => nat. |
|
8420 |
ALL (i::'A::type) j::'B::type. GEQ (f (i, j)) (xb i j)))" |
|
8421 |
by (import hollight NSUM_NSUM_PRODUCT) |
|
8422 |
||
8423 |
lemma NSUM_EQ_GENERAL: "ALL (x::'A::type => bool) (xa::'B::type => bool) (xb::'A::type => nat) |
|
8424 |
(xc::'B::type => nat) xd::'A::type => 'B::type. |
|
8425 |
FINITE x & |
|
8426 |
(ALL y::'B::type. IN y xa --> (EX! xa::'A::type. IN xa x & xd xa = y)) & |
|
8427 |
(ALL xe::'A::type. IN xe x --> IN (xd xe) xa & xc (xd xe) = xb xe) --> |
|
8428 |
nsum x xb = nsum xa xc" |
|
8429 |
by (import hollight NSUM_EQ_GENERAL) |
|
8430 |
||
17644 | 8431 |
consts |
19093 | 8432 |
sum :: "('q_54215 => bool) => ('q_54215 => hollight.real) => hollight.real" |
17644 | 8433 |
|
8434 |
defs |
|
19093 | 8435 |
sum_def: "(op ==::(('q_54215::type => bool) |
8436 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
8437 |
=> (('q_54215::type => bool) |
|
8438 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
17644 | 8439 |
=> prop) |
19093 | 8440 |
(hollight.sum::('q_54215::type => bool) |
8441 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
17644 | 8442 |
((iterate::(hollight.real => hollight.real => hollight.real) |
19093 | 8443 |
=> ('q_54215::type => bool) |
8444 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
17644 | 8445 |
(real_add::hollight.real => hollight.real => hollight.real))" |
8446 |
||
19093 | 8447 |
lemma DEF_sum: "(op =::(('q_54215::type => bool) |
8448 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
8449 |
=> (('q_54215::type => bool) |
|
8450 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
17644 | 8451 |
=> bool) |
19093 | 8452 |
(hollight.sum::('q_54215::type => bool) |
8453 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
17644 | 8454 |
((iterate::(hollight.real => hollight.real => hollight.real) |
19093 | 8455 |
=> ('q_54215::type => bool) |
8456 |
=> ('q_54215::type => hollight.real) => hollight.real) |
|
17644 | 8457 |
(real_add::hollight.real => hollight.real => hollight.real))" |
8458 |
by (import hollight DEF_sum) |
|
8459 |
||
17652 | 8460 |
lemma NEUTRAL_REAL_ADD: "neutral real_add = real_of_num 0" |
17644 | 8461 |
by (import hollight NEUTRAL_REAL_ADD) |
8462 |
||
17652 | 8463 |
lemma NEUTRAL_REAL_MUL: "neutral real_mul = real_of_num (NUMERAL_BIT1 0)" |
17644 | 8464 |
by (import hollight NEUTRAL_REAL_MUL) |
8465 |
||
8466 |
lemma MONOIDAL_REAL_ADD: "monoidal real_add" |
|
8467 |
by (import hollight MONOIDAL_REAL_ADD) |
|
8468 |
||
8469 |
lemma MONOIDAL_REAL_MUL: "monoidal real_mul" |
|
8470 |
by (import hollight MONOIDAL_REAL_MUL) |
|
8471 |
||
19093 | 8472 |
lemma SUM_CLAUSES: "(ALL x::'q_54257::type => hollight.real. |
17652 | 8473 |
hollight.sum EMPTY x = real_of_num 0) & |
19093 | 8474 |
(ALL (x::'q_54298::type) (xa::'q_54298::type => hollight.real) |
8475 |
xb::'q_54298::type => bool. |
|
17644 | 8476 |
FINITE xb --> |
8477 |
hollight.sum (INSERT x xb) xa = |
|
8478 |
COND (IN x xb) (hollight.sum xb xa) |
|
8479 |
(real_add (xa x) (hollight.sum xb xa)))" |
|
8480 |
by (import hollight SUM_CLAUSES) |
|
8481 |
||
19093 | 8482 |
lemma SUM_UNION: "ALL (x::'q_54324::type => hollight.real) (xa::'q_54324::type => bool) |
8483 |
xb::'q_54324::type => bool. |
|
17644 | 8484 |
FINITE xa & FINITE xb & DISJOINT xa xb --> |
8485 |
hollight.sum (hollight.UNION xa xb) x = |
|
8486 |
real_add (hollight.sum xa x) (hollight.sum xb x)" |
|
8487 |
by (import hollight SUM_UNION) |
|
8488 |
||
19093 | 8489 |
lemma SUM_DIFF: "ALL (x::'q_54364::type => hollight.real) (xa::'q_54364::type => bool) |
8490 |
xb::'q_54364::type => bool. |
|
8491 |
FINITE xa & SUBSET xb xa --> |
|
8492 |
hollight.sum (DIFF xa xb) x = |
|
8493 |
real_sub (hollight.sum xa x) (hollight.sum xb x)" |
|
8494 |
by (import hollight SUM_DIFF) |
|
8495 |
||
8496 |
lemma SUM_SUPPORT: "ALL (x::'q_54403::type => hollight.real) xa::'q_54403::type => bool. |
|
17644 | 8497 |
FINITE (support real_add x xa) --> |
8498 |
hollight.sum (support real_add x xa) x = hollight.sum xa x" |
|
8499 |
by (import hollight SUM_SUPPORT) |
|
8500 |
||
19093 | 8501 |
lemma SUM_ADD: "ALL (f::'q_54449::type => hollight.real) |
8502 |
(g::'q_54449::type => hollight.real) s::'q_54449::type => bool. |
|
8503 |
FINITE s --> |
|
8504 |
hollight.sum s (%x::'q_54449::type. real_add (f x) (g x)) = |
|
8505 |
real_add (hollight.sum s f) (hollight.sum s g)" |
|
8506 |
by (import hollight SUM_ADD) |
|
8507 |
||
8508 |
lemma SUM_CMUL: "ALL (f::'q_54487::type => hollight.real) (c::hollight.real) |
|
8509 |
s::'q_54487::type => bool. |
|
8510 |
FINITE s --> |
|
8511 |
hollight.sum s (%x::'q_54487::type. real_mul c (f x)) = |
|
8512 |
real_mul c (hollight.sum s f)" |
|
8513 |
by (import hollight SUM_CMUL) |
|
8514 |
||
8515 |
lemma SUM_NEG: "ALL (x::'q_54530::type => hollight.real) xa::'q_54530::type => bool. |
|
8516 |
FINITE xa --> |
|
8517 |
hollight.sum xa (%xa::'q_54530::type. real_neg (x xa)) = |
|
8518 |
real_neg (hollight.sum xa x)" |
|
8519 |
by (import hollight SUM_NEG) |
|
8520 |
||
8521 |
lemma SUM_SUB: "ALL (x::'q_54565::type => hollight.real) |
|
8522 |
(xa::'q_54565::type => hollight.real) xb::'q_54565::type => bool. |
|
8523 |
FINITE xb --> |
|
8524 |
hollight.sum xb (%xb::'q_54565::type. real_sub (x xb) (xa xb)) = |
|
8525 |
real_sub (hollight.sum xb x) (hollight.sum xb xa)" |
|
8526 |
by (import hollight SUM_SUB) |
|
8527 |
||
8528 |
lemma SUM_LE: "ALL (x::'q_54607::type => hollight.real) |
|
8529 |
(xa::'q_54607::type => hollight.real) xb::'q_54607::type => bool. |
|
8530 |
FINITE xb & |
|
8531 |
(ALL xc::'q_54607::type. IN xc xb --> real_le (x xc) (xa xc)) --> |
|
8532 |
real_le (hollight.sum xb x) (hollight.sum xb xa)" |
|
8533 |
by (import hollight SUM_LE) |
|
8534 |
||
17644 | 8535 |
lemma SUM_LT: "ALL (f::'A::type => hollight.real) (g::'A::type => hollight.real) |
8536 |
s::'A::type => bool. |
|
8537 |
FINITE s & |
|
8538 |
(ALL x::'A::type. IN x s --> real_le (f x) (g x)) & |
|
8539 |
(EX x::'A::type. IN x s & real_lt (f x) (g x)) --> |
|
8540 |
real_lt (hollight.sum s f) (hollight.sum s g)" |
|
8541 |
by (import hollight SUM_LT) |
|
8542 |
||
19093 | 8543 |
lemma SUM_LT_ALL: "ALL (f::'q_54729::type => hollight.real) |
8544 |
(g::'q_54729::type => hollight.real) s::'q_54729::type => bool. |
|
17644 | 8545 |
FINITE s & |
19093 | 8546 |
s ~= EMPTY & (ALL x::'q_54729::type. IN x s --> real_lt (f x) (g x)) --> |
17644 | 8547 |
real_lt (hollight.sum s f) (hollight.sum s g)" |
8548 |
by (import hollight SUM_LT_ALL) |
|
8549 |
||
19093 | 8550 |
lemma SUM_EQ: "ALL (x::'q_54771::type => hollight.real) |
8551 |
(xa::'q_54771::type => hollight.real) xb::'q_54771::type => bool. |
|
8552 |
FINITE xb & (ALL xc::'q_54771::type. IN xc xb --> x xc = xa xc) --> |
|
8553 |
hollight.sum xb x = hollight.sum xb xa" |
|
8554 |
by (import hollight SUM_EQ) |
|
8555 |
||
8556 |
lemma SUM_ABS: "ALL (f::'q_54830::type => hollight.real) s::'q_54830::type => bool. |
|
8557 |
FINITE s --> |
|
8558 |
real_le (real_abs (hollight.sum s f)) |
|
8559 |
(hollight.sum s (%x::'q_54830::type. real_abs (f x)))" |
|
8560 |
by (import hollight SUM_ABS) |
|
8561 |
||
8562 |
lemma SUM_CONST: "ALL (c::hollight.real) s::'q_54851::type => bool. |
|
8563 |
FINITE s --> |
|
8564 |
hollight.sum s (%n::'q_54851::type. c) = |
|
8565 |
real_mul (real_of_num (CARD s)) c" |
|
8566 |
by (import hollight SUM_CONST) |
|
8567 |
||
8568 |
lemma SUM_EQ_0: "ALL (x::'A::type => hollight.real) xa::'A::type => bool. |
|
8569 |
(ALL xb::'A::type. IN xb xa --> x xb = real_of_num 0) --> |
|
8570 |
hollight.sum xa x = real_of_num 0" |
|
8571 |
by (import hollight SUM_EQ_0) |
|
8572 |
||
8573 |
lemma SUM_0: "ALL x::'A::type => bool. |
|
8574 |
hollight.sum x (%n::'A::type. real_of_num 0) = real_of_num 0" |
|
8575 |
by (import hollight SUM_0) |
|
8576 |
||
8577 |
lemma SUM_POS_LE: "ALL (x::'q_54944::type => hollight.real) xa::'q_54944::type => bool. |
|
17644 | 8578 |
FINITE xa & |
19093 | 8579 |
(ALL xb::'q_54944::type. IN xb xa --> real_le (real_of_num 0) (x xb)) --> |
17652 | 8580 |
real_le (real_of_num 0) (hollight.sum xa x)" |
17644 | 8581 |
by (import hollight SUM_POS_LE) |
8582 |
||
8583 |
lemma SUM_POS_BOUND: "ALL (f::'A::type => hollight.real) (b::hollight.real) x::'A::type => bool. |
|
8584 |
FINITE x & |
|
17652 | 8585 |
(ALL xa::'A::type. IN xa x --> real_le (real_of_num 0) (f xa)) & |
17644 | 8586 |
real_le (hollight.sum x f) b --> |
8587 |
(ALL xa::'A::type. IN xa x --> real_le (f xa) b)" |
|
8588 |
by (import hollight SUM_POS_BOUND) |
|
8589 |
||
19093 | 8590 |
lemma SUM_POS_EQ_0: "ALL (x::'q_55091::type => hollight.real) xa::'q_55091::type => bool. |
17644 | 8591 |
FINITE xa & |
19093 | 8592 |
(ALL xb::'q_55091::type. IN xb xa --> real_le (real_of_num 0) (x xb)) & |
17652 | 8593 |
hollight.sum xa x = real_of_num 0 --> |
19093 | 8594 |
(ALL xb::'q_55091::type. IN xb xa --> x xb = real_of_num 0)" |
17644 | 8595 |
by (import hollight SUM_POS_EQ_0) |
8596 |
||
19093 | 8597 |
lemma SUM_SING: "ALL (x::'q_55113::type => hollight.real) xa::'q_55113::type. |
17644 | 8598 |
hollight.sum (INSERT xa EMPTY) x = x xa" |
8599 |
by (import hollight SUM_SING) |
|
8600 |
||
8601 |
lemma SUM_DELTA: "ALL (x::'A::type => bool) xa::'A::type. |
|
8602 |
hollight.sum x |
|
17652 | 8603 |
(%x::'A::type. COND (x = xa) (b::hollight.real) (real_of_num 0)) = |
8604 |
COND (IN xa x) b (real_of_num 0)" |
|
17644 | 8605 |
by (import hollight SUM_DELTA) |
8606 |
||
19093 | 8607 |
lemma SUM_SWAP: "ALL (f::'A::type => 'B::type => hollight.real) (x::'A::type => bool) |
8608 |
xa::'B::type => bool. |
|
8609 |
FINITE x & FINITE xa --> |
|
8610 |
hollight.sum x (%i::'A::type. hollight.sum xa (f i)) = |
|
8611 |
hollight.sum xa (%j::'B::type. hollight.sum x (%i::'A::type. f i j))" |
|
8612 |
by (import hollight SUM_SWAP) |
|
8613 |
||
8614 |
lemma SUM_IMAGE: "ALL (x::'q_55257::type => 'q_55233::type) |
|
8615 |
(xa::'q_55233::type => hollight.real) xb::'q_55257::type => bool. |
|
17644 | 8616 |
FINITE xb & |
19093 | 8617 |
(ALL (xa::'q_55257::type) y::'q_55257::type. |
17644 | 8618 |
IN xa xb & IN y xb & x xa = x y --> xa = y) --> |
8619 |
hollight.sum (IMAGE x xb) xa = hollight.sum xb (xa o x)" |
|
8620 |
by (import hollight SUM_IMAGE) |
|
8621 |
||
8622 |
lemma SUM_SUPERSET: "ALL (f::'A::type => hollight.real) (u::'A::type => bool) |
|
8623 |
v::'A::type => bool. |
|
8624 |
FINITE u & |
|
8625 |
SUBSET u v & |
|
17652 | 8626 |
(ALL x::'A::type. IN x v & ~ IN x u --> f x = real_of_num 0) --> |
17644 | 8627 |
hollight.sum v f = hollight.sum u f" |
8628 |
by (import hollight SUM_SUPERSET) |
|
8629 |
||
8630 |
lemma SUM_UNION_RZERO: "ALL (f::'A::type => hollight.real) (u::'A::type => bool) |
|
8631 |
v::'A::type => bool. |
|
8632 |
FINITE u & |
|
17652 | 8633 |
(ALL x::'A::type. IN x v & ~ IN x u --> f x = real_of_num 0) --> |
17644 | 8634 |
hollight.sum (hollight.UNION u v) f = hollight.sum u f" |
8635 |
by (import hollight SUM_UNION_RZERO) |
|
8636 |
||
8637 |
lemma SUM_UNION_LZERO: "ALL (f::'A::type => hollight.real) (u::'A::type => bool) |
|
8638 |
v::'A::type => bool. |
|
8639 |
FINITE v & |
|
17652 | 8640 |
(ALL x::'A::type. IN x u & ~ IN x v --> f x = real_of_num 0) --> |
17644 | 8641 |
hollight.sum (hollight.UNION u v) f = hollight.sum v f" |
8642 |
by (import hollight SUM_UNION_LZERO) |
|
8643 |
||
19093 | 8644 |
lemma SUM_RESTRICT: "ALL (f::'q_55484::type => hollight.real) s::'q_55484::type => bool. |
17644 | 8645 |
FINITE s --> |
8646 |
hollight.sum s |
|
19093 | 8647 |
(%x::'q_55484::type. COND (IN x s) (f x) (real_of_num 0)) = |
17644 | 8648 |
hollight.sum s f" |
8649 |
by (import hollight SUM_RESTRICT) |
|
8650 |
||
19093 | 8651 |
lemma SUM_BOUND: "ALL (x::'A::type => bool) (xa::'A::type => hollight.real) xb::hollight.real. |
8652 |
FINITE x & (ALL xc::'A::type. IN xc x --> real_le (xa xc) xb) --> |
|
8653 |
real_le (hollight.sum x xa) (real_mul (real_of_num (CARD x)) xb)" |
|
8654 |
by (import hollight SUM_BOUND) |
|
8655 |
||
8656 |
lemma SUM_BOUND_GEN: "ALL (s::'A::type => bool) (t::'q_55543::type) b::hollight.real. |
|
17644 | 8657 |
FINITE s & |
8658 |
s ~= EMPTY & |
|
8659 |
(ALL x::'A::type. |
|
8660 |
IN x s --> |
|
8661 |
real_le ((f::'A::type => hollight.real) x) |
|
8662 |
(real_div b (real_of_num (CARD s)))) --> |
|
8663 |
real_le (hollight.sum s f) b" |
|
8664 |
by (import hollight SUM_BOUND_GEN) |
|
8665 |
||
8666 |
lemma SUM_ABS_BOUND: "ALL (s::'A::type => bool) (f::'A::type => hollight.real) b::hollight.real. |
|
8667 |
FINITE s & (ALL x::'A::type. IN x s --> real_le (real_abs (f x)) b) --> |
|
8668 |
real_le (real_abs (hollight.sum s f)) (real_mul (real_of_num (CARD s)) b)" |
|
8669 |
by (import hollight SUM_ABS_BOUND) |
|
8670 |
||
8671 |
lemma SUM_BOUND_LT: "ALL (s::'A::type => bool) (f::'A::type => hollight.real) b::hollight.real. |
|
8672 |
FINITE s & |
|
8673 |
(ALL x::'A::type. IN x s --> real_le (f x) b) & |
|
8674 |
(EX x::'A::type. IN x s & real_lt (f x) b) --> |
|
8675 |
real_lt (hollight.sum s f) (real_mul (real_of_num (CARD s)) b)" |
|
8676 |
by (import hollight SUM_BOUND_LT) |
|
8677 |
||
19093 | 8678 |
lemma SUM_BOUND_LT_ALL: "ALL (s::'q_55748::type => bool) (f::'q_55748::type => hollight.real) |
17644 | 8679 |
b::hollight.real. |
8680 |
FINITE s & |
|
19093 | 8681 |
s ~= EMPTY & (ALL x::'q_55748::type. IN x s --> real_lt (f x) b) --> |
17644 | 8682 |
real_lt (hollight.sum s f) (real_mul (real_of_num (CARD s)) b)" |
8683 |
by (import hollight SUM_BOUND_LT_ALL) |
|
8684 |
||
19093 | 8685 |
lemma SUM_BOUND_LT_GEN: "ALL (s::'A::type => bool) (t::'q_55770::type) b::hollight.real. |
17644 | 8686 |
FINITE s & |
8687 |
s ~= EMPTY & |
|
8688 |
(ALL x::'A::type. |
|
8689 |
IN x s --> |
|
8690 |
real_lt ((f::'A::type => hollight.real) x) |
|
8691 |
(real_div b (real_of_num (CARD s)))) --> |
|
8692 |
real_lt (hollight.sum s f) b" |
|
8693 |
by (import hollight SUM_BOUND_LT_GEN) |
|
8694 |
||
19093 | 8695 |
lemma SUM_UNION_EQ: "ALL (s::'q_55831::type => bool) (t::'q_55831::type => bool) |
8696 |
u::'q_55831::type => bool. |
|
17644 | 8697 |
FINITE u & hollight.INTER s t = EMPTY & hollight.UNION s t = u --> |
19093 | 8698 |
real_add (hollight.sum s (f::'q_55831::type => hollight.real)) |
17644 | 8699 |
(hollight.sum t f) = |
8700 |
hollight.sum u f" |
|
8701 |
by (import hollight SUM_UNION_EQ) |
|
8702 |
||
8703 |
lemma SUM_EQ_SUPERSET: "ALL (f::'A::type => hollight.real) (s::'A::type => bool) |
|
8704 |
t::'A::type => bool. |
|
8705 |
FINITE t & |
|
8706 |
SUBSET t s & |
|
8707 |
(ALL x::'A::type. IN x t --> f x = (g::'A::type => hollight.real) x) & |
|
17652 | 8708 |
(ALL x::'A::type. IN x s & ~ IN x t --> f x = real_of_num 0) --> |
17644 | 8709 |
hollight.sum s f = hollight.sum t g" |
8710 |
by (import hollight SUM_EQ_SUPERSET) |
|
8711 |
||
19093 | 8712 |
lemma SUM_RESTRICT_SET: "ALL (s::'A::type => bool) (f::'A::type => hollight.real) r::'q_55944::type. |
17644 | 8713 |
FINITE s --> |
8714 |
hollight.sum |
|
8715 |
(GSPEC |
|
8716 |
(%u::'A::type. |
|
8717 |
EX x::'A::type. SETSPEC u (IN x s & (P::'A::type => bool) x) x)) |
|
8718 |
f = |
|
17652 | 8719 |
hollight.sum s (%x::'A::type. COND (P x) (f x) (real_of_num 0))" |
17644 | 8720 |
by (import hollight SUM_RESTRICT_SET) |
8721 |
||
19093 | 8722 |
lemma SUM_SUM_RESTRICT: "ALL (R::'q_56075::type => 'q_56074::type => bool) |
8723 |
(f::'q_56075::type => 'q_56074::type => hollight.real) |
|
8724 |
(s::'q_56075::type => bool) t::'q_56074::type => bool. |
|
17644 | 8725 |
FINITE s & FINITE t --> |
8726 |
hollight.sum s |
|
19093 | 8727 |
(%x::'q_56075::type. |
17644 | 8728 |
hollight.sum |
8729 |
(GSPEC |
|
19093 | 8730 |
(%u::'q_56074::type. |
8731 |
EX y::'q_56074::type. SETSPEC u (IN y t & R x y) y)) |
|
17644 | 8732 |
(f x)) = |
8733 |
hollight.sum t |
|
19093 | 8734 |
(%y::'q_56074::type. |
17644 | 8735 |
hollight.sum |
8736 |
(GSPEC |
|
19093 | 8737 |
(%u::'q_56075::type. |
8738 |
EX x::'q_56075::type. SETSPEC u (IN x s & R x y) x)) |
|
8739 |
(%x::'q_56075::type. f x y))" |
|
17644 | 8740 |
by (import hollight SUM_SUM_RESTRICT) |
8741 |
||
19093 | 8742 |
lemma CARD_EQ_SUM: "ALL x::'q_56096::type => bool. |
17644 | 8743 |
FINITE x --> |
8744 |
real_of_num (CARD x) = |
|
19093 | 8745 |
hollight.sum x (%x::'q_56096::type. real_of_num (NUMERAL_BIT1 0))" |
17644 | 8746 |
by (import hollight CARD_EQ_SUM) |
8747 |
||
8748 |
lemma SUM_MULTICOUNT_GEN: "ALL (R::'A::type => 'B::type => bool) (s::'A::type => bool) |
|
8749 |
(t::'B::type => bool) k::'B::type => nat. |
|
8750 |
FINITE s & |
|
8751 |
FINITE t & |
|
8752 |
(ALL j::'B::type. |
|
8753 |
IN j t --> |
|
8754 |
CARD |
|
8755 |
(GSPEC |
|
8756 |
(%u::'A::type. EX i::'A::type. SETSPEC u (IN i s & R i j) i)) = |
|
8757 |
k j) --> |
|
8758 |
hollight.sum s |
|
8759 |
(%i::'A::type. |
|
8760 |
real_of_num |
|
8761 |
(CARD |
|
8762 |
(GSPEC |
|
8763 |
(%u::'B::type. |
|
8764 |
EX j::'B::type. SETSPEC u (IN j t & R i j) j)))) = |
|
8765 |
hollight.sum t (%i::'B::type. real_of_num (k i))" |
|
8766 |
by (import hollight SUM_MULTICOUNT_GEN) |
|
8767 |
||
8768 |
lemma SUM_MULTICOUNT: "ALL (R::'A::type => 'B::type => bool) (s::'A::type => bool) |
|
8769 |
(t::'B::type => bool) k::nat. |
|
8770 |
FINITE s & |
|
8771 |
FINITE t & |
|
8772 |
(ALL j::'B::type. |
|
8773 |
IN j t --> |
|
8774 |
CARD |
|
8775 |
(GSPEC |
|
8776 |
(%u::'A::type. EX i::'A::type. SETSPEC u (IN i s & R i j) i)) = |
|
8777 |
k) --> |
|
8778 |
hollight.sum s |
|
8779 |
(%i::'A::type. |
|
8780 |
real_of_num |
|
8781 |
(CARD |
|
8782 |
(GSPEC |
|
8783 |
(%u::'B::type. |
|
8784 |
EX j::'B::type. SETSPEC u (IN j t & R i j) j)))) = |
|
8785 |
real_of_num (k * CARD t)" |
|
8786 |
by (import hollight SUM_MULTICOUNT) |
|
8787 |
||
8788 |
lemma SUM_IMAGE_GEN: "ALL (f::'A::type => 'B::type) (g::'A::type => hollight.real) |
|
8789 |
s::'A::type => bool. |
|
8790 |
FINITE s --> |
|
8791 |
hollight.sum s g = |
|
8792 |
hollight.sum (IMAGE f s) |
|
8793 |
(%y::'B::type. |
|
8794 |
hollight.sum |
|
8795 |
(GSPEC |
|
8796 |
(%u::'A::type. EX x::'A::type. SETSPEC u (IN x s & f x = y) x)) |
|
8797 |
g)" |
|
8798 |
by (import hollight SUM_IMAGE_GEN) |
|
8799 |
||
19093 | 8800 |
lemma REAL_OF_NUM_SUM: "ALL (f::'q_56493::type => nat) s::'q_56493::type => bool. |
17644 | 8801 |
FINITE s --> |
8802 |
real_of_num (nsum s f) = |
|
19093 | 8803 |
hollight.sum s (%x::'q_56493::type. real_of_num (f x))" |
17644 | 8804 |
by (import hollight REAL_OF_NUM_SUM) |
8805 |
||
8806 |
lemma SUM_SUBSET: "ALL (u::'A::type => bool) (v::'A::type => bool) |
|
8807 |
f::'A::type => hollight.real. |
|
8808 |
FINITE u & |
|
8809 |
FINITE v & |
|
17652 | 8810 |
(ALL x::'A::type. IN x (DIFF u v) --> real_le (f x) (real_of_num 0)) & |
8811 |
(ALL x::'A::type. IN x (DIFF v u) --> real_le (real_of_num 0) (f x)) --> |
|
17644 | 8812 |
real_le (hollight.sum u f) (hollight.sum v f)" |
8813 |
by (import hollight SUM_SUBSET) |
|
8814 |
||
8815 |
lemma SUM_SUBSET_SIMPLE: "ALL (u::'A::type => bool) (v::'A::type => bool) |
|
8816 |
f::'A::type => hollight.real. |
|
8817 |
FINITE v & |
|
8818 |
SUBSET u v & |
|
17652 | 8819 |
(ALL x::'A::type. IN x (DIFF v u) --> real_le (real_of_num 0) (f x)) --> |
17644 | 8820 |
real_le (hollight.sum u f) (hollight.sum v f)" |
8821 |
by (import hollight SUM_SUBSET_SIMPLE) |
|
8822 |
||
8823 |
lemma SUM_ADD_NUMSEG: "ALL (x::nat => hollight.real) (xa::nat => hollight.real) (xb::nat) xc::nat. |
|
8824 |
hollight.sum (dotdot xb xc) (%i::nat. real_add (x i) (xa i)) = |
|
8825 |
real_add (hollight.sum (dotdot xb xc) x) (hollight.sum (dotdot xb xc) xa)" |
|
8826 |
by (import hollight SUM_ADD_NUMSEG) |
|
8827 |
||
8828 |
lemma SUM_CMUL_NUMSEG: "ALL (x::nat => hollight.real) (xa::hollight.real) (xb::nat) xc::nat. |
|
8829 |
hollight.sum (dotdot xb xc) (%i::nat. real_mul xa (x i)) = |
|
8830 |
real_mul xa (hollight.sum (dotdot xb xc) x)" |
|
8831 |
by (import hollight SUM_CMUL_NUMSEG) |
|
8832 |
||
8833 |
lemma SUM_NEG_NUMSEG: "ALL (x::nat => hollight.real) (xa::nat) xb::nat. |
|
8834 |
hollight.sum (dotdot xa xb) (%i::nat. real_neg (x i)) = |
|
8835 |
real_neg (hollight.sum (dotdot xa xb) x)" |
|
8836 |
by (import hollight SUM_NEG_NUMSEG) |
|
8837 |
||
8838 |
lemma SUM_SUB_NUMSEG: "ALL (x::nat => hollight.real) (xa::nat => hollight.real) (xb::nat) xc::nat. |
|
8839 |
hollight.sum (dotdot xb xc) (%i::nat. real_sub (x i) (xa i)) = |
|
8840 |
real_sub (hollight.sum (dotdot xb xc) x) (hollight.sum (dotdot xb xc) xa)" |
|
8841 |
by (import hollight SUM_SUB_NUMSEG) |
|
8842 |
||
8843 |
lemma SUM_LE_NUMSEG: "ALL (x::nat => hollight.real) (xa::nat => hollight.real) (xb::nat) xc::nat. |
|
8844 |
(ALL i::nat. <= xb i & <= i xc --> real_le (x i) (xa i)) --> |
|
8845 |
real_le (hollight.sum (dotdot xb xc) x) (hollight.sum (dotdot xb xc) xa)" |
|
8846 |
by (import hollight SUM_LE_NUMSEG) |
|
8847 |
||
8848 |
lemma SUM_EQ_NUMSEG: "ALL (f::nat => hollight.real) (g::nat => hollight.real) (m::nat) n::nat. |
|
8849 |
(ALL i::nat. <= m i & <= i n --> f i = g i) --> |
|
8850 |
hollight.sum (dotdot m n) f = hollight.sum (dotdot m n) g" |
|
8851 |
by (import hollight SUM_EQ_NUMSEG) |
|
8852 |
||
8853 |
lemma SUM_ABS_NUMSEG: "ALL (x::nat => hollight.real) (xa::nat) xb::nat. |
|
8854 |
real_le (real_abs (hollight.sum (dotdot xa xb) x)) |
|
8855 |
(hollight.sum (dotdot xa xb) (%i::nat. real_abs (x i)))" |
|
8856 |
by (import hollight SUM_ABS_NUMSEG) |
|
8857 |
||
8858 |
lemma SUM_CONST_NUMSEG: "ALL (x::hollight.real) (xa::nat) xb::nat. |
|
8859 |
hollight.sum (dotdot xa xb) (%n::nat. x) = |
|
17652 | 8860 |
real_mul (real_of_num (xb + NUMERAL_BIT1 0 - xa)) x" |
17644 | 8861 |
by (import hollight SUM_CONST_NUMSEG) |
8862 |
||
19093 | 8863 |
lemma SUM_EQ_0_NUMSEG: "ALL (x::nat => hollight.real) xa::'q_57019::type. |
17652 | 8864 |
(ALL i::nat. <= (m::nat) i & <= i (n::nat) --> x i = real_of_num 0) --> |
8865 |
hollight.sum (dotdot m n) x = real_of_num 0" |
|
17644 | 8866 |
by (import hollight SUM_EQ_0_NUMSEG) |
8867 |
||
8868 |
lemma SUM_TRIV_NUMSEG: "ALL (f::nat => hollight.real) (m::nat) n::nat. |
|
17652 | 8869 |
< n m --> hollight.sum (dotdot m n) f = real_of_num 0" |
17644 | 8870 |
by (import hollight SUM_TRIV_NUMSEG) |
8871 |
||
8872 |
lemma SUM_POS_LE_NUMSEG: "ALL (x::nat) (xa::nat) xb::nat => hollight.real. |
|
17652 | 8873 |
(ALL p::nat. <= x p & <= p xa --> real_le (real_of_num 0) (xb p)) --> |
8874 |
real_le (real_of_num 0) (hollight.sum (dotdot x xa) xb)" |
|
17644 | 8875 |
by (import hollight SUM_POS_LE_NUMSEG) |
8876 |
||
8877 |
lemma SUM_POS_EQ_0_NUMSEG: "ALL (f::nat => hollight.real) (m::nat) n::nat. |
|
17652 | 8878 |
(ALL p::nat. <= m p & <= p n --> real_le (real_of_num 0) (f p)) & |
8879 |
hollight.sum (dotdot m n) f = real_of_num 0 --> |
|
8880 |
(ALL p::nat. <= m p & <= p n --> f p = real_of_num 0)" |
|
17644 | 8881 |
by (import hollight SUM_POS_EQ_0_NUMSEG) |
8882 |
||
8883 |
lemma SUM_SING_NUMSEG: "ALL (x::nat => hollight.real) xa::nat. hollight.sum (dotdot xa xa) x = x xa" |
|
8884 |
by (import hollight SUM_SING_NUMSEG) |
|
8885 |
||
8886 |
lemma SUM_CLAUSES_NUMSEG: "(ALL x::nat. |
|
17652 | 8887 |
hollight.sum (dotdot x 0) (f::nat => hollight.real) = |
8888 |
COND (x = 0) (f 0) (real_of_num 0)) & |
|
17644 | 8889 |
(ALL (x::nat) xa::nat. |
8890 |
hollight.sum (dotdot x (Suc xa)) f = |
|
8891 |
COND (<= x (Suc xa)) |
|
8892 |
(real_add (hollight.sum (dotdot x xa) f) (f (Suc xa))) |
|
8893 |
(hollight.sum (dotdot x xa) f))" |
|
8894 |
by (import hollight SUM_CLAUSES_NUMSEG) |
|
8895 |
||
8896 |
lemma SUM_SWAP_NUMSEG: "ALL (a::nat) (b::nat) (c::nat) (d::nat) f::nat => nat => hollight.real. |
|
8897 |
hollight.sum (dotdot a b) (%i::nat. hollight.sum (dotdot c d) (f i)) = |
|
8898 |
hollight.sum (dotdot c d) |
|
8899 |
(%j::nat. hollight.sum (dotdot a b) (%i::nat. f i j))" |
|
8900 |
by (import hollight SUM_SWAP_NUMSEG) |
|
8901 |
||
8902 |
lemma SUM_ADD_SPLIT: "ALL (x::nat => hollight.real) (xa::nat) (xb::nat) xc::nat. |
|
17652 | 8903 |
<= xa (xb + NUMERAL_BIT1 0) --> |
17644 | 8904 |
hollight.sum (dotdot xa (xb + xc)) x = |
8905 |
real_add (hollight.sum (dotdot xa xb) x) |
|
17652 | 8906 |
(hollight.sum (dotdot (xb + NUMERAL_BIT1 0) (xb + xc)) x)" |
17644 | 8907 |
by (import hollight SUM_ADD_SPLIT) |
8908 |
||
19093 | 8909 |
lemma SUM_OFFSET: "ALL (x::nat => hollight.real) (xa::nat) xb::nat. |
8910 |
hollight.sum (dotdot (xa + xb) ((n::nat) + xb)) x = |
|
8911 |
hollight.sum (dotdot xa n) (%i::nat. x (i + xb))" |
|
8912 |
by (import hollight SUM_OFFSET) |
|
8913 |
||
17644 | 8914 |
lemma SUM_OFFSET_0: "ALL (x::nat => hollight.real) (xa::nat) xb::nat. |
8915 |
<= xa xb --> |
|
8916 |
hollight.sum (dotdot xa xb) x = |
|
17652 | 8917 |
hollight.sum (dotdot 0 (xb - xa)) (%i::nat. x (i + xa))" |
17644 | 8918 |
by (import hollight SUM_OFFSET_0) |
8919 |
||
8920 |
lemma SUM_CLAUSES_LEFT: "ALL (x::nat => hollight.real) (xa::nat) xb::nat. |
|
8921 |
<= xa xb --> |
|
8922 |
hollight.sum (dotdot xa xb) x = |
|
17652 | 8923 |
real_add (x xa) (hollight.sum (dotdot (xa + NUMERAL_BIT1 0) xb) x)" |
17644 | 8924 |
by (import hollight SUM_CLAUSES_LEFT) |
8925 |
||
8926 |
lemma SUM_CLAUSES_RIGHT: "ALL (f::nat => hollight.real) (m::nat) n::nat. |
|
17652 | 8927 |
< 0 n & <= m n --> |
17644 | 8928 |
hollight.sum (dotdot m n) f = |
17652 | 8929 |
real_add (hollight.sum (dotdot m (n - NUMERAL_BIT1 0)) f) (f n)" |
17644 | 8930 |
by (import hollight SUM_CLAUSES_RIGHT) |
8931 |
||
8932 |
lemma REAL_OF_NUM_SUM_NUMSEG: "ALL (x::nat => nat) (xa::nat) xb::nat. |
|
8933 |
real_of_num (nsum (dotdot xa xb) x) = |
|
8934 |
hollight.sum (dotdot xa xb) (%i::nat. real_of_num (x i))" |
|
8935 |
by (import hollight REAL_OF_NUM_SUM_NUMSEG) |
|
8936 |
||
19093 | 8937 |
lemma SUM_BIJECTION: "ALL (x::'A::type => hollight.real) (xa::'A::type => 'A::type) |
8938 |
xb::'A::type => bool. |
|
8939 |
FINITE xb & |
|
8940 |
(ALL x::'A::type. IN x xb --> IN (xa x) xb) & |
|
8941 |
(ALL y::'A::type. IN y xb --> (EX! x::'A::type. IN x xb & xa x = y)) --> |
|
8942 |
hollight.sum xb x = hollight.sum xb (x o xa)" |
|
8943 |
by (import hollight SUM_BIJECTION) |
|
8944 |
||
8945 |
lemma SUM_SUM_PRODUCT: "ALL (x::'A::type => bool) (xa::'A::type => 'B::type => bool) |
|
8946 |
xb::'A::type => 'B::type => hollight.real. |
|
8947 |
FINITE x & (ALL i::'A::type. IN i x --> FINITE (xa i)) --> |
|
8948 |
hollight.sum x (%x::'A::type. hollight.sum (xa x) (xb x)) = |
|
8949 |
hollight.sum |
|
8950 |
(GSPEC |
|
8951 |
(%u::'A::type * 'B::type. |
|
8952 |
EX (i::'A::type) j::'B::type. |
|
8953 |
SETSPEC u (IN i x & IN j (xa i)) (i, j))) |
|
8954 |
(GABS |
|
8955 |
(%f::'A::type * 'B::type => hollight.real. |
|
8956 |
ALL (i::'A::type) j::'B::type. GEQ (f (i, j)) (xb i j)))" |
|
8957 |
by (import hollight SUM_SUM_PRODUCT) |
|
8958 |
||
8959 |
lemma SUM_EQ_GENERAL: "ALL (x::'A::type => bool) (xa::'B::type => bool) |
|
8960 |
(xb::'A::type => hollight.real) (xc::'B::type => hollight.real) |
|
8961 |
xd::'A::type => 'B::type. |
|
8962 |
FINITE x & |
|
8963 |
(ALL y::'B::type. IN y xa --> (EX! xa::'A::type. IN xa x & xd xa = y)) & |
|
8964 |
(ALL xe::'A::type. IN xe x --> IN (xd xe) xa & xc (xd xe) = xb xe) --> |
|
8965 |
hollight.sum x xb = hollight.sum xa xc" |
|
8966 |
by (import hollight SUM_EQ_GENERAL) |
|
8967 |
||
8968 |
constdefs |
|
8969 |
CASEWISE :: "(('q_57926 => 'q_57930) * ('q_57931 => 'q_57926 => 'q_57890)) hollight.list |
|
8970 |
=> 'q_57931 => 'q_57930 => 'q_57890" |
|
17644 | 8971 |
"CASEWISE == |
19093 | 8972 |
SOME CASEWISE::(('q_57926::type => 'q_57930::type) * |
8973 |
('q_57931::type |
|
8974 |
=> 'q_57926::type => 'q_57890::type)) hollight.list |
|
8975 |
=> 'q_57931::type => 'q_57930::type => 'q_57890::type. |
|
8976 |
(ALL (f::'q_57931::type) x::'q_57930::type. |
|
8977 |
CASEWISE NIL f x = (SOME y::'q_57890::type. True)) & |
|
8978 |
(ALL (h::('q_57926::type => 'q_57930::type) * |
|
8979 |
('q_57931::type => 'q_57926::type => 'q_57890::type)) |
|
8980 |
(t::(('q_57926::type => 'q_57930::type) * |
|
8981 |
('q_57931::type |
|
8982 |
=> 'q_57926::type => 'q_57890::type)) hollight.list) |
|
8983 |
(f::'q_57931::type) x::'q_57930::type. |
|
17644 | 8984 |
CASEWISE (CONS h t) f x = |
19093 | 8985 |
COND (EX y::'q_57926::type. fst h y = x) |
8986 |
(snd h f (SOME y::'q_57926::type. fst h y = x)) (CASEWISE t f x))" |
|
17644 | 8987 |
|
8988 |
lemma DEF_CASEWISE: "CASEWISE = |
|
19093 | 8989 |
(SOME CASEWISE::(('q_57926::type => 'q_57930::type) * |
8990 |
('q_57931::type |
|
8991 |
=> 'q_57926::type => 'q_57890::type)) hollight.list |
|
8992 |
=> 'q_57931::type => 'q_57930::type => 'q_57890::type. |
|
8993 |
(ALL (f::'q_57931::type) x::'q_57930::type. |
|
8994 |
CASEWISE NIL f x = (SOME y::'q_57890::type. True)) & |
|
8995 |
(ALL (h::('q_57926::type => 'q_57930::type) * |
|
8996 |
('q_57931::type => 'q_57926::type => 'q_57890::type)) |
|
8997 |
(t::(('q_57926::type => 'q_57930::type) * |
|
8998 |
('q_57931::type |
|
8999 |
=> 'q_57926::type => 'q_57890::type)) hollight.list) |
|
9000 |
(f::'q_57931::type) x::'q_57930::type. |
|
17644 | 9001 |
CASEWISE (CONS h t) f x = |
19093 | 9002 |
COND (EX y::'q_57926::type. fst h y = x) |
9003 |
(snd h f (SOME y::'q_57926::type. fst h y = x)) (CASEWISE t f x)))" |
|
17644 | 9004 |
by (import hollight DEF_CASEWISE) |
9005 |
||
9006 |
lemma CASEWISE: "(op &::bool => bool => bool) |
|
19093 | 9007 |
((op =::'q_57950::type => 'q_57950::type => bool) |
9008 |
((CASEWISE::(('q_57942::type => 'q_57990::type) * |
|
9009 |
('q_57991::type |
|
9010 |
=> 'q_57942::type => 'q_57950::type)) hollight.list |
|
9011 |
=> 'q_57991::type => 'q_57990::type => 'q_57950::type) |
|
9012 |
(NIL::(('q_57942::type => 'q_57990::type) * |
|
9013 |
('q_57991::type |
|
9014 |
=> 'q_57942::type => 'q_57950::type)) hollight.list) |
|
9015 |
(f::'q_57991::type) (x::'q_57990::type)) |
|
9016 |
((Eps::('q_57950::type => bool) => 'q_57950::type) |
|
9017 |
(%y::'q_57950::type. True::bool))) |
|
9018 |
((op =::'q_57951::type => 'q_57951::type => bool) |
|
9019 |
((CASEWISE::(('q_57993::type => 'q_57990::type) * |
|
9020 |
('q_57991::type |
|
9021 |
=> 'q_57993::type => 'q_57951::type)) hollight.list |
|
9022 |
=> 'q_57991::type => 'q_57990::type => 'q_57951::type) |
|
9023 |
((CONS::('q_57993::type => 'q_57990::type) * |
|
9024 |
('q_57991::type => 'q_57993::type => 'q_57951::type) |
|
9025 |
=> (('q_57993::type => 'q_57990::type) * |
|
9026 |
('q_57991::type |
|
9027 |
=> 'q_57993::type => 'q_57951::type)) hollight.list |
|
9028 |
=> (('q_57993::type => 'q_57990::type) * |
|
9029 |
('q_57991::type |
|
9030 |
=> 'q_57993::type => 'q_57951::type)) hollight.list) |
|
9031 |
((Pair::('q_57993::type => 'q_57990::type) |
|
9032 |
=> ('q_57991::type => 'q_57993::type => 'q_57951::type) |
|
9033 |
=> ('q_57993::type => 'q_57990::type) * |
|
9034 |
('q_57991::type => 'q_57993::type => 'q_57951::type)) |
|
9035 |
(s::'q_57993::type => 'q_57990::type) |
|
9036 |
(t::'q_57991::type => 'q_57993::type => 'q_57951::type)) |
|
9037 |
(clauses::(('q_57993::type => 'q_57990::type) * |
|
9038 |
('q_57991::type |
|
9039 |
=> 'q_57993::type => 'q_57951::type)) hollight.list)) |
|
17644 | 9040 |
f x) |
19093 | 9041 |
((COND::bool => 'q_57951::type => 'q_57951::type => 'q_57951::type) |
9042 |
((Ex::('q_57993::type => bool) => bool) |
|
9043 |
(%y::'q_57993::type. |
|
9044 |
(op =::'q_57990::type => 'q_57990::type => bool) (s y) x)) |
|
9045 |
(t f ((Eps::('q_57993::type => bool) => 'q_57993::type) |
|
9046 |
(%y::'q_57993::type. |
|
9047 |
(op =::'q_57990::type => 'q_57990::type => bool) (s y) x))) |
|
9048 |
((CASEWISE::(('q_57993::type => 'q_57990::type) * |
|
9049 |
('q_57991::type |
|
9050 |
=> 'q_57993::type => 'q_57951::type)) hollight.list |
|
9051 |
=> 'q_57991::type => 'q_57990::type => 'q_57951::type) |
|
17644 | 9052 |
clauses f x)))" |
9053 |
by (import hollight CASEWISE) |
|
9054 |
||
19093 | 9055 |
lemma CASEWISE_CASES: "ALL (clauses::(('q_58085::type => 'q_58082::type) * |
9056 |
('q_58083::type |
|
9057 |
=> 'q_58085::type => 'q_58092::type)) hollight.list) |
|
9058 |
(c::'q_58083::type) x::'q_58082::type. |
|
9059 |
(EX (s::'q_58085::type => 'q_58082::type) |
|
9060 |
(t::'q_58083::type => 'q_58085::type => 'q_58092::type) |
|
9061 |
a::'q_58085::type. |
|
17644 | 9062 |
MEM (s, t) clauses & s a = x & CASEWISE clauses c x = t c a) | |
19093 | 9063 |
~ (EX (s::'q_58085::type => 'q_58082::type) |
9064 |
(t::'q_58083::type => 'q_58085::type => 'q_58092::type) |
|
9065 |
a::'q_58085::type. MEM (s, t) clauses & s a = x) & |
|
9066 |
CASEWISE clauses c x = (SOME y::'q_58092::type. True)" |
|
17644 | 9067 |
by (import hollight CASEWISE_CASES) |
9068 |
||
9069 |
lemma CASEWISE_WORKS: "ALL (x::(('P::type => 'A::type) * |
|
9070 |
('C::type => 'P::type => 'B::type)) hollight.list) |
|
9071 |
xa::'C::type. |
|
9072 |
(ALL (s::'P::type => 'A::type) (t::'C::type => 'P::type => 'B::type) |
|
9073 |
(s'::'P::type => 'A::type) (t'::'C::type => 'P::type => 'B::type) |
|
9074 |
(xb::'P::type) y::'P::type. |
|
9075 |
MEM (s, t) x & MEM (s', t') x & s xb = s' y --> |
|
9076 |
t xa xb = t' xa y) --> |
|
9077 |
ALL_list |
|
9078 |
(GABS |
|
9079 |
(%f::('P::type => 'A::type) * ('C::type => 'P::type => 'B::type) |
|
9080 |
=> bool. |
|
9081 |
ALL (s::'P::type => 'A::type) t::'C::type => 'P::type => 'B::type. |
|
9082 |
GEQ (f (s, t)) |
|
9083 |
(ALL xb::'P::type. CASEWISE x xa (s xb) = t xa xb))) |
|
9084 |
x" |
|
9085 |
by (import hollight CASEWISE_WORKS) |
|
9086 |
||
9087 |
constdefs |
|
19093 | 9088 |
admissible :: "('q_58228 => 'q_58221 => bool) |
9089 |
=> (('q_58228 => 'q_58224) => 'q_58234 => bool) |
|
9090 |
=> ('q_58234 => 'q_58221) |
|
9091 |
=> (('q_58228 => 'q_58224) => 'q_58234 => 'q_58229) => bool" |
|
17644 | 9092 |
"admissible == |
19093 | 9093 |
%(u::'q_58228::type => 'q_58221::type => bool) |
9094 |
(ua::('q_58228::type => 'q_58224::type) => 'q_58234::type => bool) |
|
9095 |
(ub::'q_58234::type => 'q_58221::type) |
|
9096 |
uc::('q_58228::type => 'q_58224::type) |
|
9097 |
=> 'q_58234::type => 'q_58229::type. |
|
9098 |
ALL (f::'q_58228::type => 'q_58224::type) |
|
9099 |
(g::'q_58228::type => 'q_58224::type) a::'q_58234::type. |
|
17644 | 9100 |
ua f a & |
19093 | 9101 |
ua g a & (ALL z::'q_58228::type. u z (ub a) --> f z = g z) --> |
17644 | 9102 |
uc f a = uc g a" |
9103 |
||
9104 |
lemma DEF_admissible: "admissible = |
|
19093 | 9105 |
(%(u::'q_58228::type => 'q_58221::type => bool) |
9106 |
(ua::('q_58228::type => 'q_58224::type) => 'q_58234::type => bool) |
|
9107 |
(ub::'q_58234::type => 'q_58221::type) |
|
9108 |
uc::('q_58228::type => 'q_58224::type) |
|
9109 |
=> 'q_58234::type => 'q_58229::type. |
|
9110 |
ALL (f::'q_58228::type => 'q_58224::type) |
|
9111 |
(g::'q_58228::type => 'q_58224::type) a::'q_58234::type. |
|
17644 | 9112 |
ua f a & |
19093 | 9113 |
ua g a & (ALL z::'q_58228::type. u z (ub a) --> f z = g z) --> |
17644 | 9114 |
uc f a = uc g a)" |
9115 |
by (import hollight DEF_admissible) |
|
9116 |
||
9117 |
constdefs |
|
17652 | 9118 |
tailadmissible :: "('A => 'A => bool) |
9119 |
=> (('A => 'B) => 'P => bool) |
|
9120 |
=> ('P => 'A) => (('A => 'B) => 'P => 'B) => bool" |
|
17644 | 9121 |
"tailadmissible == |
9122 |
%(u::'A::type => 'A::type => bool) |
|
9123 |
(ua::('A::type => 'B::type) => 'P::type => bool) |
|
9124 |
(ub::'P::type => 'A::type) |
|
9125 |
uc::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9126 |
EX (P::('A::type => 'B::type) => 'P::type => bool) |
|
9127 |
(G::('A::type => 'B::type) => 'P::type => 'A::type) |
|
9128 |
H::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9129 |
(ALL (f::'A::type => 'B::type) (a::'P::type) y::'A::type. |
|
9130 |
P f a & u y (G f a) --> u y (ub a)) & |
|
9131 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) a::'P::type. |
|
9132 |
(ALL z::'A::type. u z (ub a) --> f z = g z) --> |
|
9133 |
P f a = P g a & G f a = G g a & H f a = H g a) & |
|
9134 |
(ALL (f::'A::type => 'B::type) a::'P::type. |
|
9135 |
ua f a --> uc f a = COND (P f a) (f (G f a)) (H f a))" |
|
9136 |
||
9137 |
lemma DEF_tailadmissible: "tailadmissible = |
|
9138 |
(%(u::'A::type => 'A::type => bool) |
|
9139 |
(ua::('A::type => 'B::type) => 'P::type => bool) |
|
9140 |
(ub::'P::type => 'A::type) |
|
9141 |
uc::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9142 |
EX (P::('A::type => 'B::type) => 'P::type => bool) |
|
9143 |
(G::('A::type => 'B::type) => 'P::type => 'A::type) |
|
9144 |
H::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9145 |
(ALL (f::'A::type => 'B::type) (a::'P::type) y::'A::type. |
|
9146 |
P f a & u y (G f a) --> u y (ub a)) & |
|
9147 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) a::'P::type. |
|
9148 |
(ALL z::'A::type. u z (ub a) --> f z = g z) --> |
|
9149 |
P f a = P g a & G f a = G g a & H f a = H g a) & |
|
9150 |
(ALL (f::'A::type => 'B::type) a::'P::type. |
|
9151 |
ua f a --> uc f a = COND (P f a) (f (G f a)) (H f a)))" |
|
9152 |
by (import hollight DEF_tailadmissible) |
|
9153 |
||
9154 |
constdefs |
|
19093 | 9155 |
superadmissible :: "('q_58378 => 'q_58378 => bool) |
9156 |
=> (('q_58378 => 'q_58380) => 'q_58386 => bool) |
|
9157 |
=> ('q_58386 => 'q_58378) |
|
9158 |
=> (('q_58378 => 'q_58380) => 'q_58386 => 'q_58380) => bool" |
|
17644 | 9159 |
"superadmissible == |
19093 | 9160 |
%(u::'q_58378::type => 'q_58378::type => bool) |
9161 |
(ua::('q_58378::type => 'q_58380::type) => 'q_58386::type => bool) |
|
9162 |
(ub::'q_58386::type => 'q_58378::type) |
|
9163 |
uc::('q_58378::type => 'q_58380::type) |
|
9164 |
=> 'q_58386::type => 'q_58380::type. |
|
17644 | 9165 |
admissible u |
19093 | 9166 |
(%(f::'q_58378::type => 'q_58380::type) a::'q_58386::type. True) ub |
17644 | 9167 |
ua --> |
9168 |
tailadmissible u ua ub uc" |
|
9169 |
||
9170 |
lemma DEF_superadmissible: "superadmissible = |
|
19093 | 9171 |
(%(u::'q_58378::type => 'q_58378::type => bool) |
9172 |
(ua::('q_58378::type => 'q_58380::type) => 'q_58386::type => bool) |
|
9173 |
(ub::'q_58386::type => 'q_58378::type) |
|
9174 |
uc::('q_58378::type => 'q_58380::type) |
|
9175 |
=> 'q_58386::type => 'q_58380::type. |
|
17644 | 9176 |
admissible u |
19093 | 9177 |
(%(f::'q_58378::type => 'q_58380::type) a::'q_58386::type. True) ub |
17644 | 9178 |
ua --> |
9179 |
tailadmissible u ua ub uc)" |
|
9180 |
by (import hollight DEF_superadmissible) |
|
9181 |
||
9182 |
lemma SUPERADMISSIBLE_COND: "ALL (x::'A::type => 'A::type => bool) |
|
9183 |
(xa::('A::type => 'B::type) => 'P::type => bool) |
|
9184 |
(xb::('A::type => 'B::type) => 'P::type => bool) |
|
9185 |
(xc::'P::type => 'A::type) |
|
9186 |
(xd::('A::type => 'B::type) => 'P::type => 'B::type) |
|
9187 |
xe::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9188 |
admissible x xa xc xb & |
|
9189 |
superadmissible x |
|
9190 |
(%(f::'A::type => 'B::type) x::'P::type. xa f x & xb f x) xc xd & |
|
9191 |
superadmissible x |
|
9192 |
(%(f::'A::type => 'B::type) x::'P::type. xa f x & ~ xb f x) xc xe --> |
|
9193 |
superadmissible x xa xc |
|
9194 |
(%(f::'A::type => 'B::type) x::'P::type. |
|
9195 |
COND (xb f x) (xd f x) (xe f x))" |
|
9196 |
by (import hollight SUPERADMISSIBLE_COND) |
|
9197 |
||
9198 |
lemma ADMISSIBLE_IMP_SUPERADMISSIBLE: "ALL (x::'A::type => 'A::type => bool) |
|
9199 |
(xa::('A::type => 'B::type) => 'P::type => bool) |
|
9200 |
(xb::'P::type => 'A::type) |
|
9201 |
xc::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9202 |
admissible x xa xb xc --> superadmissible x xa xb xc" |
|
9203 |
by (import hollight ADMISSIBLE_IMP_SUPERADMISSIBLE) |
|
9204 |
||
9205 |
lemma TAIL_IMP_SUPERADMISSIBLE: "ALL (x::'A::type => 'A::type => bool) |
|
9206 |
(xa::('A::type => 'B::type) => 'P::type => bool) |
|
9207 |
(xb::'P::type => 'A::type) |
|
9208 |
xc::('A::type => 'B::type) => 'P::type => 'A::type. |
|
9209 |
admissible x xa xb xc & |
|
9210 |
(ALL (f::'A::type => 'B::type) a::'P::type. |
|
9211 |
xa f a --> (ALL y::'A::type. x y (xc f a) --> x y (xb a))) --> |
|
9212 |
superadmissible x xa xb |
|
9213 |
(%(f::'A::type => 'B::type) x::'P::type. f (xc f x))" |
|
9214 |
by (import hollight TAIL_IMP_SUPERADMISSIBLE) |
|
9215 |
||
19093 | 9216 |
lemma ADMISSIBLE_COND: "ALL (u_353::'A::type => 'q_58766::type => bool) |
17644 | 9217 |
(p::('A::type => 'B::type) => 'P::type => bool) |
9218 |
(P::('A::type => 'B::type) => 'P::type => bool) |
|
19093 | 9219 |
(s::'P::type => 'q_58766::type) |
17644 | 9220 |
(h::('A::type => 'B::type) => 'P::type => 'B::type) |
9221 |
k::('A::type => 'B::type) => 'P::type => 'B::type. |
|
19093 | 9222 |
admissible u_353 p s P & |
9223 |
admissible u_353 (%(f::'A::type => 'B::type) x::'P::type. p f x & P f x) |
|
17644 | 9224 |
s h & |
19093 | 9225 |
admissible u_353 |
17644 | 9226 |
(%(f::'A::type => 'B::type) x::'P::type. p f x & ~ P f x) s k --> |
19093 | 9227 |
admissible u_353 p s |
17644 | 9228 |
(%(f::'A::type => 'B::type) x::'P::type. COND (P f x) (h f x) (k f x))" |
9229 |
by (import hollight ADMISSIBLE_COND) |
|
9230 |
||
19093 | 9231 |
lemma ADMISSIBLE_CONST: "admissible (u_353::'q_58841::type => 'q_58840::type => bool) |
9232 |
(p::('q_58841::type => 'q_58842::type) => 'q_58843::type => bool) |
|
9233 |
(s::'q_58843::type => 'q_58840::type) |
|
9234 |
(%f::'q_58841::type => 'q_58842::type. c::'q_58843::type => 'q_58844::type)" |
|
17644 | 9235 |
by (import hollight ADMISSIBLE_CONST) |
9236 |
||
9237 |
lemma ADMISSIBLE_COMB: "ALL (x::'A::type => 'A::type => bool) |
|
9238 |
(xa::('A::type => 'B::type) => 'P::type => bool) |
|
9239 |
(xb::'P::type => 'A::type) |
|
9240 |
(xc::('A::type => 'B::type) => 'P::type => 'C::type => 'D::type) |
|
9241 |
xd::('A::type => 'B::type) => 'P::type => 'C::type. |
|
9242 |
admissible x xa xb xc & admissible x xa xb xd --> |
|
9243 |
admissible x xa xb |
|
9244 |
(%(f::'A::type => 'B::type) x::'P::type. xc f x (xd f x))" |
|
9245 |
by (import hollight ADMISSIBLE_COMB) |
|
9246 |
||
9247 |
lemma ADMISSIBLE_BASE: "ALL (x::'A::type => 'A::type => bool) |
|
9248 |
(xa::('A::type => 'B::type) => 'P::type => bool) |
|
9249 |
(xb::'P::type => 'A::type) xc::'P::type => 'A::type. |
|
9250 |
(ALL (f::'A::type => 'B::type) a::'P::type. |
|
9251 |
xa f a --> x (xc a) (xb a)) --> |
|
9252 |
admissible x xa xb (%(f::'A::type => 'B::type) x::'P::type. f (xc x))" |
|
9253 |
by (import hollight ADMISSIBLE_BASE) |
|
9254 |
||
9255 |
lemma ADMISSIBLE_NEST: "ALL (x::'A::type => 'A::type => bool) |
|
9256 |
(xa::('A::type => 'B::type) => 'P::type => bool) |
|
9257 |
(xb::'P::type => 'A::type) |
|
9258 |
xc::('A::type => 'B::type) => 'P::type => 'A::type. |
|
9259 |
admissible x xa xb xc & |
|
9260 |
(ALL (f::'A::type => 'B::type) a::'P::type. |
|
9261 |
xa f a --> x (xc f a) (xb a)) --> |
|
9262 |
admissible x xa xb (%(f::'A::type => 'B::type) x::'P::type. f (xc f x))" |
|
9263 |
by (import hollight ADMISSIBLE_NEST) |
|
9264 |
||
9265 |
lemma ADMISSIBLE_LAMBDA: "ALL (x::'A::type => 'A::type => bool) |
|
9266 |
(xa::('A::type => 'B::type) => 'P::type => bool) |
|
9267 |
(xb::'P::type => 'A::type) |
|
9268 |
xc::'C::type => ('A::type => 'B::type) => 'P::type => 'D::type. |
|
9269 |
(ALL xd::'C::type. admissible x xa xb (xc xd)) --> |
|
9270 |
admissible x xa xb |
|
9271 |
(%(f::'A::type => 'B::type) (x::'P::type) u::'C::type. xc u f x)" |
|
9272 |
by (import hollight ADMISSIBLE_LAMBDA) |
|
9273 |
||
19093 | 9274 |
lemma ADMISSIBLE_NSUM: "ALL (x::'B::type => 'A::type => bool) |
9275 |
(xa::('B::type => 'C::type) => 'P::type => bool) |
|
9276 |
(xb::'P::type => 'A::type) |
|
9277 |
(xc::('B::type => 'C::type) => 'P::type => nat => nat) |
|
9278 |
(xd::'P::type => nat) xe::'P::type => nat. |
|
9279 |
(ALL xf::nat. |
|
9280 |
admissible x |
|
9281 |
(%(f::'B::type => 'C::type) x::'P::type. |
|
9282 |
<= (xd x) xf & <= xf (xe x) & xa f x) |
|
9283 |
xb (%(f::'B::type => 'C::type) x::'P::type. xc f x xf)) --> |
|
9284 |
admissible x xa xb |
|
9285 |
(%(f::'B::type => 'C::type) x::'P::type. |
|
9286 |
nsum (dotdot (xd x) (xe x)) (xc f x))" |
|
9287 |
by (import hollight ADMISSIBLE_NSUM) |
|
9288 |
||
9289 |
lemma ADMISSIBLE_SUM: "ALL (x::'B::type => 'A::type => bool) |
|
9290 |
(xa::('B::type => 'C::type) => 'P::type => bool) |
|
9291 |
(xb::'P::type => 'A::type) |
|
9292 |
(xc::('B::type => 'C::type) => 'P::type => nat => hollight.real) |
|
9293 |
(xd::'P::type => nat) xe::'P::type => nat. |
|
9294 |
(ALL xf::nat. |
|
9295 |
admissible x |
|
9296 |
(%(f::'B::type => 'C::type) x::'P::type. |
|
9297 |
<= (xd x) xf & <= xf (xe x) & xa f x) |
|
9298 |
xb (%(f::'B::type => 'C::type) x::'P::type. xc f x xf)) --> |
|
9299 |
admissible x xa xb |
|
9300 |
(%(f::'B::type => 'C::type) x::'P::type. |
|
9301 |
hollight.sum (dotdot (xd x) (xe x)) (xc f x))" |
|
9302 |
by (import hollight ADMISSIBLE_SUM) |
|
9303 |
||
9304 |
lemma WF_REC_CASES: "ALL (u_353::'A::type => 'A::type => bool) |
|
17644 | 9305 |
clauses::(('P::type => 'A::type) * |
9306 |
(('A::type => 'B::type) |
|
9307 |
=> 'P::type => 'B::type)) hollight.list. |
|
19093 | 9308 |
WF u_353 & |
17644 | 9309 |
ALL_list |
9310 |
(GABS |
|
9311 |
(%f::('P::type => 'A::type) * |
|
9312 |
(('A::type => 'B::type) => 'P::type => 'B::type) |
|
9313 |
=> bool. |
|
9314 |
ALL (s::'P::type => 'A::type) |
|
9315 |
t::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9316 |
GEQ (f (s, t)) |
|
9317 |
(EX (P::('A::type => 'B::type) => 'P::type => bool) |
|
9318 |
(G::('A::type => 'B::type) => 'P::type => 'A::type) |
|
9319 |
H::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9320 |
(ALL (f::'A::type => 'B::type) (a::'P::type) y::'A::type. |
|
19093 | 9321 |
P f a & u_353 y (G f a) --> u_353 y (s a)) & |
17644 | 9322 |
(ALL (f::'A::type => 'B::type) (g::'A::type => 'B::type) |
9323 |
a::'P::type. |
|
19093 | 9324 |
(ALL z::'A::type. u_353 z (s a) --> f z = g z) --> |
17644 | 9325 |
P f a = P g a & G f a = G g a & H f a = H g a) & |
9326 |
(ALL (f::'A::type => 'B::type) a::'P::type. |
|
9327 |
t f a = COND (P f a) (f (G f a)) (H f a))))) |
|
9328 |
clauses --> |
|
9329 |
(EX f::'A::type => 'B::type. ALL x::'A::type. f x = CASEWISE clauses f x)" |
|
9330 |
by (import hollight WF_REC_CASES) |
|
9331 |
||
9332 |
lemma RECURSION_CASEWISE: "ALL clauses::(('P::type => 'A::type) * |
|
9333 |
(('A::type => 'B::type) |
|
9334 |
=> 'P::type => 'B::type)) hollight.list. |
|
9335 |
(EX u::'A::type => 'A::type => bool. |
|
9336 |
WF u & |
|
9337 |
ALL_list |
|
9338 |
(GABS |
|
9339 |
(%f::('P::type => 'A::type) * |
|
9340 |
(('A::type => 'B::type) => 'P::type => 'B::type) |
|
9341 |
=> bool. |
|
9342 |
ALL (s::'P::type => 'A::type) |
|
9343 |
t::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9344 |
GEQ (f (s, t)) |
|
9345 |
(tailadmissible u |
|
9346 |
(%(f::'A::type => 'B::type) a::'P::type. True) s t))) |
|
9347 |
clauses) & |
|
9348 |
(ALL (x::'P::type => 'A::type) |
|
9349 |
(xa::('A::type => 'B::type) => 'P::type => 'B::type) |
|
9350 |
(xb::'P::type => 'A::type) |
|
9351 |
(xc::('A::type => 'B::type) => 'P::type => 'B::type) |
|
9352 |
(xd::'A::type => 'B::type) (xe::'P::type) xf::'P::type. |
|
9353 |
MEM (x, xa) clauses & MEM (xb, xc) clauses --> |
|
9354 |
x xe = xb xf --> xa xd xe = xc xd xf) --> |
|
9355 |
(EX f::'A::type => 'B::type. |
|
9356 |
ALL_list |
|
9357 |
(GABS |
|
9358 |
(%fa::('P::type => 'A::type) * |
|
9359 |
(('A::type => 'B::type) => 'P::type => 'B::type) |
|
9360 |
=> bool. |
|
9361 |
ALL (s::'P::type => 'A::type) |
|
9362 |
t::('A::type => 'B::type) => 'P::type => 'B::type. |
|
9363 |
GEQ (fa (s, t)) (ALL x::'P::type. f (s x) = t f x))) |
|
9364 |
clauses)" |
|
9365 |
by (import hollight RECURSION_CASEWISE) |
|
9366 |
||
19093 | 9367 |
lemma cth: "ALL (p1::'A::type => 'q_59947::type) |
9368 |
(p2::'q_59958::type => 'A::type => 'q_59952::type) |
|
9369 |
(p1'::'A::type => 'q_59947::type) |
|
9370 |
p2'::'q_59958::type => 'A::type => 'q_59952::type. |
|
9371 |
(ALL (c::'q_59958::type) (x::'A::type) y::'A::type. |
|
17644 | 9372 |
p1 x = p1' y --> p2 c x = p2' c y) --> |
19093 | 9373 |
(ALL (c::'q_59958::type) (x::'A::type) y::'A::type. |
17644 | 9374 |
p1' x = p1 y --> p2' c x = p2 c y)" |
9375 |
by (import hollight cth) |
|
9376 |
||
19093 | 9377 |
lemma RECURSION_CASEWISE_PAIRWISE: "ALL x::(('q_59995::type => 'q_59975::type) * |
9378 |
(('q_59975::type => 'q_59991::type) |
|
9379 |
=> 'q_59995::type => 'q_59991::type)) hollight.list. |
|
9380 |
(EX u::'q_59975::type => 'q_59975::type => bool. |
|
17644 | 9381 |
WF u & |
9382 |
ALL_list |
|
9383 |
(GABS |
|
19093 | 9384 |
(%f::('q_59995::type => 'q_59975::type) * |
9385 |
(('q_59975::type => 'q_59991::type) |
|
9386 |
=> 'q_59995::type => 'q_59991::type) |
|
17644 | 9387 |
=> bool. |
19093 | 9388 |
ALL (s::'q_59995::type => 'q_59975::type) |
9389 |
t::('q_59975::type => 'q_59991::type) |
|
9390 |
=> 'q_59995::type => 'q_59991::type. |
|
17644 | 9391 |
GEQ (f (s, t)) |
9392 |
(tailadmissible u |
|
19093 | 9393 |
(%(f::'q_59975::type => 'q_59991::type) |
9394 |
a::'q_59995::type. True) |
|
17644 | 9395 |
s t))) |
9396 |
x) & |
|
9397 |
ALL_list |
|
9398 |
(GABS |
|
19093 | 9399 |
(%f::('q_59995::type => 'q_59975::type) * |
9400 |
(('q_59975::type => 'q_59991::type) |
|
9401 |
=> 'q_59995::type => 'q_59991::type) |
|
17644 | 9402 |
=> bool. |
19093 | 9403 |
ALL (a::'q_59995::type => 'q_59975::type) |
9404 |
b::('q_59975::type => 'q_59991::type) |
|
9405 |
=> 'q_59995::type => 'q_59991::type. |
|
17644 | 9406 |
GEQ (f (a, b)) |
19093 | 9407 |
(ALL (c::'q_59975::type => 'q_59991::type) (x::'q_59995::type) |
9408 |
y::'q_59995::type. a x = a y --> b c x = b c y))) |
|
17644 | 9409 |
x & |
9410 |
PAIRWISE |
|
9411 |
(GABS |
|
19093 | 9412 |
(%f::('q_59995::type => 'q_59975::type) * |
9413 |
(('q_59975::type => 'q_59991::type) |
|
9414 |
=> 'q_59995::type => 'q_59991::type) |
|
9415 |
=> ('q_59995::type => 'q_59975::type) * |
|
9416 |
(('q_59975::type => 'q_59991::type) |
|
9417 |
=> 'q_59995::type => 'q_59991::type) |
|
17644 | 9418 |
=> bool. |
19093 | 9419 |
ALL (s::'q_59995::type => 'q_59975::type) |
9420 |
t::('q_59975::type => 'q_59991::type) |
|
9421 |
=> 'q_59995::type => 'q_59991::type. |
|
17644 | 9422 |
GEQ (f (s, t)) |
9423 |
(GABS |
|
19093 | 9424 |
(%f::('q_59995::type => 'q_59975::type) * |
9425 |
(('q_59975::type => 'q_59991::type) |
|
9426 |
=> 'q_59995::type => 'q_59991::type) |
|
17644 | 9427 |
=> bool. |
19093 | 9428 |
ALL (s'::'q_59995::type => 'q_59975::type) |
9429 |
t'::('q_59975::type => 'q_59991::type) |
|
9430 |
=> 'q_59995::type => 'q_59991::type. |
|
17644 | 9431 |
GEQ (f (s', t')) |
19093 | 9432 |
(ALL (c::'q_59975::type => 'q_59991::type) |
9433 |
(x::'q_59995::type) y::'q_59995::type. |
|
17644 | 9434 |
s x = s' y --> t c x = t' c y))))) |
9435 |
x --> |
|
19093 | 9436 |
(EX f::'q_59975::type => 'q_59991::type. |
17644 | 9437 |
ALL_list |
9438 |
(GABS |
|
19093 | 9439 |
(%fa::('q_59995::type => 'q_59975::type) * |
9440 |
(('q_59975::type => 'q_59991::type) |
|
9441 |
=> 'q_59995::type => 'q_59991::type) |
|
17644 | 9442 |
=> bool. |
19093 | 9443 |
ALL (s::'q_59995::type => 'q_59975::type) |
9444 |
t::('q_59975::type => 'q_59991::type) |
|
9445 |
=> 'q_59995::type => 'q_59991::type. |
|
9446 |
GEQ (fa (s, t)) (ALL x::'q_59995::type. f (s x) = t f x))) |
|
17644 | 9447 |
x)" |
9448 |
by (import hollight RECURSION_CASEWISE_PAIRWISE) |
|
9449 |
||
19093 | 9450 |
lemma SUPERADMISSIBLE_T: "superadmissible (u_353::'q_60105::type => 'q_60105::type => bool) |
9451 |
(%(f::'q_60105::type => 'q_60107::type) x::'q_60111::type. True) |
|
9452 |
(s::'q_60111::type => 'q_60105::type) |
|
9453 |
(t::('q_60105::type => 'q_60107::type) |
|
9454 |
=> 'q_60111::type => 'q_60107::type) = |
|
9455 |
tailadmissible u_353 |
|
9456 |
(%(f::'q_60105::type => 'q_60107::type) x::'q_60111::type. True) s t" |
|
17644 | 9457 |
by (import hollight SUPERADMISSIBLE_T) |
9458 |
||
9459 |
;end_setup |
|
9460 |
||
9461 |
end |
|
9462 |