14516
|
1 |
theory HOL4Base = HOL4Compat + HOL4Syntax:
|
|
2 |
|
|
3 |
;setup_theory bool
|
|
4 |
|
|
5 |
constdefs
|
|
6 |
ARB :: "'a"
|
|
7 |
"ARB == SOME x. True"
|
|
8 |
|
|
9 |
lemma ARB_DEF: "ARB = (SOME x. True)"
|
|
10 |
by (import bool ARB_DEF)
|
|
11 |
|
|
12 |
constdefs
|
|
13 |
IN :: "'a => ('a => bool) => bool"
|
|
14 |
"IN == %x f. f x"
|
|
15 |
|
|
16 |
lemma IN_DEF: "IN = (%x f. f x)"
|
|
17 |
by (import bool IN_DEF)
|
|
18 |
|
|
19 |
constdefs
|
|
20 |
RES_FORALL :: "('a => bool) => ('a => bool) => bool"
|
|
21 |
"RES_FORALL == %p m. ALL x. IN x p --> m x"
|
|
22 |
|
|
23 |
lemma RES_FORALL_DEF: "RES_FORALL = (%p m. ALL x. IN x p --> m x)"
|
|
24 |
by (import bool RES_FORALL_DEF)
|
|
25 |
|
|
26 |
constdefs
|
|
27 |
RES_EXISTS :: "('a => bool) => ('a => bool) => bool"
|
|
28 |
"RES_EXISTS == %p m. EX x. IN x p & m x"
|
|
29 |
|
|
30 |
lemma RES_EXISTS_DEF: "RES_EXISTS = (%p m. EX x. IN x p & m x)"
|
|
31 |
by (import bool RES_EXISTS_DEF)
|
|
32 |
|
|
33 |
constdefs
|
|
34 |
RES_EXISTS_UNIQUE :: "('a => bool) => ('a => bool) => bool"
|
|
35 |
"RES_EXISTS_UNIQUE ==
|
|
36 |
%p m. RES_EXISTS p m &
|
|
37 |
RES_FORALL p (%x. RES_FORALL p (%y. m x & m y --> x = y))"
|
|
38 |
|
|
39 |
lemma RES_EXISTS_UNIQUE_DEF: "RES_EXISTS_UNIQUE =
|
|
40 |
(%p m. RES_EXISTS p m &
|
|
41 |
RES_FORALL p (%x. RES_FORALL p (%y. m x & m y --> x = y)))"
|
|
42 |
by (import bool RES_EXISTS_UNIQUE_DEF)
|
|
43 |
|
|
44 |
constdefs
|
|
45 |
RES_SELECT :: "('a => bool) => ('a => bool) => 'a"
|
|
46 |
"RES_SELECT == %p m. SOME x. IN x p & m x"
|
|
47 |
|
|
48 |
lemma RES_SELECT_DEF: "RES_SELECT = (%p m. SOME x. IN x p & m x)"
|
|
49 |
by (import bool RES_SELECT_DEF)
|
|
50 |
|
|
51 |
lemma EXCLUDED_MIDDLE: "ALL t. t | ~ t"
|
|
52 |
by (import bool EXCLUDED_MIDDLE)
|
|
53 |
|
|
54 |
lemma FORALL_THM: "All f = All f"
|
|
55 |
by (import bool FORALL_THM)
|
|
56 |
|
|
57 |
lemma EXISTS_THM: "Ex f = Ex f"
|
|
58 |
by (import bool EXISTS_THM)
|
|
59 |
|
|
60 |
lemma F_IMP: "ALL t. ~ t --> t --> False"
|
|
61 |
by (import bool F_IMP)
|
|
62 |
|
|
63 |
lemma NOT_AND: "~ (t & ~ t)"
|
|
64 |
by (import bool NOT_AND)
|
|
65 |
|
|
66 |
lemma AND_CLAUSES: "ALL t.
|
|
67 |
(True & t) = t &
|
|
68 |
(t & True) = t & (False & t) = False & (t & False) = False & (t & t) = t"
|
|
69 |
by (import bool AND_CLAUSES)
|
|
70 |
|
|
71 |
lemma OR_CLAUSES: "ALL t.
|
|
72 |
(True | t) = True &
|
|
73 |
(t | True) = True & (False | t) = t & (t | False) = t & (t | t) = t"
|
|
74 |
by (import bool OR_CLAUSES)
|
|
75 |
|
|
76 |
lemma IMP_CLAUSES: "ALL t.
|
|
77 |
(True --> t) = t &
|
|
78 |
(t --> True) = True &
|
|
79 |
(False --> t) = True & (t --> t) = True & (t --> False) = (~ t)"
|
|
80 |
by (import bool IMP_CLAUSES)
|
|
81 |
|
|
82 |
lemma NOT_CLAUSES: "(ALL t. (~ ~ t) = t) & (~ True) = False & (~ False) = True"
|
|
83 |
by (import bool NOT_CLAUSES)
|
|
84 |
|
|
85 |
lemma BOOL_EQ_DISTINCT: "True ~= False & False ~= True"
|
|
86 |
by (import bool BOOL_EQ_DISTINCT)
|
|
87 |
|
|
88 |
lemma EQ_CLAUSES: "ALL t.
|
|
89 |
(True = t) = t &
|
|
90 |
(t = True) = t & (False = t) = (~ t) & (t = False) = (~ t)"
|
|
91 |
by (import bool EQ_CLAUSES)
|
|
92 |
|
|
93 |
lemma COND_CLAUSES: "ALL t1 t2. (if True then t1 else t2) = t1 & (if False then t1 else t2) = t2"
|
|
94 |
by (import bool COND_CLAUSES)
|
|
95 |
|
|
96 |
lemma SELECT_UNIQUE: "ALL P x. (ALL y. P y = (y = x)) --> Eps P = x"
|
|
97 |
by (import bool SELECT_UNIQUE)
|
|
98 |
|
|
99 |
lemma BOTH_EXISTS_AND_THM: "ALL (P::bool) Q::bool. (EX x::'a. P & Q) = ((EX x::'a. P) & (EX x::'a. Q))"
|
|
100 |
by (import bool BOTH_EXISTS_AND_THM)
|
|
101 |
|
|
102 |
lemma BOTH_FORALL_OR_THM: "ALL (P::bool) Q::bool.
|
|
103 |
(ALL x::'a. P | Q) = ((ALL x::'a. P) | (ALL x::'a. Q))"
|
|
104 |
by (import bool BOTH_FORALL_OR_THM)
|
|
105 |
|
|
106 |
lemma BOTH_FORALL_IMP_THM: "ALL (P::bool) Q::bool.
|
|
107 |
(ALL x::'a. P --> Q) = ((EX x::'a. P) --> (ALL x::'a. Q))"
|
|
108 |
by (import bool BOTH_FORALL_IMP_THM)
|
|
109 |
|
|
110 |
lemma BOTH_EXISTS_IMP_THM: "ALL (P::bool) Q::bool.
|
|
111 |
(EX x::'a. P --> Q) = ((ALL x::'a. P) --> (EX x::'a. Q))"
|
|
112 |
by (import bool BOTH_EXISTS_IMP_THM)
|
|
113 |
|
|
114 |
lemma OR_IMP_THM: "ALL A B. (A = (B | A)) = (B --> A)"
|
|
115 |
by (import bool OR_IMP_THM)
|
|
116 |
|
|
117 |
lemma DE_MORGAN_THM: "ALL A B. (~ (A & B)) = (~ A | ~ B) & (~ (A | B)) = (~ A & ~ B)"
|
|
118 |
by (import bool DE_MORGAN_THM)
|
|
119 |
|
|
120 |
lemma IMP_F_EQ_F: "ALL t. (t --> False) = (t = False)"
|
|
121 |
by (import bool IMP_F_EQ_F)
|
|
122 |
|
|
123 |
lemma EQ_EXPAND: "ALL t1 t2. (t1 = t2) = (t1 & t2 | ~ t1 & ~ t2)"
|
|
124 |
by (import bool EQ_EXPAND)
|
|
125 |
|
|
126 |
lemma COND_RATOR: "ALL b f g x. (if b then f else g) x = (if b then f x else g x)"
|
|
127 |
by (import bool COND_RATOR)
|
|
128 |
|
|
129 |
lemma COND_ABS: "ALL b f g. (%x. if b then f x else g x) = (if b then f else g)"
|
|
130 |
by (import bool COND_ABS)
|
|
131 |
|
|
132 |
lemma COND_EXPAND: "ALL b t1 t2. (if b then t1 else t2) = ((~ b | t1) & (b | t2))"
|
|
133 |
by (import bool COND_EXPAND)
|
|
134 |
|
|
135 |
lemma ONE_ONE_THM: "ALL f. inj f = (ALL x1 x2. f x1 = f x2 --> x1 = x2)"
|
|
136 |
by (import bool ONE_ONE_THM)
|
|
137 |
|
|
138 |
lemma ABS_REP_THM: "(All::(('a => bool) => bool) => bool)
|
|
139 |
(%P::'a => bool.
|
|
140 |
(op -->::bool => bool => bool)
|
|
141 |
((Ex::(('b => 'a) => bool) => bool)
|
|
142 |
((TYPE_DEFINITION::('a => bool) => ('b => 'a) => bool) P))
|
|
143 |
((Ex::(('b => 'a) => bool) => bool)
|
|
144 |
(%x::'b => 'a.
|
|
145 |
(Ex::(('a => 'b) => bool) => bool)
|
|
146 |
(%abs::'a => 'b.
|
|
147 |
(op &::bool => bool => bool)
|
|
148 |
((All::('b => bool) => bool)
|
|
149 |
(%a::'b. (op =::'b => 'b => bool) (abs (x a)) a))
|
|
150 |
((All::('a => bool) => bool)
|
|
151 |
(%r::'a.
|
|
152 |
(op =::bool => bool => bool) (P r)
|
|
153 |
((op =::'a => 'a => bool) (x (abs r)) r)))))))"
|
|
154 |
by (import bool ABS_REP_THM)
|
|
155 |
|
|
156 |
lemma LET_RAND: "(P::'b => bool) (Let (M::'a) (N::'a => 'b)) = (let x::'a = M in P (N x))"
|
|
157 |
by (import bool LET_RAND)
|
|
158 |
|
|
159 |
lemma LET_RATOR: "Let (M::'a) (N::'a => 'b => 'c) (b::'b) = (let x::'a = M in N x b)"
|
|
160 |
by (import bool LET_RATOR)
|
|
161 |
|
|
162 |
lemma SWAP_FORALL_THM: "ALL P. (ALL x. All (P x)) = (ALL y x. P x y)"
|
|
163 |
by (import bool SWAP_FORALL_THM)
|
|
164 |
|
|
165 |
lemma SWAP_EXISTS_THM: "ALL P. (EX x. Ex (P x)) = (EX y x. P x y)"
|
|
166 |
by (import bool SWAP_EXISTS_THM)
|
|
167 |
|
|
168 |
lemma AND_CONG: "ALL P P' Q Q'. (Q --> P = P') & (P' --> Q = Q') --> (P & Q) = (P' & Q')"
|
|
169 |
by (import bool AND_CONG)
|
|
170 |
|
|
171 |
lemma OR_CONG: "ALL P P' Q Q'. (~ Q --> P = P') & (~ P' --> Q = Q') --> (P | Q) = (P' | Q')"
|
|
172 |
by (import bool OR_CONG)
|
|
173 |
|
|
174 |
lemma COND_CONG: "ALL P Q x x' y y'.
|
|
175 |
P = Q & (Q --> x = x') & (~ Q --> y = y') -->
|
|
176 |
(if P then x else y) = (if Q then x' else y')"
|
|
177 |
by (import bool COND_CONG)
|
|
178 |
|
|
179 |
lemma MONO_COND: "(x --> y) --> (z --> w) --> (if b then x else z) --> (if b then y else w)"
|
|
180 |
by (import bool MONO_COND)
|
|
181 |
|
|
182 |
lemma SKOLEM_THM: "ALL P. (ALL x. Ex (P x)) = (EX f. ALL x. P x (f x))"
|
|
183 |
by (import bool SKOLEM_THM)
|
|
184 |
|
|
185 |
lemma bool_case_thm: "(ALL (e0::'a) e1::'a. (case True of True => e0 | False => e1) = e0) &
|
|
186 |
(ALL (e0::'a) e1::'a. (case False of True => e0 | False => e1) = e1)"
|
|
187 |
by (import bool bool_case_thm)
|
|
188 |
|
|
189 |
lemma bool_case_ID: "ALL x b. (case b of True => x | False => x) = x"
|
|
190 |
by (import bool bool_case_ID)
|
|
191 |
|
|
192 |
lemma boolAxiom: "ALL e0 e1. EX x. x True = e0 & x False = e1"
|
|
193 |
by (import bool boolAxiom)
|
|
194 |
|
|
195 |
lemma UEXISTS_OR_THM: "ALL P Q. (EX! x. P x | Q x) --> Ex1 P | Ex1 Q"
|
|
196 |
by (import bool UEXISTS_OR_THM)
|
|
197 |
|
|
198 |
lemma UEXISTS_SIMP: "(EX! x::'a. (t::bool)) = (t & (ALL x::'a. All (op = x)))"
|
|
199 |
by (import bool UEXISTS_SIMP)
|
|
200 |
|
|
201 |
consts
|
|
202 |
RES_ABSTRACT :: "('a => bool) => ('a => 'b) => 'a => 'b"
|
|
203 |
|
|
204 |
specification (RES_ABSTRACT) RES_ABSTRACT_DEF: "(ALL (p::'a => bool) (m::'a => 'b) x::'a.
|
|
205 |
IN x p --> RES_ABSTRACT p m x = m x) &
|
|
206 |
(ALL (p::'a => bool) (m1::'a => 'b) m2::'a => 'b.
|
|
207 |
(ALL x::'a. IN x p --> m1 x = m2 x) -->
|
|
208 |
RES_ABSTRACT p m1 = RES_ABSTRACT p m2)"
|
|
209 |
by (import bool RES_ABSTRACT_DEF)
|
|
210 |
|
|
211 |
lemma BOOL_FUN_CASES_THM: "ALL f. f = (%b. True) | f = (%b. False) | f = (%b. b) | f = Not"
|
|
212 |
by (import bool BOOL_FUN_CASES_THM)
|
|
213 |
|
|
214 |
lemma BOOL_FUN_INDUCT: "ALL P. P (%b. True) & P (%b. False) & P (%b. b) & P Not --> All P"
|
|
215 |
by (import bool BOOL_FUN_INDUCT)
|
|
216 |
|
|
217 |
;end_setup
|
|
218 |
|
|
219 |
;setup_theory combin
|
|
220 |
|
|
221 |
constdefs
|
|
222 |
K :: "'a => 'b => 'a"
|
|
223 |
"K == %x y. x"
|
|
224 |
|
|
225 |
lemma K_DEF: "K = (%x y. x)"
|
|
226 |
by (import combin K_DEF)
|
|
227 |
|
|
228 |
constdefs
|
|
229 |
S :: "('a => 'b => 'c) => ('a => 'b) => 'a => 'c"
|
|
230 |
"S == %f g x. f x (g x)"
|
|
231 |
|
|
232 |
lemma S_DEF: "S = (%f g x. f x (g x))"
|
|
233 |
by (import combin S_DEF)
|
|
234 |
|
|
235 |
constdefs
|
|
236 |
I :: "'a => 'a"
|
|
237 |
"(op ==::('a => 'a) => ('a => 'a) => prop) (I::'a => 'a)
|
|
238 |
((S::('a => ('a => 'a) => 'a) => ('a => 'a => 'a) => 'a => 'a)
|
|
239 |
(K::'a => ('a => 'a) => 'a) (K::'a => 'a => 'a))"
|
|
240 |
|
|
241 |
lemma I_DEF: "(op =::('a => 'a) => ('a => 'a) => bool) (I::'a => 'a)
|
|
242 |
((S::('a => ('a => 'a) => 'a) => ('a => 'a => 'a) => 'a => 'a)
|
|
243 |
(K::'a => ('a => 'a) => 'a) (K::'a => 'a => 'a))"
|
|
244 |
by (import combin I_DEF)
|
|
245 |
|
|
246 |
constdefs
|
|
247 |
C :: "('a => 'b => 'c) => 'b => 'a => 'c"
|
|
248 |
"C == %f x y. f y x"
|
|
249 |
|
|
250 |
lemma C_DEF: "C = (%f x y. f y x)"
|
|
251 |
by (import combin C_DEF)
|
|
252 |
|
|
253 |
constdefs
|
|
254 |
W :: "('a => 'a => 'b) => 'a => 'b"
|
|
255 |
"W == %f x. f x x"
|
|
256 |
|
|
257 |
lemma W_DEF: "W = (%f x. f x x)"
|
|
258 |
by (import combin W_DEF)
|
|
259 |
|
|
260 |
lemma I_THM: "ALL x. I x = x"
|
|
261 |
by (import combin I_THM)
|
|
262 |
|
|
263 |
lemma I_o_ID: "ALL f. I o f = f & f o I = f"
|
|
264 |
by (import combin I_o_ID)
|
|
265 |
|
|
266 |
;end_setup
|
|
267 |
|
|
268 |
;setup_theory sum
|
|
269 |
|
|
270 |
lemma ISL_OR_ISR: "ALL x. ISL x | ISR x"
|
|
271 |
by (import sum ISL_OR_ISR)
|
|
272 |
|
|
273 |
lemma INL: "ALL x. ISL x --> Inl (OUTL x) = x"
|
|
274 |
by (import sum INL)
|
|
275 |
|
|
276 |
lemma INR: "ALL x. ISR x --> Inr (OUTR x) = x"
|
|
277 |
by (import sum INR)
|
|
278 |
|
|
279 |
lemma sum_case_cong: "ALL (M::'b + 'c) (M'::'b + 'c) (f::'b => 'a) g::'c => 'a.
|
|
280 |
M = M' &
|
|
281 |
(ALL x::'b. M' = Inl x --> f x = (f'::'b => 'a) x) &
|
|
282 |
(ALL y::'c. M' = Inr y --> g y = (g'::'c => 'a) y) -->
|
|
283 |
sum_case f g M = sum_case f' g' M'"
|
|
284 |
by (import sum sum_case_cong)
|
|
285 |
|
|
286 |
;end_setup
|
|
287 |
|
|
288 |
;setup_theory one
|
|
289 |
|
|
290 |
;end_setup
|
|
291 |
|
|
292 |
;setup_theory option
|
|
293 |
|
|
294 |
lemma option_CLAUSES: "(op &::bool => bool => bool)
|
|
295 |
((All::('a => bool) => bool)
|
|
296 |
(%x::'a.
|
|
297 |
(All::('a => bool) => bool)
|
|
298 |
(%y::'a.
|
|
299 |
(op =::bool => bool => bool)
|
|
300 |
((op =::'a option => 'a option => bool) ((Some::'a ~=> 'a) x)
|
|
301 |
((Some::'a ~=> 'a) y))
|
|
302 |
((op =::'a => 'a => bool) x y))))
|
|
303 |
((op &::bool => bool => bool)
|
|
304 |
((All::('a => bool) => bool)
|
|
305 |
(%x::'a.
|
|
306 |
(op =::'a => 'a => bool)
|
|
307 |
((the::'a option => 'a) ((Some::'a ~=> 'a) x)) x))
|
|
308 |
((op &::bool => bool => bool)
|
|
309 |
((All::('a => bool) => bool)
|
|
310 |
(%x::'a.
|
|
311 |
(Not::bool => bool)
|
|
312 |
((op =::'a option => 'a option => bool) (None::'a option)
|
|
313 |
((Some::'a ~=> 'a) x))))
|
|
314 |
((op &::bool => bool => bool)
|
|
315 |
((All::('a => bool) => bool)
|
|
316 |
(%x::'a.
|
|
317 |
(Not::bool => bool)
|
|
318 |
((op =::'a option => 'a option => bool) ((Some::'a ~=> 'a) x)
|
|
319 |
(None::'a option))))
|
|
320 |
((op &::bool => bool => bool)
|
|
321 |
((All::('a => bool) => bool)
|
|
322 |
(%x::'a.
|
|
323 |
(op =::bool => bool => bool)
|
|
324 |
((IS_SOME::'a option => bool) ((Some::'a ~=> 'a) x))
|
|
325 |
(True::bool)))
|
|
326 |
((op &::bool => bool => bool)
|
|
327 |
((op =::bool => bool => bool)
|
|
328 |
((IS_SOME::'a option => bool) (None::'a option)) (False::bool))
|
|
329 |
((op &::bool => bool => bool)
|
|
330 |
((All::('a option => bool) => bool)
|
|
331 |
(%x::'a option.
|
|
332 |
(op =::bool => bool => bool)
|
|
333 |
((IS_NONE::'a option => bool) x)
|
|
334 |
((op =::'a option => 'a option => bool) x
|
|
335 |
(None::'a option))))
|
|
336 |
((op &::bool => bool => bool)
|
|
337 |
((All::('a option => bool) => bool)
|
|
338 |
(%x::'a option.
|
|
339 |
(op =::bool => bool => bool)
|
|
340 |
((Not::bool => bool) ((IS_SOME::'a option => bool) x))
|
|
341 |
((op =::'a option => 'a option => bool) x
|
|
342 |
(None::'a option))))
|
|
343 |
((op &::bool => bool => bool)
|
|
344 |
((All::('a option => bool) => bool)
|
|
345 |
(%x::'a option.
|
|
346 |
(op -->::bool => bool => bool)
|
|
347 |
((IS_SOME::'a option => bool) x)
|
|
348 |
((op =::'a option => 'a option => bool)
|
|
349 |
((Some::'a ~=> 'a) ((the::'a option => 'a) x))
|
|
350 |
x)))
|
|
351 |
((op &::bool => bool => bool)
|
|
352 |
((All::('a option => bool) => bool)
|
|
353 |
(%x::'a option.
|
|
354 |
(op =::'a option => 'a option => bool)
|
|
355 |
((option_case::'a option
|
|
356 |
=> ('a ~=> 'a) => 'a option ~=> 'a)
|
|
357 |
(None::'a option) (Some::'a ~=> 'a) x)
|
|
358 |
x))
|
|
359 |
((op &::bool => bool => bool)
|
|
360 |
((All::('a option => bool) => bool)
|
|
361 |
(%x::'a option.
|
|
362 |
(op =::'a option => 'a option => bool)
|
|
363 |
((option_case::'a option
|
|
364 |
=> ('a ~=> 'a) => 'a option ~=> 'a)
|
|
365 |
x (Some::'a ~=> 'a) x)
|
|
366 |
x))
|
|
367 |
((op &::bool => bool => bool)
|
|
368 |
((All::('a option => bool) => bool)
|
|
369 |
(%x::'a option.
|
|
370 |
(op -->::bool => bool => bool)
|
|
371 |
((IS_NONE::'a option => bool) x)
|
|
372 |
((op =::'b => 'b => bool)
|
|
373 |
((option_case::'b
|
|
374 |
=> ('a => 'b) => 'a option => 'b)
|
|
375 |
(e::'b) (f::'a => 'b) x)
|
|
376 |
e)))
|
|
377 |
((op &::bool => bool => bool)
|
|
378 |
((All::('a option => bool) => bool)
|
|
379 |
(%x::'a option.
|
|
380 |
(op -->::bool => bool => bool)
|
|
381 |
((IS_SOME::'a option => bool) x)
|
|
382 |
((op =::'b => 'b => bool)
|
|
383 |
((option_case::'b
|
|
384 |
=> ('a => 'b) => 'a option => 'b)
|
|
385 |
e f x)
|
|
386 |
(f ((the::'a option => 'a) x)))))
|
|
387 |
((op &::bool => bool => bool)
|
|
388 |
((All::('a option => bool) => bool)
|
|
389 |
(%x::'a option.
|
|
390 |
(op -->::bool => bool => bool)
|
|
391 |
((IS_SOME::'a option => bool) x)
|
|
392 |
((op =::'a option => 'a option => bool)
|
|
393 |
((option_case::'a option
|
|
394 |
=> ('a ~=> 'a) => 'a option ~=> 'a)
|
|
395 |
(ea::'a option) (Some::'a ~=> 'a) x)
|
|
396 |
x)))
|
|
397 |
((op &::bool => bool => bool)
|
|
398 |
((All::('b => bool) => bool)
|
|
399 |
(%u::'b.
|
|
400 |
(All::(('a => 'b) => bool) => bool)
|
|
401 |
(%f::'a => 'b.
|
|
402 |
(op =::'b => 'b => bool)
|
|
403 |
((option_case::'b => ('a => 'b) => 'a option => 'b) u f
|
|
404 |
(None::'a option))
|
|
405 |
u)))
|
|
406 |
((op &::bool => bool => bool)
|
|
407 |
((All::('b => bool) => bool)
|
|
408 |
(%u::'b.
|
|
409 |
(All::(('a => 'b) => bool) => bool)
|
|
410 |
(%f::'a => 'b.
|
|
411 |
(All::('a => bool) => bool)
|
|
412 |
(%x::'a.
|
|
413 |
(op =::'b => 'b => bool)
|
|
414 |
((option_case::'b => ('a => 'b) => 'a option => 'b) u f
|
|
415 |
((Some::'a ~=> 'a) x))
|
|
416 |
(f x)))))
|
|
417 |
((op &::bool => bool => bool)
|
|
418 |
((All::(('a => 'b) => bool) => bool)
|
|
419 |
(%f::'a => 'b.
|
|
420 |
(All::('a => bool) => bool)
|
|
421 |
(%x::'a.
|
|
422 |
(op =::'b option => 'b option => bool)
|
|
423 |
((option_map::('a => 'b) => 'a option ~=> 'b) f
|
|
424 |
((Some::'a ~=> 'a) x))
|
|
425 |
((Some::'b ~=> 'b) (f x)))))
|
|
426 |
((op &::bool => bool => bool)
|
|
427 |
((All::(('a => 'b) => bool) => bool)
|
|
428 |
(%f::'a => 'b.
|
|
429 |
(op =::'b option => 'b option => bool)
|
|
430 |
((option_map::('a => 'b) => 'a option ~=> 'b) f (None::'a option))
|
|
431 |
(None::'b option)))
|
|
432 |
((op &::bool => bool => bool)
|
|
433 |
((op =::'a option => 'a option => bool)
|
|
434 |
((OPTION_JOIN::'a option option ~=> 'a) (None::'a option option))
|
|
435 |
(None::'a option))
|
|
436 |
((All::('a option => bool) => bool)
|
|
437 |
(%x::'a option.
|
|
438 |
(op =::'a option => 'a option => bool)
|
|
439 |
((OPTION_JOIN::'a option option ~=> 'a)
|
|
440 |
((Some::'a option ~=> 'a option) x))
|
|
441 |
x))))))))))))))))))))"
|
|
442 |
by (import option option_CLAUSES)
|
|
443 |
|
|
444 |
lemma option_case_compute: "option_case (e::'b) (f::'a => 'b) (x::'a option) =
|
|
445 |
(if IS_SOME x then f (the x) else e)"
|
|
446 |
by (import option option_case_compute)
|
|
447 |
|
|
448 |
lemma OPTION_MAP_EQ_SOME: "ALL f x y. (option_map f x = Some y) = (EX z. x = Some z & y = f z)"
|
|
449 |
by (import option OPTION_MAP_EQ_SOME)
|
|
450 |
|
|
451 |
lemma OPTION_JOIN_EQ_SOME: "ALL x xa. (OPTION_JOIN x = Some xa) = (x = Some (Some xa))"
|
|
452 |
by (import option OPTION_JOIN_EQ_SOME)
|
|
453 |
|
|
454 |
lemma option_case_cong: "ALL M M' u f.
|
|
455 |
M = M' & (M' = None --> u = u') & (ALL x. M' = Some x --> f x = f' x) -->
|
|
456 |
option_case u f M = option_case u' f' M'"
|
|
457 |
by (import option option_case_cong)
|
|
458 |
|
|
459 |
;end_setup
|
|
460 |
|
|
461 |
;setup_theory marker
|
|
462 |
|
|
463 |
consts
|
|
464 |
stmarker :: "'a => 'a"
|
|
465 |
|
|
466 |
defs
|
|
467 |
stmarker_primdef: "stmarker == %x. x"
|
|
468 |
|
|
469 |
lemma stmarker_def: "ALL x. stmarker x = x"
|
|
470 |
by (import marker stmarker_def)
|
|
471 |
|
|
472 |
lemma move_left_conj: "ALL x xa xb.
|
|
473 |
(x & stmarker xb) = (stmarker xb & x) &
|
|
474 |
((stmarker xb & x) & xa) = (stmarker xb & x & xa) &
|
|
475 |
(x & stmarker xb & xa) = (stmarker xb & x & xa)"
|
|
476 |
by (import marker move_left_conj)
|
|
477 |
|
|
478 |
lemma move_right_conj: "ALL x xa xb.
|
|
479 |
(stmarker xb & x) = (x & stmarker xb) &
|
|
480 |
(x & xa & stmarker xb) = ((x & xa) & stmarker xb) &
|
|
481 |
((x & stmarker xb) & xa) = ((x & xa) & stmarker xb)"
|
|
482 |
by (import marker move_right_conj)
|
|
483 |
|
|
484 |
lemma move_left_disj: "ALL x xa xb.
|
|
485 |
(x | stmarker xb) = (stmarker xb | x) &
|
|
486 |
((stmarker xb | x) | xa) = (stmarker xb | x | xa) &
|
|
487 |
(x | stmarker xb | xa) = (stmarker xb | x | xa)"
|
|
488 |
by (import marker move_left_disj)
|
|
489 |
|
|
490 |
lemma move_right_disj: "ALL x xa xb.
|
|
491 |
(stmarker xb | x) = (x | stmarker xb) &
|
|
492 |
(x | xa | stmarker xb) = ((x | xa) | stmarker xb) &
|
|
493 |
((x | stmarker xb) | xa) = ((x | xa) | stmarker xb)"
|
|
494 |
by (import marker move_right_disj)
|
|
495 |
|
|
496 |
;end_setup
|
|
497 |
|
|
498 |
;setup_theory relation
|
|
499 |
|
|
500 |
constdefs
|
|
501 |
TC :: "('a => 'a => bool) => 'a => 'a => bool"
|
|
502 |
"TC ==
|
|
503 |
%R a b.
|
|
504 |
ALL P.
|
|
505 |
(ALL x y. R x y --> P x y) & (ALL x y z. P x y & P y z --> P x z) -->
|
|
506 |
P a b"
|
|
507 |
|
|
508 |
lemma TC_DEF: "ALL R a b.
|
|
509 |
TC R a b =
|
|
510 |
(ALL P.
|
|
511 |
(ALL x y. R x y --> P x y) & (ALL x y z. P x y & P y z --> P x z) -->
|
|
512 |
P a b)"
|
|
513 |
by (import relation TC_DEF)
|
|
514 |
|
|
515 |
constdefs
|
|
516 |
RTC :: "('a => 'a => bool) => 'a => 'a => bool"
|
|
517 |
"RTC ==
|
|
518 |
%R a b.
|
|
519 |
ALL P. (ALL x. P x x) & (ALL x y z. R x y & P y z --> P x z) --> P a b"
|
|
520 |
|
|
521 |
lemma RTC_DEF: "ALL R a b.
|
|
522 |
RTC R a b =
|
|
523 |
(ALL P. (ALL x. P x x) & (ALL x y z. R x y & P y z --> P x z) --> P a b)"
|
|
524 |
by (import relation RTC_DEF)
|
|
525 |
|
|
526 |
consts
|
|
527 |
RC :: "('a => 'a => bool) => 'a => 'a => bool"
|
|
528 |
|
|
529 |
defs
|
|
530 |
RC_primdef: "RC == %R x y. x = y | R x y"
|
|
531 |
|
|
532 |
lemma RC_def: "ALL R x y. RC R x y = (x = y | R x y)"
|
|
533 |
by (import relation RC_def)
|
|
534 |
|
|
535 |
consts
|
|
536 |
transitive :: "('a => 'a => bool) => bool"
|
|
537 |
|
|
538 |
defs
|
|
539 |
transitive_primdef: "transitive == %R. ALL x y z. R x y & R y z --> R x z"
|
|
540 |
|
|
541 |
lemma transitive_def: "ALL R. transitive R = (ALL x y z. R x y & R y z --> R x z)"
|
|
542 |
by (import relation transitive_def)
|
|
543 |
|
|
544 |
constdefs
|
|
545 |
pred_reflexive :: "('a => 'a => bool) => bool"
|
|
546 |
"pred_reflexive == %R. ALL x. R x x"
|
|
547 |
|
|
548 |
lemma reflexive_def: "ALL R. pred_reflexive R = (ALL x. R x x)"
|
|
549 |
by (import relation reflexive_def)
|
|
550 |
|
|
551 |
lemma TC_TRANSITIVE: "ALL x. transitive (TC x)"
|
|
552 |
by (import relation TC_TRANSITIVE)
|
|
553 |
|
|
554 |
lemma RTC_INDUCT: "ALL x xa.
|
|
555 |
(ALL x. xa x x) & (ALL xb y z. x xb y & xa y z --> xa xb z) -->
|
|
556 |
(ALL xb xc. RTC x xb xc --> xa xb xc)"
|
|
557 |
by (import relation RTC_INDUCT)
|
|
558 |
|
|
559 |
lemma TC_RULES: "ALL x.
|
|
560 |
(ALL xa xb. x xa xb --> TC x xa xb) &
|
|
561 |
(ALL xa xb xc. TC x xa xb & TC x xb xc --> TC x xa xc)"
|
|
562 |
by (import relation TC_RULES)
|
|
563 |
|
|
564 |
lemma RTC_RULES: "ALL x.
|
|
565 |
(ALL xa. RTC x xa xa) &
|
|
566 |
(ALL xa xb xc. x xa xb & RTC x xb xc --> RTC x xa xc)"
|
|
567 |
by (import relation RTC_RULES)
|
|
568 |
|
|
569 |
lemma RTC_STRONG_INDUCT: "ALL R P.
|
|
570 |
(ALL x. P x x) & (ALL x y z. R x y & RTC R y z & P y z --> P x z) -->
|
|
571 |
(ALL x y. RTC R x y --> P x y)"
|
|
572 |
by (import relation RTC_STRONG_INDUCT)
|
|
573 |
|
|
574 |
lemma RTC_RTC: "ALL R x y. RTC R x y --> (ALL z. RTC R y z --> RTC R x z)"
|
|
575 |
by (import relation RTC_RTC)
|
|
576 |
|
|
577 |
lemma RTC_TRANSITIVE: "ALL x. transitive (RTC x)"
|
|
578 |
by (import relation RTC_TRANSITIVE)
|
|
579 |
|
|
580 |
lemma RTC_REFLEXIVE: "ALL R. pred_reflexive (RTC R)"
|
|
581 |
by (import relation RTC_REFLEXIVE)
|
|
582 |
|
|
583 |
lemma RC_REFLEXIVE: "ALL R. pred_reflexive (RC R)"
|
|
584 |
by (import relation RC_REFLEXIVE)
|
|
585 |
|
|
586 |
lemma TC_SUBSET: "ALL x xa xb. x xa xb --> TC x xa xb"
|
|
587 |
by (import relation TC_SUBSET)
|
|
588 |
|
|
589 |
lemma RTC_SUBSET: "ALL R x y. R x y --> RTC R x y"
|
|
590 |
by (import relation RTC_SUBSET)
|
|
591 |
|
|
592 |
lemma RC_SUBSET: "ALL R x y. R x y --> RC R x y"
|
|
593 |
by (import relation RC_SUBSET)
|
|
594 |
|
|
595 |
lemma RC_RTC: "ALL R x y. RC R x y --> RTC R x y"
|
|
596 |
by (import relation RC_RTC)
|
|
597 |
|
|
598 |
lemma TC_INDUCT: "ALL x xa.
|
|
599 |
(ALL xb y. x xb y --> xa xb y) &
|
|
600 |
(ALL x y z. xa x y & xa y z --> xa x z) -->
|
|
601 |
(ALL xb xc. TC x xb xc --> xa xb xc)"
|
|
602 |
by (import relation TC_INDUCT)
|
|
603 |
|
|
604 |
lemma TC_INDUCT_LEFT1: "ALL x xa.
|
|
605 |
(ALL xb y. x xb y --> xa xb y) &
|
|
606 |
(ALL xb y z. x xb y & xa y z --> xa xb z) -->
|
|
607 |
(ALL xb xc. TC x xb xc --> xa xb xc)"
|
|
608 |
by (import relation TC_INDUCT_LEFT1)
|
|
609 |
|
|
610 |
lemma TC_STRONG_INDUCT: "ALL R P.
|
|
611 |
(ALL x y. R x y --> P x y) &
|
|
612 |
(ALL x y z. P x y & P y z & TC R x y & TC R y z --> P x z) -->
|
|
613 |
(ALL u v. TC R u v --> P u v)"
|
|
614 |
by (import relation TC_STRONG_INDUCT)
|
|
615 |
|
|
616 |
lemma TC_STRONG_INDUCT_LEFT1: "ALL R P.
|
|
617 |
(ALL x y. R x y --> P x y) &
|
|
618 |
(ALL x y z. R x y & P y z & TC R y z --> P x z) -->
|
|
619 |
(ALL u v. TC R u v --> P u v)"
|
|
620 |
by (import relation TC_STRONG_INDUCT_LEFT1)
|
|
621 |
|
|
622 |
lemma TC_RTC: "ALL R x y. TC R x y --> RTC R x y"
|
|
623 |
by (import relation TC_RTC)
|
|
624 |
|
|
625 |
lemma RTC_TC_RC: "ALL R x y. RTC R x y --> RC R x y | TC R x y"
|
|
626 |
by (import relation RTC_TC_RC)
|
|
627 |
|
|
628 |
lemma TC_RC_EQNS: "ALL R. RC (TC R) = RTC R & TC (RC R) = RTC R"
|
|
629 |
by (import relation TC_RC_EQNS)
|
|
630 |
|
|
631 |
lemma RC_IDEM: "ALL R. RC (RC R) = RC R"
|
|
632 |
by (import relation RC_IDEM)
|
|
633 |
|
|
634 |
lemma TC_IDEM: "ALL R. TC (TC R) = TC R"
|
|
635 |
by (import relation TC_IDEM)
|
|
636 |
|
|
637 |
lemma RTC_IDEM: "ALL R. RTC (RTC R) = RTC R"
|
|
638 |
by (import relation RTC_IDEM)
|
|
639 |
|
|
640 |
lemma RTC_CASES1: "ALL x xa xb. RTC x xa xb = (xa = xb | (EX u. x xa u & RTC x u xb))"
|
|
641 |
by (import relation RTC_CASES1)
|
|
642 |
|
|
643 |
lemma RTC_CASES2: "ALL x xa xb. RTC x xa xb = (xa = xb | (EX u. RTC x xa u & x u xb))"
|
|
644 |
by (import relation RTC_CASES2)
|
|
645 |
|
|
646 |
lemma RTC_CASES_RTC_TWICE: "ALL x xa xb. RTC x xa xb = (EX u. RTC x xa u & RTC x u xb)"
|
|
647 |
by (import relation RTC_CASES_RTC_TWICE)
|
|
648 |
|
|
649 |
lemma TC_CASES1: "ALL R x z. TC R x z --> R x z | (EX y. R x y & TC R y z)"
|
|
650 |
by (import relation TC_CASES1)
|
|
651 |
|
|
652 |
lemma TC_CASES2: "ALL R x z. TC R x z --> R x z | (EX y. TC R x y & R y z)"
|
|
653 |
by (import relation TC_CASES2)
|
|
654 |
|
|
655 |
lemma TC_MONOTONE: "ALL R Q. (ALL x y. R x y --> Q x y) --> (ALL x y. TC R x y --> TC Q x y)"
|
|
656 |
by (import relation TC_MONOTONE)
|
|
657 |
|
|
658 |
lemma RTC_MONOTONE: "ALL R Q. (ALL x y. R x y --> Q x y) --> (ALL x y. RTC R x y --> RTC Q x y)"
|
|
659 |
by (import relation RTC_MONOTONE)
|
|
660 |
|
|
661 |
constdefs
|
|
662 |
WF :: "('a => 'a => bool) => bool"
|
|
663 |
"WF == %R. ALL B. Ex B --> (EX min. B min & (ALL b. R b min --> ~ B b))"
|
|
664 |
|
|
665 |
lemma WF_DEF: "ALL R. WF R = (ALL B. Ex B --> (EX min. B min & (ALL b. R b min --> ~ B b)))"
|
|
666 |
by (import relation WF_DEF)
|
|
667 |
|
|
668 |
lemma WF_INDUCTION_THM: "ALL R. WF R --> (ALL P. (ALL x. (ALL y. R y x --> P y) --> P x) --> All P)"
|
|
669 |
by (import relation WF_INDUCTION_THM)
|
|
670 |
|
|
671 |
lemma WF_NOT_REFL: "ALL x xa xb. WF x --> x xa xb --> xa ~= xb"
|
|
672 |
by (import relation WF_NOT_REFL)
|
|
673 |
|
|
674 |
constdefs
|
|
675 |
EMPTY_REL :: "'a => 'a => bool"
|
|
676 |
"EMPTY_REL == %x y. False"
|
|
677 |
|
|
678 |
lemma EMPTY_REL_DEF: "ALL x y. EMPTY_REL x y = False"
|
|
679 |
by (import relation EMPTY_REL_DEF)
|
|
680 |
|
|
681 |
lemma WF_EMPTY_REL: "WF EMPTY_REL"
|
|
682 |
by (import relation WF_EMPTY_REL)
|
|
683 |
|
|
684 |
lemma WF_SUBSET: "ALL x xa. WF x & (ALL xb y. xa xb y --> x xb y) --> WF xa"
|
|
685 |
by (import relation WF_SUBSET)
|
|
686 |
|
|
687 |
lemma WF_TC: "ALL R. WF R --> WF (TC R)"
|
|
688 |
by (import relation WF_TC)
|
|
689 |
|
|
690 |
consts
|
|
691 |
inv_image :: "('b => 'b => bool) => ('a => 'b) => 'a => 'a => bool"
|
|
692 |
|
|
693 |
defs
|
|
694 |
inv_image_primdef: "relation.inv_image ==
|
|
695 |
%(R::'b => 'b => bool) (f::'a => 'b) (x::'a) y::'a. R (f x) (f y)"
|
|
696 |
|
|
697 |
lemma inv_image_def: "ALL (R::'b => 'b => bool) f::'a => 'b.
|
|
698 |
relation.inv_image R f = (%(x::'a) y::'a. R (f x) (f y))"
|
|
699 |
by (import relation inv_image_def)
|
|
700 |
|
|
701 |
lemma WF_inv_image: "ALL (R::'b => 'b => bool) f::'a => 'b. WF R --> WF (relation.inv_image R f)"
|
|
702 |
by (import relation WF_inv_image)
|
|
703 |
|
|
704 |
constdefs
|
|
705 |
RESTRICT :: "('a => 'b) => ('a => 'a => bool) => 'a => 'a => 'b"
|
|
706 |
"RESTRICT == %f R x y. if R y x then f y else ARB"
|
|
707 |
|
|
708 |
lemma RESTRICT_DEF: "ALL f R x. RESTRICT f R x = (%y. if R y x then f y else ARB)"
|
|
709 |
by (import relation RESTRICT_DEF)
|
|
710 |
|
|
711 |
lemma RESTRICT_LEMMA: "ALL x xa xb xc. xa xb xc --> RESTRICT x xa xc xb = x xb"
|
|
712 |
by (import relation RESTRICT_LEMMA)
|
|
713 |
|
|
714 |
consts
|
|
715 |
approx :: "('a => 'a => bool) => (('a => 'b) => 'a => 'b) => 'a => ('a => 'b) => bool"
|
|
716 |
|
|
717 |
defs
|
|
718 |
approx_primdef: "approx == %R M x f. f = RESTRICT (%y. M (RESTRICT f R y) y) R x"
|
|
719 |
|
|
720 |
lemma approx_def: "ALL R M x f. approx R M x f = (f = RESTRICT (%y. M (RESTRICT f R y) y) R x)"
|
|
721 |
by (import relation approx_def)
|
|
722 |
|
|
723 |
consts
|
|
724 |
the_fun :: "('a => 'a => bool) => (('a => 'b) => 'a => 'b) => 'a => 'a => 'b"
|
|
725 |
|
|
726 |
defs
|
|
727 |
the_fun_primdef: "the_fun == %R M x. Eps (approx R M x)"
|
|
728 |
|
|
729 |
lemma the_fun_def: "ALL R M x. the_fun R M x = Eps (approx R M x)"
|
|
730 |
by (import relation the_fun_def)
|
|
731 |
|
|
732 |
constdefs
|
|
733 |
WFREC :: "('a => 'a => bool) => (('a => 'b) => 'a => 'b) => 'a => 'b"
|
|
734 |
"WFREC ==
|
|
735 |
%R M x. M (RESTRICT (the_fun (TC R) (%f v. M (RESTRICT f R v) v) x) R x) x"
|
|
736 |
|
|
737 |
lemma WFREC_DEF: "ALL R M.
|
|
738 |
WFREC R M =
|
|
739 |
(%x. M (RESTRICT (the_fun (TC R) (%f v. M (RESTRICT f R v) v) x) R x) x)"
|
|
740 |
by (import relation WFREC_DEF)
|
|
741 |
|
|
742 |
lemma WFREC_THM: "ALL R M. WF R --> (ALL x. WFREC R M x = M (RESTRICT (WFREC R M) R x) x)"
|
|
743 |
by (import relation WFREC_THM)
|
|
744 |
|
|
745 |
lemma WFREC_COROLLARY: "ALL M R f. f = WFREC R M --> WF R --> (ALL x. f x = M (RESTRICT f R x) x)"
|
|
746 |
by (import relation WFREC_COROLLARY)
|
|
747 |
|
|
748 |
lemma WF_RECURSION_THM: "ALL R. WF R --> (ALL M. EX! f. ALL x. f x = M (RESTRICT f R x) x)"
|
|
749 |
by (import relation WF_RECURSION_THM)
|
|
750 |
|
|
751 |
;end_setup
|
|
752 |
|
|
753 |
;setup_theory pair
|
|
754 |
|
|
755 |
lemma CURRY_ONE_ONE_THM: "(curry f = curry g) = (f = g)"
|
|
756 |
by (import pair CURRY_ONE_ONE_THM)
|
|
757 |
|
|
758 |
lemma UNCURRY_ONE_ONE_THM: "(split f = split g) = (f = g)"
|
|
759 |
by (import pair UNCURRY_ONE_ONE_THM)
|
|
760 |
|
|
761 |
lemma pair_Axiom: "ALL f. EX x. ALL xa y. x (xa, y) = f xa y"
|
|
762 |
by (import pair pair_Axiom)
|
|
763 |
|
|
764 |
lemma UNCURRY_CONG: "ALL M M' f.
|
|
765 |
M = M' & (ALL x y. M' = (x, y) --> f x y = f' x y) -->
|
|
766 |
split f M = split f' M'"
|
|
767 |
by (import pair UNCURRY_CONG)
|
|
768 |
|
|
769 |
lemma ELIM_PEXISTS: "(EX p. P (fst p) (snd p)) = (EX p1. Ex (P p1))"
|
|
770 |
by (import pair ELIM_PEXISTS)
|
|
771 |
|
|
772 |
lemma ELIM_PFORALL: "(ALL p. P (fst p) (snd p)) = (ALL p1. All (P p1))"
|
|
773 |
by (import pair ELIM_PFORALL)
|
|
774 |
|
|
775 |
lemma PFORALL_THM: "ALL x. (ALL xa. All (x xa)) = All (split x)"
|
|
776 |
by (import pair PFORALL_THM)
|
|
777 |
|
|
778 |
lemma PEXISTS_THM: "ALL x. (EX xa. Ex (x xa)) = Ex (split x)"
|
|
779 |
by (import pair PEXISTS_THM)
|
|
780 |
|
|
781 |
lemma LET2_RAND: "ALL (x::'c => 'd) (xa::'a * 'b) xb::'a => 'b => 'c.
|
|
782 |
x (Let xa (split xb)) = (let (xa::'a, y::'b) = xa in x (xb xa y))"
|
|
783 |
by (import pair LET2_RAND)
|
|
784 |
|
|
785 |
lemma LET2_RATOR: "ALL (x::'a1 * 'a2) (xa::'a1 => 'a2 => 'b => 'c) xb::'b.
|
|
786 |
Let x (split xa) xb = (let (x::'a1, y::'a2) = x in xa x y xb)"
|
|
787 |
by (import pair LET2_RATOR)
|
|
788 |
|
|
789 |
lemma pair_case_cong: "ALL x xa xb.
|
|
790 |
x = xa & (ALL x y. xa = (x, y) --> xb x y = f' x y) -->
|
|
791 |
split xb x = split f' xa"
|
|
792 |
by (import pair pair_case_cong)
|
|
793 |
|
|
794 |
constdefs
|
|
795 |
LEX :: "('a => 'a => bool) => ('b => 'b => bool) => 'a * 'b => 'a * 'b => bool"
|
|
796 |
"LEX == %R1 R2 (s, t) (u, v). R1 s u | s = u & R2 t v"
|
|
797 |
|
|
798 |
lemma LEX_DEF: "ALL R1 R2. LEX R1 R2 = (%(s, t) (u, v). R1 s u | s = u & R2 t v)"
|
|
799 |
by (import pair LEX_DEF)
|
|
800 |
|
|
801 |
lemma WF_LEX: "ALL x xa. WF x & WF xa --> WF (LEX x xa)"
|
|
802 |
by (import pair WF_LEX)
|
|
803 |
|
|
804 |
constdefs
|
|
805 |
RPROD :: "('a => 'a => bool) => ('b => 'b => bool) => 'a * 'b => 'a * 'b => bool"
|
|
806 |
"RPROD == %R1 R2 (s, t) (u, v). R1 s u & R2 t v"
|
|
807 |
|
|
808 |
lemma RPROD_DEF: "ALL R1 R2. RPROD R1 R2 = (%(s, t) (u, v). R1 s u & R2 t v)"
|
|
809 |
by (import pair RPROD_DEF)
|
|
810 |
|
|
811 |
lemma WF_RPROD: "ALL R Q. WF R & WF Q --> WF (RPROD R Q)"
|
|
812 |
by (import pair WF_RPROD)
|
|
813 |
|
|
814 |
;end_setup
|
|
815 |
|
|
816 |
;setup_theory num
|
|
817 |
|
|
818 |
;end_setup
|
|
819 |
|
|
820 |
;setup_theory prim_rec
|
|
821 |
|
|
822 |
lemma LESS_0_0: "0 < Suc 0"
|
|
823 |
by (import prim_rec LESS_0_0)
|
|
824 |
|
|
825 |
lemma LESS_LEMMA1: "ALL x xa. x < Suc xa --> x = xa | x < xa"
|
|
826 |
by (import prim_rec LESS_LEMMA1)
|
|
827 |
|
|
828 |
lemma LESS_LEMMA2: "ALL m n. m = n | m < n --> m < Suc n"
|
|
829 |
by (import prim_rec LESS_LEMMA2)
|
|
830 |
|
|
831 |
lemma LESS_THM: "ALL m n. (m < Suc n) = (m = n | m < n)"
|
|
832 |
by (import prim_rec LESS_THM)
|
|
833 |
|
|
834 |
lemma LESS_SUC_IMP: "ALL x xa. x < Suc xa --> x ~= xa --> x < xa"
|
|
835 |
by (import prim_rec LESS_SUC_IMP)
|
|
836 |
|
|
837 |
lemma EQ_LESS: "ALL n. Suc m = n --> m < n"
|
|
838 |
by (import prim_rec EQ_LESS)
|
|
839 |
|
|
840 |
lemma NOT_LESS_EQ: "ALL (m::nat) n::nat. m = n --> ~ m < n"
|
|
841 |
by (import prim_rec NOT_LESS_EQ)
|
|
842 |
|
|
843 |
constdefs
|
|
844 |
SIMP_REC_REL :: "(nat => 'a) => 'a => ('a => 'a) => nat => bool"
|
|
845 |
"SIMP_REC_REL == %fun x f n. fun 0 = x & (ALL m<n. fun (Suc m) = f (fun m))"
|
|
846 |
|
|
847 |
lemma SIMP_REC_REL: "ALL fun x f n.
|
|
848 |
SIMP_REC_REL fun x f n = (fun 0 = x & (ALL m<n. fun (Suc m) = f (fun m)))"
|
|
849 |
by (import prim_rec SIMP_REC_REL)
|
|
850 |
|
|
851 |
lemma SIMP_REC_EXISTS: "ALL x f n. EX fun. SIMP_REC_REL fun x f n"
|
|
852 |
by (import prim_rec SIMP_REC_EXISTS)
|
|
853 |
|
|
854 |
lemma SIMP_REC_REL_UNIQUE: "ALL x xa xb xc xd xe.
|
|
855 |
SIMP_REC_REL xb x xa xd & SIMP_REC_REL xc x xa xe -->
|
|
856 |
(ALL n. n < xd & n < xe --> xb n = xc n)"
|
|
857 |
by (import prim_rec SIMP_REC_REL_UNIQUE)
|
|
858 |
|
|
859 |
lemma SIMP_REC_REL_UNIQUE_RESULT: "ALL x f n. EX! y. EX g. SIMP_REC_REL g x f (Suc n) & y = g n"
|
|
860 |
by (import prim_rec SIMP_REC_REL_UNIQUE_RESULT)
|
|
861 |
|
|
862 |
consts
|
|
863 |
SIMP_REC :: "'a => ('a => 'a) => nat => 'a"
|
|
864 |
|
|
865 |
specification (SIMP_REC) SIMP_REC: "ALL x f' n. EX g. SIMP_REC_REL g x f' (Suc n) & SIMP_REC x f' n = g n"
|
|
866 |
by (import prim_rec SIMP_REC)
|
|
867 |
|
|
868 |
lemma LESS_SUC_SUC: "ALL m. m < Suc m & m < Suc (Suc m)"
|
|
869 |
by (import prim_rec LESS_SUC_SUC)
|
|
870 |
|
|
871 |
lemma SIMP_REC_THM: "ALL x f.
|
|
872 |
SIMP_REC x f 0 = x & (ALL m. SIMP_REC x f (Suc m) = f (SIMP_REC x f m))"
|
|
873 |
by (import prim_rec SIMP_REC_THM)
|
|
874 |
|
|
875 |
constdefs
|
|
876 |
PRE :: "nat => nat"
|
|
877 |
"PRE == %m. if m = 0 then 0 else SOME n. m = Suc n"
|
|
878 |
|
|
879 |
lemma PRE_DEF: "ALL m. PRE m = (if m = 0 then 0 else SOME n. m = Suc n)"
|
|
880 |
by (import prim_rec PRE_DEF)
|
|
881 |
|
|
882 |
lemma PRE: "PRE 0 = 0 & (ALL m. PRE (Suc m) = m)"
|
|
883 |
by (import prim_rec PRE)
|
|
884 |
|
|
885 |
constdefs
|
|
886 |
PRIM_REC_FUN :: "'a => ('a => nat => 'a) => nat => nat => 'a"
|
|
887 |
"PRIM_REC_FUN == %x f. SIMP_REC (%n. x) (%fun n. f (fun (PRE n)) n)"
|
|
888 |
|
|
889 |
lemma PRIM_REC_FUN: "ALL x f. PRIM_REC_FUN x f = SIMP_REC (%n. x) (%fun n. f (fun (PRE n)) n)"
|
|
890 |
by (import prim_rec PRIM_REC_FUN)
|
|
891 |
|
|
892 |
lemma PRIM_REC_EQN: "ALL x f.
|
|
893 |
(ALL n. PRIM_REC_FUN x f 0 n = x) &
|
|
894 |
(ALL m n. PRIM_REC_FUN x f (Suc m) n = f (PRIM_REC_FUN x f m (PRE n)) n)"
|
|
895 |
by (import prim_rec PRIM_REC_EQN)
|
|
896 |
|
|
897 |
constdefs
|
|
898 |
PRIM_REC :: "'a => ('a => nat => 'a) => nat => 'a"
|
|
899 |
"PRIM_REC == %x f m. PRIM_REC_FUN x f m (PRE m)"
|
|
900 |
|
|
901 |
lemma PRIM_REC: "ALL x f m. PRIM_REC x f m = PRIM_REC_FUN x f m (PRE m)"
|
|
902 |
by (import prim_rec PRIM_REC)
|
|
903 |
|
|
904 |
lemma PRIM_REC_THM: "ALL x f.
|
|
905 |
PRIM_REC x f 0 = x & (ALL m. PRIM_REC x f (Suc m) = f (PRIM_REC x f m) m)"
|
|
906 |
by (import prim_rec PRIM_REC_THM)
|
|
907 |
|
|
908 |
lemma DC: "ALL P R a.
|
|
909 |
P a & (ALL x. P x --> (EX y. P y & R x y)) -->
|
|
910 |
(EX x. x 0 = a & (ALL n. P (x n) & R (x n) (x (Suc n))))"
|
|
911 |
by (import prim_rec DC)
|
|
912 |
|
|
913 |
lemma num_Axiom_old: "ALL e f. EX! fn1. fn1 0 = e & (ALL n. fn1 (Suc n) = f (fn1 n) n)"
|
|
914 |
by (import prim_rec num_Axiom_old)
|
|
915 |
|
|
916 |
lemma num_Axiom: "ALL e f. EX x. x 0 = e & (ALL n. x (Suc n) = f n (x n))"
|
|
917 |
by (import prim_rec num_Axiom)
|
|
918 |
|
|
919 |
consts
|
|
920 |
wellfounded :: "('a => 'a => bool) => bool"
|
|
921 |
|
|
922 |
defs
|
|
923 |
wellfounded_primdef: "wellfounded == %R. ~ (EX f. ALL n. R (f (Suc n)) (f n))"
|
|
924 |
|
|
925 |
lemma wellfounded_def: "ALL R. wellfounded R = (~ (EX f. ALL n. R (f (Suc n)) (f n)))"
|
|
926 |
by (import prim_rec wellfounded_def)
|
|
927 |
|
|
928 |
lemma WF_IFF_WELLFOUNDED: "ALL R. WF R = wellfounded R"
|
|
929 |
by (import prim_rec WF_IFF_WELLFOUNDED)
|
|
930 |
|
|
931 |
lemma WF_PRED: "WF (%x y. y = Suc x)"
|
|
932 |
by (import prim_rec WF_PRED)
|
|
933 |
|
|
934 |
lemma WF_LESS: "(WF::(nat => nat => bool) => bool) (op <::nat => nat => bool)"
|
|
935 |
by (import prim_rec WF_LESS)
|
|
936 |
|
|
937 |
consts
|
|
938 |
measure :: "('a => nat) => 'a => 'a => bool"
|
|
939 |
|
|
940 |
defs
|
|
941 |
measure_primdef: "prim_rec.measure == relation.inv_image op <"
|
|
942 |
|
|
943 |
lemma measure_def: "prim_rec.measure = relation.inv_image op <"
|
|
944 |
by (import prim_rec measure_def)
|
|
945 |
|
|
946 |
lemma WF_measure: "ALL x. WF (prim_rec.measure x)"
|
|
947 |
by (import prim_rec WF_measure)
|
|
948 |
|
|
949 |
lemma measure_thm: "ALL x xa xb. prim_rec.measure x xa xb = (x xa < x xb)"
|
|
950 |
by (import prim_rec measure_thm)
|
|
951 |
|
|
952 |
;end_setup
|
|
953 |
|
|
954 |
;setup_theory arithmetic
|
|
955 |
|
|
956 |
constdefs
|
|
957 |
nat_elim__magic :: "nat => nat"
|
|
958 |
"nat_elim__magic == %n. n"
|
|
959 |
|
|
960 |
lemma nat_elim__magic: "ALL n. nat_elim__magic n = n"
|
|
961 |
by (import arithmetic nat_elim__magic)
|
|
962 |
|
|
963 |
consts
|
|
964 |
EVEN :: "nat => bool"
|
|
965 |
|
|
966 |
specification (EVEN) EVEN: "EVEN 0 = True & (ALL n. EVEN (Suc n) = (~ EVEN n))"
|
|
967 |
by (import arithmetic EVEN)
|
|
968 |
|
|
969 |
consts
|
|
970 |
ODD :: "nat => bool"
|
|
971 |
|
|
972 |
specification (ODD) ODD: "ODD 0 = False & (ALL n. ODD (Suc n) = (~ ODD n))"
|
|
973 |
by (import arithmetic ODD)
|
|
974 |
|
|
975 |
lemma TWO: "2 = Suc 1"
|
|
976 |
by (import arithmetic TWO)
|
|
977 |
|
|
978 |
lemma NORM_0: "(0::nat) = (0::nat)"
|
|
979 |
by (import arithmetic NORM_0)
|
|
980 |
|
|
981 |
lemma num_case_compute: "ALL n. nat_case f g n = (if n = 0 then f else g (PRE n))"
|
|
982 |
by (import arithmetic num_case_compute)
|
|
983 |
|
|
984 |
lemma ADD_CLAUSES: "0 + m = m & m + 0 = m & Suc m + n = Suc (m + n) & m + Suc n = Suc (m + n)"
|
|
985 |
by (import arithmetic ADD_CLAUSES)
|
|
986 |
|
|
987 |
lemma LESS_ADD: "ALL (m::nat) n::nat. n < m --> (EX p::nat. p + n = m)"
|
|
988 |
by (import arithmetic LESS_ADD)
|
|
989 |
|
|
990 |
lemma LESS_ANTISYM: "ALL (m::nat) n::nat. ~ (m < n & n < m)"
|
|
991 |
by (import arithmetic LESS_ANTISYM)
|
|
992 |
|
|
993 |
lemma LESS_LESS_SUC: "ALL x xa. ~ (x < xa & xa < Suc x)"
|
|
994 |
by (import arithmetic LESS_LESS_SUC)
|
|
995 |
|
|
996 |
lemma FUN_EQ_LEMMA: "ALL f x1 x2. f x1 & ~ f x2 --> x1 ~= x2"
|
|
997 |
by (import arithmetic FUN_EQ_LEMMA)
|
|
998 |
|
|
999 |
lemma LESS_NOT_SUC: "ALL m n. m < n & n ~= Suc m --> Suc m < n"
|
|
1000 |
by (import arithmetic LESS_NOT_SUC)
|
|
1001 |
|
|
1002 |
lemma LESS_0_CASES: "ALL m::nat. (0::nat) = m | (0::nat) < m"
|
|
1003 |
by (import arithmetic LESS_0_CASES)
|
|
1004 |
|
|
1005 |
lemma LESS_CASES_IMP: "ALL (m::nat) n::nat. ~ m < n & m ~= n --> n < m"
|
|
1006 |
by (import arithmetic LESS_CASES_IMP)
|
|
1007 |
|
|
1008 |
lemma LESS_CASES: "ALL (m::nat) n::nat. m < n | n <= m"
|
|
1009 |
by (import arithmetic LESS_CASES)
|
|
1010 |
|
|
1011 |
lemma LESS_EQ_SUC_REFL: "ALL m. m <= Suc m"
|
|
1012 |
by (import arithmetic LESS_EQ_SUC_REFL)
|
|
1013 |
|
|
1014 |
lemma LESS_ADD_NONZERO: "ALL (m::nat) n::nat. n ~= (0::nat) --> m < m + n"
|
|
1015 |
by (import arithmetic LESS_ADD_NONZERO)
|
|
1016 |
|
|
1017 |
lemma LESS_EQ_ANTISYM: "ALL (x::nat) xa::nat. ~ (x < xa & xa <= x)"
|
|
1018 |
by (import arithmetic LESS_EQ_ANTISYM)
|
|
1019 |
|
|
1020 |
lemma SUB_0: "ALL m::nat. (0::nat) - m = (0::nat) & m - (0::nat) = m"
|
|
1021 |
by (import arithmetic SUB_0)
|
|
1022 |
|
|
1023 |
lemma SUC_SUB1: "ALL m. Suc m - 1 = m"
|
|
1024 |
by (import arithmetic SUC_SUB1)
|
|
1025 |
|
|
1026 |
lemma PRE_SUB1: "ALL m. PRE m = m - 1"
|
|
1027 |
by (import arithmetic PRE_SUB1)
|
|
1028 |
|
|
1029 |
lemma MULT_CLAUSES: "ALL x xa.
|
|
1030 |
0 * x = 0 &
|
|
1031 |
x * 0 = 0 &
|
|
1032 |
1 * x = x &
|
|
1033 |
x * 1 = x & Suc x * xa = x * xa + xa & x * Suc xa = x + x * xa"
|
|
1034 |
by (import arithmetic MULT_CLAUSES)
|
|
1035 |
|
|
1036 |
lemma PRE_SUB: "ALL m n. PRE (m - n) = PRE m - n"
|
|
1037 |
by (import arithmetic PRE_SUB)
|
|
1038 |
|
|
1039 |
lemma ADD_EQ_1: "ALL (m::nat) n::nat.
|
|
1040 |
(m + n = (1::nat)) =
|
|
1041 |
(m = (1::nat) & n = (0::nat) | m = (0::nat) & n = (1::nat))"
|
|
1042 |
by (import arithmetic ADD_EQ_1)
|
|
1043 |
|
|
1044 |
lemma ADD_INV_0_EQ: "ALL (m::nat) n::nat. (m + n = m) = (n = (0::nat))"
|
|
1045 |
by (import arithmetic ADD_INV_0_EQ)
|
|
1046 |
|
|
1047 |
lemma PRE_SUC_EQ: "ALL m n. 0 < n --> (m = PRE n) = (Suc m = n)"
|
|
1048 |
by (import arithmetic PRE_SUC_EQ)
|
|
1049 |
|
|
1050 |
lemma INV_PRE_EQ: "ALL m n. 0 < m & 0 < n --> (PRE m = PRE n) = (m = n)"
|
|
1051 |
by (import arithmetic INV_PRE_EQ)
|
|
1052 |
|
|
1053 |
lemma LESS_SUC_NOT: "ALL m n. m < n --> ~ n < Suc m"
|
|
1054 |
by (import arithmetic LESS_SUC_NOT)
|
|
1055 |
|
|
1056 |
lemma ADD_EQ_SUB: "ALL (m::nat) (n::nat) p::nat. n <= p --> (m + n = p) = (m = p - n)"
|
|
1057 |
by (import arithmetic ADD_EQ_SUB)
|
|
1058 |
|
|
1059 |
lemma LESS_ADD_1: "ALL (x::nat) xa::nat. xa < x --> (EX xb::nat. x = xa + (xb + (1::nat)))"
|
|
1060 |
by (import arithmetic LESS_ADD_1)
|
|
1061 |
|
|
1062 |
lemma NOT_ODD_EQ_EVEN: "ALL n m. Suc (n + n) ~= m + m"
|
|
1063 |
by (import arithmetic NOT_ODD_EQ_EVEN)
|
|
1064 |
|
|
1065 |
lemma MULT_SUC_EQ: "ALL p m n. (n * Suc p = m * Suc p) = (n = m)"
|
|
1066 |
by (import arithmetic MULT_SUC_EQ)
|
|
1067 |
|
|
1068 |
lemma MULT_EXP_MONO: "ALL p q n m. (n * Suc q ^ p = m * Suc q ^ p) = (n = m)"
|
|
1069 |
by (import arithmetic MULT_EXP_MONO)
|
|
1070 |
|
|
1071 |
lemma LESS_ADD_SUC: "ALL m n. m < m + Suc n"
|
|
1072 |
by (import arithmetic LESS_ADD_SUC)
|
|
1073 |
|
|
1074 |
lemma LESS_OR_EQ_ADD: "ALL (n::nat) m::nat. n < m | (EX p::nat. n = p + m)"
|
|
1075 |
by (import arithmetic LESS_OR_EQ_ADD)
|
|
1076 |
|
|
1077 |
lemma WOP: "ALL P::nat => bool. Ex P --> (EX n::nat. P n & (ALL m<n. ~ P m))"
|
|
1078 |
by (import arithmetic WOP)
|
|
1079 |
|
|
1080 |
lemma INV_PRE_LESS: "ALL m. 0 < m --> (ALL n. (PRE m < PRE n) = (m < n))"
|
|
1081 |
by (import arithmetic INV_PRE_LESS)
|
|
1082 |
|
|
1083 |
lemma INV_PRE_LESS_EQ: "ALL n. 0 < n --> (ALL m. (PRE m <= PRE n) = (m <= n))"
|
|
1084 |
by (import arithmetic INV_PRE_LESS_EQ)
|
|
1085 |
|
|
1086 |
lemma SUB_EQ_EQ_0: "ALL (m::nat) n::nat. (m - n = m) = (m = (0::nat) | n = (0::nat))"
|
|
1087 |
by (import arithmetic SUB_EQ_EQ_0)
|
|
1088 |
|
|
1089 |
lemma SUB_LESS_OR: "ALL (m::nat) n::nat. n < m --> n <= m - (1::nat)"
|
|
1090 |
by (import arithmetic SUB_LESS_OR)
|
|
1091 |
|
|
1092 |
lemma LESS_SUB_ADD_LESS: "ALL (n::nat) (m::nat) i::nat. i < n - m --> i + m < n"
|
|
1093 |
by (import arithmetic LESS_SUB_ADD_LESS)
|
|
1094 |
|
|
1095 |
lemma LESS_EQ_SUB_LESS: "ALL (x::nat) xa::nat. xa <= x --> (ALL c::nat. (x - xa < c) = (x < xa + c))"
|
|
1096 |
by (import arithmetic LESS_EQ_SUB_LESS)
|
|
1097 |
|
|
1098 |
lemma NOT_SUC_LESS_EQ: "ALL x xa. (~ Suc x <= xa) = (xa <= x)"
|
|
1099 |
by (import arithmetic NOT_SUC_LESS_EQ)
|
|
1100 |
|
|
1101 |
lemma SUB_LESS_EQ_ADD: "ALL (m::nat) p::nat. m <= p --> (ALL n::nat. (p - m <= n) = (p <= m + n))"
|
|
1102 |
by (import arithmetic SUB_LESS_EQ_ADD)
|
|
1103 |
|
|
1104 |
lemma SUB_CANCEL: "ALL (x::nat) (xa::nat) xb::nat.
|
|
1105 |
xa <= x & xb <= x --> (x - xa = x - xb) = (xa = xb)"
|
|
1106 |
by (import arithmetic SUB_CANCEL)
|
|
1107 |
|
|
1108 |
lemma NOT_EXP_0: "ALL m n. Suc n ^ m ~= 0"
|
|
1109 |
by (import arithmetic NOT_EXP_0)
|
|
1110 |
|
|
1111 |
lemma ZERO_LESS_EXP: "ALL m n. 0 < Suc n ^ m"
|
|
1112 |
by (import arithmetic ZERO_LESS_EXP)
|
|
1113 |
|
|
1114 |
lemma ODD_OR_EVEN: "ALL x. EX xa. x = Suc (Suc 0) * xa | x = Suc (Suc 0) * xa + 1"
|
|
1115 |
by (import arithmetic ODD_OR_EVEN)
|
|
1116 |
|
|
1117 |
lemma LESS_EXP_SUC_MONO: "ALL n m. Suc (Suc m) ^ n < Suc (Suc m) ^ Suc n"
|
|
1118 |
by (import arithmetic LESS_EXP_SUC_MONO)
|
|
1119 |
|
|
1120 |
lemma LESS_LESS_CASES: "ALL (m::nat) n::nat. m = n | m < n | n < m"
|
|
1121 |
by (import arithmetic LESS_LESS_CASES)
|
|
1122 |
|
|
1123 |
lemma LESS_EQUAL_ADD: "ALL (m::nat) n::nat. m <= n --> (EX p::nat. n = m + p)"
|
|
1124 |
by (import arithmetic LESS_EQUAL_ADD)
|
|
1125 |
|
|
1126 |
lemma LESS_EQ_EXISTS: "ALL (m::nat) n::nat. (m <= n) = (EX p::nat. n = m + p)"
|
|
1127 |
by (import arithmetic LESS_EQ_EXISTS)
|
|
1128 |
|
|
1129 |
lemma MULT_EQ_1: "ALL (x::nat) y::nat. (x * y = (1::nat)) = (x = (1::nat) & y = (1::nat))"
|
|
1130 |
by (import arithmetic MULT_EQ_1)
|
|
1131 |
|
|
1132 |
consts
|
|
1133 |
FACT :: "nat => nat"
|
|
1134 |
|
|
1135 |
specification (FACT) FACT: "FACT 0 = 1 & (ALL n. FACT (Suc n) = Suc n * FACT n)"
|
|
1136 |
by (import arithmetic FACT)
|
|
1137 |
|
|
1138 |
lemma FACT_LESS: "ALL n. 0 < FACT n"
|
|
1139 |
by (import arithmetic FACT_LESS)
|
|
1140 |
|
|
1141 |
lemma EVEN_ODD: "ALL n. EVEN n = (~ ODD n)"
|
|
1142 |
by (import arithmetic EVEN_ODD)
|
|
1143 |
|
|
1144 |
lemma ODD_EVEN: "ALL x. ODD x = (~ EVEN x)"
|
|
1145 |
by (import arithmetic ODD_EVEN)
|
|
1146 |
|
|
1147 |
lemma EVEN_OR_ODD: "ALL x. EVEN x | ODD x"
|
|
1148 |
by (import arithmetic EVEN_OR_ODD)
|
|
1149 |
|
|
1150 |
lemma EVEN_AND_ODD: "ALL x. ~ (EVEN x & ODD x)"
|
|
1151 |
by (import arithmetic EVEN_AND_ODD)
|
|
1152 |
|
|
1153 |
lemma EVEN_ADD: "ALL m n. EVEN (m + n) = (EVEN m = EVEN n)"
|
|
1154 |
by (import arithmetic EVEN_ADD)
|
|
1155 |
|
|
1156 |
lemma EVEN_MULT: "ALL m n. EVEN (m * n) = (EVEN m | EVEN n)"
|
|
1157 |
by (import arithmetic EVEN_MULT)
|
|
1158 |
|
|
1159 |
lemma ODD_ADD: "ALL m n. ODD (m + n) = (ODD m ~= ODD n)"
|
|
1160 |
by (import arithmetic ODD_ADD)
|
|
1161 |
|
|
1162 |
lemma ODD_MULT: "ALL m n. ODD (m * n) = (ODD m & ODD n)"
|
|
1163 |
by (import arithmetic ODD_MULT)
|
|
1164 |
|
|
1165 |
lemma EVEN_DOUBLE: "ALL n. EVEN (2 * n)"
|
|
1166 |
by (import arithmetic EVEN_DOUBLE)
|
|
1167 |
|
|
1168 |
lemma ODD_DOUBLE: "ALL x. ODD (Suc (2 * x))"
|
|
1169 |
by (import arithmetic ODD_DOUBLE)
|
|
1170 |
|
|
1171 |
lemma EVEN_ODD_EXISTS: "ALL x. (EVEN x --> (EX m. x = 2 * m)) & (ODD x --> (EX m. x = Suc (2 * m)))"
|
|
1172 |
by (import arithmetic EVEN_ODD_EXISTS)
|
|
1173 |
|
|
1174 |
lemma EVEN_EXISTS: "ALL n. EVEN n = (EX m. n = 2 * m)"
|
|
1175 |
by (import arithmetic EVEN_EXISTS)
|
|
1176 |
|
|
1177 |
lemma ODD_EXISTS: "ALL n. ODD n = (EX m. n = Suc (2 * m))"
|
|
1178 |
by (import arithmetic ODD_EXISTS)
|
|
1179 |
|
|
1180 |
lemma NOT_SUC_LESS_EQ_0: "ALL x. ~ Suc x <= 0"
|
|
1181 |
by (import arithmetic NOT_SUC_LESS_EQ_0)
|
|
1182 |
|
|
1183 |
lemma NOT_LEQ: "ALL x xa. (~ x <= xa) = (Suc xa <= x)"
|
|
1184 |
by (import arithmetic NOT_LEQ)
|
|
1185 |
|
|
1186 |
lemma NOT_NUM_EQ: "ALL x xa. (x ~= xa) = (Suc x <= xa | Suc xa <= x)"
|
|
1187 |
by (import arithmetic NOT_NUM_EQ)
|
|
1188 |
|
|
1189 |
lemma NOT_GREATER_EQ: "ALL x xa. (~ xa <= x) = (Suc x <= xa)"
|
|
1190 |
by (import arithmetic NOT_GREATER_EQ)
|
|
1191 |
|
|
1192 |
lemma SUC_ADD_SYM: "ALL m n. Suc (m + n) = Suc n + m"
|
|
1193 |
by (import arithmetic SUC_ADD_SYM)
|
|
1194 |
|
|
1195 |
lemma NOT_SUC_ADD_LESS_EQ: "ALL m n. ~ Suc (m + n) <= m"
|
|
1196 |
by (import arithmetic NOT_SUC_ADD_LESS_EQ)
|
|
1197 |
|
|
1198 |
lemma SUB_LEFT_ADD: "ALL (m::nat) (n::nat) p::nat.
|
|
1199 |
m + (n - p) = (if n <= p then m else m + n - p)"
|
|
1200 |
by (import arithmetic SUB_LEFT_ADD)
|
|
1201 |
|
|
1202 |
lemma SUB_RIGHT_ADD: "ALL (m::nat) (n::nat) p::nat. m - n + p = (if m <= n then p else m + p - n)"
|
|
1203 |
by (import arithmetic SUB_RIGHT_ADD)
|
|
1204 |
|
|
1205 |
lemma SUB_LEFT_SUB: "ALL (m::nat) (n::nat) p::nat.
|
|
1206 |
m - (n - p) = (if n <= p then m else m + p - n)"
|
|
1207 |
by (import arithmetic SUB_LEFT_SUB)
|
|
1208 |
|
|
1209 |
lemma SUB_LEFT_SUC: "ALL m n. Suc (m - n) = (if m <= n then Suc 0 else Suc m - n)"
|
|
1210 |
by (import arithmetic SUB_LEFT_SUC)
|
|
1211 |
|
|
1212 |
lemma SUB_LEFT_LESS_EQ: "ALL (m::nat) (n::nat) p::nat. (m <= n - p) = (m + p <= n | m <= (0::nat))"
|
|
1213 |
by (import arithmetic SUB_LEFT_LESS_EQ)
|
|
1214 |
|
|
1215 |
lemma SUB_RIGHT_LESS_EQ: "ALL (m::nat) (n::nat) p::nat. (m - n <= p) = (m <= n + p)"
|
|
1216 |
by (import arithmetic SUB_RIGHT_LESS_EQ)
|
|
1217 |
|
|
1218 |
lemma SUB_RIGHT_LESS: "ALL (m::nat) (n::nat) p::nat. (m - n < p) = (m < n + p & (0::nat) < p)"
|
|
1219 |
by (import arithmetic SUB_RIGHT_LESS)
|
|
1220 |
|
|
1221 |
lemma SUB_RIGHT_GREATER_EQ: "ALL (m::nat) (n::nat) p::nat. (p <= m - n) = (n + p <= m | p <= (0::nat))"
|
|
1222 |
by (import arithmetic SUB_RIGHT_GREATER_EQ)
|
|
1223 |
|
|
1224 |
lemma SUB_LEFT_GREATER: "ALL (m::nat) (n::nat) p::nat. (n - p < m) = (n < m + p & (0::nat) < m)"
|
|
1225 |
by (import arithmetic SUB_LEFT_GREATER)
|
|
1226 |
|
|
1227 |
lemma SUB_RIGHT_GREATER: "ALL (m::nat) (n::nat) p::nat. (p < m - n) = (n + p < m)"
|
|
1228 |
by (import arithmetic SUB_RIGHT_GREATER)
|
|
1229 |
|
|
1230 |
lemma SUB_LEFT_EQ: "ALL (m::nat) (n::nat) p::nat.
|
|
1231 |
(m = n - p) = (m + p = n | m <= (0::nat) & n <= p)"
|
|
1232 |
by (import arithmetic SUB_LEFT_EQ)
|
|
1233 |
|
|
1234 |
lemma SUB_RIGHT_EQ: "ALL (m::nat) (n::nat) p::nat.
|
|
1235 |
(m - n = p) = (m = n + p | m <= n & p <= (0::nat))"
|
|
1236 |
by (import arithmetic SUB_RIGHT_EQ)
|
|
1237 |
|
|
1238 |
lemma LE: "(ALL n::nat. (n <= (0::nat)) = (n = (0::nat))) &
|
|
1239 |
(ALL (m::nat) n::nat. (m <= Suc n) = (m = Suc n | m <= n))"
|
|
1240 |
by (import arithmetic LE)
|
|
1241 |
|
|
1242 |
lemma DA: "ALL (k::nat) n::nat.
|
|
1243 |
(0::nat) < n --> (EX (x::nat) q::nat. k = q * n + x & x < n)"
|
|
1244 |
by (import arithmetic DA)
|
|
1245 |
|
|
1246 |
lemma DIV_LESS_EQ: "ALL n::nat. (0::nat) < n --> (ALL k::nat. k div n <= k)"
|
|
1247 |
by (import arithmetic DIV_LESS_EQ)
|
|
1248 |
|
|
1249 |
lemma DIV_UNIQUE: "ALL (n::nat) (k::nat) q::nat.
|
|
1250 |
(EX r::nat. k = q * n + r & r < n) --> k div n = q"
|
|
1251 |
by (import arithmetic DIV_UNIQUE)
|
|
1252 |
|
|
1253 |
lemma MOD_UNIQUE: "ALL (n::nat) (k::nat) r::nat.
|
|
1254 |
(EX q::nat. k = q * n + r & r < n) --> k mod n = r"
|
|
1255 |
by (import arithmetic MOD_UNIQUE)
|
|
1256 |
|
|
1257 |
lemma DIV_MULT: "ALL (n::nat) r::nat. r < n --> (ALL q::nat. (q * n + r) div n = q)"
|
|
1258 |
by (import arithmetic DIV_MULT)
|
|
1259 |
|
|
1260 |
lemma MOD_EQ_0: "ALL n::nat. (0::nat) < n --> (ALL k::nat. k * n mod n = (0::nat))"
|
|
1261 |
by (import arithmetic MOD_EQ_0)
|
|
1262 |
|
|
1263 |
lemma ZERO_MOD: "ALL n::nat. (0::nat) < n --> (0::nat) mod n = (0::nat)"
|
|
1264 |
by (import arithmetic ZERO_MOD)
|
|
1265 |
|
|
1266 |
lemma ZERO_DIV: "ALL n::nat. (0::nat) < n --> (0::nat) div n = (0::nat)"
|
|
1267 |
by (import arithmetic ZERO_DIV)
|
|
1268 |
|
|
1269 |
lemma MOD_MULT: "ALL (n::nat) r::nat. r < n --> (ALL q::nat. (q * n + r) mod n = r)"
|
|
1270 |
by (import arithmetic MOD_MULT)
|
|
1271 |
|
|
1272 |
lemma MOD_TIMES: "ALL n::nat.
|
|
1273 |
(0::nat) < n --> (ALL (q::nat) r::nat. (q * n + r) mod n = r mod n)"
|
|
1274 |
by (import arithmetic MOD_TIMES)
|
|
1275 |
|
|
1276 |
lemma MOD_PLUS: "ALL n::nat.
|
|
1277 |
(0::nat) < n -->
|
|
1278 |
(ALL (j::nat) k::nat. (j mod n + k mod n) mod n = (j + k) mod n)"
|
|
1279 |
by (import arithmetic MOD_PLUS)
|
|
1280 |
|
|
1281 |
lemma MOD_MOD: "ALL n::nat. (0::nat) < n --> (ALL k::nat. k mod n mod n = k mod n)"
|
|
1282 |
by (import arithmetic MOD_MOD)
|
|
1283 |
|
|
1284 |
lemma ADD_DIV_ADD_DIV: "ALL x::nat.
|
|
1285 |
(0::nat) < x -->
|
|
1286 |
(ALL (xa::nat) r::nat. (xa * x + r) div x = xa + r div x)"
|
|
1287 |
by (import arithmetic ADD_DIV_ADD_DIV)
|
|
1288 |
|
|
1289 |
lemma MOD_MULT_MOD: "ALL (m::nat) n::nat.
|
|
1290 |
(0::nat) < n & (0::nat) < m -->
|
|
1291 |
(ALL x::nat. x mod (n * m) mod n = x mod n)"
|
|
1292 |
by (import arithmetic MOD_MULT_MOD)
|
|
1293 |
|
|
1294 |
lemma DIVMOD_ID: "ALL n::nat. (0::nat) < n --> n div n = (1::nat) & n mod n = (0::nat)"
|
|
1295 |
by (import arithmetic DIVMOD_ID)
|
|
1296 |
|
|
1297 |
lemma DIV_DIV_DIV_MULT: "ALL (x::nat) xa::nat.
|
|
1298 |
(0::nat) < x & (0::nat) < xa -->
|
|
1299 |
(ALL xb::nat. xb div x div xa = xb div (x * xa))"
|
|
1300 |
by (import arithmetic DIV_DIV_DIV_MULT)
|
|
1301 |
|
|
1302 |
lemma DIV_P: "ALL (P::nat => bool) (p::nat) q::nat.
|
|
1303 |
(0::nat) < q -->
|
|
1304 |
P (p div q) = (EX (k::nat) r::nat. p = k * q + r & r < q & P k)"
|
|
1305 |
by (import arithmetic DIV_P)
|
|
1306 |
|
|
1307 |
lemma MOD_P: "ALL (P::nat => bool) (p::nat) q::nat.
|
|
1308 |
(0::nat) < q -->
|
|
1309 |
P (p mod q) = (EX (k::nat) r::nat. p = k * q + r & r < q & P r)"
|
|
1310 |
by (import arithmetic MOD_P)
|
|
1311 |
|
|
1312 |
lemma MOD_TIMES2: "ALL n::nat.
|
|
1313 |
(0::nat) < n -->
|
|
1314 |
(ALL (j::nat) k::nat. j mod n * (k mod n) mod n = j * k mod n)"
|
|
1315 |
by (import arithmetic MOD_TIMES2)
|
|
1316 |
|
|
1317 |
lemma MOD_COMMON_FACTOR: "ALL (n::nat) (p::nat) q::nat.
|
|
1318 |
(0::nat) < n & (0::nat) < q --> n * (p mod q) = n * p mod (n * q)"
|
|
1319 |
by (import arithmetic MOD_COMMON_FACTOR)
|
|
1320 |
|
|
1321 |
lemma num_case_cong: "ALL M M' b f.
|
|
1322 |
M = M' & (M' = 0 --> b = b') & (ALL n. M' = Suc n --> f n = f' n) -->
|
|
1323 |
nat_case b f M = nat_case b' f' M'"
|
|
1324 |
by (import arithmetic num_case_cong)
|
|
1325 |
|
|
1326 |
lemma SUC_ELIM_THM: "ALL P. (ALL n. P (Suc n) n) = (ALL n. 0 < n --> P n (n - 1))"
|
|
1327 |
by (import arithmetic SUC_ELIM_THM)
|
|
1328 |
|
|
1329 |
lemma SUB_ELIM_THM: "(P::nat => bool) ((a::nat) - (b::nat)) =
|
|
1330 |
(ALL x::nat. (b = a + x --> P (0::nat)) & (a = b + x --> P x))"
|
|
1331 |
by (import arithmetic SUB_ELIM_THM)
|
|
1332 |
|
|
1333 |
lemma PRE_ELIM_THM: "P (PRE n) = (ALL m. (n = 0 --> P 0) & (n = Suc m --> P m))"
|
|
1334 |
by (import arithmetic PRE_ELIM_THM)
|
|
1335 |
|
|
1336 |
lemma MULT_INCREASES: "ALL m n. 1 < m & 0 < n --> Suc n <= m * n"
|
|
1337 |
by (import arithmetic MULT_INCREASES)
|
|
1338 |
|
|
1339 |
lemma EXP_ALWAYS_BIG_ENOUGH: "ALL b::nat. (1::nat) < b --> (ALL n::nat. EX m::nat. n <= b ^ m)"
|
|
1340 |
by (import arithmetic EXP_ALWAYS_BIG_ENOUGH)
|
|
1341 |
|
|
1342 |
lemma EXP_EQ_0: "ALL (n::nat) m::nat. (n ^ m = (0::nat)) = (n = (0::nat) & (0::nat) < m)"
|
|
1343 |
by (import arithmetic EXP_EQ_0)
|
|
1344 |
|
|
1345 |
lemma EXP_1: "ALL x::nat. (1::nat) ^ x = (1::nat) & x ^ (1::nat) = x"
|
|
1346 |
by (import arithmetic EXP_1)
|
|
1347 |
|
|
1348 |
lemma EXP_EQ_1: "ALL (n::nat) m::nat. (n ^ m = (1::nat)) = (n = (1::nat) | m = (0::nat))"
|
|
1349 |
by (import arithmetic EXP_EQ_1)
|
|
1350 |
|
|
1351 |
lemma MIN_MAX_EQ: "ALL (x::nat) xa::nat. (min x xa = max x xa) = (x = xa)"
|
|
1352 |
by (import arithmetic MIN_MAX_EQ)
|
|
1353 |
|
|
1354 |
lemma MIN_MAX_LT: "ALL (x::nat) xa::nat. (min x xa < max x xa) = (x ~= xa)"
|
|
1355 |
by (import arithmetic MIN_MAX_LT)
|
|
1356 |
|
|
1357 |
lemma MIN_MAX_PRED: "ALL (P::nat => bool) (m::nat) n::nat.
|
|
1358 |
P m & P n --> P (min m n) & P (max m n)"
|
|
1359 |
by (import arithmetic MIN_MAX_PRED)
|
|
1360 |
|
|
1361 |
lemma MIN_LT: "ALL (x::nat) xa::nat.
|
|
1362 |
(min xa x < xa) = (xa ~= x & min xa x = x) &
|
|
1363 |
(min xa x < x) = (xa ~= x & min xa x = xa) &
|
|
1364 |
(xa < min xa x) = False & (x < min xa x) = False"
|
|
1365 |
by (import arithmetic MIN_LT)
|
|
1366 |
|
|
1367 |
lemma MAX_LT: "ALL (x::nat) xa::nat.
|
|
1368 |
(xa < max xa x) = (xa ~= x & max xa x = x) &
|
|
1369 |
(x < max xa x) = (xa ~= x & max xa x = xa) &
|
|
1370 |
(max xa x < xa) = False & (max xa x < x) = False"
|
|
1371 |
by (import arithmetic MAX_LT)
|
|
1372 |
|
|
1373 |
lemma MIN_LE: "ALL (x::nat) xa::nat. min xa x <= xa & min xa x <= x"
|
|
1374 |
by (import arithmetic MIN_LE)
|
|
1375 |
|
|
1376 |
lemma MAX_LE: "ALL (x::nat) xa::nat. xa <= max xa x & x <= max xa x"
|
|
1377 |
by (import arithmetic MAX_LE)
|
|
1378 |
|
|
1379 |
lemma MIN_0: "ALL x::nat. min x (0::nat) = (0::nat) & min (0::nat) x = (0::nat)"
|
|
1380 |
by (import arithmetic MIN_0)
|
|
1381 |
|
|
1382 |
lemma MAX_0: "ALL x::nat. max x (0::nat) = x & max (0::nat) x = x"
|
|
1383 |
by (import arithmetic MAX_0)
|
|
1384 |
|
|
1385 |
lemma EXISTS_GREATEST: "ALL P::nat => bool.
|
|
1386 |
(Ex P & (EX x::nat. ALL y::nat. x < y --> ~ P y)) =
|
|
1387 |
(EX x::nat. P x & (ALL y::nat. x < y --> ~ P y))"
|
|
1388 |
by (import arithmetic EXISTS_GREATEST)
|
|
1389 |
|
|
1390 |
;end_setup
|
|
1391 |
|
|
1392 |
;setup_theory hrat
|
|
1393 |
|
|
1394 |
constdefs
|
|
1395 |
trat_1 :: "nat * nat"
|
|
1396 |
"trat_1 == (0, 0)"
|
|
1397 |
|
|
1398 |
lemma trat_1: "trat_1 = (0, 0)"
|
|
1399 |
by (import hrat trat_1)
|
|
1400 |
|
|
1401 |
constdefs
|
|
1402 |
trat_inv :: "nat * nat => nat * nat"
|
|
1403 |
"trat_inv == %(x, y). (y, x)"
|
|
1404 |
|
|
1405 |
lemma trat_inv: "ALL x y. trat_inv (x, y) = (y, x)"
|
|
1406 |
by (import hrat trat_inv)
|
|
1407 |
|
|
1408 |
constdefs
|
|
1409 |
trat_add :: "nat * nat => nat * nat => nat * nat"
|
|
1410 |
"trat_add ==
|
|
1411 |
%(x, y) (x', y').
|
|
1412 |
(PRE (Suc x * Suc y' + Suc x' * Suc y), PRE (Suc y * Suc y'))"
|
|
1413 |
|
|
1414 |
lemma trat_add: "ALL x y x' y'.
|
|
1415 |
trat_add (x, y) (x', y') =
|
|
1416 |
(PRE (Suc x * Suc y' + Suc x' * Suc y), PRE (Suc y * Suc y'))"
|
|
1417 |
by (import hrat trat_add)
|
|
1418 |
|
|
1419 |
constdefs
|
|
1420 |
trat_mul :: "nat * nat => nat * nat => nat * nat"
|
|
1421 |
"trat_mul == %(x, y) (x', y'). (PRE (Suc x * Suc x'), PRE (Suc y * Suc y'))"
|
|
1422 |
|
|
1423 |
lemma trat_mul: "ALL x y x' y'.
|
|
1424 |
trat_mul (x, y) (x', y') = (PRE (Suc x * Suc x'), PRE (Suc y * Suc y'))"
|
|
1425 |
by (import hrat trat_mul)
|
|
1426 |
|
|
1427 |
consts
|
|
1428 |
trat_sucint :: "nat => nat * nat"
|
|
1429 |
|
|
1430 |
specification (trat_sucint) trat_sucint: "trat_sucint 0 = trat_1 &
|
|
1431 |
(ALL n. trat_sucint (Suc n) = trat_add (trat_sucint n) trat_1)"
|
|
1432 |
by (import hrat trat_sucint)
|
|
1433 |
|
|
1434 |
constdefs
|
|
1435 |
trat_eq :: "nat * nat => nat * nat => bool"
|
|
1436 |
"trat_eq == %(x, y) (x', y'). Suc x * Suc y' = Suc x' * Suc y"
|
|
1437 |
|
|
1438 |
lemma trat_eq: "ALL x y x' y'. trat_eq (x, y) (x', y') = (Suc x * Suc y' = Suc x' * Suc y)"
|
|
1439 |
by (import hrat trat_eq)
|
|
1440 |
|
|
1441 |
lemma TRAT_EQ_REFL: "ALL p. trat_eq p p"
|
|
1442 |
by (import hrat TRAT_EQ_REFL)
|
|
1443 |
|
|
1444 |
lemma TRAT_EQ_SYM: "ALL p q. trat_eq p q = trat_eq q p"
|
|
1445 |
by (import hrat TRAT_EQ_SYM)
|
|
1446 |
|
|
1447 |
lemma TRAT_EQ_TRANS: "ALL p q r. trat_eq p q & trat_eq q r --> trat_eq p r"
|
|
1448 |
by (import hrat TRAT_EQ_TRANS)
|
|
1449 |
|
|
1450 |
lemma TRAT_EQ_AP: "ALL p q. p = q --> trat_eq p q"
|
|
1451 |
by (import hrat TRAT_EQ_AP)
|
|
1452 |
|
|
1453 |
lemma TRAT_ADD_SYM_EQ: "ALL h i. trat_add h i = trat_add i h"
|
|
1454 |
by (import hrat TRAT_ADD_SYM_EQ)
|
|
1455 |
|
|
1456 |
lemma TRAT_MUL_SYM_EQ: "ALL h i. trat_mul h i = trat_mul i h"
|
|
1457 |
by (import hrat TRAT_MUL_SYM_EQ)
|
|
1458 |
|
|
1459 |
lemma TRAT_INV_WELLDEFINED: "ALL p q. trat_eq p q --> trat_eq (trat_inv p) (trat_inv q)"
|
|
1460 |
by (import hrat TRAT_INV_WELLDEFINED)
|
|
1461 |
|
|
1462 |
lemma TRAT_ADD_WELLDEFINED: "ALL p q r. trat_eq p q --> trat_eq (trat_add p r) (trat_add q r)"
|
|
1463 |
by (import hrat TRAT_ADD_WELLDEFINED)
|
|
1464 |
|
|
1465 |
lemma TRAT_ADD_WELLDEFINED2: "ALL p1 p2 q1 q2.
|
|
1466 |
trat_eq p1 p2 & trat_eq q1 q2 -->
|
|
1467 |
trat_eq (trat_add p1 q1) (trat_add p2 q2)"
|
|
1468 |
by (import hrat TRAT_ADD_WELLDEFINED2)
|
|
1469 |
|
|
1470 |
lemma TRAT_MUL_WELLDEFINED: "ALL p q r. trat_eq p q --> trat_eq (trat_mul p r) (trat_mul q r)"
|
|
1471 |
by (import hrat TRAT_MUL_WELLDEFINED)
|
|
1472 |
|
|
1473 |
lemma TRAT_MUL_WELLDEFINED2: "ALL p1 p2 q1 q2.
|
|
1474 |
trat_eq p1 p2 & trat_eq q1 q2 -->
|
|
1475 |
trat_eq (trat_mul p1 q1) (trat_mul p2 q2)"
|
|
1476 |
by (import hrat TRAT_MUL_WELLDEFINED2)
|
|
1477 |
|
|
1478 |
lemma TRAT_ADD_SYM: "ALL h i. trat_eq (trat_add h i) (trat_add i h)"
|
|
1479 |
by (import hrat TRAT_ADD_SYM)
|
|
1480 |
|
|
1481 |
lemma TRAT_ADD_ASSOC: "ALL h i j. trat_eq (trat_add h (trat_add i j)) (trat_add (trat_add h i) j)"
|
|
1482 |
by (import hrat TRAT_ADD_ASSOC)
|
|
1483 |
|
|
1484 |
lemma TRAT_MUL_SYM: "ALL h i. trat_eq (trat_mul h i) (trat_mul i h)"
|
|
1485 |
by (import hrat TRAT_MUL_SYM)
|
|
1486 |
|
|
1487 |
lemma TRAT_MUL_ASSOC: "ALL h i j. trat_eq (trat_mul h (trat_mul i j)) (trat_mul (trat_mul h i) j)"
|
|
1488 |
by (import hrat TRAT_MUL_ASSOC)
|
|
1489 |
|
|
1490 |
lemma TRAT_LDISTRIB: "ALL h i j.
|
|
1491 |
trat_eq (trat_mul h (trat_add i j))
|
|
1492 |
(trat_add (trat_mul h i) (trat_mul h j))"
|
|
1493 |
by (import hrat TRAT_LDISTRIB)
|
|
1494 |
|
|
1495 |
lemma TRAT_MUL_LID: "ALL h. trat_eq (trat_mul trat_1 h) h"
|
|
1496 |
by (import hrat TRAT_MUL_LID)
|
|
1497 |
|
|
1498 |
lemma TRAT_MUL_LINV: "ALL h. trat_eq (trat_mul (trat_inv h) h) trat_1"
|
|
1499 |
by (import hrat TRAT_MUL_LINV)
|
|
1500 |
|
|
1501 |
lemma TRAT_NOZERO: "ALL h i. ~ trat_eq (trat_add h i) h"
|
|
1502 |
by (import hrat TRAT_NOZERO)
|
|
1503 |
|
|
1504 |
lemma TRAT_ADD_TOTAL: "ALL h i.
|
|
1505 |
trat_eq h i |
|
|
1506 |
(EX d. trat_eq h (trat_add i d)) | (EX d. trat_eq i (trat_add h d))"
|
|
1507 |
by (import hrat TRAT_ADD_TOTAL)
|
|
1508 |
|
|
1509 |
lemma TRAT_SUCINT_0: "ALL n. trat_eq (trat_sucint n) (n, 0)"
|
|
1510 |
by (import hrat TRAT_SUCINT_0)
|
|
1511 |
|
|
1512 |
lemma TRAT_ARCH: "ALL h. EX n d. trat_eq (trat_sucint n) (trat_add h d)"
|
|
1513 |
by (import hrat TRAT_ARCH)
|
|
1514 |
|
|
1515 |
lemma TRAT_SUCINT: "trat_eq (trat_sucint 0) trat_1 &
|
|
1516 |
(ALL n. trat_eq (trat_sucint (Suc n)) (trat_add (trat_sucint n) trat_1))"
|
|
1517 |
by (import hrat TRAT_SUCINT)
|
|
1518 |
|
|
1519 |
lemma TRAT_EQ_EQUIV: "ALL p q. trat_eq p q = (trat_eq p = trat_eq q)"
|
|
1520 |
by (import hrat TRAT_EQ_EQUIV)
|
|
1521 |
|
|
1522 |
typedef (open) hrat = "{x. EX xa. x = trat_eq xa}"
|
|
1523 |
by (rule typedef_helper,import hrat hrat_TY_DEF)
|
|
1524 |
|
|
1525 |
lemmas hrat_TY_DEF = typedef_hol2hol4 [OF type_definition_hrat]
|
|
1526 |
|
|
1527 |
consts
|
|
1528 |
mk_hrat :: "(nat * nat => bool) => hrat"
|
|
1529 |
dest_hrat :: "hrat => nat * nat => bool"
|
|
1530 |
|
|
1531 |
specification (dest_hrat mk_hrat) hrat_tybij: "(ALL a. mk_hrat (dest_hrat a) = a) &
|
|
1532 |
(ALL r. (EX x. r = trat_eq x) = (dest_hrat (mk_hrat r) = r))"
|
|
1533 |
by (import hrat hrat_tybij)
|
|
1534 |
|
|
1535 |
constdefs
|
|
1536 |
hrat_1 :: "hrat"
|
|
1537 |
"hrat_1 == mk_hrat (trat_eq trat_1)"
|
|
1538 |
|
|
1539 |
lemma hrat_1: "hrat_1 = mk_hrat (trat_eq trat_1)"
|
|
1540 |
by (import hrat hrat_1)
|
|
1541 |
|
|
1542 |
constdefs
|
|
1543 |
hrat_inv :: "hrat => hrat"
|
|
1544 |
"hrat_inv == %T1. mk_hrat (trat_eq (trat_inv (Eps (dest_hrat T1))))"
|
|
1545 |
|
|
1546 |
lemma hrat_inv: "ALL T1. hrat_inv T1 = mk_hrat (trat_eq (trat_inv (Eps (dest_hrat T1))))"
|
|
1547 |
by (import hrat hrat_inv)
|
|
1548 |
|
|
1549 |
constdefs
|
|
1550 |
hrat_add :: "hrat => hrat => hrat"
|
|
1551 |
"hrat_add ==
|
|
1552 |
%T1 T2.
|
|
1553 |
mk_hrat (trat_eq (trat_add (Eps (dest_hrat T1)) (Eps (dest_hrat T2))))"
|
|
1554 |
|
|
1555 |
lemma hrat_add: "ALL T1 T2.
|
|
1556 |
hrat_add T1 T2 =
|
|
1557 |
mk_hrat (trat_eq (trat_add (Eps (dest_hrat T1)) (Eps (dest_hrat T2))))"
|
|
1558 |
by (import hrat hrat_add)
|
|
1559 |
|
|
1560 |
constdefs
|
|
1561 |
hrat_mul :: "hrat => hrat => hrat"
|
|
1562 |
"hrat_mul ==
|
|
1563 |
%T1 T2.
|
|
1564 |
mk_hrat (trat_eq (trat_mul (Eps (dest_hrat T1)) (Eps (dest_hrat T2))))"
|
|
1565 |
|
|
1566 |
lemma hrat_mul: "ALL T1 T2.
|
|
1567 |
hrat_mul T1 T2 =
|
|
1568 |
mk_hrat (trat_eq (trat_mul (Eps (dest_hrat T1)) (Eps (dest_hrat T2))))"
|
|
1569 |
by (import hrat hrat_mul)
|
|
1570 |
|
|
1571 |
constdefs
|
|
1572 |
hrat_sucint :: "nat => hrat"
|
|
1573 |
"hrat_sucint == %T1. mk_hrat (trat_eq (trat_sucint T1))"
|
|
1574 |
|
|
1575 |
lemma hrat_sucint: "ALL T1. hrat_sucint T1 = mk_hrat (trat_eq (trat_sucint T1))"
|
|
1576 |
by (import hrat hrat_sucint)
|
|
1577 |
|
|
1578 |
lemma HRAT_ADD_SYM: "ALL h i. hrat_add h i = hrat_add i h"
|
|
1579 |
by (import hrat HRAT_ADD_SYM)
|
|
1580 |
|
|
1581 |
lemma HRAT_ADD_ASSOC: "ALL h i j. hrat_add h (hrat_add i j) = hrat_add (hrat_add h i) j"
|
|
1582 |
by (import hrat HRAT_ADD_ASSOC)
|
|
1583 |
|
|
1584 |
lemma HRAT_MUL_SYM: "ALL h i. hrat_mul h i = hrat_mul i h"
|
|
1585 |
by (import hrat HRAT_MUL_SYM)
|
|
1586 |
|
|
1587 |
lemma HRAT_MUL_ASSOC: "ALL h i j. hrat_mul h (hrat_mul i j) = hrat_mul (hrat_mul h i) j"
|
|
1588 |
by (import hrat HRAT_MUL_ASSOC)
|
|
1589 |
|
|
1590 |
lemma HRAT_LDISTRIB: "ALL h i j.
|
|
1591 |
hrat_mul h (hrat_add i j) = hrat_add (hrat_mul h i) (hrat_mul h j)"
|
|
1592 |
by (import hrat HRAT_LDISTRIB)
|
|
1593 |
|
|
1594 |
lemma HRAT_MUL_LID: "ALL h. hrat_mul hrat_1 h = h"
|
|
1595 |
by (import hrat HRAT_MUL_LID)
|
|
1596 |
|
|
1597 |
lemma HRAT_MUL_LINV: "ALL h. hrat_mul (hrat_inv h) h = hrat_1"
|
|
1598 |
by (import hrat HRAT_MUL_LINV)
|
|
1599 |
|
|
1600 |
lemma HRAT_NOZERO: "ALL h i. hrat_add h i ~= h"
|
|
1601 |
by (import hrat HRAT_NOZERO)
|
|
1602 |
|
|
1603 |
lemma HRAT_ADD_TOTAL: "ALL h i. h = i | (EX x. h = hrat_add i x) | (EX x. i = hrat_add h x)"
|
|
1604 |
by (import hrat HRAT_ADD_TOTAL)
|
|
1605 |
|
|
1606 |
lemma HRAT_ARCH: "ALL h. EX x xa. hrat_sucint x = hrat_add h xa"
|
|
1607 |
by (import hrat HRAT_ARCH)
|
|
1608 |
|
|
1609 |
lemma HRAT_SUCINT: "hrat_sucint 0 = hrat_1 &
|
|
1610 |
(ALL x. hrat_sucint (Suc x) = hrat_add (hrat_sucint x) hrat_1)"
|
|
1611 |
by (import hrat HRAT_SUCINT)
|
|
1612 |
|
|
1613 |
;end_setup
|
|
1614 |
|
|
1615 |
;setup_theory hreal
|
|
1616 |
|
|
1617 |
constdefs
|
|
1618 |
hrat_lt :: "hrat => hrat => bool"
|
|
1619 |
"hrat_lt == %x y. EX d. y = hrat_add x d"
|
|
1620 |
|
|
1621 |
lemma hrat_lt: "ALL x y. hrat_lt x y = (EX d. y = hrat_add x d)"
|
|
1622 |
by (import hreal hrat_lt)
|
|
1623 |
|
|
1624 |
lemma HRAT_LT_REFL: "ALL x. ~ hrat_lt x x"
|
|
1625 |
by (import hreal HRAT_LT_REFL)
|
|
1626 |
|
|
1627 |
lemma HRAT_LT_TRANS: "ALL x y z. hrat_lt x y & hrat_lt y z --> hrat_lt x z"
|
|
1628 |
by (import hreal HRAT_LT_TRANS)
|
|
1629 |
|
|
1630 |
lemma HRAT_LT_ANTISYM: "ALL x y. ~ (hrat_lt x y & hrat_lt y x)"
|
|
1631 |
by (import hreal HRAT_LT_ANTISYM)
|
|
1632 |
|
|
1633 |
lemma HRAT_LT_TOTAL: "ALL x y. x = y | hrat_lt x y | hrat_lt y x"
|
|
1634 |
by (import hreal HRAT_LT_TOTAL)
|
|
1635 |
|
|
1636 |
lemma HRAT_MUL_RID: "ALL x. hrat_mul x hrat_1 = x"
|
|
1637 |
by (import hreal HRAT_MUL_RID)
|
|
1638 |
|
|
1639 |
lemma HRAT_MUL_RINV: "ALL x. hrat_mul x (hrat_inv x) = hrat_1"
|
|
1640 |
by (import hreal HRAT_MUL_RINV)
|
|
1641 |
|
|
1642 |
lemma HRAT_RDISTRIB: "ALL x y z.
|
|
1643 |
hrat_mul (hrat_add x y) z = hrat_add (hrat_mul x z) (hrat_mul y z)"
|
|
1644 |
by (import hreal HRAT_RDISTRIB)
|
|
1645 |
|
|
1646 |
lemma HRAT_LT_ADDL: "ALL x y. hrat_lt x (hrat_add x y)"
|
|
1647 |
by (import hreal HRAT_LT_ADDL)
|
|
1648 |
|
|
1649 |
lemma HRAT_LT_ADDR: "ALL x xa. hrat_lt xa (hrat_add x xa)"
|
|
1650 |
by (import hreal HRAT_LT_ADDR)
|
|
1651 |
|
|
1652 |
lemma HRAT_LT_GT: "ALL x y. hrat_lt x y --> ~ hrat_lt y x"
|
|
1653 |
by (import hreal HRAT_LT_GT)
|
|
1654 |
|
|
1655 |
lemma HRAT_LT_NE: "ALL x y. hrat_lt x y --> x ~= y"
|
|
1656 |
by (import hreal HRAT_LT_NE)
|
|
1657 |
|
|
1658 |
lemma HRAT_EQ_LADD: "ALL x y z. (hrat_add x y = hrat_add x z) = (y = z)"
|
|
1659 |
by (import hreal HRAT_EQ_LADD)
|
|
1660 |
|
|
1661 |
lemma HRAT_EQ_LMUL: "ALL x y z. (hrat_mul x y = hrat_mul x z) = (y = z)"
|
|
1662 |
by (import hreal HRAT_EQ_LMUL)
|
|
1663 |
|
|
1664 |
lemma HRAT_LT_ADD2: "ALL u v x y.
|
|
1665 |
hrat_lt u x & hrat_lt v y --> hrat_lt (hrat_add u v) (hrat_add x y)"
|
|
1666 |
by (import hreal HRAT_LT_ADD2)
|
|
1667 |
|
|
1668 |
lemma HRAT_LT_LADD: "ALL x y z. hrat_lt (hrat_add z x) (hrat_add z y) = hrat_lt x y"
|
|
1669 |
by (import hreal HRAT_LT_LADD)
|
|
1670 |
|
|
1671 |
lemma HRAT_LT_RADD: "ALL x y z. hrat_lt (hrat_add x z) (hrat_add y z) = hrat_lt x y"
|
|
1672 |
by (import hreal HRAT_LT_RADD)
|
|
1673 |
|
|
1674 |
lemma HRAT_LT_MUL2: "ALL u v x y.
|
|
1675 |
hrat_lt u x & hrat_lt v y --> hrat_lt (hrat_mul u v) (hrat_mul x y)"
|
|
1676 |
by (import hreal HRAT_LT_MUL2)
|
|
1677 |
|
|
1678 |
lemma HRAT_LT_LMUL: "ALL x y z. hrat_lt (hrat_mul z x) (hrat_mul z y) = hrat_lt x y"
|
|
1679 |
by (import hreal HRAT_LT_LMUL)
|
|
1680 |
|
|
1681 |
lemma HRAT_LT_RMUL: "ALL x y z. hrat_lt (hrat_mul x z) (hrat_mul y z) = hrat_lt x y"
|
|
1682 |
by (import hreal HRAT_LT_RMUL)
|
|
1683 |
|
|
1684 |
lemma HRAT_LT_LMUL1: "ALL x y. hrat_lt (hrat_mul x y) y = hrat_lt x hrat_1"
|
|
1685 |
by (import hreal HRAT_LT_LMUL1)
|
|
1686 |
|
|
1687 |
lemma HRAT_LT_RMUL1: "ALL x y. hrat_lt (hrat_mul x y) x = hrat_lt y hrat_1"
|
|
1688 |
by (import hreal HRAT_LT_RMUL1)
|
|
1689 |
|
|
1690 |
lemma HRAT_GT_LMUL1: "ALL x y. hrat_lt y (hrat_mul x y) = hrat_lt hrat_1 x"
|
|
1691 |
by (import hreal HRAT_GT_LMUL1)
|
|
1692 |
|
|
1693 |
lemma HRAT_LT_L1: "ALL x y. hrat_lt (hrat_mul (hrat_inv x) y) hrat_1 = hrat_lt y x"
|
|
1694 |
by (import hreal HRAT_LT_L1)
|
|
1695 |
|
|
1696 |
lemma HRAT_LT_R1: "ALL x y. hrat_lt (hrat_mul x (hrat_inv y)) hrat_1 = hrat_lt x y"
|
|
1697 |
by (import hreal HRAT_LT_R1)
|
|
1698 |
|
|
1699 |
lemma HRAT_GT_L1: "ALL x y. hrat_lt hrat_1 (hrat_mul (hrat_inv x) y) = hrat_lt x y"
|
|
1700 |
by (import hreal HRAT_GT_L1)
|
|
1701 |
|
|
1702 |
lemma HRAT_INV_MUL: "ALL x y. hrat_inv (hrat_mul x y) = hrat_mul (hrat_inv x) (hrat_inv y)"
|
|
1703 |
by (import hreal HRAT_INV_MUL)
|
|
1704 |
|
|
1705 |
lemma HRAT_UP: "ALL x. Ex (hrat_lt x)"
|
|
1706 |
by (import hreal HRAT_UP)
|
|
1707 |
|
|
1708 |
lemma HRAT_DOWN: "ALL x. EX xa. hrat_lt xa x"
|
|
1709 |
by (import hreal HRAT_DOWN)
|
|
1710 |
|
|
1711 |
lemma HRAT_DOWN2: "ALL x y. EX xa. hrat_lt xa x & hrat_lt xa y"
|
|
1712 |
by (import hreal HRAT_DOWN2)
|
|
1713 |
|
|
1714 |
lemma HRAT_MEAN: "ALL x y. hrat_lt x y --> (EX xa. hrat_lt x xa & hrat_lt xa y)"
|
|
1715 |
by (import hreal HRAT_MEAN)
|
|
1716 |
|
|
1717 |
constdefs
|
|
1718 |
isacut :: "(hrat => bool) => bool"
|
|
1719 |
"isacut ==
|
|
1720 |
%C. Ex C &
|
|
1721 |
(EX x. ~ C x) &
|
|
1722 |
(ALL x y. C x & hrat_lt y x --> C y) &
|
|
1723 |
(ALL x. C x --> (EX y. C y & hrat_lt x y))"
|
|
1724 |
|
|
1725 |
lemma isacut: "ALL C.
|
|
1726 |
isacut C =
|
|
1727 |
(Ex C &
|
|
1728 |
(EX x. ~ C x) &
|
|
1729 |
(ALL x y. C x & hrat_lt y x --> C y) &
|
|
1730 |
(ALL x. C x --> (EX y. C y & hrat_lt x y)))"
|
|
1731 |
by (import hreal isacut)
|
|
1732 |
|
|
1733 |
constdefs
|
|
1734 |
cut_of_hrat :: "hrat => hrat => bool"
|
|
1735 |
"cut_of_hrat == %x y. hrat_lt y x"
|
|
1736 |
|
|
1737 |
lemma cut_of_hrat: "ALL x. cut_of_hrat x = (%y. hrat_lt y x)"
|
|
1738 |
by (import hreal cut_of_hrat)
|
|
1739 |
|
|
1740 |
lemma ISACUT_HRAT: "ALL h. isacut (cut_of_hrat h)"
|
|
1741 |
by (import hreal ISACUT_HRAT)
|
|
1742 |
|
|
1743 |
typedef (open) hreal = "Collect isacut"
|
|
1744 |
by (rule typedef_helper,import hreal hreal_TY_DEF)
|
|
1745 |
|
|
1746 |
lemmas hreal_TY_DEF = typedef_hol2hol4 [OF type_definition_hreal]
|
|
1747 |
|
|
1748 |
consts
|
|
1749 |
hreal :: "(hrat => bool) => hreal"
|
|
1750 |
cut :: "hreal => hrat => bool"
|
|
1751 |
|
|
1752 |
specification (cut hreal) hreal_tybij: "(ALL a. hreal (hreal.cut a) = a) &
|
|
1753 |
(ALL r. isacut r = (hreal.cut (hreal r) = r))"
|
|
1754 |
by (import hreal hreal_tybij)
|
|
1755 |
|
|
1756 |
lemma EQUAL_CUTS: "ALL X Y. hreal.cut X = hreal.cut Y --> X = Y"
|
|
1757 |
by (import hreal EQUAL_CUTS)
|
|
1758 |
|
|
1759 |
lemma CUT_ISACUT: "ALL x. isacut (hreal.cut x)"
|
|
1760 |
by (import hreal CUT_ISACUT)
|
|
1761 |
|
|
1762 |
lemma CUT_NONEMPTY: "ALL x. Ex (hreal.cut x)"
|
|
1763 |
by (import hreal CUT_NONEMPTY)
|
|
1764 |
|
|
1765 |
lemma CUT_BOUNDED: "ALL x. EX xa. ~ hreal.cut x xa"
|
|
1766 |
by (import hreal CUT_BOUNDED)
|
|
1767 |
|
|
1768 |
lemma CUT_DOWN: "ALL x xa xb. hreal.cut x xa & hrat_lt xb xa --> hreal.cut x xb"
|
|
1769 |
by (import hreal CUT_DOWN)
|
|
1770 |
|
|
1771 |
lemma CUT_UP: "ALL x xa. hreal.cut x xa --> (EX y. hreal.cut x y & hrat_lt xa y)"
|
|
1772 |
by (import hreal CUT_UP)
|
|
1773 |
|
|
1774 |
lemma CUT_UBOUND: "ALL x xa xb. ~ hreal.cut x xa & hrat_lt xa xb --> ~ hreal.cut x xb"
|
|
1775 |
by (import hreal CUT_UBOUND)
|
|
1776 |
|
|
1777 |
lemma CUT_STRADDLE: "ALL X x y. hreal.cut X x & ~ hreal.cut X y --> hrat_lt x y"
|
|
1778 |
by (import hreal CUT_STRADDLE)
|
|
1779 |
|
|
1780 |
lemma CUT_NEARTOP_ADD: "ALL X e. EX x. hreal.cut X x & ~ hreal.cut X (hrat_add x e)"
|
|
1781 |
by (import hreal CUT_NEARTOP_ADD)
|
|
1782 |
|
|
1783 |
lemma CUT_NEARTOP_MUL: "ALL X u.
|
|
1784 |
hrat_lt hrat_1 u --> (EX x. hreal.cut X x & ~ hreal.cut X (hrat_mul u x))"
|
|
1785 |
by (import hreal CUT_NEARTOP_MUL)
|
|
1786 |
|
|
1787 |
constdefs
|
|
1788 |
hreal_1 :: "hreal"
|
|
1789 |
"hreal_1 == hreal (cut_of_hrat hrat_1)"
|
|
1790 |
|
|
1791 |
lemma hreal_1: "hreal_1 = hreal (cut_of_hrat hrat_1)"
|
|
1792 |
by (import hreal hreal_1)
|
|
1793 |
|
|
1794 |
constdefs
|
|
1795 |
hreal_add :: "hreal => hreal => hreal"
|
|
1796 |
"hreal_add ==
|
|
1797 |
%X Y. hreal (%w. EX x y. w = hrat_add x y & hreal.cut X x & hreal.cut Y y)"
|
|
1798 |
|
|
1799 |
lemma hreal_add: "ALL X Y.
|
|
1800 |
hreal_add X Y =
|
|
1801 |
hreal (%w. EX x y. w = hrat_add x y & hreal.cut X x & hreal.cut Y y)"
|
|
1802 |
by (import hreal hreal_add)
|
|
1803 |
|
|
1804 |
constdefs
|
|
1805 |
hreal_mul :: "hreal => hreal => hreal"
|
|
1806 |
"hreal_mul ==
|
|
1807 |
%X Y. hreal (%w. EX x y. w = hrat_mul x y & hreal.cut X x & hreal.cut Y y)"
|
|
1808 |
|
|
1809 |
lemma hreal_mul: "ALL X Y.
|
|
1810 |
hreal_mul X Y =
|
|
1811 |
hreal (%w. EX x y. w = hrat_mul x y & hreal.cut X x & hreal.cut Y y)"
|
|
1812 |
by (import hreal hreal_mul)
|
|
1813 |
|
|
1814 |
constdefs
|
|
1815 |
hreal_inv :: "hreal => hreal"
|
|
1816 |
"hreal_inv ==
|
|
1817 |
%X. hreal
|
|
1818 |
(%w. EX d. hrat_lt d hrat_1 &
|
|
1819 |
(ALL x. hreal.cut X x --> hrat_lt (hrat_mul w x) d))"
|
|
1820 |
|
|
1821 |
lemma hreal_inv: "ALL X.
|
|
1822 |
hreal_inv X =
|
|
1823 |
hreal
|
|
1824 |
(%w. EX d. hrat_lt d hrat_1 &
|
|
1825 |
(ALL x. hreal.cut X x --> hrat_lt (hrat_mul w x) d))"
|
|
1826 |
by (import hreal hreal_inv)
|
|
1827 |
|
|
1828 |
constdefs
|
|
1829 |
hreal_sup :: "(hreal => bool) => hreal"
|
|
1830 |
"hreal_sup == %P. hreal (%w. EX X. P X & hreal.cut X w)"
|
|
1831 |
|
|
1832 |
lemma hreal_sup: "ALL P. hreal_sup P = hreal (%w. EX X. P X & hreal.cut X w)"
|
|
1833 |
by (import hreal hreal_sup)
|
|
1834 |
|
|
1835 |
constdefs
|
|
1836 |
hreal_lt :: "hreal => hreal => bool"
|
|
1837 |
"hreal_lt == %X Y. X ~= Y & (ALL x. hreal.cut X x --> hreal.cut Y x)"
|
|
1838 |
|
|
1839 |
lemma hreal_lt: "ALL X Y. hreal_lt X Y = (X ~= Y & (ALL x. hreal.cut X x --> hreal.cut Y x))"
|
|
1840 |
by (import hreal hreal_lt)
|
|
1841 |
|
|
1842 |
lemma HREAL_INV_ISACUT: "ALL X.
|
|
1843 |
isacut
|
|
1844 |
(%w. EX d. hrat_lt d hrat_1 &
|
|
1845 |
(ALL x. hreal.cut X x --> hrat_lt (hrat_mul w x) d))"
|
|
1846 |
by (import hreal HREAL_INV_ISACUT)
|
|
1847 |
|
|
1848 |
lemma HREAL_ADD_ISACUT: "ALL X Y.
|
|
1849 |
isacut (%w. EX x y. w = hrat_add x y & hreal.cut X x & hreal.cut Y y)"
|
|
1850 |
by (import hreal HREAL_ADD_ISACUT)
|
|
1851 |
|
|
1852 |
lemma HREAL_MUL_ISACUT: "ALL X Y.
|
|
1853 |
isacut (%w. EX x y. w = hrat_mul x y & hreal.cut X x & hreal.cut Y y)"
|
|
1854 |
by (import hreal HREAL_MUL_ISACUT)
|
|
1855 |
|
|
1856 |
lemma HREAL_ADD_SYM: "ALL X Y. hreal_add X Y = hreal_add Y X"
|
|
1857 |
by (import hreal HREAL_ADD_SYM)
|
|
1858 |
|
|
1859 |
lemma HREAL_MUL_SYM: "ALL X Y. hreal_mul X Y = hreal_mul Y X"
|
|
1860 |
by (import hreal HREAL_MUL_SYM)
|
|
1861 |
|
|
1862 |
lemma HREAL_ADD_ASSOC: "ALL X Y Z. hreal_add X (hreal_add Y Z) = hreal_add (hreal_add X Y) Z"
|
|
1863 |
by (import hreal HREAL_ADD_ASSOC)
|
|
1864 |
|
|
1865 |
lemma HREAL_MUL_ASSOC: "ALL X Y Z. hreal_mul X (hreal_mul Y Z) = hreal_mul (hreal_mul X Y) Z"
|
|
1866 |
by (import hreal HREAL_MUL_ASSOC)
|
|
1867 |
|
|
1868 |
lemma HREAL_LDISTRIB: "ALL X Y Z.
|
|
1869 |
hreal_mul X (hreal_add Y Z) = hreal_add (hreal_mul X Y) (hreal_mul X Z)"
|
|
1870 |
by (import hreal HREAL_LDISTRIB)
|
|
1871 |
|
|
1872 |
lemma HREAL_MUL_LID: "ALL X. hreal_mul hreal_1 X = X"
|
|
1873 |
by (import hreal HREAL_MUL_LID)
|
|
1874 |
|
|
1875 |
lemma HREAL_MUL_LINV: "ALL X. hreal_mul (hreal_inv X) X = hreal_1"
|
|
1876 |
by (import hreal HREAL_MUL_LINV)
|
|
1877 |
|
|
1878 |
lemma HREAL_NOZERO: "ALL X Y. hreal_add X Y ~= X"
|
|
1879 |
by (import hreal HREAL_NOZERO)
|
|
1880 |
|
|
1881 |
constdefs
|
|
1882 |
hreal_sub :: "hreal => hreal => hreal"
|
|
1883 |
"hreal_sub ==
|
|
1884 |
%Y X. hreal (%w. EX x. ~ hreal.cut X x & hreal.cut Y (hrat_add x w))"
|
|
1885 |
|
|
1886 |
lemma hreal_sub: "ALL Y X.
|
|
1887 |
hreal_sub Y X =
|
|
1888 |
hreal (%w. EX x. ~ hreal.cut X x & hreal.cut Y (hrat_add x w))"
|
|
1889 |
by (import hreal hreal_sub)
|
|
1890 |
|
|
1891 |
lemma HREAL_LT_LEMMA: "ALL X Y. hreal_lt X Y --> (EX x. ~ hreal.cut X x & hreal.cut Y x)"
|
|
1892 |
by (import hreal HREAL_LT_LEMMA)
|
|
1893 |
|
|
1894 |
lemma HREAL_SUB_ISACUT: "ALL X Y.
|
|
1895 |
hreal_lt X Y -->
|
|
1896 |
isacut (%w. EX x. ~ hreal.cut X x & hreal.cut Y (hrat_add x w))"
|
|
1897 |
by (import hreal HREAL_SUB_ISACUT)
|
|
1898 |
|
|
1899 |
lemma HREAL_SUB_ADD: "ALL X Y. hreal_lt X Y --> hreal_add (hreal_sub Y X) X = Y"
|
|
1900 |
by (import hreal HREAL_SUB_ADD)
|
|
1901 |
|
|
1902 |
lemma HREAL_LT_TOTAL: "ALL X Y. X = Y | hreal_lt X Y | hreal_lt Y X"
|
|
1903 |
by (import hreal HREAL_LT_TOTAL)
|
|
1904 |
|
|
1905 |
lemma HREAL_LT: "ALL X Y. hreal_lt X Y = (EX D. Y = hreal_add X D)"
|
|
1906 |
by (import hreal HREAL_LT)
|
|
1907 |
|
|
1908 |
lemma HREAL_ADD_TOTAL: "ALL X Y. X = Y | (EX D. Y = hreal_add X D) | (EX D. X = hreal_add Y D)"
|
|
1909 |
by (import hreal HREAL_ADD_TOTAL)
|
|
1910 |
|
|
1911 |
lemma HREAL_SUP_ISACUT: "ALL P.
|
|
1912 |
Ex P & (EX Y. ALL X. P X --> hreal_lt X Y) -->
|
|
1913 |
isacut (%w. EX X. P X & hreal.cut X w)"
|
|
1914 |
by (import hreal HREAL_SUP_ISACUT)
|
|
1915 |
|
|
1916 |
lemma HREAL_SUP: "ALL P.
|
|
1917 |
Ex P & (EX Y. ALL X. P X --> hreal_lt X Y) -->
|
|
1918 |
(ALL Y. (EX X. P X & hreal_lt Y X) = hreal_lt Y (hreal_sup P))"
|
|
1919 |
by (import hreal HREAL_SUP)
|
|
1920 |
|
|
1921 |
;end_setup
|
|
1922 |
|
|
1923 |
;setup_theory numeral
|
|
1924 |
|
|
1925 |
lemma numeral_suc: "Suc ALT_ZERO = NUMERAL_BIT1 ALT_ZERO &
|
|
1926 |
(ALL x. Suc (NUMERAL_BIT1 x) = NUMERAL_BIT2 x) &
|
|
1927 |
(ALL x. Suc (NUMERAL_BIT2 x) = NUMERAL_BIT1 (Suc x))"
|
|
1928 |
by (import numeral numeral_suc)
|
|
1929 |
|
|
1930 |
constdefs
|
|
1931 |
iZ :: "nat => nat"
|
|
1932 |
"iZ == %x. x"
|
|
1933 |
|
|
1934 |
lemma iZ: "ALL x. iZ x = x"
|
|
1935 |
by (import numeral iZ)
|
|
1936 |
|
|
1937 |
constdefs
|
|
1938 |
iiSUC :: "nat => nat"
|
|
1939 |
"iiSUC == %n. Suc (Suc n)"
|
|
1940 |
|
|
1941 |
lemma iiSUC: "ALL n. iiSUC n = Suc (Suc n)"
|
|
1942 |
by (import numeral iiSUC)
|
|
1943 |
|
|
1944 |
lemma numeral_distrib: "(ALL x::nat. (0::nat) + x = x) &
|
|
1945 |
(ALL x::nat. x + (0::nat) = x) &
|
|
1946 |
(ALL (x::nat) xa::nat. NUMERAL x + NUMERAL xa = NUMERAL (iZ (x + xa))) &
|
|
1947 |
(ALL x::nat. (0::nat) * x = (0::nat)) &
|
|
1948 |
(ALL x::nat. x * (0::nat) = (0::nat)) &
|
|
1949 |
(ALL (x::nat) xa::nat. NUMERAL x * NUMERAL xa = NUMERAL (x * xa)) &
|
|
1950 |
(ALL x::nat. (0::nat) - x = (0::nat)) &
|
|
1951 |
(ALL x::nat. x - (0::nat) = x) &
|
|
1952 |
(ALL (x::nat) xa::nat. NUMERAL x - NUMERAL xa = NUMERAL (x - xa)) &
|
|
1953 |
(ALL x::nat. (0::nat) ^ NUMERAL (NUMERAL_BIT1 x) = (0::nat)) &
|
|
1954 |
(ALL x::nat. (0::nat) ^ NUMERAL (NUMERAL_BIT2 x) = (0::nat)) &
|
|
1955 |
(ALL x::nat. x ^ (0::nat) = (1::nat)) &
|
|
1956 |
(ALL (x::nat) xa::nat. NUMERAL x ^ NUMERAL xa = NUMERAL (x ^ xa)) &
|
|
1957 |
Suc (0::nat) = (1::nat) &
|
|
1958 |
(ALL x::nat. Suc (NUMERAL x) = NUMERAL (Suc x)) &
|
|
1959 |
PRE (0::nat) = (0::nat) &
|
|
1960 |
(ALL x::nat. PRE (NUMERAL x) = NUMERAL (PRE x)) &
|
|
1961 |
(ALL x::nat. (NUMERAL x = (0::nat)) = (x = ALT_ZERO)) &
|
|
1962 |
(ALL x::nat. ((0::nat) = NUMERAL x) = (x = ALT_ZERO)) &
|
|
1963 |
(ALL (x::nat) xa::nat. (NUMERAL x = NUMERAL xa) = (x = xa)) &
|
|
1964 |
(ALL x::nat. (x < (0::nat)) = False) &
|
|
1965 |
(ALL x::nat. ((0::nat) < NUMERAL x) = (ALT_ZERO < x)) &
|
|
1966 |
(ALL (x::nat) xa::nat. (NUMERAL x < NUMERAL xa) = (x < xa)) &
|
|
1967 |
(ALL x::nat. (x < (0::nat)) = False) &
|
|
1968 |
(ALL x::nat. ((0::nat) < NUMERAL x) = (ALT_ZERO < x)) &
|
|
1969 |
(ALL (x::nat) xa::nat. (NUMERAL xa < NUMERAL x) = (xa < x)) &
|
|
1970 |
(ALL x::nat. ((0::nat) <= x) = True) &
|
|
1971 |
(ALL x::nat. (NUMERAL x <= (0::nat)) = (x <= ALT_ZERO)) &
|
|
1972 |
(ALL (x::nat) xa::nat. (NUMERAL x <= NUMERAL xa) = (x <= xa)) &
|
|
1973 |
(ALL x::nat. ((0::nat) <= x) = True) &
|
|
1974 |
(ALL x::nat. (x <= (0::nat)) = (x = (0::nat))) &
|
|
1975 |
(ALL (x::nat) xa::nat. (NUMERAL xa <= NUMERAL x) = (xa <= x)) &
|
|
1976 |
(ALL x::nat. ODD (NUMERAL x) = ODD x) &
|
|
1977 |
(ALL x::nat. EVEN (NUMERAL x) = EVEN x) & ~ ODD (0::nat) & EVEN (0::nat)"
|
|
1978 |
by (import numeral numeral_distrib)
|
|
1979 |
|
|
1980 |
lemma numeral_iisuc: "iiSUC ALT_ZERO = NUMERAL_BIT2 ALT_ZERO &
|
|
1981 |
iiSUC (NUMERAL_BIT1 n) = NUMERAL_BIT1 (Suc n) &
|
|
1982 |
iiSUC (NUMERAL_BIT2 n) = NUMERAL_BIT2 (Suc n)"
|
|
1983 |
by (import numeral numeral_iisuc)
|
|
1984 |
|
|
1985 |
lemma numeral_add: "ALL x xa.
|
|
1986 |
iZ (ALT_ZERO + x) = x &
|
|
1987 |
iZ (x + ALT_ZERO) = x &
|
|
1988 |
iZ (NUMERAL_BIT1 x + NUMERAL_BIT1 xa) = NUMERAL_BIT2 (iZ (x + xa)) &
|
|
1989 |
iZ (NUMERAL_BIT1 x + NUMERAL_BIT2 xa) = NUMERAL_BIT1 (Suc (x + xa)) &
|
|
1990 |
iZ (NUMERAL_BIT2 x + NUMERAL_BIT1 xa) = NUMERAL_BIT1 (Suc (x + xa)) &
|
|
1991 |
iZ (NUMERAL_BIT2 x + NUMERAL_BIT2 xa) = NUMERAL_BIT2 (Suc (x + xa)) &
|
|
1992 |
Suc (ALT_ZERO + x) = Suc x &
|
|
1993 |
Suc (x + ALT_ZERO) = Suc x &
|
|
1994 |
Suc (NUMERAL_BIT1 x + NUMERAL_BIT1 xa) = NUMERAL_BIT1 (Suc (x + xa)) &
|
|
1995 |
Suc (NUMERAL_BIT1 x + NUMERAL_BIT2 xa) = NUMERAL_BIT2 (Suc (x + xa)) &
|
|
1996 |
Suc (NUMERAL_BIT2 x + NUMERAL_BIT1 xa) = NUMERAL_BIT2 (Suc (x + xa)) &
|
|
1997 |
Suc (NUMERAL_BIT2 x + NUMERAL_BIT2 xa) = NUMERAL_BIT1 (iiSUC (x + xa)) &
|
|
1998 |
iiSUC (ALT_ZERO + x) = iiSUC x &
|
|
1999 |
iiSUC (x + ALT_ZERO) = iiSUC x &
|
|
2000 |
iiSUC (NUMERAL_BIT1 x + NUMERAL_BIT1 xa) = NUMERAL_BIT2 (Suc (x + xa)) &
|
|
2001 |
iiSUC (NUMERAL_BIT1 x + NUMERAL_BIT2 xa) =
|
|
2002 |
NUMERAL_BIT1 (iiSUC (x + xa)) &
|
|
2003 |
iiSUC (NUMERAL_BIT2 x + NUMERAL_BIT1 xa) =
|
|
2004 |
NUMERAL_BIT1 (iiSUC (x + xa)) &
|
|
2005 |
iiSUC (NUMERAL_BIT2 x + NUMERAL_BIT2 xa) = NUMERAL_BIT2 (iiSUC (x + xa))"
|
|
2006 |
by (import numeral numeral_add)
|
|
2007 |
|
|
2008 |
lemma numeral_eq: "ALL x xa.
|
|
2009 |
(ALT_ZERO = NUMERAL_BIT1 x) = False &
|
|
2010 |
(NUMERAL_BIT1 x = ALT_ZERO) = False &
|
|
2011 |
(ALT_ZERO = NUMERAL_BIT2 x) = False &
|
|
2012 |
(NUMERAL_BIT2 x = ALT_ZERO) = False &
|
|
2013 |
(NUMERAL_BIT1 x = NUMERAL_BIT2 xa) = False &
|
|
2014 |
(NUMERAL_BIT2 x = NUMERAL_BIT1 xa) = False &
|
|
2015 |
(NUMERAL_BIT1 x = NUMERAL_BIT1 xa) = (x = xa) &
|
|
2016 |
(NUMERAL_BIT2 x = NUMERAL_BIT2 xa) = (x = xa)"
|
|
2017 |
by (import numeral numeral_eq)
|
|
2018 |
|
|
2019 |
lemma numeral_lt: "ALL x xa.
|
|
2020 |
(ALT_ZERO < NUMERAL_BIT1 x) = True &
|
|
2021 |
(ALT_ZERO < NUMERAL_BIT2 x) = True &
|
|
2022 |
(x < ALT_ZERO) = False &
|
|
2023 |
(NUMERAL_BIT1 x < NUMERAL_BIT1 xa) = (x < xa) &
|
|
2024 |
(NUMERAL_BIT2 x < NUMERAL_BIT2 xa) = (x < xa) &
|
|
2025 |
(NUMERAL_BIT1 x < NUMERAL_BIT2 xa) = (~ xa < x) &
|
|
2026 |
(NUMERAL_BIT2 x < NUMERAL_BIT1 xa) = (x < xa)"
|
|
2027 |
by (import numeral numeral_lt)
|
|
2028 |
|
|
2029 |
lemma numeral_lte: "ALL x xa.
|
|
2030 |
(ALT_ZERO <= x) = True &
|
|
2031 |
(NUMERAL_BIT1 x <= ALT_ZERO) = False &
|
|
2032 |
(NUMERAL_BIT2 x <= ALT_ZERO) = False &
|
|
2033 |
(NUMERAL_BIT1 x <= NUMERAL_BIT1 xa) = (x <= xa) &
|
|
2034 |
(NUMERAL_BIT1 x <= NUMERAL_BIT2 xa) = (x <= xa) &
|
|
2035 |
(NUMERAL_BIT2 x <= NUMERAL_BIT1 xa) = (~ xa <= x) &
|
|
2036 |
(NUMERAL_BIT2 x <= NUMERAL_BIT2 xa) = (x <= xa)"
|
|
2037 |
by (import numeral numeral_lte)
|
|
2038 |
|
|
2039 |
lemma numeral_pre: "PRE ALT_ZERO = ALT_ZERO &
|
|
2040 |
PRE (NUMERAL_BIT1 ALT_ZERO) = ALT_ZERO &
|
|
2041 |
(ALL x.
|
|
2042 |
PRE (NUMERAL_BIT1 (NUMERAL_BIT1 x)) =
|
|
2043 |
NUMERAL_BIT2 (PRE (NUMERAL_BIT1 x))) &
|
|
2044 |
(ALL x.
|
|
2045 |
PRE (NUMERAL_BIT1 (NUMERAL_BIT2 x)) = NUMERAL_BIT2 (NUMERAL_BIT1 x)) &
|
|
2046 |
(ALL x. PRE (NUMERAL_BIT2 x) = NUMERAL_BIT1 x)"
|
|
2047 |
by (import numeral numeral_pre)
|
|
2048 |
|
|
2049 |
lemma bit_initiality: "ALL zf b1f b2f.
|
|
2050 |
EX x. x ALT_ZERO = zf &
|
|
2051 |
(ALL n. x (NUMERAL_BIT1 n) = b1f n (x n)) &
|
|
2052 |
(ALL n. x (NUMERAL_BIT2 n) = b2f n (x n))"
|
|
2053 |
by (import numeral bit_initiality)
|
|
2054 |
|
|
2055 |
consts
|
|
2056 |
iBIT_cases :: "nat => 'a => (nat => 'a) => (nat => 'a) => 'a"
|
|
2057 |
|
|
2058 |
specification (iBIT_cases) iBIT_cases: "(ALL (zf::'a) (bf1::nat => 'a) bf2::nat => 'a.
|
|
2059 |
iBIT_cases ALT_ZERO zf bf1 bf2 = zf) &
|
|
2060 |
(ALL (n::nat) (zf::'a) (bf1::nat => 'a) bf2::nat => 'a.
|
|
2061 |
iBIT_cases (NUMERAL_BIT1 n) zf bf1 bf2 = bf1 n) &
|
|
2062 |
(ALL (n::nat) (zf::'a) (bf1::nat => 'a) bf2::nat => 'a.
|
|
2063 |
iBIT_cases (NUMERAL_BIT2 n) zf bf1 bf2 = bf2 n)"
|
|
2064 |
by (import numeral iBIT_cases)
|
|
2065 |
|
|
2066 |
constdefs
|
|
2067 |
iDUB :: "nat => nat"
|
|
2068 |
"iDUB == %x. x + x"
|
|
2069 |
|
|
2070 |
lemma iDUB: "ALL x. iDUB x = x + x"
|
|
2071 |
by (import numeral iDUB)
|
|
2072 |
|
|
2073 |
consts
|
|
2074 |
iSUB :: "bool => nat => nat => nat"
|
|
2075 |
|
|
2076 |
specification (iSUB) iSUB_DEF: "(ALL b x. iSUB b ALT_ZERO x = ALT_ZERO) &
|
|
2077 |
(ALL b n x.
|
|
2078 |
iSUB b (NUMERAL_BIT1 n) x =
|
|
2079 |
(if b
|
|
2080 |
then iBIT_cases x (NUMERAL_BIT1 n) (%m. iDUB (iSUB True n m))
|
|
2081 |
(%m. NUMERAL_BIT1 (iSUB False n m))
|
|
2082 |
else iBIT_cases x (iDUB n) (%m. NUMERAL_BIT1 (iSUB False n m))
|
|
2083 |
(%m. iDUB (iSUB False n m)))) &
|
|
2084 |
(ALL b n x.
|
|
2085 |
iSUB b (NUMERAL_BIT2 n) x =
|
|
2086 |
(if b
|
|
2087 |
then iBIT_cases x (NUMERAL_BIT2 n) (%m. NUMERAL_BIT1 (iSUB True n m))
|
|
2088 |
(%m. iDUB (iSUB True n m))
|
|
2089 |
else iBIT_cases x (NUMERAL_BIT1 n) (%m. iDUB (iSUB True n m))
|
|
2090 |
(%m. NUMERAL_BIT1 (iSUB False n m))))"
|
|
2091 |
by (import numeral iSUB_DEF)
|
|
2092 |
|
|
2093 |
lemma bit_induction: "ALL P.
|
|
2094 |
P ALT_ZERO &
|
|
2095 |
(ALL n. P n --> P (NUMERAL_BIT1 n)) &
|
|
2096 |
(ALL n. P n --> P (NUMERAL_BIT2 n)) -->
|
|
2097 |
All P"
|
|
2098 |
by (import numeral bit_induction)
|
|
2099 |
|
|
2100 |
lemma iSUB_THM: "ALL xa xb xc.
|
|
2101 |
iSUB xa ALT_ZERO x = ALT_ZERO &
|
|
2102 |
iSUB True xb ALT_ZERO = xb &
|
|
2103 |
iSUB False (NUMERAL_BIT1 xb) ALT_ZERO = iDUB xb &
|
|
2104 |
iSUB True (NUMERAL_BIT1 xb) (NUMERAL_BIT1 xc) = iDUB (iSUB True xb xc) &
|
|
2105 |
iSUB False (NUMERAL_BIT1 xb) (NUMERAL_BIT1 xc) =
|
|
2106 |
NUMERAL_BIT1 (iSUB False xb xc) &
|
|
2107 |
iSUB True (NUMERAL_BIT1 xb) (NUMERAL_BIT2 xc) =
|
|
2108 |
NUMERAL_BIT1 (iSUB False xb xc) &
|
|
2109 |
iSUB False (NUMERAL_BIT1 xb) (NUMERAL_BIT2 xc) =
|
|
2110 |
iDUB (iSUB False xb xc) &
|
|
2111 |
iSUB False (NUMERAL_BIT2 xb) ALT_ZERO = NUMERAL_BIT1 xb &
|
|
2112 |
iSUB True (NUMERAL_BIT2 xb) (NUMERAL_BIT1 xc) =
|
|
2113 |
NUMERAL_BIT1 (iSUB True xb xc) &
|
|
2114 |
iSUB False (NUMERAL_BIT2 xb) (NUMERAL_BIT1 xc) = iDUB (iSUB True xb xc) &
|
|
2115 |
iSUB True (NUMERAL_BIT2 xb) (NUMERAL_BIT2 xc) = iDUB (iSUB True xb xc) &
|
|
2116 |
iSUB False (NUMERAL_BIT2 xb) (NUMERAL_BIT2 xc) =
|
|
2117 |
NUMERAL_BIT1 (iSUB False xb xc)"
|
|
2118 |
by (import numeral iSUB_THM)
|
|
2119 |
|
|
2120 |
lemma numeral_sub: "ALL x xa.
|
|
2121 |
NUMERAL (x - xa) = (if xa < x then NUMERAL (iSUB True x xa) else 0)"
|
|
2122 |
by (import numeral numeral_sub)
|
|
2123 |
|
|
2124 |
lemma iDUB_removal: "ALL x.
|
|
2125 |
iDUB (NUMERAL_BIT1 x) = NUMERAL_BIT2 (iDUB x) &
|
|
2126 |
iDUB (NUMERAL_BIT2 x) = NUMERAL_BIT2 (NUMERAL_BIT1 x) &
|
|
2127 |
iDUB ALT_ZERO = ALT_ZERO"
|
|
2128 |
by (import numeral iDUB_removal)
|
|
2129 |
|
|
2130 |
lemma numeral_mult: "ALL x xa.
|
|
2131 |
ALT_ZERO * x = ALT_ZERO &
|
|
2132 |
x * ALT_ZERO = ALT_ZERO &
|
|
2133 |
NUMERAL_BIT1 x * xa = iZ (iDUB (x * xa) + xa) &
|
|
2134 |
NUMERAL_BIT2 x * xa = iDUB (iZ (x * xa + xa))"
|
|
2135 |
by (import numeral numeral_mult)
|
|
2136 |
|
|
2137 |
constdefs
|
|
2138 |
iSQR :: "nat => nat"
|
|
2139 |
"iSQR == %x. x * x"
|
|
2140 |
|
|
2141 |
lemma iSQR: "ALL x. iSQR x = x * x"
|
|
2142 |
by (import numeral iSQR)
|
|
2143 |
|
|
2144 |
lemma numeral_exp: "(ALL x. x ^ ALT_ZERO = NUMERAL_BIT1 ALT_ZERO) &
|
|
2145 |
(ALL x xa. x ^ NUMERAL_BIT1 xa = x * iSQR (x ^ xa)) &
|
|
2146 |
(ALL x xa. x ^ NUMERAL_BIT2 xa = iSQR x * iSQR (x ^ xa))"
|
|
2147 |
by (import numeral numeral_exp)
|
|
2148 |
|
|
2149 |
lemma numeral_evenodd: "ALL x.
|
|
2150 |
EVEN ALT_ZERO &
|
|
2151 |
EVEN (NUMERAL_BIT2 x) &
|
|
2152 |
~ EVEN (NUMERAL_BIT1 x) &
|
|
2153 |
~ ODD ALT_ZERO & ~ ODD (NUMERAL_BIT2 x) & ODD (NUMERAL_BIT1 x)"
|
|
2154 |
by (import numeral numeral_evenodd)
|
|
2155 |
|
|
2156 |
lemma numeral_fact: "ALL n. FACT n = (if n = 0 then 1 else n * FACT (PRE n))"
|
|
2157 |
by (import numeral numeral_fact)
|
|
2158 |
|
|
2159 |
lemma numeral_funpow: "ALL n. (f ^ n) x = (if n = 0 then x else (f ^ (n - 1)) (f x))"
|
|
2160 |
by (import numeral numeral_funpow)
|
|
2161 |
|
|
2162 |
;end_setup
|
|
2163 |
|
|
2164 |
;setup_theory ind_type
|
|
2165 |
|
|
2166 |
lemma INJ_INVERSE2: "ALL P::'A => 'B => 'C.
|
|
2167 |
(ALL (x1::'A) (y1::'B) (x2::'A) y2::'B.
|
|
2168 |
(P x1 y1 = P x2 y2) = (x1 = x2 & y1 = y2)) -->
|
|
2169 |
(EX (x::'C => 'A) Y::'C => 'B.
|
|
2170 |
ALL (xa::'A) y::'B. x (P xa y) = xa & Y (P xa y) = y)"
|
|
2171 |
by (import ind_type INJ_INVERSE2)
|
|
2172 |
|
|
2173 |
constdefs
|
|
2174 |
NUMPAIR :: "nat => nat => nat"
|
|
2175 |
"NUMPAIR == %x y. 2 ^ x * (2 * y + 1)"
|
|
2176 |
|
|
2177 |
lemma NUMPAIR: "ALL x y. NUMPAIR x y = 2 ^ x * (2 * y + 1)"
|
|
2178 |
by (import ind_type NUMPAIR)
|
|
2179 |
|
|
2180 |
lemma NUMPAIR_INJ_LEMMA: "ALL x xa xb xc. NUMPAIR x xa = NUMPAIR xb xc --> x = xb"
|
|
2181 |
by (import ind_type NUMPAIR_INJ_LEMMA)
|
|
2182 |
|
|
2183 |
lemma NUMPAIR_INJ: "ALL x1 y1 x2 y2. (NUMPAIR x1 y1 = NUMPAIR x2 y2) = (x1 = x2 & y1 = y2)"
|
|
2184 |
by (import ind_type NUMPAIR_INJ)
|
|
2185 |
|
|
2186 |
consts
|
|
2187 |
NUMSND :: "nat => nat"
|
|
2188 |
NUMFST :: "nat => nat"
|
|
2189 |
|
|
2190 |
specification (NUMFST NUMSND) NUMPAIR_DEST: "ALL x y. NUMFST (NUMPAIR x y) = x & NUMSND (NUMPAIR x y) = y"
|
|
2191 |
by (import ind_type NUMPAIR_DEST)
|
|
2192 |
|
|
2193 |
constdefs
|
|
2194 |
NUMSUM :: "bool => nat => nat"
|
|
2195 |
"NUMSUM == %b x. if b then Suc (2 * x) else 2 * x"
|
|
2196 |
|
|
2197 |
lemma NUMSUM: "ALL b x. NUMSUM b x = (if b then Suc (2 * x) else 2 * x)"
|
|
2198 |
by (import ind_type NUMSUM)
|
|
2199 |
|
|
2200 |
lemma NUMSUM_INJ: "ALL b1 x1 b2 x2. (NUMSUM b1 x1 = NUMSUM b2 x2) = (b1 = b2 & x1 = x2)"
|
|
2201 |
by (import ind_type NUMSUM_INJ)
|
|
2202 |
|
|
2203 |
consts
|
|
2204 |
NUMRIGHT :: "nat => nat"
|
|
2205 |
NUMLEFT :: "nat => bool"
|
|
2206 |
|
|
2207 |
specification (NUMLEFT NUMRIGHT) NUMSUM_DEST: "ALL x y. NUMLEFT (NUMSUM x y) = x & NUMRIGHT (NUMSUM x y) = y"
|
|
2208 |
by (import ind_type NUMSUM_DEST)
|
|
2209 |
|
|
2210 |
constdefs
|
|
2211 |
INJN :: "nat => nat => 'a => bool"
|
|
2212 |
"INJN == %m n a. n = m"
|
|
2213 |
|
|
2214 |
lemma INJN: "ALL m. INJN m = (%n a. n = m)"
|
|
2215 |
by (import ind_type INJN)
|
|
2216 |
|
|
2217 |
lemma INJN_INJ: "ALL n1 n2. (INJN n1 = INJN n2) = (n1 = n2)"
|
|
2218 |
by (import ind_type INJN_INJ)
|
|
2219 |
|
|
2220 |
constdefs
|
|
2221 |
INJA :: "'a => nat => 'a => bool"
|
|
2222 |
"INJA == %a n b. b = a"
|
|
2223 |
|
|
2224 |
lemma INJA: "ALL a. INJA a = (%n b. b = a)"
|
|
2225 |
by (import ind_type INJA)
|
|
2226 |
|
|
2227 |
lemma INJA_INJ: "ALL a1 a2. (INJA a1 = INJA a2) = (a1 = a2)"
|
|
2228 |
by (import ind_type INJA_INJ)
|
|
2229 |
|
|
2230 |
constdefs
|
|
2231 |
INJF :: "(nat => nat => 'a => bool) => nat => 'a => bool"
|
|
2232 |
"INJF == %f n. f (NUMFST n) (NUMSND n)"
|
|
2233 |
|
|
2234 |
lemma INJF: "ALL f. INJF f = (%n. f (NUMFST n) (NUMSND n))"
|
|
2235 |
by (import ind_type INJF)
|
|
2236 |
|
|
2237 |
lemma INJF_INJ: "ALL f1 f2. (INJF f1 = INJF f2) = (f1 = f2)"
|
|
2238 |
by (import ind_type INJF_INJ)
|
|
2239 |
|
|
2240 |
constdefs
|
|
2241 |
INJP :: "(nat => 'a => bool) => (nat => 'a => bool) => nat => 'a => bool"
|
|
2242 |
"INJP ==
|
|
2243 |
%f1 f2 n a. if NUMLEFT n then f1 (NUMRIGHT n) a else f2 (NUMRIGHT n) a"
|
|
2244 |
|
|
2245 |
lemma INJP: "ALL f1 f2.
|
|
2246 |
INJP f1 f2 =
|
|
2247 |
(%n a. if NUMLEFT n then f1 (NUMRIGHT n) a else f2 (NUMRIGHT n) a)"
|
|
2248 |
by (import ind_type INJP)
|
|
2249 |
|
|
2250 |
lemma INJP_INJ: "ALL f1 f1' f2 f2'. (INJP f1 f2 = INJP f1' f2') = (f1 = f1' & f2 = f2')"
|
|
2251 |
by (import ind_type INJP_INJ)
|
|
2252 |
|
|
2253 |
constdefs
|
|
2254 |
ZCONSTR :: "nat => 'a => (nat => nat => 'a => bool) => nat => 'a => bool"
|
|
2255 |
"ZCONSTR == %c i r. INJP (INJN (Suc c)) (INJP (INJA i) (INJF r))"
|
|
2256 |
|
|
2257 |
lemma ZCONSTR: "ALL c i r. ZCONSTR c i r = INJP (INJN (Suc c)) (INJP (INJA i) (INJF r))"
|
|
2258 |
by (import ind_type ZCONSTR)
|
|
2259 |
|
|
2260 |
constdefs
|
|
2261 |
ZBOT :: "nat => 'a => bool"
|
|
2262 |
"ZBOT == INJP (INJN 0) (SOME z. True)"
|
|
2263 |
|
|
2264 |
lemma ZBOT: "ZBOT = INJP (INJN 0) (SOME z. True)"
|
|
2265 |
by (import ind_type ZBOT)
|
|
2266 |
|
|
2267 |
lemma ZCONSTR_ZBOT: "ALL x xa xb. ZCONSTR x xa xb ~= ZBOT"
|
|
2268 |
by (import ind_type ZCONSTR_ZBOT)
|
|
2269 |
|
|
2270 |
constdefs
|
|
2271 |
ZRECSPACE :: "(nat => 'a => bool) => bool"
|
|
2272 |
"ZRECSPACE ==
|
|
2273 |
%a0. ALL ZRECSPACE'.
|
|
2274 |
(ALL a0.
|
|
2275 |
a0 = ZBOT |
|
|
2276 |
(EX c i r. a0 = ZCONSTR c i r & (ALL n. ZRECSPACE' (r n))) -->
|
|
2277 |
ZRECSPACE' a0) -->
|
|
2278 |
ZRECSPACE' a0"
|
|
2279 |
|
|
2280 |
lemma ZRECSPACE: "ZRECSPACE =
|
|
2281 |
(%a0. ALL ZRECSPACE'.
|
|
2282 |
(ALL a0.
|
|
2283 |
a0 = ZBOT |
|
|
2284 |
(EX c i r. a0 = ZCONSTR c i r & (ALL n. ZRECSPACE' (r n))) -->
|
|
2285 |
ZRECSPACE' a0) -->
|
|
2286 |
ZRECSPACE' a0)"
|
|
2287 |
by (import ind_type ZRECSPACE)
|
|
2288 |
|
|
2289 |
lemma ZRECSPACE_rules: "(op &::bool => bool => bool)
|
|
2290 |
((ZRECSPACE::(nat => 'a => bool) => bool) (ZBOT::nat => 'a => bool))
|
|
2291 |
((All::(nat => bool) => bool)
|
|
2292 |
(%c::nat.
|
|
2293 |
(All::('a => bool) => bool)
|
|
2294 |
(%i::'a.
|
|
2295 |
(All::((nat => nat => 'a => bool) => bool) => bool)
|
|
2296 |
(%r::nat => nat => 'a => bool.
|
|
2297 |
(op -->::bool => bool => bool)
|
|
2298 |
((All::(nat => bool) => bool)
|
|
2299 |
(%n::nat.
|
|
2300 |
(ZRECSPACE::(nat => 'a => bool) => bool) (r n)))
|
|
2301 |
((ZRECSPACE::(nat => 'a => bool) => bool)
|
|
2302 |
((ZCONSTR::nat
|
|
2303 |
=> 'a => (nat => nat => 'a => bool)
|
|
2304 |
=> nat => 'a => bool)
|
|
2305 |
c i r))))))"
|
|
2306 |
by (import ind_type ZRECSPACE_rules)
|
|
2307 |
|
|
2308 |
lemma ZRECSPACE_ind: "ALL x.
|
|
2309 |
x ZBOT & (ALL c i r. (ALL n. x (r n)) --> x (ZCONSTR c i r)) -->
|
|
2310 |
(ALL a0. ZRECSPACE a0 --> x a0)"
|
|
2311 |
by (import ind_type ZRECSPACE_ind)
|
|
2312 |
|
|
2313 |
lemma ZRECSPACE_cases: "ALL a0.
|
|
2314 |
ZRECSPACE a0 =
|
|
2315 |
(a0 = ZBOT | (EX c i r. a0 = ZCONSTR c i r & (ALL n. ZRECSPACE (r n))))"
|
|
2316 |
by (import ind_type ZRECSPACE_cases)
|
|
2317 |
|
|
2318 |
typedef (open) ('a) recspace = "(Collect::((nat => 'a => bool) => bool) => (nat => 'a => bool) set)
|
|
2319 |
(ZRECSPACE::(nat => 'a => bool) => bool)"
|
|
2320 |
by (rule typedef_helper,import ind_type recspace_TY_DEF)
|
|
2321 |
|
|
2322 |
lemmas recspace_TY_DEF = typedef_hol2hol4 [OF type_definition_recspace]
|
|
2323 |
|
|
2324 |
consts
|
|
2325 |
mk_rec :: "(nat => 'a => bool) => 'a recspace"
|
|
2326 |
dest_rec :: "'a recspace => nat => 'a => bool"
|
|
2327 |
|
|
2328 |
specification (dest_rec mk_rec) recspace_repfns: "(ALL a::'a recspace. mk_rec (dest_rec a) = a) &
|
|
2329 |
(ALL r::nat => 'a => bool. ZRECSPACE r = (dest_rec (mk_rec r) = r))"
|
|
2330 |
by (import ind_type recspace_repfns)
|
|
2331 |
|
|
2332 |
constdefs
|
|
2333 |
BOTTOM :: "'a recspace"
|
|
2334 |
"BOTTOM == mk_rec ZBOT"
|
|
2335 |
|
|
2336 |
lemma BOTTOM: "BOTTOM = mk_rec ZBOT"
|
|
2337 |
by (import ind_type BOTTOM)
|
|
2338 |
|
|
2339 |
constdefs
|
|
2340 |
CONSTR :: "nat => 'a => (nat => 'a recspace) => 'a recspace"
|
|
2341 |
"CONSTR == %c i r. mk_rec (ZCONSTR c i (%n. dest_rec (r n)))"
|
|
2342 |
|
|
2343 |
lemma CONSTR: "ALL c i r. CONSTR c i r = mk_rec (ZCONSTR c i (%n. dest_rec (r n)))"
|
|
2344 |
by (import ind_type CONSTR)
|
|
2345 |
|
|
2346 |
lemma MK_REC_INJ: "ALL x y. mk_rec x = mk_rec y --> ZRECSPACE x & ZRECSPACE y --> x = y"
|
|
2347 |
by (import ind_type MK_REC_INJ)
|
|
2348 |
|
|
2349 |
lemma DEST_REC_INJ: "ALL x y. (dest_rec x = dest_rec y) = (x = y)"
|
|
2350 |
by (import ind_type DEST_REC_INJ)
|
|
2351 |
|
|
2352 |
lemma CONSTR_BOT: "ALL c i r. CONSTR c i r ~= BOTTOM"
|
|
2353 |
by (import ind_type CONSTR_BOT)
|
|
2354 |
|
|
2355 |
lemma CONSTR_INJ: "ALL c1 i1 r1 c2 i2 r2.
|
|
2356 |
(CONSTR c1 i1 r1 = CONSTR c2 i2 r2) = (c1 = c2 & i1 = i2 & r1 = r2)"
|
|
2357 |
by (import ind_type CONSTR_INJ)
|
|
2358 |
|
|
2359 |
lemma CONSTR_IND: "ALL P.
|
|
2360 |
P BOTTOM & (ALL c i r. (ALL n. P (r n)) --> P (CONSTR c i r)) --> All P"
|
|
2361 |
by (import ind_type CONSTR_IND)
|
|
2362 |
|
|
2363 |
lemma CONSTR_REC: "ALL Fn. EX f. ALL c i r. f (CONSTR c i r) = Fn c i r (%n. f (r n))"
|
|
2364 |
by (import ind_type CONSTR_REC)
|
|
2365 |
|
|
2366 |
consts
|
|
2367 |
FCONS :: "'a => (nat => 'a) => nat => 'a"
|
|
2368 |
|
|
2369 |
specification (FCONS) FCONS: "(ALL (a::'a) f::nat => 'a. FCONS a f (0::nat) = a) &
|
|
2370 |
(ALL (a::'a) (f::nat => 'a) n::nat. FCONS a f (Suc n) = f n)"
|
|
2371 |
by (import ind_type FCONS)
|
|
2372 |
|
|
2373 |
constdefs
|
|
2374 |
FNIL :: "nat => 'a"
|
|
2375 |
"FNIL == %n. SOME x. True"
|
|
2376 |
|
|
2377 |
lemma FNIL: "ALL n. FNIL n = (SOME x. True)"
|
|
2378 |
by (import ind_type FNIL)
|
|
2379 |
|
|
2380 |
constdefs
|
|
2381 |
ISO :: "('a => 'b) => ('b => 'a) => bool"
|
|
2382 |
"ISO == %f g. (ALL x. f (g x) = x) & (ALL y. g (f y) = y)"
|
|
2383 |
|
|
2384 |
lemma ISO: "ALL f g. ISO f g = ((ALL x. f (g x) = x) & (ALL y. g (f y) = y))"
|
|
2385 |
by (import ind_type ISO)
|
|
2386 |
|
|
2387 |
lemma ISO_REFL: "ISO (%x. x) (%x. x)"
|
|
2388 |
by (import ind_type ISO_REFL)
|
|
2389 |
|
|
2390 |
lemma ISO_FUN: "ISO (f::'a => 'c) (f'::'c => 'a) & ISO (g::'b => 'd) (g'::'d => 'b) -->
|
|
2391 |
ISO (%(h::'a => 'b) a'::'c. g (h (f' a')))
|
|
2392 |
(%(h::'c => 'd) a::'a. g' (h (f a)))"
|
|
2393 |
by (import ind_type ISO_FUN)
|
|
2394 |
|
|
2395 |
lemma ISO_USAGE: "ISO f g -->
|
|
2396 |
(ALL P. All P = (ALL x. P (g x))) &
|
|
2397 |
(ALL P. Ex P = (EX x. P (g x))) & (ALL a b. (a = g b) = (f a = b))"
|
|
2398 |
by (import ind_type ISO_USAGE)
|
|
2399 |
|
|
2400 |
;end_setup
|
|
2401 |
|
|
2402 |
;setup_theory divides
|
|
2403 |
|
|
2404 |
lemma ONE_DIVIDES_ALL: "All (op dvd (1::nat))"
|
|
2405 |
by (import divides ONE_DIVIDES_ALL)
|
|
2406 |
|
|
2407 |
lemma DIVIDES_ADD_2: "ALL (a::nat) (b::nat) c::nat. a dvd b & a dvd b + c --> a dvd c"
|
|
2408 |
by (import divides DIVIDES_ADD_2)
|
|
2409 |
|
|
2410 |
lemma NOT_LT_DIV: "ALL (a::nat) b::nat. (0::nat) < b & b < a --> ~ a dvd b"
|
|
2411 |
by (import divides NOT_LT_DIV)
|
|
2412 |
|
|
2413 |
lemma DIVIDES_FACT: "ALL b. 0 < b --> b dvd FACT b"
|
|
2414 |
by (import divides DIVIDES_FACT)
|
|
2415 |
|
|
2416 |
lemma DIVIDES_MULT_LEFT: "ALL (x::nat) xa::nat. (x * xa dvd xa) = (xa = (0::nat) | x = (1::nat))"
|
|
2417 |
by (import divides DIVIDES_MULT_LEFT)
|
|
2418 |
|
|
2419 |
;end_setup
|
|
2420 |
|
|
2421 |
;setup_theory prime
|
|
2422 |
|
|
2423 |
consts
|
|
2424 |
prime :: "nat => bool"
|
|
2425 |
|
|
2426 |
defs
|
|
2427 |
prime_primdef: "prime.prime == %a. a ~= 1 & (ALL b. b dvd a --> b = a | b = 1)"
|
|
2428 |
|
|
2429 |
lemma prime_def: "ALL a. prime.prime a = (a ~= 1 & (ALL b. b dvd a --> b = a | b = 1))"
|
|
2430 |
by (import prime prime_def)
|
|
2431 |
|
|
2432 |
lemma NOT_PRIME_0: "~ prime.prime 0"
|
|
2433 |
by (import prime NOT_PRIME_0)
|
|
2434 |
|
|
2435 |
lemma NOT_PRIME_1: "~ prime.prime 1"
|
|
2436 |
by (import prime NOT_PRIME_1)
|
|
2437 |
|
|
2438 |
;end_setup
|
|
2439 |
|
|
2440 |
;setup_theory list
|
|
2441 |
|
|
2442 |
consts
|
|
2443 |
EL :: "nat => 'a list => 'a"
|
|
2444 |
|
|
2445 |
specification (EL) EL: "(ALL l::'a list. EL (0::nat) l = hd l) &
|
|
2446 |
(ALL (l::'a list) n::nat. EL (Suc n) l = EL n (tl l))"
|
|
2447 |
by (import list EL)
|
|
2448 |
|
|
2449 |
lemma NULL: "(op &::bool => bool => bool) ((null::'a list => bool) ([]::'a list))
|
|
2450 |
((All::('a => bool) => bool)
|
|
2451 |
(%x::'a.
|
|
2452 |
(All::('a list => bool) => bool)
|
|
2453 |
(%xa::'a list.
|
|
2454 |
(Not::bool => bool)
|
|
2455 |
((null::'a list => bool)
|
|
2456 |
((op #::'a => 'a list => 'a list) x xa)))))"
|
|
2457 |
by (import list NULL)
|
|
2458 |
|
|
2459 |
lemma list_case_compute: "ALL l. list_case b f l = (if null l then b else f (hd l) (tl l))"
|
|
2460 |
by (import list list_case_compute)
|
|
2461 |
|
|
2462 |
lemma LIST_NOT_EQ: "ALL l1 l2. l1 ~= l2 --> (ALL x xa. x # l1 ~= xa # l2)"
|
|
2463 |
by (import list LIST_NOT_EQ)
|
|
2464 |
|
|
2465 |
lemma NOT_EQ_LIST: "ALL h1 h2. h1 ~= h2 --> (ALL x xa. h1 # x ~= h2 # xa)"
|
|
2466 |
by (import list NOT_EQ_LIST)
|
|
2467 |
|
|
2468 |
lemma EQ_LIST: "ALL h1 h2. h1 = h2 --> (ALL l1 l2. l1 = l2 --> h1 # l1 = h2 # l2)"
|
|
2469 |
by (import list EQ_LIST)
|
|
2470 |
|
|
2471 |
lemma CONS: "ALL l. ~ null l --> hd l # tl l = l"
|
|
2472 |
by (import list CONS)
|
|
2473 |
|
|
2474 |
lemma MAP_EQ_NIL: "ALL l f. (map f l = []) = (l = []) & ([] = map f l) = (l = [])"
|
|
2475 |
by (import list MAP_EQ_NIL)
|
|
2476 |
|
|
2477 |
lemma EVERY_EL: "ALL l P. list_all P l = (ALL n<length l. P (EL n l))"
|
|
2478 |
by (import list EVERY_EL)
|
|
2479 |
|
|
2480 |
lemma EVERY_CONJ: "ALL l. list_all (%x. P x & Q x) l = (list_all P l & list_all Q l)"
|
|
2481 |
by (import list EVERY_CONJ)
|
|
2482 |
|
|
2483 |
lemma EVERY_MEM: "ALL P l. list_all P l = (ALL e. e mem l --> P e)"
|
|
2484 |
by (import list EVERY_MEM)
|
|
2485 |
|
|
2486 |
lemma EXISTS_MEM: "ALL P l. list_exists P l = (EX e. e mem l & P e)"
|
|
2487 |
by (import list EXISTS_MEM)
|
|
2488 |
|
|
2489 |
lemma MEM_APPEND: "ALL e l1 l2. e mem l1 @ l2 = (e mem l1 | e mem l2)"
|
|
2490 |
by (import list MEM_APPEND)
|
|
2491 |
|
|
2492 |
lemma EXISTS_APPEND: "ALL P l1 l2. list_exists P (l1 @ l2) = (list_exists P l1 | list_exists P l2)"
|
|
2493 |
by (import list EXISTS_APPEND)
|
|
2494 |
|
|
2495 |
lemma NOT_EVERY: "ALL P l. (~ list_all P l) = list_exists (Not o P) l"
|
|
2496 |
by (import list NOT_EVERY)
|
|
2497 |
|
|
2498 |
lemma NOT_EXISTS: "ALL P l. (~ list_exists P l) = list_all (Not o P) l"
|
|
2499 |
by (import list NOT_EXISTS)
|
|
2500 |
|
|
2501 |
lemma MEM_MAP: "ALL l f x. x mem map f l = (EX y. x = f y & y mem l)"
|
|
2502 |
by (import list MEM_MAP)
|
|
2503 |
|
|
2504 |
lemma LENGTH_CONS: "ALL l n. (length l = Suc n) = (EX h l'. length l' = n & l = h # l')"
|
|
2505 |
by (import list LENGTH_CONS)
|
|
2506 |
|
|
2507 |
lemma LENGTH_EQ_CONS: "ALL P n.
|
|
2508 |
(ALL l. length l = Suc n --> P l) =
|
|
2509 |
(ALL l. length l = n --> (ALL x. P (x # l)))"
|
|
2510 |
by (import list LENGTH_EQ_CONS)
|
|
2511 |
|
|
2512 |
lemma LENGTH_EQ_NIL: "ALL P. (ALL l. length l = 0 --> P l) = P []"
|
|
2513 |
by (import list LENGTH_EQ_NIL)
|
|
2514 |
|
|
2515 |
lemma CONS_ACYCLIC: "ALL l x. l ~= x # l & x # l ~= l"
|
|
2516 |
by (import list CONS_ACYCLIC)
|
|
2517 |
|
|
2518 |
lemma APPEND_eq_NIL: "(ALL (l1::'a list) l2::'a list. ([] = l1 @ l2) = (l1 = [] & l2 = [])) &
|
|
2519 |
(ALL (l1::'a list) l2::'a list. (l1 @ l2 = []) = (l1 = [] & l2 = []))"
|
|
2520 |
by (import list APPEND_eq_NIL)
|
|
2521 |
|
|
2522 |
lemma APPEND_11: "(ALL (l1::'a list) (l2::'a list) l3::'a list.
|
|
2523 |
(l1 @ l2 = l1 @ l3) = (l2 = l3)) &
|
|
2524 |
(ALL (l1::'a list) (l2::'a list) l3::'a list.
|
|
2525 |
(l2 @ l1 = l3 @ l1) = (l2 = l3))"
|
|
2526 |
by (import list APPEND_11)
|
|
2527 |
|
|
2528 |
lemma EL_compute: "ALL n. EL n l = (if n = 0 then hd l else EL (PRE n) (tl l))"
|
|
2529 |
by (import list EL_compute)
|
|
2530 |
|
|
2531 |
lemma WF_LIST_PRED: "WF (%L1 L2. EX h. L2 = h # L1)"
|
|
2532 |
by (import list WF_LIST_PRED)
|
|
2533 |
|
|
2534 |
lemma list_size_cong: "ALL M N f f'.
|
|
2535 |
M = N & (ALL x. x mem N --> f x = f' x) -->
|
|
2536 |
list_size f M = list_size f' N"
|
|
2537 |
by (import list list_size_cong)
|
|
2538 |
|
|
2539 |
lemma FOLDR_CONG: "ALL l l' b b' f f'.
|
|
2540 |
l = l' & b = b' & (ALL x a. x mem l' --> f x a = f' x a) -->
|
|
2541 |
foldr f l b = foldr f' l' b'"
|
|
2542 |
by (import list FOLDR_CONG)
|
|
2543 |
|
|
2544 |
lemma FOLDL_CONG: "ALL l l' b b' f f'.
|
|
2545 |
l = l' & b = b' & (ALL x a. x mem l' --> f a x = f' a x) -->
|
|
2546 |
foldl f b l = foldl f' b' l'"
|
|
2547 |
by (import list FOLDL_CONG)
|
|
2548 |
|
|
2549 |
lemma MAP_CONG: "ALL l1 l2 f f'.
|
|
2550 |
l1 = l2 & (ALL x. x mem l2 --> f x = f' x) --> map f l1 = map f' l2"
|
|
2551 |
by (import list MAP_CONG)
|
|
2552 |
|
|
2553 |
lemma EXISTS_CONG: "ALL l1 l2 P P'.
|
|
2554 |
l1 = l2 & (ALL x. x mem l2 --> P x = P' x) -->
|
|
2555 |
list_exists P l1 = list_exists P' l2"
|
|
2556 |
by (import list EXISTS_CONG)
|
|
2557 |
|
|
2558 |
lemma EVERY_CONG: "ALL l1 l2 P P'.
|
|
2559 |
l1 = l2 & (ALL x. x mem l2 --> P x = P' x) -->
|
|
2560 |
list_all P l1 = list_all P' l2"
|
|
2561 |
by (import list EVERY_CONG)
|
|
2562 |
|
|
2563 |
lemma EVERY_MONOTONIC: "ALL P Q. (ALL x. P x --> Q x) --> (ALL l. list_all P l --> list_all Q l)"
|
|
2564 |
by (import list EVERY_MONOTONIC)
|
|
2565 |
|
|
2566 |
lemma LENGTH_ZIP: "ALL l1 l2.
|
|
2567 |
length l1 = length l2 -->
|
|
2568 |
length (zip l1 l2) = length l1 & length (zip l1 l2) = length l2"
|
|
2569 |
by (import list LENGTH_ZIP)
|
|
2570 |
|
|
2571 |
lemma LENGTH_UNZIP: "ALL pl.
|
|
2572 |
length (fst (unzip pl)) = length pl & length (snd (unzip pl)) = length pl"
|
|
2573 |
by (import list LENGTH_UNZIP)
|
|
2574 |
|
|
2575 |
lemma ZIP_UNZIP: "ALL l. ZIP (unzip l) = l"
|
|
2576 |
by (import list ZIP_UNZIP)
|
|
2577 |
|
|
2578 |
lemma UNZIP_ZIP: "ALL l1 l2. length l1 = length l2 --> unzip (zip l1 l2) = (l1, l2)"
|
|
2579 |
by (import list UNZIP_ZIP)
|
|
2580 |
|
|
2581 |
lemma ZIP_MAP: "ALL l1 l2 f1 f2.
|
|
2582 |
length l1 = length l2 -->
|
|
2583 |
zip (map f1 l1) l2 = map (%p. (f1 (fst p), snd p)) (zip l1 l2) &
|
|
2584 |
zip l1 (map f2 l2) = map (%p. (fst p, f2 (snd p))) (zip l1 l2)"
|
|
2585 |
by (import list ZIP_MAP)
|
|
2586 |
|
|
2587 |
lemma MEM_ZIP: "ALL l1 l2 p.
|
|
2588 |
length l1 = length l2 -->
|
|
2589 |
p mem zip l1 l2 = (EX n<length l1. p = (EL n l1, EL n l2))"
|
|
2590 |
by (import list MEM_ZIP)
|
|
2591 |
|
|
2592 |
lemma EL_ZIP: "ALL l1 l2 n.
|
|
2593 |
length l1 = length l2 & n < length l1 -->
|
|
2594 |
EL n (zip l1 l2) = (EL n l1, EL n l2)"
|
|
2595 |
by (import list EL_ZIP)
|
|
2596 |
|
|
2597 |
lemma MAP2_ZIP: "ALL l1 l2.
|
|
2598 |
length l1 = length l2 -->
|
|
2599 |
(ALL f. map2 f l1 l2 = map (split f) (zip l1 l2))"
|
|
2600 |
by (import list MAP2_ZIP)
|
|
2601 |
|
|
2602 |
lemma MEM_EL: "ALL l x. x mem l = (EX n<length l. x = EL n l)"
|
|
2603 |
by (import list MEM_EL)
|
|
2604 |
|
|
2605 |
lemma LAST_CONS: "(ALL x::'a. last [x] = x) &
|
|
2606 |
(ALL (x::'a) (xa::'a) xb::'a list. last (x # xa # xb) = last (xa # xb))"
|
|
2607 |
by (import list LAST_CONS)
|
|
2608 |
|
|
2609 |
lemma FRONT_CONS: "(ALL x::'a. butlast [x] = []) &
|
|
2610 |
(ALL (x::'a) (xa::'a) xb::'a list.
|
|
2611 |
butlast (x # xa # xb) = x # butlast (xa # xb))"
|
|
2612 |
by (import list FRONT_CONS)
|
|
2613 |
|
|
2614 |
;end_setup
|
|
2615 |
|
|
2616 |
;setup_theory pred_set
|
|
2617 |
|
|
2618 |
lemma EXTENSION: "ALL s t. (s = t) = (ALL x. IN x s = IN x t)"
|
|
2619 |
by (import pred_set EXTENSION)
|
|
2620 |
|
|
2621 |
lemma NOT_EQUAL_SETS: "ALL x xa. (x ~= xa) = (EX xb. IN xb xa = (~ IN xb x))"
|
|
2622 |
by (import pred_set NOT_EQUAL_SETS)
|
|
2623 |
|
|
2624 |
lemma NUM_SET_WOP: "ALL s::nat => bool.
|
|
2625 |
(EX n::nat. IN n s) =
|
|
2626 |
(EX n::nat. IN n s & (ALL m::nat. IN m s --> n <= m))"
|
|
2627 |
by (import pred_set NUM_SET_WOP)
|
|
2628 |
|
|
2629 |
consts
|
|
2630 |
GSPEC :: "('b => 'a * bool) => 'a => bool"
|
|
2631 |
|
|
2632 |
specification (GSPEC) GSPECIFICATION: "ALL (f::'b => 'a * bool) v::'a. IN v (GSPEC f) = (EX x::'b. (v, True) = f x)"
|
|
2633 |
by (import pred_set GSPECIFICATION)
|
|
2634 |
|
|
2635 |
lemma SET_MINIMUM: "ALL (s::'a => bool) M::'a => nat.
|
|
2636 |
(EX x::'a. IN x s) =
|
|
2637 |
(EX x::'a. IN x s & (ALL y::'a. IN y s --> M x <= M y))"
|
|
2638 |
by (import pred_set SET_MINIMUM)
|
|
2639 |
|
|
2640 |
constdefs
|
|
2641 |
EMPTY :: "'a => bool"
|
|
2642 |
"EMPTY == %x. False"
|
|
2643 |
|
|
2644 |
lemma EMPTY_DEF: "EMPTY = (%x. False)"
|
|
2645 |
by (import pred_set EMPTY_DEF)
|
|
2646 |
|
|
2647 |
lemma NOT_IN_EMPTY: "ALL x. ~ IN x EMPTY"
|
|
2648 |
by (import pred_set NOT_IN_EMPTY)
|
|
2649 |
|
|
2650 |
lemma MEMBER_NOT_EMPTY: "ALL x. (EX xa. IN xa x) = (x ~= EMPTY)"
|
|
2651 |
by (import pred_set MEMBER_NOT_EMPTY)
|
|
2652 |
|
14684
|
2653 |
consts
|
14516
|
2654 |
UNIV :: "'a => bool"
|
14684
|
2655 |
|
|
2656 |
defs
|
|
2657 |
UNIV_def: "pred_set.UNIV == %x. True"
|
14516
|
2658 |
|
|
2659 |
lemma UNIV_DEF: "pred_set.UNIV = (%x. True)"
|
|
2660 |
by (import pred_set UNIV_DEF)
|
|
2661 |
|
|
2662 |
lemma IN_UNIV: "ALL x. IN x pred_set.UNIV"
|
|
2663 |
by (import pred_set IN_UNIV)
|
|
2664 |
|
|
2665 |
lemma UNIV_NOT_EMPTY: "pred_set.UNIV ~= EMPTY"
|
|
2666 |
by (import pred_set UNIV_NOT_EMPTY)
|
|
2667 |
|
|
2668 |
lemma EMPTY_NOT_UNIV: "EMPTY ~= pred_set.UNIV"
|
|
2669 |
by (import pred_set EMPTY_NOT_UNIV)
|
|
2670 |
|
|
2671 |
lemma EQ_UNIV: "(ALL x. IN x s) = (s = pred_set.UNIV)"
|
|
2672 |
by (import pred_set EQ_UNIV)
|
|
2673 |
|
|
2674 |
constdefs
|
|
2675 |
SUBSET :: "('a => bool) => ('a => bool) => bool"
|
|
2676 |
"SUBSET == %s t. ALL x. IN x s --> IN x t"
|
|
2677 |
|
|
2678 |
lemma SUBSET_DEF: "ALL s t. SUBSET s t = (ALL x. IN x s --> IN x t)"
|
|
2679 |
by (import pred_set SUBSET_DEF)
|
|
2680 |
|
|
2681 |
lemma SUBSET_TRANS: "ALL x xa xb. SUBSET x xa & SUBSET xa xb --> SUBSET x xb"
|
|
2682 |
by (import pred_set SUBSET_TRANS)
|
|
2683 |
|
|
2684 |
lemma SUBSET_REFL: "ALL x. SUBSET x x"
|
|
2685 |
by (import pred_set SUBSET_REFL)
|
|
2686 |
|
|
2687 |
lemma SUBSET_ANTISYM: "ALL x xa. SUBSET x xa & SUBSET xa x --> x = xa"
|
|
2688 |
by (import pred_set SUBSET_ANTISYM)
|
|
2689 |
|
|
2690 |
lemma EMPTY_SUBSET: "All (SUBSET EMPTY)"
|
|
2691 |
by (import pred_set EMPTY_SUBSET)
|
|
2692 |
|
|
2693 |
lemma SUBSET_EMPTY: "ALL x. SUBSET x EMPTY = (x = EMPTY)"
|
|
2694 |
by (import pred_set SUBSET_EMPTY)
|
|
2695 |
|
|
2696 |
lemma SUBSET_UNIV: "ALL x. SUBSET x pred_set.UNIV"
|
|
2697 |
by (import pred_set SUBSET_UNIV)
|
|
2698 |
|
|
2699 |
lemma UNIV_SUBSET: "ALL x. SUBSET pred_set.UNIV x = (x = pred_set.UNIV)"
|
|
2700 |
by (import pred_set UNIV_SUBSET)
|
|
2701 |
|
|
2702 |
constdefs
|
|
2703 |
PSUBSET :: "('a => bool) => ('a => bool) => bool"
|
|
2704 |
"PSUBSET == %s t. SUBSET s t & s ~= t"
|
|
2705 |
|
|
2706 |
lemma PSUBSET_DEF: "ALL s t. PSUBSET s t = (SUBSET s t & s ~= t)"
|
|
2707 |
by (import pred_set PSUBSET_DEF)
|
|
2708 |
|
|
2709 |
lemma PSUBSET_TRANS: "ALL x xa xb. PSUBSET x xa & PSUBSET xa xb --> PSUBSET x xb"
|
|
2710 |
by (import pred_set PSUBSET_TRANS)
|
|
2711 |
|
|
2712 |
lemma PSUBSET_IRREFL: "ALL x. ~ PSUBSET x x"
|
|
2713 |
by (import pred_set PSUBSET_IRREFL)
|
|
2714 |
|
|
2715 |
lemma NOT_PSUBSET_EMPTY: "ALL x. ~ PSUBSET x EMPTY"
|
|
2716 |
by (import pred_set NOT_PSUBSET_EMPTY)
|
|
2717 |
|
|
2718 |
lemma NOT_UNIV_PSUBSET: "ALL x. ~ PSUBSET pred_set.UNIV x"
|
|
2719 |
by (import pred_set NOT_UNIV_PSUBSET)
|
|
2720 |
|
|
2721 |
lemma PSUBSET_UNIV: "ALL x. PSUBSET x pred_set.UNIV = (EX xa. ~ IN xa x)"
|
|
2722 |
by (import pred_set PSUBSET_UNIV)
|
|
2723 |
|
14684
|
2724 |
consts
|
14516
|
2725 |
UNION :: "('a => bool) => ('a => bool) => 'a => bool"
|
14684
|
2726 |
|
|
2727 |
defs
|
|
2728 |
UNION_def: "pred_set.UNION == %s t. GSPEC (%x. (x, IN x s | IN x t))"
|
14516
|
2729 |
|
|
2730 |
lemma UNION_DEF: "ALL s t. pred_set.UNION s t = GSPEC (%x. (x, IN x s | IN x t))"
|
|
2731 |
by (import pred_set UNION_DEF)
|
|
2732 |
|
|
2733 |
lemma IN_UNION: "ALL x xa xb. IN xb (pred_set.UNION x xa) = (IN xb x | IN xb xa)"
|
|
2734 |
by (import pred_set IN_UNION)
|
|
2735 |
|
|
2736 |
lemma UNION_ASSOC: "ALL x xa xb.
|
|
2737 |
pred_set.UNION x (pred_set.UNION xa xb) =
|
|
2738 |
pred_set.UNION (pred_set.UNION x xa) xb"
|
|
2739 |
by (import pred_set UNION_ASSOC)
|
|
2740 |
|
|
2741 |
lemma UNION_IDEMPOT: "ALL x. pred_set.UNION x x = x"
|
|
2742 |
by (import pred_set UNION_IDEMPOT)
|
|
2743 |
|
|
2744 |
lemma UNION_COMM: "ALL x xa. pred_set.UNION x xa = pred_set.UNION xa x"
|
|
2745 |
by (import pred_set UNION_COMM)
|
|
2746 |
|
|
2747 |
lemma SUBSET_UNION: "(ALL (x::'a => bool) xa::'a => bool. SUBSET x (pred_set.UNION x xa)) &
|
|
2748 |
(ALL (x::'a => bool) xa::'a => bool. SUBSET x (pred_set.UNION xa x))"
|
|
2749 |
by (import pred_set SUBSET_UNION)
|
|
2750 |
|
|
2751 |
lemma UNION_SUBSET: "ALL s t u. SUBSET (pred_set.UNION s t) u = (SUBSET s u & SUBSET t u)"
|
|
2752 |
by (import pred_set UNION_SUBSET)
|
|
2753 |
|
|
2754 |
lemma SUBSET_UNION_ABSORPTION: "ALL x xa. SUBSET x xa = (pred_set.UNION x xa = xa)"
|
|
2755 |
by (import pred_set SUBSET_UNION_ABSORPTION)
|
|
2756 |
|
|
2757 |
lemma UNION_EMPTY: "(ALL x::'a => bool. pred_set.UNION EMPTY x = x) &
|
|
2758 |
(ALL x::'a => bool. pred_set.UNION x EMPTY = x)"
|
|
2759 |
by (import pred_set UNION_EMPTY)
|
|
2760 |
|
|
2761 |
lemma UNION_UNIV: "(ALL x::'a => bool. pred_set.UNION pred_set.UNIV x = pred_set.UNIV) &
|
|
2762 |
(ALL x::'a => bool. pred_set.UNION x pred_set.UNIV = pred_set.UNIV)"
|
|
2763 |
by (import pred_set UNION_UNIV)
|
|
2764 |
|
|
2765 |
lemma EMPTY_UNION: "ALL x xa. (pred_set.UNION x xa = EMPTY) = (x = EMPTY & xa = EMPTY)"
|
|
2766 |
by (import pred_set EMPTY_UNION)
|
|
2767 |
|
14684
|
2768 |
consts
|
14516
|
2769 |
INTER :: "('a => bool) => ('a => bool) => 'a => bool"
|
14684
|
2770 |
|
|
2771 |
defs
|
|
2772 |
INTER_def: "pred_set.INTER == %s t. GSPEC (%x. (x, IN x s & IN x t))"
|
14516
|
2773 |
|
|
2774 |
lemma INTER_DEF: "ALL s t. pred_set.INTER s t = GSPEC (%x. (x, IN x s & IN x t))"
|
|
2775 |
by (import pred_set INTER_DEF)
|
|
2776 |
|
|
2777 |
lemma IN_INTER: "ALL x xa xb. IN xb (pred_set.INTER x xa) = (IN xb x & IN xb xa)"
|
|
2778 |
by (import pred_set IN_INTER)
|
|
2779 |
|
|
2780 |
lemma INTER_ASSOC: "ALL x xa xb.
|
|
2781 |
pred_set.INTER x (pred_set.INTER xa xb) =
|
|
2782 |
pred_set.INTER (pred_set.INTER x xa) xb"
|
|
2783 |
by (import pred_set INTER_ASSOC)
|
|
2784 |
|
|
2785 |
lemma INTER_IDEMPOT: "ALL x. pred_set.INTER x x = x"
|
|
2786 |
by (import pred_set INTER_IDEMPOT)
|
|
2787 |
|
|
2788 |
lemma INTER_COMM: "ALL x xa. pred_set.INTER x xa = pred_set.INTER xa x"
|
|
2789 |
by (import pred_set INTER_COMM)
|
|
2790 |
|
|
2791 |
lemma INTER_SUBSET: "(ALL (x::'a => bool) xa::'a => bool. SUBSET (pred_set.INTER x xa) x) &
|
|
2792 |
(ALL (x::'a => bool) xa::'a => bool. SUBSET (pred_set.INTER xa x) x)"
|
|
2793 |
by (import pred_set INTER_SUBSET)
|
|
2794 |
|
|
2795 |
lemma SUBSET_INTER: "ALL s t u. SUBSET s (pred_set.INTER t u) = (SUBSET s t & SUBSET s u)"
|
|
2796 |
by (import pred_set SUBSET_INTER)
|
|
2797 |
|
|
2798 |
lemma SUBSET_INTER_ABSORPTION: "ALL x xa. SUBSET x xa = (pred_set.INTER x xa = x)"
|
|
2799 |
by (import pred_set SUBSET_INTER_ABSORPTION)
|
|
2800 |
|
|
2801 |
lemma INTER_EMPTY: "(ALL x::'a => bool. pred_set.INTER EMPTY x = EMPTY) &
|
|
2802 |
(ALL x::'a => bool. pred_set.INTER x EMPTY = EMPTY)"
|
|
2803 |
by (import pred_set INTER_EMPTY)
|
|
2804 |
|
|
2805 |
lemma INTER_UNIV: "(ALL x::'a => bool. pred_set.INTER pred_set.UNIV x = x) &
|
|
2806 |
(ALL x::'a => bool. pred_set.INTER x pred_set.UNIV = x)"
|
|
2807 |
by (import pred_set INTER_UNIV)
|
|
2808 |
|
|
2809 |
lemma UNION_OVER_INTER: "ALL x xa xb.
|
|
2810 |
pred_set.INTER x (pred_set.UNION xa xb) =
|
|
2811 |
pred_set.UNION (pred_set.INTER x xa) (pred_set.INTER x xb)"
|
|
2812 |
by (import pred_set UNION_OVER_INTER)
|
|
2813 |
|
|
2814 |
lemma INTER_OVER_UNION: "ALL x xa xb.
|
|
2815 |
pred_set.UNION x (pred_set.INTER xa xb) =
|
|
2816 |
pred_set.INTER (pred_set.UNION x xa) (pred_set.UNION x xb)"
|
|
2817 |
by (import pred_set INTER_OVER_UNION)
|
|
2818 |
|
|
2819 |
constdefs
|
|
2820 |
DISJOINT :: "('a => bool) => ('a => bool) => bool"
|
|
2821 |
"DISJOINT == %s t. pred_set.INTER s t = EMPTY"
|
|
2822 |
|
|
2823 |
lemma DISJOINT_DEF: "ALL s t. DISJOINT s t = (pred_set.INTER s t = EMPTY)"
|
|
2824 |
by (import pred_set DISJOINT_DEF)
|
|
2825 |
|
|
2826 |
lemma IN_DISJOINT: "ALL x xa. DISJOINT x xa = (~ (EX xb. IN xb x & IN xb xa))"
|
|
2827 |
by (import pred_set IN_DISJOINT)
|
|
2828 |
|
|
2829 |
lemma DISJOINT_SYM: "ALL x xa. DISJOINT x xa = DISJOINT xa x"
|
|
2830 |
by (import pred_set DISJOINT_SYM)
|
|
2831 |
|
|
2832 |
lemma DISJOINT_EMPTY: "ALL x. DISJOINT EMPTY x & DISJOINT x EMPTY"
|
|
2833 |
by (import pred_set DISJOINT_EMPTY)
|
|
2834 |
|
|
2835 |
lemma DISJOINT_EMPTY_REFL: "ALL x. (x = EMPTY) = DISJOINT x x"
|
|
2836 |
by (import pred_set DISJOINT_EMPTY_REFL)
|
|
2837 |
|
|
2838 |
lemma DISJOINT_UNION: "ALL x xa xb.
|
|
2839 |
DISJOINT (pred_set.UNION x xa) xb = (DISJOINT x xb & DISJOINT xa xb)"
|
|
2840 |
by (import pred_set DISJOINT_UNION)
|
|
2841 |
|
|
2842 |
lemma DISJOINT_UNION_BOTH: "ALL s t u.
|
|
2843 |
DISJOINT (pred_set.UNION s t) u = (DISJOINT s u & DISJOINT t u) &
|
|
2844 |
DISJOINT u (pred_set.UNION s t) = (DISJOINT s u & DISJOINT t u)"
|
|
2845 |
by (import pred_set DISJOINT_UNION_BOTH)
|
|
2846 |
|
|
2847 |
constdefs
|
|
2848 |
DIFF :: "('a => bool) => ('a => bool) => 'a => bool"
|
|
2849 |
"DIFF == %s t. GSPEC (%x. (x, IN x s & ~ IN x t))"
|
|
2850 |
|
|
2851 |
lemma DIFF_DEF: "ALL s t. DIFF s t = GSPEC (%x. (x, IN x s & ~ IN x t))"
|
|
2852 |
by (import pred_set DIFF_DEF)
|
|
2853 |
|
|
2854 |
lemma IN_DIFF: "ALL s t x. IN x (DIFF s t) = (IN x s & ~ IN x t)"
|
|
2855 |
by (import pred_set IN_DIFF)
|
|
2856 |
|
|
2857 |
lemma DIFF_EMPTY: "ALL s. DIFF s EMPTY = s"
|
|
2858 |
by (import pred_set DIFF_EMPTY)
|
|
2859 |
|
|
2860 |
lemma EMPTY_DIFF: "ALL s. DIFF EMPTY s = EMPTY"
|
|
2861 |
by (import pred_set EMPTY_DIFF)
|
|
2862 |
|
|
2863 |
lemma DIFF_UNIV: "ALL s. DIFF s pred_set.UNIV = EMPTY"
|
|
2864 |
by (import pred_set DIFF_UNIV)
|
|
2865 |
|
|
2866 |
lemma DIFF_DIFF: "ALL x xa. DIFF (DIFF x xa) xa = DIFF x xa"
|
|
2867 |
by (import pred_set DIFF_DIFF)
|
|
2868 |
|
|
2869 |
lemma DIFF_EQ_EMPTY: "ALL x. DIFF x x = EMPTY"
|
|
2870 |
by (import pred_set DIFF_EQ_EMPTY)
|
|
2871 |
|
|
2872 |
constdefs
|
|
2873 |
INSERT :: "'a => ('a => bool) => 'a => bool"
|
|
2874 |
"INSERT == %x s. GSPEC (%y. (y, y = x | IN y s))"
|
|
2875 |
|
|
2876 |
lemma INSERT_DEF: "ALL x s. INSERT x s = GSPEC (%y. (y, y = x | IN y s))"
|
|
2877 |
by (import pred_set INSERT_DEF)
|
|
2878 |
|
|
2879 |
lemma IN_INSERT: "ALL x xa xb. IN x (INSERT xa xb) = (x = xa | IN x xb)"
|
|
2880 |
by (import pred_set IN_INSERT)
|
|
2881 |
|
|
2882 |
lemma COMPONENT: "ALL x xa. IN x (INSERT x xa)"
|
|
2883 |
by (import pred_set COMPONENT)
|
|
2884 |
|
|
2885 |
lemma SET_CASES: "ALL x. x = EMPTY | (EX xa xb. x = INSERT xa xb & ~ IN xa xb)"
|
|
2886 |
by (import pred_set SET_CASES)
|
|
2887 |
|
|
2888 |
lemma DECOMPOSITION: "ALL s x. IN x s = (EX t. s = INSERT x t & ~ IN x t)"
|
|
2889 |
by (import pred_set DECOMPOSITION)
|
|
2890 |
|
|
2891 |
lemma ABSORPTION: "ALL x xa. IN x xa = (INSERT x xa = xa)"
|
|
2892 |
by (import pred_set ABSORPTION)
|
|
2893 |
|
|
2894 |
lemma INSERT_INSERT: "ALL x xa. INSERT x (INSERT x xa) = INSERT x xa"
|
|
2895 |
by (import pred_set INSERT_INSERT)
|
|
2896 |
|
|
2897 |
lemma INSERT_COMM: "ALL x xa xb. INSERT x (INSERT xa xb) = INSERT xa (INSERT x xb)"
|
|
2898 |
by (import pred_set INSERT_COMM)
|
|
2899 |
|
|
2900 |
lemma INSERT_UNIV: "ALL x. INSERT x pred_set.UNIV = pred_set.UNIV"
|
|
2901 |
by (import pred_set INSERT_UNIV)
|
|
2902 |
|
|
2903 |
lemma NOT_INSERT_EMPTY: "ALL x xa. INSERT x xa ~= EMPTY"
|
|
2904 |
by (import pred_set NOT_INSERT_EMPTY)
|
|
2905 |
|
|
2906 |
lemma NOT_EMPTY_INSERT: "ALL x xa. EMPTY ~= INSERT x xa"
|
|
2907 |
by (import pred_set NOT_EMPTY_INSERT)
|
|
2908 |
|
|
2909 |
lemma INSERT_UNION: "ALL x s t.
|
|
2910 |
pred_set.UNION (INSERT x s) t =
|
|
2911 |
(if IN x t then pred_set.UNION s t else INSERT x (pred_set.UNION s t))"
|
|
2912 |
by (import pred_set INSERT_UNION)
|
|
2913 |
|
|
2914 |
lemma INSERT_UNION_EQ: "ALL x s t. pred_set.UNION (INSERT x s) t = INSERT x (pred_set.UNION s t)"
|
|
2915 |
by (import pred_set INSERT_UNION_EQ)
|
|
2916 |
|
|
2917 |
lemma INSERT_INTER: "ALL x s t.
|
|
2918 |
pred_set.INTER (INSERT x s) t =
|
|
2919 |
(if IN x t then INSERT x (pred_set.INTER s t) else pred_set.INTER s t)"
|
|
2920 |
by (import pred_set INSERT_INTER)
|
|
2921 |
|
|
2922 |
lemma DISJOINT_INSERT: "ALL x xa xb. DISJOINT (INSERT x xa) xb = (DISJOINT xa xb & ~ IN x xb)"
|
|
2923 |
by (import pred_set DISJOINT_INSERT)
|
|
2924 |
|
|
2925 |
lemma INSERT_SUBSET: "ALL x xa xb. SUBSET (INSERT x xa) xb = (IN x xb & SUBSET xa xb)"
|
|
2926 |
by (import pred_set INSERT_SUBSET)
|
|
2927 |
|
|
2928 |
lemma SUBSET_INSERT: "ALL x xa. ~ IN x xa --> (ALL xb. SUBSET xa (INSERT x xb) = SUBSET xa xb)"
|
|
2929 |
by (import pred_set SUBSET_INSERT)
|
|
2930 |
|
|
2931 |
lemma INSERT_DIFF: "ALL s t x.
|
|
2932 |
DIFF (INSERT x s) t = (if IN x t then DIFF s t else INSERT x (DIFF s t))"
|
|
2933 |
by (import pred_set INSERT_DIFF)
|
|
2934 |
|
|
2935 |
constdefs
|
|
2936 |
DELETE :: "('a => bool) => 'a => 'a => bool"
|
|
2937 |
"DELETE == %s x. DIFF s (INSERT x EMPTY)"
|
|
2938 |
|
|
2939 |
lemma DELETE_DEF: "ALL s x. DELETE s x = DIFF s (INSERT x EMPTY)"
|
|
2940 |
by (import pred_set DELETE_DEF)
|
|
2941 |
|
|
2942 |
lemma IN_DELETE: "ALL x xa xb. IN xa (DELETE x xb) = (IN xa x & xa ~= xb)"
|
|
2943 |
by (import pred_set IN_DELETE)
|
|
2944 |
|
|
2945 |
lemma DELETE_NON_ELEMENT: "ALL x xa. (~ IN x xa) = (DELETE xa x = xa)"
|
|
2946 |
by (import pred_set DELETE_NON_ELEMENT)
|
|
2947 |
|
|
2948 |
lemma IN_DELETE_EQ: "ALL s x x'. (IN x s = IN x' s) = (IN x (DELETE s x') = IN x' (DELETE s x))"
|
|
2949 |
by (import pred_set IN_DELETE_EQ)
|
|
2950 |
|
|
2951 |
lemma EMPTY_DELETE: "ALL x. DELETE EMPTY x = EMPTY"
|
|
2952 |
by (import pred_set EMPTY_DELETE)
|
|
2953 |
|
|
2954 |
lemma DELETE_DELETE: "ALL x xa. DELETE (DELETE xa x) x = DELETE xa x"
|
|
2955 |
by (import pred_set DELETE_DELETE)
|
|
2956 |
|
|
2957 |
lemma DELETE_COMM: "ALL x xa xb. DELETE (DELETE xb x) xa = DELETE (DELETE xb xa) x"
|
|
2958 |
by (import pred_set DELETE_COMM)
|
|
2959 |
|
|
2960 |
lemma DELETE_SUBSET: "ALL x xa. SUBSET (DELETE xa x) xa"
|
|
2961 |
by (import pred_set DELETE_SUBSET)
|
|
2962 |
|
|
2963 |
lemma SUBSET_DELETE: "ALL x xa xb. SUBSET xa (DELETE xb x) = (~ IN x xa & SUBSET xa xb)"
|
|
2964 |
by (import pred_set SUBSET_DELETE)
|
|
2965 |
|
|
2966 |
lemma SUBSET_INSERT_DELETE: "ALL x s t. SUBSET s (INSERT x t) = SUBSET (DELETE s x) t"
|
|
2967 |
by (import pred_set SUBSET_INSERT_DELETE)
|
|
2968 |
|
|
2969 |
lemma DIFF_INSERT: "ALL x xa xb. DIFF x (INSERT xb xa) = DIFF (DELETE x xb) xa"
|
|
2970 |
by (import pred_set DIFF_INSERT)
|
|
2971 |
|
|
2972 |
lemma PSUBSET_INSERT_SUBSET: "ALL x xa. PSUBSET x xa = (EX xb. ~ IN xb x & SUBSET (INSERT xb x) xa)"
|
|
2973 |
by (import pred_set PSUBSET_INSERT_SUBSET)
|
|
2974 |
|
|
2975 |
lemma PSUBSET_MEMBER: "ALL s t. PSUBSET s t = (SUBSET s t & (EX y. IN y t & ~ IN y s))"
|
|
2976 |
by (import pred_set PSUBSET_MEMBER)
|
|
2977 |
|
|
2978 |
lemma DELETE_INSERT: "ALL x xa xb.
|
|
2979 |
DELETE (INSERT x xb) xa =
|
|
2980 |
(if x = xa then DELETE xb xa else INSERT x (DELETE xb xa))"
|
|
2981 |
by (import pred_set DELETE_INSERT)
|
|
2982 |
|
|
2983 |
lemma INSERT_DELETE: "ALL x xa. IN x xa --> INSERT x (DELETE xa x) = xa"
|
|
2984 |
by (import pred_set INSERT_DELETE)
|
|
2985 |
|
|
2986 |
lemma DELETE_INTER: "ALL x xa xb.
|
|
2987 |
pred_set.INTER (DELETE x xb) xa = DELETE (pred_set.INTER x xa) xb"
|
|
2988 |
by (import pred_set DELETE_INTER)
|
|
2989 |
|
|
2990 |
lemma DISJOINT_DELETE_SYM: "ALL x xa xb. DISJOINT (DELETE x xb) xa = DISJOINT (DELETE xa xb) x"
|
|
2991 |
by (import pred_set DISJOINT_DELETE_SYM)
|
|
2992 |
|
|
2993 |
consts
|
|
2994 |
CHOICE :: "('a => bool) => 'a"
|
|
2995 |
|
|
2996 |
specification (CHOICE) CHOICE_DEF: "ALL x. x ~= EMPTY --> IN (CHOICE x) x"
|
|
2997 |
by (import pred_set CHOICE_DEF)
|
|
2998 |
|
|
2999 |
constdefs
|
|
3000 |
REST :: "('a => bool) => 'a => bool"
|
|
3001 |
"REST == %s. DELETE s (CHOICE s)"
|
|
3002 |
|
|
3003 |
lemma REST_DEF: "ALL s. REST s = DELETE s (CHOICE s)"
|
|
3004 |
by (import pred_set REST_DEF)
|
|
3005 |
|
|
3006 |
lemma CHOICE_NOT_IN_REST: "ALL x. ~ IN (CHOICE x) (REST x)"
|
|
3007 |
by (import pred_set CHOICE_NOT_IN_REST)
|
|
3008 |
|
|
3009 |
lemma CHOICE_INSERT_REST: "ALL s. s ~= EMPTY --> INSERT (CHOICE s) (REST s) = s"
|
|
3010 |
by (import pred_set CHOICE_INSERT_REST)
|
|
3011 |
|
|
3012 |
lemma REST_SUBSET: "ALL x. SUBSET (REST x) x"
|
|
3013 |
by (import pred_set REST_SUBSET)
|
|
3014 |
|
|
3015 |
lemma REST_PSUBSET: "ALL x. x ~= EMPTY --> PSUBSET (REST x) x"
|
|
3016 |
by (import pred_set REST_PSUBSET)
|
|
3017 |
|
|
3018 |
constdefs
|
|
3019 |
SING :: "('a => bool) => bool"
|
|
3020 |
"SING == %s. EX x. s = INSERT x EMPTY"
|
|
3021 |
|
|
3022 |
lemma SING_DEF: "ALL s. SING s = (EX x. s = INSERT x EMPTY)"
|
|
3023 |
by (import pred_set SING_DEF)
|
|
3024 |
|
|
3025 |
lemma SING: "ALL x. SING (INSERT x EMPTY)"
|
|
3026 |
by (import pred_set SING)
|
|
3027 |
|
|
3028 |
lemma IN_SING: "ALL x xa. IN x (INSERT xa EMPTY) = (x = xa)"
|
|
3029 |
by (import pred_set IN_SING)
|
|
3030 |
|
|
3031 |
lemma NOT_SING_EMPTY: "ALL x. INSERT x EMPTY ~= EMPTY"
|
|
3032 |
by (import pred_set NOT_SING_EMPTY)
|
|
3033 |
|
|
3034 |
lemma NOT_EMPTY_SING: "ALL x. EMPTY ~= INSERT x EMPTY"
|
|
3035 |
by (import pred_set NOT_EMPTY_SING)
|
|
3036 |
|
|
3037 |
lemma EQUAL_SING: "ALL x xa. (INSERT x EMPTY = INSERT xa EMPTY) = (x = xa)"
|
|
3038 |
by (import pred_set EQUAL_SING)
|
|
3039 |
|
|
3040 |
lemma DISJOINT_SING_EMPTY: "ALL x. DISJOINT (INSERT x EMPTY) EMPTY"
|
|
3041 |
by (import pred_set DISJOINT_SING_EMPTY)
|
|
3042 |
|
|
3043 |
lemma INSERT_SING_UNION: "ALL x xa. INSERT xa x = pred_set.UNION (INSERT xa EMPTY) x"
|
|
3044 |
by (import pred_set INSERT_SING_UNION)
|
|
3045 |
|
|
3046 |
lemma SING_DELETE: "ALL x. DELETE (INSERT x EMPTY) x = EMPTY"
|
|
3047 |
by (import pred_set SING_DELETE)
|
|
3048 |
|
|
3049 |
lemma DELETE_EQ_SING: "ALL x xa. IN xa x --> (DELETE x xa = EMPTY) = (x = INSERT xa EMPTY)"
|
|
3050 |
by (import pred_set DELETE_EQ_SING)
|
|
3051 |
|
|
3052 |
lemma CHOICE_SING: "ALL x. CHOICE (INSERT x EMPTY) = x"
|
|
3053 |
by (import pred_set CHOICE_SING)
|
|
3054 |
|
|
3055 |
lemma REST_SING: "ALL x. REST (INSERT x EMPTY) = EMPTY"
|
|
3056 |
by (import pred_set REST_SING)
|
|
3057 |
|
|
3058 |
lemma SING_IFF_EMPTY_REST: "ALL x. SING x = (x ~= EMPTY & REST x = EMPTY)"
|
|
3059 |
by (import pred_set SING_IFF_EMPTY_REST)
|
|
3060 |
|
|
3061 |
constdefs
|
|
3062 |
IMAGE :: "('a => 'b) => ('a => bool) => 'b => bool"
|
|
3063 |
"IMAGE == %f s. GSPEC (%x. (f x, IN x s))"
|
|
3064 |
|
|
3065 |
lemma IMAGE_DEF: "ALL f s. IMAGE f s = GSPEC (%x. (f x, IN x s))"
|
|
3066 |
by (import pred_set IMAGE_DEF)
|
|
3067 |
|
|
3068 |
lemma IN_IMAGE: "ALL (x::'b) (xa::'a => bool) xb::'a => 'b.
|
|
3069 |
IN x (IMAGE xb xa) = (EX xc::'a. x = xb xc & IN xc xa)"
|
|
3070 |
by (import pred_set IN_IMAGE)
|
|
3071 |
|
|
3072 |
lemma IMAGE_IN: "ALL x xa. IN x xa --> (ALL xb. IN (xb x) (IMAGE xb xa))"
|
|
3073 |
by (import pred_set IMAGE_IN)
|
|
3074 |
|
|
3075 |
lemma IMAGE_EMPTY: "ALL x. IMAGE x EMPTY = EMPTY"
|
|
3076 |
by (import pred_set IMAGE_EMPTY)
|
|
3077 |
|
|
3078 |
lemma IMAGE_ID: "ALL x. IMAGE (%x. x) x = x"
|
|
3079 |
by (import pred_set IMAGE_ID)
|
|
3080 |
|
|
3081 |
lemma IMAGE_COMPOSE: "ALL (x::'b => 'c) (xa::'a => 'b) xb::'a => bool.
|
|
3082 |
IMAGE (x o xa) xb = IMAGE x (IMAGE xa xb)"
|
|
3083 |
by (import pred_set IMAGE_COMPOSE)
|
|
3084 |
|
|
3085 |
lemma IMAGE_INSERT: "ALL x xa xb. IMAGE x (INSERT xa xb) = INSERT (x xa) (IMAGE x xb)"
|
|
3086 |
by (import pred_set IMAGE_INSERT)
|
|
3087 |
|
|
3088 |
lemma IMAGE_EQ_EMPTY: "ALL s x. (IMAGE x s = EMPTY) = (s = EMPTY)"
|
|
3089 |
by (import pred_set IMAGE_EQ_EMPTY)
|
|
3090 |
|
|
3091 |
lemma IMAGE_DELETE: "ALL f x s. ~ IN x s --> IMAGE f (DELETE s x) = IMAGE f s"
|
|
3092 |
by (import pred_set IMAGE_DELETE)
|
|
3093 |
|
|
3094 |
lemma IMAGE_UNION: "ALL x xa xb.
|
|
3095 |
IMAGE x (pred_set.UNION xa xb) = pred_set.UNION (IMAGE x xa) (IMAGE x xb)"
|
|
3096 |
by (import pred_set IMAGE_UNION)
|
|
3097 |
|
|
3098 |
lemma IMAGE_SUBSET: "ALL x xa. SUBSET x xa --> (ALL xb. SUBSET (IMAGE xb x) (IMAGE xb xa))"
|
|
3099 |
by (import pred_set IMAGE_SUBSET)
|
|
3100 |
|
|
3101 |
lemma IMAGE_INTER: "ALL f s t.
|
|
3102 |
SUBSET (IMAGE f (pred_set.INTER s t))
|
|
3103 |
(pred_set.INTER (IMAGE f s) (IMAGE f t))"
|
|
3104 |
by (import pred_set IMAGE_INTER)
|
|
3105 |
|
|
3106 |
constdefs
|
|
3107 |
INJ :: "('a => 'b) => ('a => bool) => ('b => bool) => bool"
|
|
3108 |
"INJ ==
|
|
3109 |
%f s t.
|
|
3110 |
(ALL x. IN x s --> IN (f x) t) &
|
|
3111 |
(ALL x y. IN x s & IN y s --> f x = f y --> x = y)"
|
|
3112 |
|
|
3113 |
lemma INJ_DEF: "ALL f s t.
|
|
3114 |
INJ f s t =
|
|
3115 |
((ALL x. IN x s --> IN (f x) t) &
|
|
3116 |
(ALL x y. IN x s & IN y s --> f x = f y --> x = y))"
|
|
3117 |
by (import pred_set INJ_DEF)
|
|
3118 |
|
|
3119 |
lemma INJ_ID: "ALL x. INJ (%x. x) x x"
|
|
3120 |
by (import pred_set INJ_ID)
|
|
3121 |
|
|
3122 |
lemma INJ_COMPOSE: "ALL x xa xb xc xd. INJ x xb xc & INJ xa xc xd --> INJ (xa o x) xb xd"
|
|
3123 |
by (import pred_set INJ_COMPOSE)
|
|
3124 |
|
|
3125 |
lemma INJ_EMPTY: "ALL x. All (INJ x EMPTY) & (ALL xa. INJ x xa EMPTY = (xa = EMPTY))"
|
|
3126 |
by (import pred_set INJ_EMPTY)
|
|
3127 |
|
|
3128 |
constdefs
|
|
3129 |
SURJ :: "('a => 'b) => ('a => bool) => ('b => bool) => bool"
|
|
3130 |
"SURJ ==
|
|
3131 |
%f s t.
|
|
3132 |
(ALL x. IN x s --> IN (f x) t) &
|
|
3133 |
(ALL x. IN x t --> (EX y. IN y s & f y = x))"
|
|
3134 |
|
|
3135 |
lemma SURJ_DEF: "ALL f s t.
|
|
3136 |
SURJ f s t =
|
|
3137 |
((ALL x. IN x s --> IN (f x) t) &
|
|
3138 |
(ALL x. IN x t --> (EX y. IN y s & f y = x)))"
|
|
3139 |
by (import pred_set SURJ_DEF)
|
|
3140 |
|
|
3141 |
lemma SURJ_ID: "ALL x. SURJ (%x. x) x x"
|
|
3142 |
by (import pred_set SURJ_ID)
|
|
3143 |
|
|
3144 |
lemma SURJ_COMPOSE: "ALL x xa xb xc xd. SURJ x xb xc & SURJ xa xc xd --> SURJ (xa o x) xb xd"
|
|
3145 |
by (import pred_set SURJ_COMPOSE)
|
|
3146 |
|
|
3147 |
lemma SURJ_EMPTY: "ALL x.
|
|
3148 |
(ALL xa. SURJ x EMPTY xa = (xa = EMPTY)) &
|
|
3149 |
(ALL xa. SURJ x xa EMPTY = (xa = EMPTY))"
|
|
3150 |
by (import pred_set SURJ_EMPTY)
|
|
3151 |
|
|
3152 |
lemma IMAGE_SURJ: "ALL x xa xb. SURJ x xa xb = (IMAGE x xa = xb)"
|
|
3153 |
by (import pred_set IMAGE_SURJ)
|
|
3154 |
|
|
3155 |
constdefs
|
|
3156 |
BIJ :: "('a => 'b) => ('a => bool) => ('b => bool) => bool"
|
|
3157 |
"BIJ == %f s t. INJ f s t & SURJ f s t"
|
|
3158 |
|
|
3159 |
lemma BIJ_DEF: "ALL f s t. BIJ f s t = (INJ f s t & SURJ f s t)"
|
|
3160 |
by (import pred_set BIJ_DEF)
|
|
3161 |
|
|
3162 |
lemma BIJ_ID: "ALL x. BIJ (%x. x) x x"
|
|
3163 |
by (import pred_set BIJ_ID)
|
|
3164 |
|
|
3165 |
lemma BIJ_EMPTY: "ALL x.
|
|
3166 |
(ALL xa. BIJ x EMPTY xa = (xa = EMPTY)) &
|
|
3167 |
(ALL xa. BIJ x xa EMPTY = (xa = EMPTY))"
|
|
3168 |
by (import pred_set BIJ_EMPTY)
|
|
3169 |
|
|
3170 |
lemma BIJ_COMPOSE: "ALL x xa xb xc xd. BIJ x xb xc & BIJ xa xc xd --> BIJ (xa o x) xb xd"
|
|
3171 |
by (import pred_set BIJ_COMPOSE)
|
|
3172 |
|
|
3173 |
consts
|
|
3174 |
LINV :: "('a => 'b) => ('a => bool) => 'b => 'a"
|
|
3175 |
|
|
3176 |
specification (LINV) LINV_DEF: "ALL f s t. INJ f s t --> (ALL x. IN x s --> LINV f s (f x) = x)"
|
|
3177 |
by (import pred_set LINV_DEF)
|
|
3178 |
|
|
3179 |
consts
|
|
3180 |
RINV :: "('a => 'b) => ('a => bool) => 'b => 'a"
|
|
3181 |
|
|
3182 |
specification (RINV) RINV_DEF: "ALL f s t. SURJ f s t --> (ALL x. IN x t --> f (RINV f s x) = x)"
|
|
3183 |
by (import pred_set RINV_DEF)
|
|
3184 |
|
|
3185 |
constdefs
|
|
3186 |
FINITE :: "('a => bool) => bool"
|
|
3187 |
"FINITE ==
|
|
3188 |
%s. ALL P. P EMPTY & (ALL s. P s --> (ALL e. P (INSERT e s))) --> P s"
|
|
3189 |
|
|
3190 |
lemma FINITE_DEF: "ALL s.
|
|
3191 |
FINITE s =
|
|
3192 |
(ALL P. P EMPTY & (ALL s. P s --> (ALL e. P (INSERT e s))) --> P s)"
|
|
3193 |
by (import pred_set FINITE_DEF)
|
|
3194 |
|
|
3195 |
lemma FINITE_EMPTY: "FINITE EMPTY"
|
|
3196 |
by (import pred_set FINITE_EMPTY)
|
|
3197 |
|
|
3198 |
lemma FINITE_INDUCT: "ALL P.
|
|
3199 |
P EMPTY &
|
|
3200 |
(ALL s. FINITE s & P s --> (ALL e. ~ IN e s --> P (INSERT e s))) -->
|
|
3201 |
(ALL s. FINITE s --> P s)"
|
|
3202 |
by (import pred_set FINITE_INDUCT)
|
|
3203 |
|
|
3204 |
lemma FINITE_INSERT: "ALL x s. FINITE (INSERT x s) = FINITE s"
|
|
3205 |
by (import pred_set FINITE_INSERT)
|
|
3206 |
|
|
3207 |
lemma FINITE_DELETE: "ALL x s. FINITE (DELETE s x) = FINITE s"
|
|
3208 |
by (import pred_set FINITE_DELETE)
|
|
3209 |
|
|
3210 |
lemma FINITE_UNION: "ALL s t. FINITE (pred_set.UNION s t) = (FINITE s & FINITE t)"
|
|
3211 |
by (import pred_set FINITE_UNION)
|
|
3212 |
|
|
3213 |
lemma INTER_FINITE: "ALL s. FINITE s --> (ALL t. FINITE (pred_set.INTER s t))"
|
|
3214 |
by (import pred_set INTER_FINITE)
|
|
3215 |
|
|
3216 |
lemma SUBSET_FINITE: "ALL s. FINITE s --> (ALL t. SUBSET t s --> FINITE t)"
|
|
3217 |
by (import pred_set SUBSET_FINITE)
|
|
3218 |
|
|
3219 |
lemma PSUBSET_FINITE: "ALL x. FINITE x --> (ALL xa. PSUBSET xa x --> FINITE xa)"
|
|
3220 |
by (import pred_set PSUBSET_FINITE)
|
|
3221 |
|
|
3222 |
lemma FINITE_DIFF: "ALL s. FINITE s --> (ALL t. FINITE (DIFF s t))"
|
|
3223 |
by (import pred_set FINITE_DIFF)
|
|
3224 |
|
|
3225 |
lemma FINITE_SING: "ALL x. FINITE (INSERT x EMPTY)"
|
|
3226 |
by (import pred_set FINITE_SING)
|
|
3227 |
|
|
3228 |
lemma SING_FINITE: "ALL x. SING x --> FINITE x"
|
|
3229 |
by (import pred_set SING_FINITE)
|
|
3230 |
|
|
3231 |
lemma IMAGE_FINITE: "ALL s. FINITE s --> (ALL f. FINITE (IMAGE f s))"
|
|
3232 |
by (import pred_set IMAGE_FINITE)
|
|
3233 |
|
|
3234 |
consts
|
|
3235 |
CARD :: "('a => bool) => nat"
|
|
3236 |
|
|
3237 |
specification (CARD) CARD_DEF: "(op &::bool => bool => bool)
|
|
3238 |
((op =::nat => nat => bool)
|
|
3239 |
((CARD::('a => bool) => nat) (EMPTY::'a => bool)) (0::nat))
|
|
3240 |
((All::(('a => bool) => bool) => bool)
|
|
3241 |
(%s::'a => bool.
|
|
3242 |
(op -->::bool => bool => bool) ((FINITE::('a => bool) => bool) s)
|
|
3243 |
((All::('a => bool) => bool)
|
|
3244 |
(%x::'a.
|
|
3245 |
(op =::nat => nat => bool)
|
|
3246 |
((CARD::('a => bool) => nat)
|
|
3247 |
((INSERT::'a => ('a => bool) => 'a => bool) x s))
|
|
3248 |
((If::bool => nat => nat => nat)
|
|
3249 |
((IN::'a => ('a => bool) => bool) x s)
|
|
3250 |
((CARD::('a => bool) => nat) s)
|
|
3251 |
((Suc::nat => nat) ((CARD::('a => bool) => nat) s)))))))"
|
|
3252 |
by (import pred_set CARD_DEF)
|
|
3253 |
|
|
3254 |
lemma CARD_EMPTY: "CARD EMPTY = 0"
|
|
3255 |
by (import pred_set CARD_EMPTY)
|
|
3256 |
|
|
3257 |
lemma CARD_INSERT: "ALL s.
|
|
3258 |
FINITE s -->
|
|
3259 |
(ALL x. CARD (INSERT x s) = (if IN x s then CARD s else Suc (CARD s)))"
|
|
3260 |
by (import pred_set CARD_INSERT)
|
|
3261 |
|
|
3262 |
lemma CARD_EQ_0: "ALL s. FINITE s --> (CARD s = 0) = (s = EMPTY)"
|
|
3263 |
by (import pred_set CARD_EQ_0)
|
|
3264 |
|
|
3265 |
lemma CARD_DELETE: "ALL s.
|
|
3266 |
FINITE s -->
|
|
3267 |
(ALL x. CARD (DELETE s x) = (if IN x s then CARD s - 1 else CARD s))"
|
|
3268 |
by (import pred_set CARD_DELETE)
|
|
3269 |
|
|
3270 |
lemma CARD_INTER_LESS_EQ: "ALL s. FINITE s --> (ALL t. CARD (pred_set.INTER s t) <= CARD s)"
|
|
3271 |
by (import pred_set CARD_INTER_LESS_EQ)
|
|
3272 |
|
|
3273 |
lemma CARD_UNION: "ALL s.
|
|
3274 |
FINITE s -->
|
|
3275 |
(ALL t.
|
|
3276 |
FINITE t -->
|
|
3277 |
CARD (pred_set.UNION s t) + CARD (pred_set.INTER s t) =
|
|
3278 |
CARD s + CARD t)"
|
|
3279 |
by (import pred_set CARD_UNION)
|
|
3280 |
|
|
3281 |
lemma CARD_SUBSET: "ALL s. FINITE s --> (ALL t. SUBSET t s --> CARD t <= CARD s)"
|
|
3282 |
by (import pred_set CARD_SUBSET)
|
|
3283 |
|
|
3284 |
lemma CARD_PSUBSET: "ALL s. FINITE s --> (ALL t. PSUBSET t s --> CARD t < CARD s)"
|
|
3285 |
by (import pred_set CARD_PSUBSET)
|
|
3286 |
|
|
3287 |
lemma CARD_SING: "ALL x. CARD (INSERT x EMPTY) = 1"
|
|
3288 |
by (import pred_set CARD_SING)
|
|
3289 |
|
|
3290 |
lemma SING_IFF_CARD1: "ALL x. SING x = (CARD x = 1 & FINITE x)"
|
|
3291 |
by (import pred_set SING_IFF_CARD1)
|
|
3292 |
|
|
3293 |
lemma CARD_DIFF: "ALL t.
|
|
3294 |
FINITE t -->
|
|
3295 |
(ALL s.
|
|
3296 |
FINITE s --> CARD (DIFF s t) = CARD s - CARD (pred_set.INTER s t))"
|
|
3297 |
by (import pred_set CARD_DIFF)
|
|
3298 |
|
|
3299 |
lemma LESS_CARD_DIFF: "ALL t.
|
|
3300 |
FINITE t -->
|
|
3301 |
(ALL s. FINITE s --> CARD t < CARD s --> 0 < CARD (DIFF s t))"
|
|
3302 |
by (import pred_set LESS_CARD_DIFF)
|
|
3303 |
|
|
3304 |
lemma FINITE_COMPLETE_INDUCTION: "ALL P.
|
|
3305 |
(ALL x. (ALL y. PSUBSET y x --> P y) --> FINITE x --> P x) -->
|
|
3306 |
(ALL x. FINITE x --> P x)"
|
|
3307 |
by (import pred_set FINITE_COMPLETE_INDUCTION)
|
|
3308 |
|
|
3309 |
constdefs
|
|
3310 |
INFINITE :: "('a => bool) => bool"
|
|
3311 |
"INFINITE == %s. ~ FINITE s"
|
|
3312 |
|
|
3313 |
lemma INFINITE_DEF: "ALL s. INFINITE s = (~ FINITE s)"
|
|
3314 |
by (import pred_set INFINITE_DEF)
|
|
3315 |
|
|
3316 |
lemma NOT_IN_FINITE: "(op =::bool => bool => bool)
|
|
3317 |
((INFINITE::('a => bool) => bool) (pred_set.UNIV::'a => bool))
|
|
3318 |
((All::(('a => bool) => bool) => bool)
|
|
3319 |
(%s::'a => bool.
|
|
3320 |
(op -->::bool => bool => bool) ((FINITE::('a => bool) => bool) s)
|
|
3321 |
((Ex::('a => bool) => bool)
|
|
3322 |
(%x::'a.
|
|
3323 |
(Not::bool => bool) ((IN::'a => ('a => bool) => bool) x s)))))"
|
|
3324 |
by (import pred_set NOT_IN_FINITE)
|
|
3325 |
|
|
3326 |
lemma INFINITE_INHAB: "ALL x. INFINITE x --> (EX xa. IN xa x)"
|
|
3327 |
by (import pred_set INFINITE_INHAB)
|
|
3328 |
|
|
3329 |
lemma IMAGE_11_INFINITE: "ALL f.
|
|
3330 |
(ALL x y. f x = f y --> x = y) -->
|
|
3331 |
(ALL s. INFINITE s --> INFINITE (IMAGE f s))"
|
|
3332 |
by (import pred_set IMAGE_11_INFINITE)
|
|
3333 |
|
|
3334 |
lemma INFINITE_SUBSET: "ALL x. INFINITE x --> (ALL xa. SUBSET x xa --> INFINITE xa)"
|
|
3335 |
by (import pred_set INFINITE_SUBSET)
|
|
3336 |
|
|
3337 |
lemma IN_INFINITE_NOT_FINITE: "ALL x xa. INFINITE x & FINITE xa --> (EX xb. IN xb x & ~ IN xb xa)"
|
|
3338 |
by (import pred_set IN_INFINITE_NOT_FINITE)
|
|
3339 |
|
|
3340 |
lemma INFINITE_UNIV: "(op =::bool => bool => bool)
|
|
3341 |
((INFINITE::('a => bool) => bool) (pred_set.UNIV::'a => bool))
|
|
3342 |
((Ex::(('a => 'a) => bool) => bool)
|
|
3343 |
(%f::'a => 'a.
|
|
3344 |
(op &::bool => bool => bool)
|
|
3345 |
((All::('a => bool) => bool)
|
|
3346 |
(%x::'a.
|
|
3347 |
(All::('a => bool) => bool)
|
|
3348 |
(%y::'a.
|
|
3349 |
(op -->::bool => bool => bool)
|
|
3350 |
((op =::'a => 'a => bool) (f x) (f y))
|
|
3351 |
((op =::'a => 'a => bool) x y))))
|
|
3352 |
((Ex::('a => bool) => bool)
|
|
3353 |
(%y::'a.
|
|
3354 |
(All::('a => bool) => bool)
|
|
3355 |
(%x::'a.
|
|
3356 |
(Not::bool => bool)
|
|
3357 |
((op =::'a => 'a => bool) (f x) y))))))"
|
|
3358 |
by (import pred_set INFINITE_UNIV)
|
|
3359 |
|
|
3360 |
lemma FINITE_PSUBSET_INFINITE: "ALL x. INFINITE x = (ALL xa. FINITE xa --> SUBSET xa x --> PSUBSET xa x)"
|
|
3361 |
by (import pred_set FINITE_PSUBSET_INFINITE)
|
|
3362 |
|
|
3363 |
lemma FINITE_PSUBSET_UNIV: "(op =::bool => bool => bool)
|
|
3364 |
((INFINITE::('a => bool) => bool) (pred_set.UNIV::'a => bool))
|
|
3365 |
((All::(('a => bool) => bool) => bool)
|
|
3366 |
(%s::'a => bool.
|
|
3367 |
(op -->::bool => bool => bool) ((FINITE::('a => bool) => bool) s)
|
|
3368 |
((PSUBSET::('a => bool) => ('a => bool) => bool) s
|
|
3369 |
(pred_set.UNIV::'a => bool))))"
|
|
3370 |
by (import pred_set FINITE_PSUBSET_UNIV)
|
|
3371 |
|
|
3372 |
lemma INFINITE_DIFF_FINITE: "ALL s t. INFINITE s & FINITE t --> DIFF s t ~= EMPTY"
|
|
3373 |
by (import pred_set INFINITE_DIFF_FINITE)
|
|
3374 |
|
|
3375 |
lemma FINITE_ISO_NUM: "ALL s.
|
|
3376 |
FINITE s -->
|
|
3377 |
(EX f. (ALL n m. n < CARD s & m < CARD s --> f n = f m --> n = m) &
|
|
3378 |
s = GSPEC (%n. (f n, n < CARD s)))"
|
|
3379 |
by (import pred_set FINITE_ISO_NUM)
|
|
3380 |
|
|
3381 |
lemma FINITE_WEAK_ENUMERATE: "ALL x::'a => bool.
|
|
3382 |
FINITE x =
|
|
3383 |
(EX (f::nat => 'a) b::nat. ALL e::'a. IN e x = (EX n<b. e = f n))"
|
|
3384 |
by (import pred_set FINITE_WEAK_ENUMERATE)
|
|
3385 |
|
|
3386 |
constdefs
|
|
3387 |
BIGUNION :: "(('a => bool) => bool) => 'a => bool"
|
|
3388 |
"BIGUNION == %P. GSPEC (%x. (x, EX p. IN p P & IN x p))"
|
|
3389 |
|
|
3390 |
lemma BIGUNION: "ALL P. BIGUNION P = GSPEC (%x. (x, EX p. IN p P & IN x p))"
|
|
3391 |
by (import pred_set BIGUNION)
|
|
3392 |
|
|
3393 |
lemma IN_BIGUNION: "ALL x xa. IN x (BIGUNION xa) = (EX s. IN x s & IN s xa)"
|
|
3394 |
by (import pred_set IN_BIGUNION)
|
|
3395 |
|
|
3396 |
lemma BIGUNION_EMPTY: "BIGUNION EMPTY = EMPTY"
|
|
3397 |
by (import pred_set BIGUNION_EMPTY)
|
|
3398 |
|
|
3399 |
lemma BIGUNION_SING: "ALL x. BIGUNION (INSERT x EMPTY) = x"
|
|
3400 |
by (import pred_set BIGUNION_SING)
|
|
3401 |
|
|
3402 |
lemma BIGUNION_UNION: "ALL x xa.
|
|
3403 |
BIGUNION (pred_set.UNION x xa) =
|
|
3404 |
pred_set.UNION (BIGUNION x) (BIGUNION xa)"
|
|
3405 |
by (import pred_set BIGUNION_UNION)
|
|
3406 |
|
|
3407 |
lemma DISJOINT_BIGUNION: "(ALL (s::('a => bool) => bool) t::'a => bool.
|
|
3408 |
DISJOINT (BIGUNION s) t =
|
|
3409 |
(ALL s'::'a => bool. IN s' s --> DISJOINT s' t)) &
|
|
3410 |
(ALL (x::('a => bool) => bool) xa::'a => bool.
|
|
3411 |
DISJOINT xa (BIGUNION x) =
|
|
3412 |
(ALL xb::'a => bool. IN xb x --> DISJOINT xa xb))"
|
|
3413 |
by (import pred_set DISJOINT_BIGUNION)
|
|
3414 |
|
|
3415 |
lemma BIGUNION_INSERT: "ALL x xa. BIGUNION (INSERT x xa) = pred_set.UNION x (BIGUNION xa)"
|
|
3416 |
by (import pred_set BIGUNION_INSERT)
|
|
3417 |
|
|
3418 |
lemma BIGUNION_SUBSET: "ALL X P. SUBSET (BIGUNION P) X = (ALL Y. IN Y P --> SUBSET Y X)"
|
|
3419 |
by (import pred_set BIGUNION_SUBSET)
|
|
3420 |
|
|
3421 |
lemma FINITE_BIGUNION: "ALL x. FINITE x & (ALL s. IN s x --> FINITE s) --> FINITE (BIGUNION x)"
|
|
3422 |
by (import pred_set FINITE_BIGUNION)
|
|
3423 |
|
|
3424 |
constdefs
|
|
3425 |
BIGINTER :: "(('a => bool) => bool) => 'a => bool"
|
|
3426 |
"BIGINTER == %B. GSPEC (%x. (x, ALL P. IN P B --> IN x P))"
|
|
3427 |
|
|
3428 |
lemma BIGINTER: "ALL B. BIGINTER B = GSPEC (%x. (x, ALL P. IN P B --> IN x P))"
|
|
3429 |
by (import pred_set BIGINTER)
|
|
3430 |
|
|
3431 |
lemma IN_BIGINTER: "IN x (BIGINTER B) = (ALL P. IN P B --> IN x P)"
|
|
3432 |
by (import pred_set IN_BIGINTER)
|
|
3433 |
|
|
3434 |
lemma BIGINTER_INSERT: "ALL P B. BIGINTER (INSERT P B) = pred_set.INTER P (BIGINTER B)"
|
|
3435 |
by (import pred_set BIGINTER_INSERT)
|
|
3436 |
|
|
3437 |
lemma BIGINTER_EMPTY: "BIGINTER EMPTY = pred_set.UNIV"
|
|
3438 |
by (import pred_set BIGINTER_EMPTY)
|
|
3439 |
|
|
3440 |
lemma BIGINTER_INTER: "ALL x xa. BIGINTER (INSERT x (INSERT xa EMPTY)) = pred_set.INTER x xa"
|
|
3441 |
by (import pred_set BIGINTER_INTER)
|
|
3442 |
|
|
3443 |
lemma BIGINTER_SING: "ALL x. BIGINTER (INSERT x EMPTY) = x"
|
|
3444 |
by (import pred_set BIGINTER_SING)
|
|
3445 |
|
|
3446 |
lemma SUBSET_BIGINTER: "ALL X P. SUBSET X (BIGINTER P) = (ALL x. IN x P --> SUBSET X x)"
|
|
3447 |
by (import pred_set SUBSET_BIGINTER)
|
|
3448 |
|
|
3449 |
lemma DISJOINT_BIGINTER: "ALL x xa xb.
|
|
3450 |
IN xa xb & DISJOINT xa x -->
|
|
3451 |
DISJOINT x (BIGINTER xb) & DISJOINT (BIGINTER xb) x"
|
|
3452 |
by (import pred_set DISJOINT_BIGINTER)
|
|
3453 |
|
|
3454 |
constdefs
|
|
3455 |
CROSS :: "('a => bool) => ('b => bool) => 'a * 'b => bool"
|
|
3456 |
"CROSS == %P Q. GSPEC (%p. (p, IN (fst p) P & IN (snd p) Q))"
|
|
3457 |
|
|
3458 |
lemma CROSS_DEF: "ALL P Q. CROSS P Q = GSPEC (%p. (p, IN (fst p) P & IN (snd p) Q))"
|
|
3459 |
by (import pred_set CROSS_DEF)
|
|
3460 |
|
|
3461 |
lemma IN_CROSS: "ALL x xa xb. IN xb (CROSS x xa) = (IN (fst xb) x & IN (snd xb) xa)"
|
|
3462 |
by (import pred_set IN_CROSS)
|
|
3463 |
|
|
3464 |
lemma CROSS_EMPTY: "ALL x. CROSS x EMPTY = EMPTY & CROSS EMPTY x = EMPTY"
|
|
3465 |
by (import pred_set CROSS_EMPTY)
|
|
3466 |
|
|
3467 |
lemma CROSS_INSERT_LEFT: "ALL x xa xb.
|
|
3468 |
CROSS (INSERT xb x) xa =
|
|
3469 |
pred_set.UNION (CROSS (INSERT xb EMPTY) xa) (CROSS x xa)"
|
|
3470 |
by (import pred_set CROSS_INSERT_LEFT)
|
|
3471 |
|
|
3472 |
lemma CROSS_INSERT_RIGHT: "ALL x xa xb.
|
|
3473 |
CROSS x (INSERT xb xa) =
|
|
3474 |
pred_set.UNION (CROSS x (INSERT xb EMPTY)) (CROSS x xa)"
|
|
3475 |
by (import pred_set CROSS_INSERT_RIGHT)
|
|
3476 |
|
|
3477 |
lemma FINITE_CROSS: "ALL x xa. FINITE x & FINITE xa --> FINITE (CROSS x xa)"
|
|
3478 |
by (import pred_set FINITE_CROSS)
|
|
3479 |
|
|
3480 |
lemma CROSS_SINGS: "ALL x xa. CROSS (INSERT x EMPTY) (INSERT xa EMPTY) = INSERT (x, xa) EMPTY"
|
|
3481 |
by (import pred_set CROSS_SINGS)
|
|
3482 |
|
|
3483 |
lemma CARD_SING_CROSS: "ALL x s. FINITE s --> CARD (CROSS (INSERT x EMPTY) s) = CARD s"
|
|
3484 |
by (import pred_set CARD_SING_CROSS)
|
|
3485 |
|
|
3486 |
lemma CARD_CROSS: "ALL x xa. FINITE x & FINITE xa --> CARD (CROSS x xa) = CARD x * CARD xa"
|
|
3487 |
by (import pred_set CARD_CROSS)
|
|
3488 |
|
|
3489 |
lemma CROSS_SUBSET: "ALL x xa xb xc.
|
|
3490 |
SUBSET (CROSS xb xc) (CROSS x xa) =
|
|
3491 |
(xb = EMPTY | xc = EMPTY | SUBSET xb x & SUBSET xc xa)"
|
|
3492 |
by (import pred_set CROSS_SUBSET)
|
|
3493 |
|
|
3494 |
lemma FINITE_CROSS_EQ: "ALL P Q. FINITE (CROSS P Q) = (P = EMPTY | Q = EMPTY | FINITE P & FINITE Q)"
|
|
3495 |
by (import pred_set FINITE_CROSS_EQ)
|
|
3496 |
|
|
3497 |
constdefs
|
|
3498 |
COMPL :: "('a => bool) => 'a => bool"
|
|
3499 |
"COMPL == DIFF pred_set.UNIV"
|
|
3500 |
|
|
3501 |
lemma COMPL_DEF: "ALL P. COMPL P = DIFF pred_set.UNIV P"
|
|
3502 |
by (import pred_set COMPL_DEF)
|
|
3503 |
|
|
3504 |
lemma IN_COMPL: "ALL x xa. IN x (COMPL xa) = (~ IN x xa)"
|
|
3505 |
by (import pred_set IN_COMPL)
|
|
3506 |
|
|
3507 |
lemma COMPL_COMPL: "ALL x. COMPL (COMPL x) = x"
|
|
3508 |
by (import pred_set COMPL_COMPL)
|
|
3509 |
|
|
3510 |
lemma COMPL_CLAUSES: "ALL x.
|
|
3511 |
pred_set.INTER (COMPL x) x = EMPTY &
|
|
3512 |
pred_set.UNION (COMPL x) x = pred_set.UNIV"
|
|
3513 |
by (import pred_set COMPL_CLAUSES)
|
|
3514 |
|
|
3515 |
lemma COMPL_SPLITS: "ALL x xa.
|
|
3516 |
pred_set.UNION (pred_set.INTER x xa) (pred_set.INTER (COMPL x) xa) = xa"
|
|
3517 |
by (import pred_set COMPL_SPLITS)
|
|
3518 |
|
|
3519 |
lemma INTER_UNION_COMPL: "ALL x xa. pred_set.INTER x xa = COMPL (pred_set.UNION (COMPL x) (COMPL xa))"
|
|
3520 |
by (import pred_set INTER_UNION_COMPL)
|
|
3521 |
|
|
3522 |
lemma COMPL_EMPTY: "COMPL EMPTY = pred_set.UNIV"
|
|
3523 |
by (import pred_set COMPL_EMPTY)
|
|
3524 |
|
|
3525 |
consts
|
|
3526 |
count :: "nat => nat => bool"
|
|
3527 |
|
|
3528 |
defs
|
|
3529 |
count_primdef: "count == %n. GSPEC (%m. (m, m < n))"
|
|
3530 |
|
|
3531 |
lemma count_def: "ALL n. count n = GSPEC (%m. (m, m < n))"
|
|
3532 |
by (import pred_set count_def)
|
|
3533 |
|
|
3534 |
lemma IN_COUNT: "ALL m n. IN m (count n) = (m < n)"
|
|
3535 |
by (import pred_set IN_COUNT)
|
|
3536 |
|
|
3537 |
lemma COUNT_ZERO: "count 0 = EMPTY"
|
|
3538 |
by (import pred_set COUNT_ZERO)
|
|
3539 |
|
|
3540 |
lemma COUNT_SUC: "ALL n. count (Suc n) = INSERT n (count n)"
|
|
3541 |
by (import pred_set COUNT_SUC)
|
|
3542 |
|
|
3543 |
lemma FINITE_COUNT: "ALL n. FINITE (count n)"
|
|
3544 |
by (import pred_set FINITE_COUNT)
|
|
3545 |
|
|
3546 |
lemma CARD_COUNT: "ALL n. CARD (count n) = n"
|
|
3547 |
by (import pred_set CARD_COUNT)
|
|
3548 |
|
|
3549 |
constdefs
|
|
3550 |
ITSET_tupled :: "('a => 'b => 'b) => ('a => bool) * 'b => 'b"
|
|
3551 |
"ITSET_tupled ==
|
|
3552 |
%f. WFREC
|
|
3553 |
(SOME R.
|
|
3554 |
WF R &
|
|
3555 |
(ALL b s.
|
|
3556 |
FINITE s & s ~= EMPTY --> R (REST s, f (CHOICE s) b) (s, b)))
|
|
3557 |
(%ITSET_tupled (v, v1).
|
|
3558 |
if FINITE v
|
|
3559 |
then if v = EMPTY then v1
|
|
3560 |
else ITSET_tupled (REST v, f (CHOICE v) v1)
|
|
3561 |
else ARB)"
|
|
3562 |
|
|
3563 |
lemma ITSET_tupled_primitive_def: "ALL f.
|
|
3564 |
ITSET_tupled f =
|
|
3565 |
WFREC
|
|
3566 |
(SOME R.
|
|
3567 |
WF R &
|
|
3568 |
(ALL b s.
|
|
3569 |
FINITE s & s ~= EMPTY --> R (REST s, f (CHOICE s) b) (s, b)))
|
|
3570 |
(%ITSET_tupled (v, v1).
|
|
3571 |
if FINITE v
|
|
3572 |
then if v = EMPTY then v1
|
|
3573 |
else ITSET_tupled (REST v, f (CHOICE v) v1)
|
|
3574 |
else ARB)"
|
|
3575 |
by (import pred_set ITSET_tupled_primitive_def)
|
|
3576 |
|
|
3577 |
constdefs
|
|
3578 |
ITSET :: "('a => 'b => 'b) => ('a => bool) => 'b => 'b"
|
|
3579 |
"ITSET == %f x x1. ITSET_tupled f (x, x1)"
|
|
3580 |
|
|
3581 |
lemma ITSET_curried_def: "ALL f x x1. ITSET f x x1 = ITSET_tupled f (x, x1)"
|
|
3582 |
by (import pred_set ITSET_curried_def)
|
|
3583 |
|
|
3584 |
lemma ITSET_IND: "ALL P.
|
|
3585 |
(ALL s b.
|
|
3586 |
(FINITE s & s ~= EMPTY --> P (REST s) (f (CHOICE s) b)) -->
|
|
3587 |
P s b) -->
|
|
3588 |
(ALL v. All (P v))"
|
|
3589 |
by (import pred_set ITSET_IND)
|
|
3590 |
|
|
3591 |
lemma ITSET_THM: "ALL s f b.
|
|
3592 |
FINITE s -->
|
|
3593 |
ITSET f s b =
|
|
3594 |
(if s = EMPTY then b else ITSET f (REST s) (f (CHOICE s) b))"
|
|
3595 |
by (import pred_set ITSET_THM)
|
|
3596 |
|
|
3597 |
lemma ITSET_EMPTY: "ALL x xa. ITSET x EMPTY xa = xa"
|
|
3598 |
by (import pred_set ITSET_EMPTY)
|
|
3599 |
|
|
3600 |
;end_setup
|
|
3601 |
|
|
3602 |
;setup_theory operator
|
|
3603 |
|
|
3604 |
constdefs
|
|
3605 |
ASSOC :: "('a => 'a => 'a) => bool"
|
|
3606 |
"ASSOC == %f. ALL x y z. f x (f y z) = f (f x y) z"
|
|
3607 |
|
|
3608 |
lemma ASSOC_DEF: "ALL f. ASSOC f = (ALL x y z. f x (f y z) = f (f x y) z)"
|
|
3609 |
by (import operator ASSOC_DEF)
|
|
3610 |
|
|
3611 |
constdefs
|
|
3612 |
COMM :: "('a => 'a => 'b) => bool"
|
|
3613 |
"COMM == %f. ALL x y. f x y = f y x"
|
|
3614 |
|
|
3615 |
lemma COMM_DEF: "ALL f. COMM f = (ALL x y. f x y = f y x)"
|
|
3616 |
by (import operator COMM_DEF)
|
|
3617 |
|
|
3618 |
constdefs
|
|
3619 |
FCOMM :: "('a => 'b => 'a) => ('c => 'a => 'a) => bool"
|
|
3620 |
"FCOMM == %f g. ALL x y z. g x (f y z) = f (g x y) z"
|
|
3621 |
|
|
3622 |
lemma FCOMM_DEF: "ALL f g. FCOMM f g = (ALL x y z. g x (f y z) = f (g x y) z)"
|
|
3623 |
by (import operator FCOMM_DEF)
|
|
3624 |
|
|
3625 |
constdefs
|
|
3626 |
RIGHT_ID :: "('a => 'b => 'a) => 'b => bool"
|
|
3627 |
"RIGHT_ID == %f e. ALL x. f x e = x"
|
|
3628 |
|
|
3629 |
lemma RIGHT_ID_DEF: "ALL f e. RIGHT_ID f e = (ALL x. f x e = x)"
|
|
3630 |
by (import operator RIGHT_ID_DEF)
|
|
3631 |
|
|
3632 |
constdefs
|
|
3633 |
LEFT_ID :: "('a => 'b => 'b) => 'a => bool"
|
|
3634 |
"LEFT_ID == %f e. ALL x. f e x = x"
|
|
3635 |
|
|
3636 |
lemma LEFT_ID_DEF: "ALL f e. LEFT_ID f e = (ALL x. f e x = x)"
|
|
3637 |
by (import operator LEFT_ID_DEF)
|
|
3638 |
|
|
3639 |
constdefs
|
|
3640 |
MONOID :: "('a => 'a => 'a) => 'a => bool"
|
|
3641 |
"MONOID == %f e. ASSOC f & RIGHT_ID f e & LEFT_ID f e"
|
|
3642 |
|
|
3643 |
lemma MONOID_DEF: "ALL f e. MONOID f e = (ASSOC f & RIGHT_ID f e & LEFT_ID f e)"
|
|
3644 |
by (import operator MONOID_DEF)
|
|
3645 |
|
|
3646 |
lemma ASSOC_CONJ: "ASSOC op &"
|
|
3647 |
by (import operator ASSOC_CONJ)
|
|
3648 |
|
|
3649 |
lemma ASSOC_DISJ: "ASSOC op |"
|
|
3650 |
by (import operator ASSOC_DISJ)
|
|
3651 |
|
|
3652 |
lemma FCOMM_ASSOC: "ALL x. FCOMM x x = ASSOC x"
|
|
3653 |
by (import operator FCOMM_ASSOC)
|
|
3654 |
|
|
3655 |
lemma MONOID_CONJ_T: "MONOID op & True"
|
|
3656 |
by (import operator MONOID_CONJ_T)
|
|
3657 |
|
|
3658 |
lemma MONOID_DISJ_F: "MONOID op | False"
|
|
3659 |
by (import operator MONOID_DISJ_F)
|
|
3660 |
|
|
3661 |
;end_setup
|
|
3662 |
|
|
3663 |
;setup_theory rich_list
|
|
3664 |
|
|
3665 |
consts
|
|
3666 |
SNOC :: "'a => 'a list => 'a list"
|
|
3667 |
|
|
3668 |
specification (SNOC) SNOC: "(ALL x::'a. SNOC x [] = [x]) &
|
|
3669 |
(ALL (x::'a) (x'::'a) l::'a list. SNOC x (x' # l) = x' # SNOC x l)"
|
|
3670 |
by (import rich_list SNOC)
|
|
3671 |
|
|
3672 |
consts
|
|
3673 |
SCANL :: "('b => 'a => 'b) => 'b => 'a list => 'b list"
|
|
3674 |
|
|
3675 |
specification (SCANL) SCANL: "(ALL (f::'b => 'a => 'b) e::'b. SCANL f e [] = [e]) &
|
|
3676 |
(ALL (f::'b => 'a => 'b) (e::'b) (x::'a) l::'a list.
|
|
3677 |
SCANL f e (x # l) = e # SCANL f (f e x) l)"
|
|
3678 |
by (import rich_list SCANL)
|
|
3679 |
|
|
3680 |
consts
|
|
3681 |
SCANR :: "('a => 'b => 'b) => 'b => 'a list => 'b list"
|
|
3682 |
|
|
3683 |
specification (SCANR) SCANR: "(ALL (f::'a => 'b => 'b) e::'b. SCANR f e [] = [e]) &
|
|
3684 |
(ALL (f::'a => 'b => 'b) (e::'b) (x::'a) l::'a list.
|
|
3685 |
SCANR f e (x # l) = f x (hd (SCANR f e l)) # SCANR f e l)"
|
|
3686 |
by (import rich_list SCANR)
|
|
3687 |
|
|
3688 |
lemma IS_EL_DEF: "ALL x l. x mem l = list_exists (op = x) l"
|
|
3689 |
by (import rich_list IS_EL_DEF)
|
|
3690 |
|
|
3691 |
constdefs
|
|
3692 |
AND_EL :: "bool list => bool"
|
|
3693 |
"AND_EL == list_all I"
|
|
3694 |
|
|
3695 |
lemma AND_EL_DEF: "AND_EL = list_all I"
|
|
3696 |
by (import rich_list AND_EL_DEF)
|
|
3697 |
|
|
3698 |
constdefs
|
|
3699 |
OR_EL :: "bool list => bool"
|
|
3700 |
"OR_EL == list_exists I"
|
|
3701 |
|
|
3702 |
lemma OR_EL_DEF: "OR_EL = list_exists I"
|
|
3703 |
by (import rich_list OR_EL_DEF)
|
|
3704 |
|
|
3705 |
consts
|
|
3706 |
FIRSTN :: "nat => 'a list => 'a list"
|
|
3707 |
|
|
3708 |
specification (FIRSTN) FIRSTN: "(ALL l::'a list. FIRSTN (0::nat) l = []) &
|
|
3709 |
(ALL (n::nat) (x::'a) l::'a list. FIRSTN (Suc n) (x # l) = x # FIRSTN n l)"
|
|
3710 |
by (import rich_list FIRSTN)
|
|
3711 |
|
|
3712 |
consts
|
|
3713 |
BUTFIRSTN :: "nat => 'a list => 'a list"
|
|
3714 |
|
|
3715 |
specification (BUTFIRSTN) BUTFIRSTN: "(ALL l::'a list. BUTFIRSTN (0::nat) l = l) &
|
|
3716 |
(ALL (n::nat) (x::'a) l::'a list. BUTFIRSTN (Suc n) (x # l) = BUTFIRSTN n l)"
|
|
3717 |
by (import rich_list BUTFIRSTN)
|
|
3718 |
|
|
3719 |
consts
|
|
3720 |
SEG :: "nat => nat => 'a list => 'a list"
|
|
3721 |
|
|
3722 |
specification (SEG) SEG: "(ALL (k::nat) l::'a list. SEG (0::nat) k l = []) &
|
|
3723 |
(ALL (m::nat) (x::'a) l::'a list.
|
|
3724 |
SEG (Suc m) (0::nat) (x # l) = x # SEG m (0::nat) l) &
|
|
3725 |
(ALL (m::nat) (k::nat) (x::'a) l::'a list.
|
|
3726 |
SEG (Suc m) (Suc k) (x # l) = SEG (Suc m) k l)"
|
|
3727 |
by (import rich_list SEG)
|
|
3728 |
|
|
3729 |
lemma LAST: "ALL x l. last (SNOC x l) = x"
|
|
3730 |
by (import rich_list LAST)
|
|
3731 |
|
|
3732 |
lemma BUTLAST: "ALL x l. butlast (SNOC x l) = l"
|
|
3733 |
by (import rich_list BUTLAST)
|
|
3734 |
|
|
3735 |
consts
|
|
3736 |
LASTN :: "nat => 'a list => 'a list"
|
|
3737 |
|
|
3738 |
specification (LASTN) LASTN: "(ALL l::'a list. LASTN (0::nat) l = []) &
|
|
3739 |
(ALL (n::nat) (x::'a) l::'a list.
|
|
3740 |
LASTN (Suc n) (SNOC x l) = SNOC x (LASTN n l))"
|
|
3741 |
by (import rich_list LASTN)
|
|
3742 |
|
|
3743 |
consts
|
|
3744 |
BUTLASTN :: "nat => 'a list => 'a list"
|
|
3745 |
|
|
3746 |
specification (BUTLASTN) BUTLASTN: "(ALL l::'a list. BUTLASTN (0::nat) l = l) &
|
|
3747 |
(ALL (n::nat) (x::'a) l::'a list.
|
|
3748 |
BUTLASTN (Suc n) (SNOC x l) = BUTLASTN n l)"
|
|
3749 |
by (import rich_list BUTLASTN)
|
|
3750 |
|
|
3751 |
lemma EL: "(ALL x::'a list. EL (0::nat) x = hd x) &
|
|
3752 |
(ALL (x::nat) xa::'a list. EL (Suc x) xa = EL x (tl xa))"
|
|
3753 |
by (import rich_list EL)
|
|
3754 |
|
|
3755 |
consts
|
|
3756 |
ELL :: "nat => 'a list => 'a"
|
|
3757 |
|
|
3758 |
specification (ELL) ELL: "(ALL l::'a list. ELL (0::nat) l = last l) &
|
|
3759 |
(ALL (n::nat) l::'a list. ELL (Suc n) l = ELL n (butlast l))"
|
|
3760 |
by (import rich_list ELL)
|
|
3761 |
|
|
3762 |
consts
|
|
3763 |
IS_PREFIX :: "'a list => 'a list => bool"
|
|
3764 |
|
|
3765 |
specification (IS_PREFIX) IS_PREFIX: "(ALL l::'a list. IS_PREFIX l [] = True) &
|
|
3766 |
(ALL (x::'a) l::'a list. IS_PREFIX [] (x # l) = False) &
|
|
3767 |
(ALL (x1::'a) (l1::'a list) (x2::'a) l2::'a list.
|
|
3768 |
IS_PREFIX (x1 # l1) (x2 # l2) = (x1 = x2 & IS_PREFIX l1 l2))"
|
|
3769 |
by (import rich_list IS_PREFIX)
|
|
3770 |
|
|
3771 |
lemma SNOC_APPEND: "ALL x l. SNOC x l = l @ [x]"
|
|
3772 |
by (import rich_list SNOC_APPEND)
|
|
3773 |
|
|
3774 |
lemma REVERSE: "rev [] = [] & (ALL (x::'a) xa::'a list. rev (x # xa) = SNOC x (rev xa))"
|
|
3775 |
by (import rich_list REVERSE)
|
|
3776 |
|
|
3777 |
lemma REVERSE_SNOC: "ALL x l. rev (SNOC x l) = x # rev l"
|
|
3778 |
by (import rich_list REVERSE_SNOC)
|
|
3779 |
|
|
3780 |
lemma SNOC_Axiom: "ALL (e::'b) f::'a => 'a list => 'b => 'b.
|
|
3781 |
EX x::'a list => 'b.
|
|
3782 |
x [] = e & (ALL (xa::'a) l::'a list. x (SNOC xa l) = f xa l (x l))"
|
|
3783 |
by (import rich_list SNOC_Axiom)
|
|
3784 |
|
|
3785 |
consts
|
|
3786 |
IS_SUFFIX :: "'a list => 'a list => bool"
|
|
3787 |
|
|
3788 |
specification (IS_SUFFIX) IS_SUFFIX: "(ALL l::'a list. IS_SUFFIX l [] = True) &
|
|
3789 |
(ALL (x::'a) l::'a list. IS_SUFFIX [] (SNOC x l) = False) &
|
|
3790 |
(ALL (x1::'a) (l1::'a list) (x2::'a) l2::'a list.
|
|
3791 |
IS_SUFFIX (SNOC x1 l1) (SNOC x2 l2) = (x1 = x2 & IS_SUFFIX l1 l2))"
|
|
3792 |
by (import rich_list IS_SUFFIX)
|
|
3793 |
|
|
3794 |
consts
|
|
3795 |
IS_SUBLIST :: "'a list => 'a list => bool"
|
|
3796 |
|
|
3797 |
specification (IS_SUBLIST) IS_SUBLIST: "(ALL l::'a list. IS_SUBLIST l [] = True) &
|
|
3798 |
(ALL (x::'a) l::'a list. IS_SUBLIST [] (x # l) = False) &
|
|
3799 |
(ALL (x1::'a) (l1::'a list) (x2::'a) l2::'a list.
|
|
3800 |
IS_SUBLIST (x1 # l1) (x2 # l2) =
|
|
3801 |
(x1 = x2 & IS_PREFIX l1 l2 | IS_SUBLIST l1 (x2 # l2)))"
|
|
3802 |
by (import rich_list IS_SUBLIST)
|
|
3803 |
|
|
3804 |
consts
|
|
3805 |
SPLITP :: "('a => bool) => 'a list => 'a list * 'a list"
|
|
3806 |
|
|
3807 |
specification (SPLITP) SPLITP: "(ALL P::'a => bool. SPLITP P [] = ([], [])) &
|
|
3808 |
(ALL (P::'a => bool) (x::'a) l::'a list.
|
|
3809 |
SPLITP P (x # l) =
|
|
3810 |
(if P x then ([], x # l) else (x # fst (SPLITP P l), snd (SPLITP P l))))"
|
|
3811 |
by (import rich_list SPLITP)
|
|
3812 |
|
|
3813 |
constdefs
|
|
3814 |
PREFIX :: "('a => bool) => 'a list => 'a list"
|
|
3815 |
"PREFIX == %P l. fst (SPLITP (Not o P) l)"
|
|
3816 |
|
|
3817 |
lemma PREFIX_DEF: "ALL P l. PREFIX P l = fst (SPLITP (Not o P) l)"
|
|
3818 |
by (import rich_list PREFIX_DEF)
|
|
3819 |
|
|
3820 |
constdefs
|
|
3821 |
SUFFIX :: "('a => bool) => 'a list => 'a list"
|
|
3822 |
"SUFFIX == %P. foldl (%l' x. if P x then SNOC x l' else []) []"
|
|
3823 |
|
|
3824 |
lemma SUFFIX_DEF: "ALL P l. SUFFIX P l = foldl (%l' x. if P x then SNOC x l' else []) [] l"
|
|
3825 |
by (import rich_list SUFFIX_DEF)
|
|
3826 |
|
|
3827 |
constdefs
|
|
3828 |
UNZIP_FST :: "('a * 'b) list => 'a list"
|
|
3829 |
"UNZIP_FST == %l. fst (unzip l)"
|
|
3830 |
|
|
3831 |
lemma UNZIP_FST_DEF: "ALL l. UNZIP_FST l = fst (unzip l)"
|
|
3832 |
by (import rich_list UNZIP_FST_DEF)
|
|
3833 |
|
|
3834 |
constdefs
|
|
3835 |
UNZIP_SND :: "('a * 'b) list => 'b list"
|
|
3836 |
"UNZIP_SND == %l. snd (unzip l)"
|
|
3837 |
|
|
3838 |
lemma UNZIP_SND_DEF: "ALL l. UNZIP_SND l = snd (unzip l)"
|
|
3839 |
by (import rich_list UNZIP_SND_DEF)
|
|
3840 |
|
|
3841 |
consts
|
|
3842 |
GENLIST :: "(nat => 'a) => nat => 'a list"
|
|
3843 |
|
|
3844 |
specification (GENLIST) GENLIST: "(ALL f::nat => 'a. GENLIST f (0::nat) = []) &
|
|
3845 |
(ALL (f::nat => 'a) n::nat. GENLIST f (Suc n) = SNOC (f n) (GENLIST f n))"
|
|
3846 |
by (import rich_list GENLIST)
|
|
3847 |
|
|
3848 |
consts
|
|
3849 |
REPLICATE :: "nat => 'a => 'a list"
|
|
3850 |
|
|
3851 |
specification (REPLICATE) REPLICATE: "(ALL x::'a. REPLICATE (0::nat) x = []) &
|
|
3852 |
(ALL (n::nat) x::'a. REPLICATE (Suc n) x = x # REPLICATE n x)"
|
|
3853 |
by (import rich_list REPLICATE)
|
|
3854 |
|
|
3855 |
lemma LENGTH_MAP2: "ALL l1 l2.
|
|
3856 |
length l1 = length l2 -->
|
|
3857 |
(ALL f.
|
|
3858 |
length (map2 f l1 l2) = length l1 &
|
|
3859 |
length (map2 f l1 l2) = length l2)"
|
|
3860 |
by (import rich_list LENGTH_MAP2)
|
|
3861 |
|
|
3862 |
lemma NULL_EQ_NIL: "ALL l. null l = (l = [])"
|
|
3863 |
by (import rich_list NULL_EQ_NIL)
|
|
3864 |
|
|
3865 |
lemma LENGTH_EQ: "ALL x y. x = y --> length x = length y"
|
|
3866 |
by (import rich_list LENGTH_EQ)
|
|
3867 |
|
|
3868 |
lemma LENGTH_NOT_NULL: "ALL l. (0 < length l) = (~ null l)"
|
|
3869 |
by (import rich_list LENGTH_NOT_NULL)
|
|
3870 |
|
|
3871 |
lemma SNOC_INDUCT: "ALL P. P [] & (ALL l. P l --> (ALL x. P (SNOC x l))) --> All P"
|
|
3872 |
by (import rich_list SNOC_INDUCT)
|
|
3873 |
|
|
3874 |
lemma SNOC_CASES: "ALL x'. x' = [] | (EX x l. x' = SNOC x l)"
|
|
3875 |
by (import rich_list SNOC_CASES)
|
|
3876 |
|
|
3877 |
lemma LENGTH_SNOC: "ALL x l. length (SNOC x l) = Suc (length l)"
|
|
3878 |
by (import rich_list LENGTH_SNOC)
|
|
3879 |
|
|
3880 |
lemma NOT_NIL_SNOC: "ALL x xa. [] ~= SNOC x xa"
|
|
3881 |
by (import rich_list NOT_NIL_SNOC)
|
|
3882 |
|
|
3883 |
lemma NOT_SNOC_NIL: "ALL x xa. SNOC x xa ~= []"
|
|
3884 |
by (import rich_list NOT_SNOC_NIL)
|
|
3885 |
|
|
3886 |
lemma SNOC_11: "ALL x l x' l'. (SNOC x l = SNOC x' l') = (x = x' & l = l')"
|
|
3887 |
by (import rich_list SNOC_11)
|
|
3888 |
|
|
3889 |
lemma SNOC_EQ_LENGTH_EQ: "ALL x1 l1 x2 l2. SNOC x1 l1 = SNOC x2 l2 --> length l1 = length l2"
|
|
3890 |
by (import rich_list SNOC_EQ_LENGTH_EQ)
|
|
3891 |
|
|
3892 |
lemma SNOC_REVERSE_CONS: "ALL x xa. SNOC x xa = rev (x # rev xa)"
|
|
3893 |
by (import rich_list SNOC_REVERSE_CONS)
|
|
3894 |
|
|
3895 |
lemma MAP_SNOC: "ALL x xa xb. map x (SNOC xa xb) = SNOC (x xa) (map x xb)"
|
|
3896 |
by (import rich_list MAP_SNOC)
|
|
3897 |
|
|
3898 |
lemma FOLDR_SNOC: "ALL f e x l. foldr f (SNOC x l) e = foldr f l (f x e)"
|
|
3899 |
by (import rich_list FOLDR_SNOC)
|
|
3900 |
|
|
3901 |
lemma FOLDL_SNOC: "ALL (f::'b => 'a => 'b) (e::'b) (x::'a) l::'a list.
|
|
3902 |
foldl f e (SNOC x l) = f (foldl f e l) x"
|
|
3903 |
by (import rich_list FOLDL_SNOC)
|
|
3904 |
|
|
3905 |
lemma FOLDR_FOLDL: "ALL f e. MONOID f e --> (ALL l. foldr f l e = foldl f e l)"
|
|
3906 |
by (import rich_list FOLDR_FOLDL)
|
|
3907 |
|
|
3908 |
lemma LENGTH_FOLDR: "ALL l. length l = foldr (%x. Suc) l 0"
|
|
3909 |
by (import rich_list LENGTH_FOLDR)
|
|
3910 |
|
|
3911 |
lemma LENGTH_FOLDL: "ALL l. length l = foldl (%l' x. Suc l') 0 l"
|
|
3912 |
by (import rich_list LENGTH_FOLDL)
|
|
3913 |
|
|
3914 |
lemma MAP_FOLDR: "ALL f l. map f l = foldr (%x. op # (f x)) l []"
|
|
3915 |
by (import rich_list MAP_FOLDR)
|
|
3916 |
|
|
3917 |
lemma MAP_FOLDL: "ALL f l. map f l = foldl (%l' x. SNOC (f x) l') [] l"
|
|
3918 |
by (import rich_list MAP_FOLDL)
|
|
3919 |
|
|
3920 |
lemma MAP_o: "ALL (f::'b => 'c) g::'a => 'b. map (f o g) = map f o map g"
|
|
3921 |
by (import rich_list MAP_o)
|
|
3922 |
|
|
3923 |
lemma FILTER_FOLDR: "ALL P l. filter P l = foldr (%x l'. if P x then x # l' else l') l []"
|
|
3924 |
by (import rich_list FILTER_FOLDR)
|
|
3925 |
|
|
3926 |
lemma FILTER_SNOC: "ALL P x l.
|
|
3927 |
filter P (SNOC x l) = (if P x then SNOC x (filter P l) else filter P l)"
|
|
3928 |
by (import rich_list FILTER_SNOC)
|
|
3929 |
|
|
3930 |
lemma FILTER_FOLDL: "ALL P l. filter P l = foldl (%l' x. if P x then SNOC x l' else l') [] l"
|
|
3931 |
by (import rich_list FILTER_FOLDL)
|
|
3932 |
|
|
3933 |
lemma FILTER_COMM: "ALL f1 f2 l. filter f1 (filter f2 l) = filter f2 (filter f1 l)"
|
|
3934 |
by (import rich_list FILTER_COMM)
|
|
3935 |
|
|
3936 |
lemma FILTER_IDEM: "ALL f l. filter f (filter f l) = filter f l"
|
|
3937 |
by (import rich_list FILTER_IDEM)
|
|
3938 |
|
|
3939 |
lemma FILTER_MAP: "ALL (f1::'b => bool) (f2::'a => 'b) l::'a list.
|
|
3940 |
filter f1 (map f2 l) = map f2 (filter (f1 o f2) l)"
|
|
3941 |
by (import rich_list FILTER_MAP)
|
|
3942 |
|
|
3943 |
lemma LENGTH_SEG: "ALL n k l. n + k <= length l --> length (SEG n k l) = n"
|
|
3944 |
by (import rich_list LENGTH_SEG)
|
|
3945 |
|
|
3946 |
lemma APPEND_NIL: "(ALL l::'a list. l @ [] = l) & (ALL x::'a list. [] @ x = x)"
|
|
3947 |
by (import rich_list APPEND_NIL)
|
|
3948 |
|
|
3949 |
lemma APPEND_SNOC: "ALL l1 x l2. l1 @ SNOC x l2 = SNOC x (l1 @ l2)"
|
|
3950 |
by (import rich_list APPEND_SNOC)
|
|
3951 |
|
|
3952 |
lemma APPEND_FOLDR: "ALL l1 l2. l1 @ l2 = foldr op # l1 l2"
|
|
3953 |
by (import rich_list APPEND_FOLDR)
|
|
3954 |
|
|
3955 |
lemma APPEND_FOLDL: "ALL l1 l2. l1 @ l2 = foldl (%l' x. SNOC x l') l1 l2"
|
|
3956 |
by (import rich_list APPEND_FOLDL)
|
|
3957 |
|
|
3958 |
lemma CONS_APPEND: "ALL x l. x # l = [x] @ l"
|
|
3959 |
by (import rich_list CONS_APPEND)
|
|
3960 |
|
|
3961 |
lemma ASSOC_APPEND: "ASSOC op @"
|
|
3962 |
by (import rich_list ASSOC_APPEND)
|
|
3963 |
|
|
3964 |
lemma MONOID_APPEND_NIL: "MONOID op @ []"
|
|
3965 |
by (import rich_list MONOID_APPEND_NIL)
|
|
3966 |
|
|
3967 |
lemma APPEND_LENGTH_EQ: "ALL l1 l1'.
|
|
3968 |
length l1 = length l1' -->
|
|
3969 |
(ALL l2 l2'.
|
|
3970 |
length l2 = length l2' -->
|
|
3971 |
(l1 @ l2 = l1' @ l2') = (l1 = l1' & l2 = l2'))"
|
|
3972 |
by (import rich_list APPEND_LENGTH_EQ)
|
|
3973 |
|
|
3974 |
lemma FLAT_SNOC: "ALL x l. concat (SNOC x l) = concat l @ x"
|
|
3975 |
by (import rich_list FLAT_SNOC)
|
|
3976 |
|
|
3977 |
lemma FLAT_FOLDR: "ALL l. concat l = foldr op @ l []"
|
|
3978 |
by (import rich_list FLAT_FOLDR)
|
|
3979 |
|
|
3980 |
lemma FLAT_FOLDL: "ALL l. concat l = foldl op @ [] l"
|
|
3981 |
by (import rich_list FLAT_FOLDL)
|
|
3982 |
|
|
3983 |
lemma LENGTH_FLAT: "ALL l. length (concat l) = sum (map size l)"
|
|
3984 |
by (import rich_list LENGTH_FLAT)
|
|
3985 |
|
|
3986 |
lemma REVERSE_FOLDR: "ALL l. rev l = foldr SNOC l []"
|
|
3987 |
by (import rich_list REVERSE_FOLDR)
|
|
3988 |
|
|
3989 |
lemma REVERSE_FOLDL: "ALL l. rev l = foldl (%l' x. x # l') [] l"
|
|
3990 |
by (import rich_list REVERSE_FOLDL)
|
|
3991 |
|
|
3992 |
lemma ALL_EL_SNOC: "ALL P x l. list_all P (SNOC x l) = (list_all P l & P x)"
|
|
3993 |
by (import rich_list ALL_EL_SNOC)
|
|
3994 |
|
|
3995 |
lemma ALL_EL_MAP: "ALL (P::'b => bool) (f::'a => 'b) l::'a list.
|
|
3996 |
list_all P (map f l) = list_all (P o f) l"
|
|
3997 |
by (import rich_list ALL_EL_MAP)
|
|
3998 |
|
|
3999 |
lemma SOME_EL_SNOC: "ALL P x l. list_exists P (SNOC x l) = (P x | list_exists P l)"
|
|
4000 |
by (import rich_list SOME_EL_SNOC)
|
|
4001 |
|
|
4002 |
lemma IS_EL_SNOC: "ALL y x l. y mem SNOC x l = (y = x | y mem l)"
|
|
4003 |
by (import rich_list IS_EL_SNOC)
|
|
4004 |
|
|
4005 |
lemma SUM_SNOC: "ALL x l. sum (SNOC x l) = sum l + x"
|
|
4006 |
by (import rich_list SUM_SNOC)
|
|
4007 |
|
|
4008 |
lemma SUM_FOLDL: "ALL l. sum l = foldl op + 0 l"
|
|
4009 |
by (import rich_list SUM_FOLDL)
|
|
4010 |
|
|
4011 |
lemma IS_PREFIX_APPEND: "ALL l1 l2. IS_PREFIX l1 l2 = (EX l. l1 = l2 @ l)"
|
|
4012 |
by (import rich_list IS_PREFIX_APPEND)
|
|
4013 |
|
|
4014 |
lemma IS_SUFFIX_APPEND: "ALL l1 l2. IS_SUFFIX l1 l2 = (EX l. l1 = l @ l2)"
|
|
4015 |
by (import rich_list IS_SUFFIX_APPEND)
|
|
4016 |
|
|
4017 |
lemma IS_SUBLIST_APPEND: "ALL l1 l2. IS_SUBLIST l1 l2 = (EX l l'. l1 = l @ l2 @ l')"
|
|
4018 |
by (import rich_list IS_SUBLIST_APPEND)
|
|
4019 |
|
|
4020 |
lemma IS_PREFIX_IS_SUBLIST: "ALL l1 l2. IS_PREFIX l1 l2 --> IS_SUBLIST l1 l2"
|
|
4021 |
by (import rich_list IS_PREFIX_IS_SUBLIST)
|
|
4022 |
|
|
4023 |
lemma IS_SUFFIX_IS_SUBLIST: "ALL l1 l2. IS_SUFFIX l1 l2 --> IS_SUBLIST l1 l2"
|
|
4024 |
by (import rich_list IS_SUFFIX_IS_SUBLIST)
|
|
4025 |
|
|
4026 |
lemma IS_PREFIX_REVERSE: "ALL l1 l2. IS_PREFIX (rev l1) (rev l2) = IS_SUFFIX l1 l2"
|
|
4027 |
by (import rich_list IS_PREFIX_REVERSE)
|
|
4028 |
|
|
4029 |
lemma IS_SUFFIX_REVERSE: "ALL l2 l1. IS_SUFFIX (rev l1) (rev l2) = IS_PREFIX l1 l2"
|
|
4030 |
by (import rich_list IS_SUFFIX_REVERSE)
|
|
4031 |
|
|
4032 |
lemma IS_SUBLIST_REVERSE: "ALL l1 l2. IS_SUBLIST (rev l1) (rev l2) = IS_SUBLIST l1 l2"
|
|
4033 |
by (import rich_list IS_SUBLIST_REVERSE)
|
|
4034 |
|
|
4035 |
lemma PREFIX_FOLDR: "ALL P x. PREFIX P x = foldr (%x l'. if P x then x # l' else []) x []"
|
|
4036 |
by (import rich_list PREFIX_FOLDR)
|
|
4037 |
|
|
4038 |
lemma PREFIX: "(ALL x::'a => bool. PREFIX x [] = []) &
|
|
4039 |
(ALL (x::'a => bool) (xa::'a) xb::'a list.
|
|
4040 |
PREFIX x (xa # xb) = (if x xa then xa # PREFIX x xb else []))"
|
|
4041 |
by (import rich_list PREFIX)
|
|
4042 |
|
|
4043 |
lemma IS_PREFIX_PREFIX: "ALL P l. IS_PREFIX l (PREFIX P l)"
|
|
4044 |
by (import rich_list IS_PREFIX_PREFIX)
|
|
4045 |
|
|
4046 |
lemma LENGTH_SCANL: "ALL (f::'b => 'a => 'b) (e::'b) l::'a list.
|
|
4047 |
length (SCANL f e l) = Suc (length l)"
|
|
4048 |
by (import rich_list LENGTH_SCANL)
|
|
4049 |
|
|
4050 |
lemma LENGTH_SCANR: "ALL f e l. length (SCANR f e l) = Suc (length l)"
|
|
4051 |
by (import rich_list LENGTH_SCANR)
|
|
4052 |
|
|
4053 |
lemma COMM_MONOID_FOLDL: "ALL x.
|
|
4054 |
COMM x -->
|
|
4055 |
(ALL xa. MONOID x xa --> (ALL e l. foldl x e l = x e (foldl x xa l)))"
|
|
4056 |
by (import rich_list COMM_MONOID_FOLDL)
|
|
4057 |
|
|
4058 |
lemma COMM_MONOID_FOLDR: "ALL x.
|
|
4059 |
COMM x -->
|
|
4060 |
(ALL xa. MONOID x xa --> (ALL e l. foldr x l e = x e (foldr x l xa)))"
|
|
4061 |
by (import rich_list COMM_MONOID_FOLDR)
|
|
4062 |
|
|
4063 |
lemma FCOMM_FOLDR_APPEND: "ALL x xa.
|
|
4064 |
FCOMM x xa -->
|
|
4065 |
(ALL xb.
|
|
4066 |
LEFT_ID x xb -->
|
|
4067 |
(ALL l1 l2.
|
|
4068 |
foldr xa (l1 @ l2) xb = x (foldr xa l1 xb) (foldr xa l2 xb)))"
|
|
4069 |
by (import rich_list FCOMM_FOLDR_APPEND)
|
|
4070 |
|
|
4071 |
lemma FCOMM_FOLDL_APPEND: "ALL x xa.
|
|
4072 |
FCOMM x xa -->
|
|
4073 |
(ALL xb.
|
|
4074 |
RIGHT_ID xa xb -->
|
|
4075 |
(ALL l1 l2.
|
|
4076 |
foldl x xb (l1 @ l2) = xa (foldl x xb l1) (foldl x xb l2)))"
|
|
4077 |
by (import rich_list FCOMM_FOLDL_APPEND)
|
|
4078 |
|
|
4079 |
lemma FOLDL_SINGLE: "ALL x xa xb. foldl x xa [xb] = x xa xb"
|
|
4080 |
by (import rich_list FOLDL_SINGLE)
|
|
4081 |
|
|
4082 |
lemma FOLDR_SINGLE: "ALL x xa xb. foldr x [xb] xa = x xb xa"
|
|
4083 |
by (import rich_list FOLDR_SINGLE)
|
|
4084 |
|
|
4085 |
lemma FOLDR_CONS_NIL: "ALL l. foldr op # l [] = l"
|
|
4086 |
by (import rich_list FOLDR_CONS_NIL)
|
|
4087 |
|
|
4088 |
lemma FOLDL_SNOC_NIL: "ALL l. foldl (%xs x. SNOC x xs) [] l = l"
|
|
4089 |
by (import rich_list FOLDL_SNOC_NIL)
|
|
4090 |
|
|
4091 |
lemma FOLDR_REVERSE: "ALL x xa xb. foldr x (rev xb) xa = foldl (%xa y. x y xa) xa xb"
|
|
4092 |
by (import rich_list FOLDR_REVERSE)
|
|
4093 |
|
|
4094 |
lemma FOLDL_REVERSE: "ALL x xa xb. foldl x xa (rev xb) = foldr (%xa y. x y xa) xb xa"
|
|
4095 |
by (import rich_list FOLDL_REVERSE)
|
|
4096 |
|
|
4097 |
lemma FOLDR_MAP: "ALL (f::'a => 'a => 'a) (e::'a) (g::'b => 'a) l::'b list.
|
|
4098 |
foldr f (map g l) e = foldr (%x::'b. f (g x)) l e"
|
|
4099 |
by (import rich_list FOLDR_MAP)
|
|
4100 |
|
|
4101 |
lemma FOLDL_MAP: "ALL (f::'a => 'a => 'a) (e::'a) (g::'b => 'a) l::'b list.
|
|
4102 |
foldl f e (map g l) = foldl (%(x::'a) y::'b. f x (g y)) e l"
|
|
4103 |
by (import rich_list FOLDL_MAP)
|
|
4104 |
|
|
4105 |
lemma ALL_EL_FOLDR: "ALL P l. list_all P l = foldr (%x. op & (P x)) l True"
|
|
4106 |
by (import rich_list ALL_EL_FOLDR)
|
|
4107 |
|
|
4108 |
lemma ALL_EL_FOLDL: "ALL P l. list_all P l = foldl (%l' x. l' & P x) True l"
|
|
4109 |
by (import rich_list ALL_EL_FOLDL)
|
|
4110 |
|
|
4111 |
lemma SOME_EL_FOLDR: "ALL P l. list_exists P l = foldr (%x. op | (P x)) l False"
|
|
4112 |
by (import rich_list SOME_EL_FOLDR)
|
|
4113 |
|
|
4114 |
lemma SOME_EL_FOLDL: "ALL P l. list_exists P l = foldl (%l' x. l' | P x) False l"
|
|
4115 |
by (import rich_list SOME_EL_FOLDL)
|
|
4116 |
|
|
4117 |
lemma ALL_EL_FOLDR_MAP: "ALL x xa. list_all x xa = foldr op & (map x xa) True"
|
|
4118 |
by (import rich_list ALL_EL_FOLDR_MAP)
|
|
4119 |
|
|
4120 |
lemma ALL_EL_FOLDL_MAP: "ALL x xa. list_all x xa = foldl op & True (map x xa)"
|
|
4121 |
by (import rich_list ALL_EL_FOLDL_MAP)
|
|
4122 |
|
|
4123 |
lemma SOME_EL_FOLDR_MAP: "ALL x xa. list_exists x xa = foldr op | (map x xa) False"
|
|
4124 |
by (import rich_list SOME_EL_FOLDR_MAP)
|
|
4125 |
|
|
4126 |
lemma SOME_EL_FOLDL_MAP: "ALL x xa. list_exists x xa = foldl op | False (map x xa)"
|
|
4127 |
by (import rich_list SOME_EL_FOLDL_MAP)
|
|
4128 |
|
|
4129 |
lemma FOLDR_FILTER: "ALL (f::'a => 'a => 'a) (e::'a) (P::'a => bool) l::'a list.
|
|
4130 |
foldr f (filter P l) e =
|
|
4131 |
foldr (%(x::'a) y::'a. if P x then f x y else y) l e"
|
|
4132 |
by (import rich_list FOLDR_FILTER)
|
|
4133 |
|
|
4134 |
lemma FOLDL_FILTER: "ALL (f::'a => 'a => 'a) (e::'a) (P::'a => bool) l::'a list.
|
|
4135 |
foldl f e (filter P l) =
|
|
4136 |
foldl (%(x::'a) y::'a. if P y then f x y else x) e l"
|
|
4137 |
by (import rich_list FOLDL_FILTER)
|
|
4138 |
|
|
4139 |
lemma ASSOC_FOLDR_FLAT: "ALL f.
|
|
4140 |
ASSOC f -->
|
|
4141 |
(ALL e.
|
|
4142 |
LEFT_ID f e -->
|
|
4143 |
(ALL l. foldr f (concat l) e = foldr f (map (FOLDR f e) l) e))"
|
|
4144 |
by (import rich_list ASSOC_FOLDR_FLAT)
|
|
4145 |
|
|
4146 |
lemma ASSOC_FOLDL_FLAT: "ALL f.
|
|
4147 |
ASSOC f -->
|
|
4148 |
(ALL e.
|
|
4149 |
RIGHT_ID f e -->
|
|
4150 |
(ALL l. foldl f e (concat l) = foldl f e (map (foldl f e) l)))"
|
|
4151 |
by (import rich_list ASSOC_FOLDL_FLAT)
|
|
4152 |
|
|
4153 |
lemma SOME_EL_MAP: "ALL (P::'b => bool) (f::'a => 'b) l::'a list.
|
|
4154 |
list_exists P (map f l) = list_exists (P o f) l"
|
|
4155 |
by (import rich_list SOME_EL_MAP)
|
|
4156 |
|
|
4157 |
lemma SOME_EL_DISJ: "ALL P Q l.
|
|
4158 |
list_exists (%x. P x | Q x) l = (list_exists P l | list_exists Q l)"
|
|
4159 |
by (import rich_list SOME_EL_DISJ)
|
|
4160 |
|
|
4161 |
lemma IS_EL_FOLDR: "ALL x xa. x mem xa = foldr (%xa. op | (x = xa)) xa False"
|
|
4162 |
by (import rich_list IS_EL_FOLDR)
|
|
4163 |
|
|
4164 |
lemma IS_EL_FOLDL: "ALL x xa. x mem xa = foldl (%l' xa. l' | x = xa) False xa"
|
|
4165 |
by (import rich_list IS_EL_FOLDL)
|
|
4166 |
|
|
4167 |
lemma NULL_FOLDR: "ALL l. null l = foldr (%x l'. False) l True"
|
|
4168 |
by (import rich_list NULL_FOLDR)
|
|
4169 |
|
|
4170 |
lemma NULL_FOLDL: "ALL l. null l = foldl (%x l'. False) True l"
|
|
4171 |
by (import rich_list NULL_FOLDL)
|
|
4172 |
|
|
4173 |
lemma FILTER_REVERSE: "ALL P l. filter P (rev l) = rev (filter P l)"
|
|
4174 |
by (import rich_list FILTER_REVERSE)
|
|
4175 |
|
|
4176 |
lemma SEG_LENGTH_ID: "ALL l. SEG (length l) 0 l = l"
|
|
4177 |
by (import rich_list SEG_LENGTH_ID)
|
|
4178 |
|
|
4179 |
lemma SEG_SUC_CONS: "ALL m n l x. SEG m (Suc n) (x # l) = SEG m n l"
|
|
4180 |
by (import rich_list SEG_SUC_CONS)
|
|
4181 |
|
|
4182 |
lemma SEG_0_SNOC: "ALL m l x. m <= length l --> SEG m 0 (SNOC x l) = SEG m 0 l"
|
|
4183 |
by (import rich_list SEG_0_SNOC)
|
|
4184 |
|
|
4185 |
lemma BUTLASTN_SEG: "ALL n l. n <= length l --> BUTLASTN n l = SEG (length l - n) 0 l"
|
|
4186 |
by (import rich_list BUTLASTN_SEG)
|
|
4187 |
|
|
4188 |
lemma LASTN_CONS: "ALL n l. n <= length l --> (ALL x. LASTN n (x # l) = LASTN n l)"
|
|
4189 |
by (import rich_list LASTN_CONS)
|
|
4190 |
|
|
4191 |
lemma LENGTH_LASTN: "ALL n l. n <= length l --> length (LASTN n l) = n"
|
|
4192 |
by (import rich_list LENGTH_LASTN)
|
|
4193 |
|
|
4194 |
lemma LASTN_LENGTH_ID: "ALL l. LASTN (length l) l = l"
|
|
4195 |
by (import rich_list LASTN_LENGTH_ID)
|
|
4196 |
|
|
4197 |
lemma LASTN_LASTN: "ALL l n m. m <= length l --> n <= m --> LASTN n (LASTN m l) = LASTN n l"
|
|
4198 |
by (import rich_list LASTN_LASTN)
|
|
4199 |
|
|
4200 |
lemma FIRSTN_LENGTH_ID: "ALL l. FIRSTN (length l) l = l"
|
|
4201 |
by (import rich_list FIRSTN_LENGTH_ID)
|
|
4202 |
|
|
4203 |
lemma FIRSTN_SNOC: "ALL n l. n <= length l --> (ALL x. FIRSTN n (SNOC x l) = FIRSTN n l)"
|
|
4204 |
by (import rich_list FIRSTN_SNOC)
|
|
4205 |
|
|
4206 |
lemma BUTLASTN_LENGTH_NIL: "ALL l. BUTLASTN (length l) l = []"
|
|
4207 |
by (import rich_list BUTLASTN_LENGTH_NIL)
|
|
4208 |
|
|
4209 |
lemma BUTLASTN_SUC_BUTLAST: "ALL n l. n < length l --> BUTLASTN (Suc n) l = BUTLASTN n (butlast l)"
|
|
4210 |
by (import rich_list BUTLASTN_SUC_BUTLAST)
|
|
4211 |
|
|
4212 |
lemma BUTLASTN_BUTLAST: "ALL n l. n < length l --> BUTLASTN n (butlast l) = butlast (BUTLASTN n l)"
|
|
4213 |
by (import rich_list BUTLASTN_BUTLAST)
|
|
4214 |
|
|
4215 |
lemma LENGTH_BUTLASTN: "ALL n l. n <= length l --> length (BUTLASTN n l) = length l - n"
|
|
4216 |
by (import rich_list LENGTH_BUTLASTN)
|
|
4217 |
|
|
4218 |
lemma BUTLASTN_BUTLASTN: "ALL m n l.
|
|
4219 |
n + m <= length l --> BUTLASTN n (BUTLASTN m l) = BUTLASTN (n + m) l"
|
|
4220 |
by (import rich_list BUTLASTN_BUTLASTN)
|
|
4221 |
|
|
4222 |
lemma APPEND_BUTLASTN_LASTN: "ALL n l. n <= length l --> BUTLASTN n l @ LASTN n l = l"
|
|
4223 |
by (import rich_list APPEND_BUTLASTN_LASTN)
|
|
4224 |
|
|
4225 |
lemma APPEND_FIRSTN_LASTN: "ALL m n l. m + n = length l --> FIRSTN n l @ LASTN m l = l"
|
|
4226 |
by (import rich_list APPEND_FIRSTN_LASTN)
|
|
4227 |
|
|
4228 |
lemma BUTLASTN_APPEND2: "ALL n l1 l2. n <= length l2 --> BUTLASTN n (l1 @ l2) = l1 @ BUTLASTN n l2"
|
|
4229 |
by (import rich_list BUTLASTN_APPEND2)
|
|
4230 |
|
|
4231 |
lemma BUTLASTN_LENGTH_APPEND: "ALL l2 l1. BUTLASTN (length l2) (l1 @ l2) = l1"
|
|
4232 |
by (import rich_list BUTLASTN_LENGTH_APPEND)
|
|
4233 |
|
|
4234 |
lemma LASTN_LENGTH_APPEND: "ALL l2 l1. LASTN (length l2) (l1 @ l2) = l2"
|
|
4235 |
by (import rich_list LASTN_LENGTH_APPEND)
|
|
4236 |
|
|
4237 |
lemma BUTLASTN_CONS: "ALL n l. n <= length l --> (ALL x. BUTLASTN n (x # l) = x # BUTLASTN n l)"
|
|
4238 |
by (import rich_list BUTLASTN_CONS)
|
|
4239 |
|
|
4240 |
lemma BUTLASTN_LENGTH_CONS: "ALL l x. BUTLASTN (length l) (x # l) = [x]"
|
|
4241 |
by (import rich_list BUTLASTN_LENGTH_CONS)
|
|
4242 |
|
|
4243 |
lemma LAST_LASTN_LAST: "ALL n l. n <= length l --> 0 < n --> last (LASTN n l) = last l"
|
|
4244 |
by (import rich_list LAST_LASTN_LAST)
|
|
4245 |
|
|
4246 |
lemma BUTLASTN_LASTN_NIL: "ALL n l. n <= length l --> BUTLASTN n (LASTN n l) = []"
|
|
4247 |
by (import rich_list BUTLASTN_LASTN_NIL)
|
|
4248 |
|
|
4249 |
lemma LASTN_BUTLASTN: "ALL n m l.
|
|
4250 |
n + m <= length l -->
|
|
4251 |
LASTN n (BUTLASTN m l) = BUTLASTN m (LASTN (n + m) l)"
|
|
4252 |
by (import rich_list LASTN_BUTLASTN)
|
|
4253 |
|
|
4254 |
lemma BUTLASTN_LASTN: "ALL m n l.
|
|
4255 |
m <= n & n <= length l -->
|
|
4256 |
BUTLASTN m (LASTN n l) = LASTN (n - m) (BUTLASTN m l)"
|
|
4257 |
by (import rich_list BUTLASTN_LASTN)
|
|
4258 |
|
|
4259 |
lemma LASTN_1: "ALL l. l ~= [] --> LASTN 1 l = [last l]"
|
|
4260 |
by (import rich_list LASTN_1)
|
|
4261 |
|
|
4262 |
lemma BUTLASTN_1: "ALL l. l ~= [] --> BUTLASTN 1 l = butlast l"
|
|
4263 |
by (import rich_list BUTLASTN_1)
|
|
4264 |
|
|
4265 |
lemma BUTLASTN_APPEND1: "ALL l2 n.
|
|
4266 |
length l2 <= n -->
|
|
4267 |
(ALL l1. BUTLASTN n (l1 @ l2) = BUTLASTN (n - length l2) l1)"
|
|
4268 |
by (import rich_list BUTLASTN_APPEND1)
|
|
4269 |
|
|
4270 |
lemma LASTN_APPEND2: "ALL n l2. n <= length l2 --> (ALL l1. LASTN n (l1 @ l2) = LASTN n l2)"
|
|
4271 |
by (import rich_list LASTN_APPEND2)
|
|
4272 |
|
|
4273 |
lemma LASTN_APPEND1: "ALL l2 n.
|
|
4274 |
length l2 <= n -->
|
|
4275 |
(ALL l1. LASTN n (l1 @ l2) = LASTN (n - length l2) l1 @ l2)"
|
|
4276 |
by (import rich_list LASTN_APPEND1)
|
|
4277 |
|
|
4278 |
lemma LASTN_MAP: "ALL n l. n <= length l --> (ALL f. LASTN n (map f l) = map f (LASTN n l))"
|
|
4279 |
by (import rich_list LASTN_MAP)
|
|
4280 |
|
|
4281 |
lemma BUTLASTN_MAP: "ALL n l.
|
|
4282 |
n <= length l --> (ALL f. BUTLASTN n (map f l) = map f (BUTLASTN n l))"
|
|
4283 |
by (import rich_list BUTLASTN_MAP)
|
|
4284 |
|
|
4285 |
lemma ALL_EL_LASTN: "ALL P l. list_all P l --> (ALL m<=length l. list_all P (LASTN m l))"
|
|
4286 |
by (import rich_list ALL_EL_LASTN)
|
|
4287 |
|
|
4288 |
lemma ALL_EL_BUTLASTN: "ALL P l. list_all P l --> (ALL m<=length l. list_all P (BUTLASTN m l))"
|
|
4289 |
by (import rich_list ALL_EL_BUTLASTN)
|
|
4290 |
|
|
4291 |
lemma LENGTH_FIRSTN: "ALL n l. n <= length l --> length (FIRSTN n l) = n"
|
|
4292 |
by (import rich_list LENGTH_FIRSTN)
|
|
4293 |
|
|
4294 |
lemma FIRSTN_FIRSTN: "ALL m l. m <= length l --> (ALL n<=m. FIRSTN n (FIRSTN m l) = FIRSTN n l)"
|
|
4295 |
by (import rich_list FIRSTN_FIRSTN)
|
|
4296 |
|
|
4297 |
lemma LENGTH_BUTFIRSTN: "ALL n l. n <= length l --> length (BUTFIRSTN n l) = length l - n"
|
|
4298 |
by (import rich_list LENGTH_BUTFIRSTN)
|
|
4299 |
|
|
4300 |
lemma BUTFIRSTN_LENGTH_NIL: "ALL l. BUTFIRSTN (length l) l = []"
|
|
4301 |
by (import rich_list BUTFIRSTN_LENGTH_NIL)
|
|
4302 |
|
|
4303 |
lemma BUTFIRSTN_APPEND1: "ALL n l1.
|
|
4304 |
n <= length l1 --> (ALL l2. BUTFIRSTN n (l1 @ l2) = BUTFIRSTN n l1 @ l2)"
|
|
4305 |
by (import rich_list BUTFIRSTN_APPEND1)
|
|
4306 |
|
|
4307 |
lemma BUTFIRSTN_APPEND2: "ALL l1 n.
|
|
4308 |
length l1 <= n -->
|
|
4309 |
(ALL l2. BUTFIRSTN n (l1 @ l2) = BUTFIRSTN (n - length l1) l2)"
|
|
4310 |
by (import rich_list BUTFIRSTN_APPEND2)
|
|
4311 |
|
|
4312 |
lemma BUTFIRSTN_BUTFIRSTN: "ALL n m l.
|
|
4313 |
n + m <= length l --> BUTFIRSTN n (BUTFIRSTN m l) = BUTFIRSTN (n + m) l"
|
|
4314 |
by (import rich_list BUTFIRSTN_BUTFIRSTN)
|
|
4315 |
|
|
4316 |
lemma APPEND_FIRSTN_BUTFIRSTN: "ALL n l. n <= length l --> FIRSTN n l @ BUTFIRSTN n l = l"
|
|
4317 |
by (import rich_list APPEND_FIRSTN_BUTFIRSTN)
|
|
4318 |
|
|
4319 |
lemma LASTN_SEG: "ALL n l. n <= length l --> LASTN n l = SEG n (length l - n) l"
|
|
4320 |
by (import rich_list LASTN_SEG)
|
|
4321 |
|
|
4322 |
lemma FIRSTN_SEG: "ALL n l. n <= length l --> FIRSTN n l = SEG n 0 l"
|
|
4323 |
by (import rich_list FIRSTN_SEG)
|
|
4324 |
|
|
4325 |
lemma BUTFIRSTN_SEG: "ALL n l. n <= length l --> BUTFIRSTN n l = SEG (length l - n) n l"
|
|
4326 |
by (import rich_list BUTFIRSTN_SEG)
|
|
4327 |
|
|
4328 |
lemma BUTFIRSTN_SNOC: "ALL n l.
|
|
4329 |
n <= length l -->
|
|
4330 |
(ALL x. BUTFIRSTN n (SNOC x l) = SNOC x (BUTFIRSTN n l))"
|
|
4331 |
by (import rich_list BUTFIRSTN_SNOC)
|
|
4332 |
|
|
4333 |
lemma APPEND_BUTLASTN_BUTFIRSTN: "ALL m n l. m + n = length l --> BUTLASTN m l @ BUTFIRSTN n l = l"
|
|
4334 |
by (import rich_list APPEND_BUTLASTN_BUTFIRSTN)
|
|
4335 |
|
|
4336 |
lemma SEG_SEG: "ALL n1 m1 n2 m2 l.
|
|
4337 |
n1 + m1 <= length l & n2 + m2 <= n1 -->
|
|
4338 |
SEG n2 m2 (SEG n1 m1 l) = SEG n2 (m1 + m2) l"
|
|
4339 |
by (import rich_list SEG_SEG)
|
|
4340 |
|
|
4341 |
lemma SEG_APPEND1: "ALL n m l1. n + m <= length l1 --> (ALL l2. SEG n m (l1 @ l2) = SEG n m l1)"
|
|
4342 |
by (import rich_list SEG_APPEND1)
|
|
4343 |
|
|
4344 |
lemma SEG_APPEND2: "ALL l1 m n l2.
|
|
4345 |
length l1 <= m & n <= length l2 -->
|
|
4346 |
SEG n m (l1 @ l2) = SEG n (m - length l1) l2"
|
|
4347 |
by (import rich_list SEG_APPEND2)
|
|
4348 |
|
|
4349 |
lemma SEG_FIRSTN_BUTFISTN: "ALL n m l. n + m <= length l --> SEG n m l = FIRSTN n (BUTFIRSTN m l)"
|
|
4350 |
by (import rich_list SEG_FIRSTN_BUTFISTN)
|
|
4351 |
|
|
4352 |
lemma SEG_APPEND: "ALL m l1 n l2.
|
|
4353 |
m < length l1 & length l1 <= n + m & n + m <= length l1 + length l2 -->
|
|
4354 |
SEG n m (l1 @ l2) =
|
|
4355 |
SEG (length l1 - m) m l1 @ SEG (n + m - length l1) 0 l2"
|
|
4356 |
by (import rich_list SEG_APPEND)
|
|
4357 |
|
|
4358 |
lemma SEG_LENGTH_SNOC: "ALL x xa. SEG 1 (length x) (SNOC xa x) = [xa]"
|
|
4359 |
by (import rich_list SEG_LENGTH_SNOC)
|
|
4360 |
|
|
4361 |
lemma SEG_SNOC: "ALL n m l. n + m <= length l --> (ALL x. SEG n m (SNOC x l) = SEG n m l)"
|
|
4362 |
by (import rich_list SEG_SNOC)
|
|
4363 |
|
|
4364 |
lemma ELL_SEG: "ALL n l. n < length l --> ELL n l = hd (SEG 1 (PRE (length l - n)) l)"
|
|
4365 |
by (import rich_list ELL_SEG)
|
|
4366 |
|
|
4367 |
lemma SNOC_FOLDR: "ALL x l. SNOC x l = foldr op # l [x]"
|
|
4368 |
by (import rich_list SNOC_FOLDR)
|
|
4369 |
|
|
4370 |
lemma IS_EL_FOLDR_MAP: "ALL x xa. x mem xa = foldr op | (map (op = x) xa) False"
|
|
4371 |
by (import rich_list IS_EL_FOLDR_MAP)
|
|
4372 |
|
|
4373 |
lemma IS_EL_FOLDL_MAP: "ALL x xa. x mem xa = foldl op | False (map (op = x) xa)"
|
|
4374 |
by (import rich_list IS_EL_FOLDL_MAP)
|
|
4375 |
|
|
4376 |
lemma FILTER_FILTER: "ALL P Q l. filter P (filter Q l) = [x:l. P x & Q x]"
|
|
4377 |
by (import rich_list FILTER_FILTER)
|
|
4378 |
|
|
4379 |
lemma FCOMM_FOLDR_FLAT: "ALL g f.
|
|
4380 |
FCOMM g f -->
|
|
4381 |
(ALL e.
|
|
4382 |
LEFT_ID g e -->
|
|
4383 |
(ALL l. foldr f (concat l) e = foldr g (map (FOLDR f e) l) e))"
|
|
4384 |
by (import rich_list FCOMM_FOLDR_FLAT)
|
|
4385 |
|
|
4386 |
lemma FCOMM_FOLDL_FLAT: "ALL f g.
|
|
4387 |
FCOMM f g -->
|
|
4388 |
(ALL e.
|
|
4389 |
RIGHT_ID g e -->
|
|
4390 |
(ALL l. foldl f e (concat l) = foldl g e (map (foldl f e) l)))"
|
|
4391 |
by (import rich_list FCOMM_FOLDL_FLAT)
|
|
4392 |
|
|
4393 |
lemma FOLDR_MAP_REVERSE: "ALL f::'a => 'a => 'a.
|
|
4394 |
(ALL (a::'a) (b::'a) c::'a. f a (f b c) = f b (f a c)) -->
|
|
4395 |
(ALL (e::'a) (g::'b => 'a) l::'b list.
|
|
4396 |
foldr f (map g (rev l)) e = foldr f (map g l) e)"
|
|
4397 |
by (import rich_list FOLDR_MAP_REVERSE)
|
|
4398 |
|
|
4399 |
lemma FOLDR_FILTER_REVERSE: "ALL f::'a => 'a => 'a.
|
|
4400 |
(ALL (a::'a) (b::'a) c::'a. f a (f b c) = f b (f a c)) -->
|
|
4401 |
(ALL (e::'a) (P::'a => bool) l::'a list.
|
|
4402 |
foldr f (filter P (rev l)) e = foldr f (filter P l) e)"
|
|
4403 |
by (import rich_list FOLDR_FILTER_REVERSE)
|
|
4404 |
|
|
4405 |
lemma COMM_ASSOC_FOLDR_REVERSE: "ALL f. COMM f --> ASSOC f --> (ALL e l. foldr f (rev l) e = foldr f l e)"
|
|
4406 |
by (import rich_list COMM_ASSOC_FOLDR_REVERSE)
|
|
4407 |
|
|
4408 |
lemma COMM_ASSOC_FOLDL_REVERSE: "ALL f. COMM f --> ASSOC f --> (ALL e l. foldl f e (rev l) = foldl f e l)"
|
|
4409 |
by (import rich_list COMM_ASSOC_FOLDL_REVERSE)
|
|
4410 |
|
|
4411 |
lemma ELL_LAST: "ALL l. ~ null l --> ELL 0 l = last l"
|
|
4412 |
by (import rich_list ELL_LAST)
|
|
4413 |
|
|
4414 |
lemma ELL_0_SNOC: "ALL l x. ELL 0 (SNOC x l) = x"
|
|
4415 |
by (import rich_list ELL_0_SNOC)
|
|
4416 |
|
|
4417 |
lemma ELL_SNOC: "ALL n. 0 < n --> (ALL x l. ELL n (SNOC x l) = ELL (PRE n) l)"
|
|
4418 |
by (import rich_list ELL_SNOC)
|
|
4419 |
|
|
4420 |
lemma ELL_SUC_SNOC: "ALL n x xa. ELL (Suc n) (SNOC x xa) = ELL n xa"
|
|
4421 |
by (import rich_list ELL_SUC_SNOC)
|
|
4422 |
|
|
4423 |
lemma ELL_CONS: "ALL n l. n < length l --> (ALL x. ELL n (x # l) = ELL n l)"
|
|
4424 |
by (import rich_list ELL_CONS)
|
|
4425 |
|
|
4426 |
lemma ELL_LENGTH_CONS: "ALL l x. ELL (length l) (x # l) = x"
|
|
4427 |
by (import rich_list ELL_LENGTH_CONS)
|
|
4428 |
|
|
4429 |
lemma ELL_LENGTH_SNOC: "ALL l x. ELL (length l) (SNOC x l) = (if null l then x else hd l)"
|
|
4430 |
by (import rich_list ELL_LENGTH_SNOC)
|
|
4431 |
|
|
4432 |
lemma ELL_APPEND2: "ALL n l2. n < length l2 --> (ALL l1. ELL n (l1 @ l2) = ELL n l2)"
|
|
4433 |
by (import rich_list ELL_APPEND2)
|
|
4434 |
|
|
4435 |
lemma ELL_APPEND1: "ALL l2 n.
|
|
4436 |
length l2 <= n --> (ALL l1. ELL n (l1 @ l2) = ELL (n - length l2) l1)"
|
|
4437 |
by (import rich_list ELL_APPEND1)
|
|
4438 |
|
|
4439 |
lemma ELL_PRE_LENGTH: "ALL l. l ~= [] --> ELL (PRE (length l)) l = hd l"
|
|
4440 |
by (import rich_list ELL_PRE_LENGTH)
|
|
4441 |
|
|
4442 |
lemma EL_LENGTH_SNOC: "ALL l x. EL (length l) (SNOC x l) = x"
|
|
4443 |
by (import rich_list EL_LENGTH_SNOC)
|
|
4444 |
|
|
4445 |
lemma EL_PRE_LENGTH: "ALL l. l ~= [] --> EL (PRE (length l)) l = last l"
|
|
4446 |
by (import rich_list EL_PRE_LENGTH)
|
|
4447 |
|
|
4448 |
lemma EL_SNOC: "ALL n l. n < length l --> (ALL x. EL n (SNOC x l) = EL n l)"
|
|
4449 |
by (import rich_list EL_SNOC)
|
|
4450 |
|
|
4451 |
lemma EL_ELL: "ALL n l. n < length l --> EL n l = ELL (PRE (length l - n)) l"
|
|
4452 |
by (import rich_list EL_ELL)
|
|
4453 |
|
|
4454 |
lemma EL_LENGTH_APPEND: "ALL l2 l1. ~ null l2 --> EL (length l1) (l1 @ l2) = hd l2"
|
|
4455 |
by (import rich_list EL_LENGTH_APPEND)
|
|
4456 |
|
|
4457 |
lemma ELL_EL: "ALL n l. n < length l --> ELL n l = EL (PRE (length l - n)) l"
|
|
4458 |
by (import rich_list ELL_EL)
|
|
4459 |
|
|
4460 |
lemma ELL_MAP: "ALL n l f. n < length l --> ELL n (map f l) = f (ELL n l)"
|
|
4461 |
by (import rich_list ELL_MAP)
|
|
4462 |
|
|
4463 |
lemma LENGTH_BUTLAST: "ALL l. l ~= [] --> length (butlast l) = PRE (length l)"
|
|
4464 |
by (import rich_list LENGTH_BUTLAST)
|
|
4465 |
|
|
4466 |
lemma BUTFIRSTN_LENGTH_APPEND: "ALL l1 l2. BUTFIRSTN (length l1) (l1 @ l2) = l2"
|
|
4467 |
by (import rich_list BUTFIRSTN_LENGTH_APPEND)
|
|
4468 |
|
|
4469 |
lemma FIRSTN_APPEND1: "ALL n l1. n <= length l1 --> (ALL l2. FIRSTN n (l1 @ l2) = FIRSTN n l1)"
|
|
4470 |
by (import rich_list FIRSTN_APPEND1)
|
|
4471 |
|
|
4472 |
lemma FIRSTN_APPEND2: "ALL l1 n.
|
|
4473 |
length l1 <= n -->
|
|
4474 |
(ALL l2. FIRSTN n (l1 @ l2) = l1 @ FIRSTN (n - length l1) l2)"
|
|
4475 |
by (import rich_list FIRSTN_APPEND2)
|
|
4476 |
|
|
4477 |
lemma FIRSTN_LENGTH_APPEND: "ALL l1 l2. FIRSTN (length l1) (l1 @ l2) = l1"
|
|
4478 |
by (import rich_list FIRSTN_LENGTH_APPEND)
|
|
4479 |
|
|
4480 |
lemma REVERSE_FLAT: "ALL l. rev (concat l) = concat (rev (map rev l))"
|
|
4481 |
by (import rich_list REVERSE_FLAT)
|
|
4482 |
|
|
4483 |
lemma MAP_FILTER: "ALL f P l.
|
|
4484 |
(ALL x. P (f x) = P x) --> map f (filter P l) = filter P (map f l)"
|
|
4485 |
by (import rich_list MAP_FILTER)
|
|
4486 |
|
|
4487 |
lemma FLAT_REVERSE: "ALL l. concat (rev l) = rev (concat (map rev l))"
|
|
4488 |
by (import rich_list FLAT_REVERSE)
|
|
4489 |
|
|
4490 |
lemma FLAT_FLAT: "ALL l. concat (concat l) = concat (map concat l)"
|
|
4491 |
by (import rich_list FLAT_FLAT)
|
|
4492 |
|
|
4493 |
lemma ALL_EL_REVERSE: "ALL P l. list_all P (rev l) = list_all P l"
|
|
4494 |
by (import rich_list ALL_EL_REVERSE)
|
|
4495 |
|
|
4496 |
lemma SOME_EL_REVERSE: "ALL P l. list_exists P (rev l) = list_exists P l"
|
|
4497 |
by (import rich_list SOME_EL_REVERSE)
|
|
4498 |
|
|
4499 |
lemma ALL_EL_SEG: "ALL P l.
|
|
4500 |
list_all P l --> (ALL m k. m + k <= length l --> list_all P (SEG m k l))"
|
|
4501 |
by (import rich_list ALL_EL_SEG)
|
|
4502 |
|
|
4503 |
lemma ALL_EL_FIRSTN: "ALL P l. list_all P l --> (ALL m<=length l. list_all P (FIRSTN m l))"
|
|
4504 |
by (import rich_list ALL_EL_FIRSTN)
|
|
4505 |
|
|
4506 |
lemma ALL_EL_BUTFIRSTN: "ALL P l. list_all P l --> (ALL m<=length l. list_all P (BUTFIRSTN m l))"
|
|
4507 |
by (import rich_list ALL_EL_BUTFIRSTN)
|
|
4508 |
|
|
4509 |
lemma SOME_EL_SEG: "ALL m k l.
|
|
4510 |
m + k <= length l -->
|
|
4511 |
(ALL P. list_exists P (SEG m k l) --> list_exists P l)"
|
|
4512 |
by (import rich_list SOME_EL_SEG)
|
|
4513 |
|
|
4514 |
lemma SOME_EL_FIRSTN: "ALL m l.
|
|
4515 |
m <= length l --> (ALL P. list_exists P (FIRSTN m l) --> list_exists P l)"
|
|
4516 |
by (import rich_list SOME_EL_FIRSTN)
|
|
4517 |
|
|
4518 |
lemma SOME_EL_BUTFIRSTN: "ALL m l.
|
|
4519 |
m <= length l -->
|
|
4520 |
(ALL P. list_exists P (BUTFIRSTN m l) --> list_exists P l)"
|
|
4521 |
by (import rich_list SOME_EL_BUTFIRSTN)
|
|
4522 |
|
|
4523 |
lemma SOME_EL_LASTN: "ALL m l.
|
|
4524 |
m <= length l --> (ALL P. list_exists P (LASTN m l) --> list_exists P l)"
|
|
4525 |
by (import rich_list SOME_EL_LASTN)
|
|
4526 |
|
|
4527 |
lemma SOME_EL_BUTLASTN: "ALL m l.
|
|
4528 |
m <= length l -->
|
|
4529 |
(ALL P. list_exists P (BUTLASTN m l) --> list_exists P l)"
|
|
4530 |
by (import rich_list SOME_EL_BUTLASTN)
|
|
4531 |
|
|
4532 |
lemma IS_EL_REVERSE: "ALL x l. x mem rev l = x mem l"
|
|
4533 |
by (import rich_list IS_EL_REVERSE)
|
|
4534 |
|
|
4535 |
lemma IS_EL_FILTER: "ALL P x. P x --> (ALL l. x mem filter P l = x mem l)"
|
|
4536 |
by (import rich_list IS_EL_FILTER)
|
|
4537 |
|
|
4538 |
lemma IS_EL_SEG: "ALL n m l. n + m <= length l --> (ALL x. x mem SEG n m l --> x mem l)"
|
|
4539 |
by (import rich_list IS_EL_SEG)
|
|
4540 |
|
|
4541 |
lemma IS_EL_SOME_EL: "ALL x l. x mem l = list_exists (op = x) l"
|
|
4542 |
by (import rich_list IS_EL_SOME_EL)
|
|
4543 |
|
|
4544 |
lemma IS_EL_FIRSTN: "ALL x xa. x <= length xa --> (ALL xb. xb mem FIRSTN x xa --> xb mem xa)"
|
|
4545 |
by (import rich_list IS_EL_FIRSTN)
|
|
4546 |
|
|
4547 |
lemma IS_EL_BUTFIRSTN: "ALL x xa. x <= length xa --> (ALL xb. xb mem BUTFIRSTN x xa --> xb mem xa)"
|
|
4548 |
by (import rich_list IS_EL_BUTFIRSTN)
|
|
4549 |
|
|
4550 |
lemma IS_EL_BUTLASTN: "ALL x xa. x <= length xa --> (ALL xb. xb mem BUTLASTN x xa --> xb mem xa)"
|
|
4551 |
by (import rich_list IS_EL_BUTLASTN)
|
|
4552 |
|
|
4553 |
lemma IS_EL_LASTN: "ALL x xa. x <= length xa --> (ALL xb. xb mem LASTN x xa --> xb mem xa)"
|
|
4554 |
by (import rich_list IS_EL_LASTN)
|
|
4555 |
|
|
4556 |
lemma ZIP_SNOC: "ALL l1 l2.
|
|
4557 |
length l1 = length l2 -->
|
|
4558 |
(ALL x1 x2. zip (SNOC x1 l1) (SNOC x2 l2) = SNOC (x1, x2) (zip l1 l2))"
|
|
4559 |
by (import rich_list ZIP_SNOC)
|
|
4560 |
|
|
4561 |
lemma UNZIP_SNOC: "ALL x l.
|
|
4562 |
unzip (SNOC x l) =
|
|
4563 |
(SNOC (fst x) (fst (unzip l)), SNOC (snd x) (snd (unzip l)))"
|
|
4564 |
by (import rich_list UNZIP_SNOC)
|
|
4565 |
|
|
4566 |
lemma LENGTH_UNZIP_FST: "ALL x. length (UNZIP_FST x) = length x"
|
|
4567 |
by (import rich_list LENGTH_UNZIP_FST)
|
|
4568 |
|
|
4569 |
lemma LENGTH_UNZIP_SND: "ALL x. length (UNZIP_SND x) = length x"
|
|
4570 |
by (import rich_list LENGTH_UNZIP_SND)
|
|
4571 |
|
|
4572 |
lemma SUM_APPEND: "ALL l1 l2. sum (l1 @ l2) = sum l1 + sum l2"
|
|
4573 |
by (import rich_list SUM_APPEND)
|
|
4574 |
|
|
4575 |
lemma SUM_REVERSE: "ALL l. sum (rev l) = sum l"
|
|
4576 |
by (import rich_list SUM_REVERSE)
|
|
4577 |
|
|
4578 |
lemma SUM_FLAT: "ALL l. sum (concat l) = sum (map sum l)"
|
|
4579 |
by (import rich_list SUM_FLAT)
|
|
4580 |
|
|
4581 |
lemma EL_APPEND1: "ALL n l1 l2. n < length l1 --> EL n (l1 @ l2) = EL n l1"
|
|
4582 |
by (import rich_list EL_APPEND1)
|
|
4583 |
|
|
4584 |
lemma EL_APPEND2: "ALL l1 n.
|
|
4585 |
length l1 <= n --> (ALL l2. EL n (l1 @ l2) = EL (n - length l1) l2)"
|
|
4586 |
by (import rich_list EL_APPEND2)
|
|
4587 |
|
|
4588 |
lemma EL_MAP: "ALL n l. n < length l --> (ALL f. EL n (map f l) = f (EL n l))"
|
|
4589 |
by (import rich_list EL_MAP)
|
|
4590 |
|
|
4591 |
lemma EL_CONS: "ALL n. 0 < n --> (ALL x l. EL n (x # l) = EL (PRE n) l)"
|
|
4592 |
by (import rich_list EL_CONS)
|
|
4593 |
|
|
4594 |
lemma EL_SEG: "ALL n l. n < length l --> EL n l = hd (SEG 1 n l)"
|
|
4595 |
by (import rich_list EL_SEG)
|
|
4596 |
|
|
4597 |
lemma EL_IS_EL: "ALL n l. n < length l --> EL n l mem l"
|
|
4598 |
by (import rich_list EL_IS_EL)
|
|
4599 |
|
|
4600 |
lemma TL_SNOC: "ALL x l. tl (SNOC x l) = (if null l then [] else SNOC x (tl l))"
|
|
4601 |
by (import rich_list TL_SNOC)
|
|
4602 |
|
|
4603 |
lemma EL_REVERSE: "ALL n l. n < length l --> EL n (rev l) = EL (PRE (length l - n)) l"
|
|
4604 |
by (import rich_list EL_REVERSE)
|
|
4605 |
|
|
4606 |
lemma EL_REVERSE_ELL: "ALL n l. n < length l --> EL n (rev l) = ELL n l"
|
|
4607 |
by (import rich_list EL_REVERSE_ELL)
|
|
4608 |
|
|
4609 |
lemma ELL_LENGTH_APPEND: "ALL l1 l2. ~ null l1 --> ELL (length l2) (l1 @ l2) = last l1"
|
|
4610 |
by (import rich_list ELL_LENGTH_APPEND)
|
|
4611 |
|
|
4612 |
lemma ELL_IS_EL: "ALL n l. n < length l --> ELL n l mem l"
|
|
4613 |
by (import rich_list ELL_IS_EL)
|
|
4614 |
|
|
4615 |
lemma ELL_REVERSE: "ALL n l. n < length l --> ELL n (rev l) = ELL (PRE (length l - n)) l"
|
|
4616 |
by (import rich_list ELL_REVERSE)
|
|
4617 |
|
|
4618 |
lemma ELL_REVERSE_EL: "ALL n l. n < length l --> ELL n (rev l) = EL n l"
|
|
4619 |
by (import rich_list ELL_REVERSE_EL)
|
|
4620 |
|
|
4621 |
lemma FIRSTN_BUTLASTN: "ALL n l. n <= length l --> FIRSTN n l = BUTLASTN (length l - n) l"
|
|
4622 |
by (import rich_list FIRSTN_BUTLASTN)
|
|
4623 |
|
|
4624 |
lemma BUTLASTN_FIRSTN: "ALL n l. n <= length l --> BUTLASTN n l = FIRSTN (length l - n) l"
|
|
4625 |
by (import rich_list BUTLASTN_FIRSTN)
|
|
4626 |
|
|
4627 |
lemma LASTN_BUTFIRSTN: "ALL n l. n <= length l --> LASTN n l = BUTFIRSTN (length l - n) l"
|
|
4628 |
by (import rich_list LASTN_BUTFIRSTN)
|
|
4629 |
|
|
4630 |
lemma BUTFIRSTN_LASTN: "ALL n l. n <= length l --> BUTFIRSTN n l = LASTN (length l - n) l"
|
|
4631 |
by (import rich_list BUTFIRSTN_LASTN)
|
|
4632 |
|
|
4633 |
lemma SEG_LASTN_BUTLASTN: "ALL n m l.
|
|
4634 |
n + m <= length l -->
|
|
4635 |
SEG n m l = LASTN n (BUTLASTN (length l - (n + m)) l)"
|
|
4636 |
by (import rich_list SEG_LASTN_BUTLASTN)
|
|
4637 |
|
|
4638 |
lemma BUTFIRSTN_REVERSE: "ALL n l. n <= length l --> BUTFIRSTN n (rev l) = rev (BUTLASTN n l)"
|
|
4639 |
by (import rich_list BUTFIRSTN_REVERSE)
|
|
4640 |
|
|
4641 |
lemma BUTLASTN_REVERSE: "ALL n l. n <= length l --> BUTLASTN n (rev l) = rev (BUTFIRSTN n l)"
|
|
4642 |
by (import rich_list BUTLASTN_REVERSE)
|
|
4643 |
|
|
4644 |
lemma LASTN_REVERSE: "ALL n l. n <= length l --> LASTN n (rev l) = rev (FIRSTN n l)"
|
|
4645 |
by (import rich_list LASTN_REVERSE)
|
|
4646 |
|
|
4647 |
lemma FIRSTN_REVERSE: "ALL n l. n <= length l --> FIRSTN n (rev l) = rev (LASTN n l)"
|
|
4648 |
by (import rich_list FIRSTN_REVERSE)
|
|
4649 |
|
|
4650 |
lemma SEG_REVERSE: "ALL n m l.
|
|
4651 |
n + m <= length l -->
|
|
4652 |
SEG n m (rev l) = rev (SEG n (length l - (n + m)) l)"
|
|
4653 |
by (import rich_list SEG_REVERSE)
|
|
4654 |
|
|
4655 |
lemma LENGTH_GENLIST: "ALL f n. length (GENLIST f n) = n"
|
|
4656 |
by (import rich_list LENGTH_GENLIST)
|
|
4657 |
|
|
4658 |
lemma LENGTH_REPLICATE: "ALL n x. length (REPLICATE n x) = n"
|
|
4659 |
by (import rich_list LENGTH_REPLICATE)
|
|
4660 |
|
|
4661 |
lemma IS_EL_REPLICATE: "ALL n. 0 < n --> (ALL x. x mem REPLICATE n x)"
|
|
4662 |
by (import rich_list IS_EL_REPLICATE)
|
|
4663 |
|
|
4664 |
lemma ALL_EL_REPLICATE: "ALL x n. list_all (op = x) (REPLICATE n x)"
|
|
4665 |
by (import rich_list ALL_EL_REPLICATE)
|
|
4666 |
|
|
4667 |
lemma AND_EL_FOLDL: "ALL l. AND_EL l = foldl op & True l"
|
|
4668 |
by (import rich_list AND_EL_FOLDL)
|
|
4669 |
|
|
4670 |
lemma AND_EL_FOLDR: "ALL l. AND_EL l = foldr op & l True"
|
|
4671 |
by (import rich_list AND_EL_FOLDR)
|
|
4672 |
|
|
4673 |
lemma OR_EL_FOLDL: "ALL l. OR_EL l = foldl op | False l"
|
|
4674 |
by (import rich_list OR_EL_FOLDL)
|
|
4675 |
|
|
4676 |
lemma OR_EL_FOLDR: "ALL l. OR_EL l = foldr op | l False"
|
|
4677 |
by (import rich_list OR_EL_FOLDR)
|
|
4678 |
|
|
4679 |
;end_setup
|
|
4680 |
|
|
4681 |
;setup_theory state_transformer
|
|
4682 |
|
|
4683 |
constdefs
|
|
4684 |
UNIT :: "'b => 'a => 'b * 'a"
|
|
4685 |
"(op ==::('b => 'a => 'b * 'a) => ('b => 'a => 'b * 'a) => prop)
|
|
4686 |
(UNIT::'b => 'a => 'b * 'a) (Pair::'b => 'a => 'b * 'a)"
|
|
4687 |
|
|
4688 |
lemma UNIT_DEF: "ALL x::'b. UNIT x = Pair x"
|
|
4689 |
by (import state_transformer UNIT_DEF)
|
|
4690 |
|
|
4691 |
constdefs
|
|
4692 |
BIND :: "('a => 'b * 'a) => ('b => 'a => 'c * 'a) => 'a => 'c * 'a"
|
|
4693 |
"BIND == %g f. split f o g"
|
|
4694 |
|
|
4695 |
lemma BIND_DEF: "ALL g f. BIND g f = split f o g"
|
|
4696 |
by (import state_transformer BIND_DEF)
|
|
4697 |
|
|
4698 |
constdefs
|
|
4699 |
MMAP :: "('c => 'b) => ('a => 'c * 'a) => 'a => 'b * 'a"
|
|
4700 |
"MMAP == %(f::'c => 'b) m::'a => 'c * 'a. BIND m (UNIT o f)"
|
|
4701 |
|
|
4702 |
lemma MMAP_DEF: "ALL (f::'c => 'b) m::'a => 'c * 'a. MMAP f m = BIND m (UNIT o f)"
|
|
4703 |
by (import state_transformer MMAP_DEF)
|
|
4704 |
|
|
4705 |
constdefs
|
|
4706 |
JOIN :: "('a => ('a => 'b * 'a) * 'a) => 'a => 'b * 'a"
|
|
4707 |
"JOIN == %z. BIND z I"
|
|
4708 |
|
|
4709 |
lemma JOIN_DEF: "ALL z. JOIN z = BIND z I"
|
|
4710 |
by (import state_transformer JOIN_DEF)
|
|
4711 |
|
|
4712 |
lemma BIND_LEFT_UNIT: "ALL k x. BIND (UNIT x) k = k x"
|
|
4713 |
by (import state_transformer BIND_LEFT_UNIT)
|
|
4714 |
|
|
4715 |
lemma UNIT_UNCURRY: "ALL x. split UNIT x = x"
|
|
4716 |
by (import state_transformer UNIT_UNCURRY)
|
|
4717 |
|
|
4718 |
lemma BIND_RIGHT_UNIT: "ALL k. BIND k UNIT = k"
|
|
4719 |
by (import state_transformer BIND_RIGHT_UNIT)
|
|
4720 |
|
|
4721 |
lemma BIND_ASSOC: "ALL x xa xb. BIND x (%a. BIND (xa a) xb) = BIND (BIND x xa) xb"
|
|
4722 |
by (import state_transformer BIND_ASSOC)
|
|
4723 |
|
|
4724 |
lemma MMAP_ID: "MMAP I = I"
|
|
4725 |
by (import state_transformer MMAP_ID)
|
|
4726 |
|
|
4727 |
lemma MMAP_COMP: "ALL (f::'c => 'd) g::'b => 'c. MMAP (f o g) = MMAP f o MMAP g"
|
|
4728 |
by (import state_transformer MMAP_COMP)
|
|
4729 |
|
|
4730 |
lemma MMAP_UNIT: "ALL f::'b => 'c. MMAP f o UNIT = UNIT o f"
|
|
4731 |
by (import state_transformer MMAP_UNIT)
|
|
4732 |
|
|
4733 |
lemma MMAP_JOIN: "ALL f::'b => 'c. MMAP f o JOIN = JOIN o MMAP (MMAP f)"
|
|
4734 |
by (import state_transformer MMAP_JOIN)
|
|
4735 |
|
|
4736 |
lemma JOIN_UNIT: "JOIN o UNIT = I"
|
|
4737 |
by (import state_transformer JOIN_UNIT)
|
|
4738 |
|
|
4739 |
lemma JOIN_MMAP_UNIT: "JOIN o MMAP UNIT = I"
|
|
4740 |
by (import state_transformer JOIN_MMAP_UNIT)
|
|
4741 |
|
|
4742 |
lemma JOIN_MAP_JOIN: "JOIN o MMAP JOIN = JOIN o JOIN"
|
|
4743 |
by (import state_transformer JOIN_MAP_JOIN)
|
|
4744 |
|
|
4745 |
lemma JOIN_MAP: "ALL x xa. BIND x xa = JOIN (MMAP xa x)"
|
|
4746 |
by (import state_transformer JOIN_MAP)
|
|
4747 |
|
|
4748 |
lemma FST_o_UNIT: "ALL x. fst o UNIT x = K x"
|
|
4749 |
by (import state_transformer FST_o_UNIT)
|
|
4750 |
|
|
4751 |
lemma SND_o_UNIT: "ALL x. snd o UNIT x = I"
|
|
4752 |
by (import state_transformer SND_o_UNIT)
|
|
4753 |
|
|
4754 |
lemma FST_o_MMAP: "ALL x xa. fst o MMAP x xa = x o (fst o xa)"
|
|
4755 |
by (import state_transformer FST_o_MMAP)
|
|
4756 |
|
|
4757 |
;end_setup
|
|
4758 |
|
|
4759 |
end
|
|
4760 |
|