author | isatest |
Sat, 26 Oct 2002 13:05:27 +0200 | |
changeset 13680 | a6ce43a59d4a |
parent 12484 | 7ad150f5fc10 |
child 14981 | e73f8140af78 |
permissions | -rw-r--r-- |
9169 | 1 |
(* Title: HOLCF/Pcpo.ML |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
2 |
ID: $Id$ |
1461 | 3 |
Author: Franz Regensburger |
12030 | 4 |
License: GPL (GNU GENERAL PUBLIC LICENSE) |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
5 |
|
9169 | 6 |
introduction of the classes cpo and pcpo |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
7 |
*) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
8 |
|
2640 | 9 |
|
10 |
(* ------------------------------------------------------------------------ *) |
|
11 |
(* derive the old rule minimal *) |
|
12 |
(* ------------------------------------------------------------------------ *) |
|
9169 | 13 |
|
14 |
Goalw [UU_def] "ALL z. UU << z"; |
|
9969 | 15 |
by (rtac (some_eq_ex RS iffD2) 1); |
9169 | 16 |
by (rtac least 1); |
17 |
qed "UU_least"; |
|
2640 | 18 |
|
9169 | 19 |
bind_thm("minimal", UU_least RS spec); |
2640 | 20 |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
21 |
AddIffs [minimal]; |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
22 |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
23 |
(* ------------------------------------------------------------------------ *) |
2839 | 24 |
(* in cpo's everthing equal to THE lub has lub properties for every chain *) |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
25 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
26 |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
27 |
Goal "[| chain(S); lub(range(S)) = (l::'a::cpo) |] ==> range(S) <<| l "; |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
28 |
by (blast_tac (claset() addDs [cpo] addIs [lubI]) 1); |
9169 | 29 |
qed "thelubE"; |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
30 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
31 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
32 |
(* Properties of the lub *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
33 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
34 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
35 |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
36 |
Goal "chain (S::nat => 'a::cpo) ==> S(x) << lub(range(S))"; |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
37 |
by (blast_tac (claset() addDs [cpo] addIs [lubI RS is_ub_lub]) 1); |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
38 |
qed "is_ub_thelub"; |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
39 |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
40 |
Goal "[| chain (S::nat => 'a::cpo); range(S) <| x |] ==> lub(range S) << x"; |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
41 |
by (blast_tac (claset() addDs [cpo] addIs [lubI RS is_lub_lub]) 1); |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
42 |
qed "is_lub_thelub"; |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
43 |
|
11342 | 44 |
Goal "[| range X <= range Y; chain Y; chain (X::nat=>'a::cpo) |] ==> lub(range X) << lub(range Y)"; |
45 |
by (etac is_lub_thelub 1); |
|
46 |
by (rtac ub_rangeI 1); |
|
47 |
by (subgoal_tac "? j. X i = Y j" 1); |
|
48 |
by (Clarsimp_tac 1); |
|
49 |
by (etac is_ub_thelub 1); |
|
50 |
by Auto_tac; |
|
51 |
qed "lub_range_mono"; |
|
52 |
||
53 |
Goal "chain (Y::nat=>'a::cpo) ==> lub(range (%i. Y(i + j))) = lub(range Y)"; |
|
54 |
by (rtac antisym_less 1); |
|
12484 | 55 |
by (rtac lub_range_mono 1); |
11342 | 56 |
by (Fast_tac 1); |
57 |
by (atac 1); |
|
12484 | 58 |
by (etac chain_shift 1); |
59 |
by (rtac is_lub_thelub 1); |
|
60 |
by (assume_tac 1); |
|
61 |
by (rtac ub_rangeI 1); |
|
62 |
by (rtac trans_less 1); |
|
63 |
by (rtac is_ub_thelub 2); |
|
64 |
by (etac chain_shift 2); |
|
65 |
by (etac chain_mono3 1); |
|
66 |
by (rtac le_add1 1); |
|
11342 | 67 |
qed "lub_range_shift"; |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
68 |
|
9169 | 69 |
Goal "chain Y ==> max_in_chain i Y = (lub(range(Y)) = ((Y i)::'a::cpo))"; |
70 |
by (rtac iffI 1); |
|
71 |
by (fast_tac (HOL_cs addSIs [thelubI,lub_finch1]) 1); |
|
72 |
by (rewtac max_in_chain_def); |
|
73 |
by (safe_tac (HOL_cs addSIs [antisym_less])); |
|
74 |
by (fast_tac (HOL_cs addSEs [chain_mono3]) 1); |
|
75 |
by (dtac sym 1); |
|
76 |
by (force_tac (HOL_cs addSEs [is_ub_thelub], simpset()) 1); |
|
77 |
qed "maxinch_is_thelub"; |
|
2354 | 78 |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
79 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
80 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
81 |
(* the << relation between two chains is preserved by their lubs *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
82 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
83 |
|
9169 | 84 |
Goal "[|chain(C1::(nat=>'a::cpo));chain(C2); ALL k. C1(k) << C2(k)|]\ |
85 |
\ ==> lub(range(C1)) << lub(range(C2))"; |
|
86 |
by (etac is_lub_thelub 1); |
|
87 |
by (rtac ub_rangeI 1); |
|
88 |
by (rtac trans_less 1); |
|
89 |
by (etac spec 1); |
|
90 |
by (etac is_ub_thelub 1); |
|
91 |
qed "lub_mono"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
92 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
93 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
94 |
(* the = relation between two chains is preserved by their lubs *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
95 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
96 |
|
9169 | 97 |
Goal "[| chain(C1::(nat=>'a::cpo));chain(C2);ALL k. C1(k)=C2(k)|]\ |
98 |
\ ==> lub(range(C1))=lub(range(C2))"; |
|
99 |
by (rtac antisym_less 1); |
|
100 |
by (rtac lub_mono 1); |
|
101 |
by (atac 1); |
|
102 |
by (atac 1); |
|
103 |
by (strip_tac 1); |
|
104 |
by (rtac (antisym_less_inverse RS conjunct1) 1); |
|
105 |
by (etac spec 1); |
|
106 |
by (rtac lub_mono 1); |
|
107 |
by (atac 1); |
|
108 |
by (atac 1); |
|
109 |
by (strip_tac 1); |
|
110 |
by (rtac (antisym_less_inverse RS conjunct2) 1); |
|
111 |
by (etac spec 1); |
|
112 |
qed "lub_equal"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
113 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
114 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
115 |
(* more results about mono and = of lubs of chains *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
116 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
117 |
|
9169 | 118 |
Goal "[|EX j. ALL i. j<i --> X(i::nat)=Y(i);chain(X::nat=>'a::cpo);chain(Y)|]\ |
119 |
\ ==> lub(range(X))<<lub(range(Y))"; |
|
120 |
by (etac exE 1); |
|
121 |
by (rtac is_lub_thelub 1); |
|
122 |
by (assume_tac 1); |
|
123 |
by (rtac ub_rangeI 1); |
|
124 |
by (strip_tac 1); |
|
125 |
by (case_tac "j<i" 1); |
|
126 |
by (res_inst_tac [("s","Y(i)"),("t","X(i)")] subst 1); |
|
127 |
by (rtac sym 1); |
|
128 |
by (Fast_tac 1); |
|
129 |
by (rtac is_ub_thelub 1); |
|
130 |
by (assume_tac 1); |
|
131 |
by (res_inst_tac [("y","X(Suc(j))")] trans_less 1); |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
132 |
by (rtac chain_mono 1); |
9169 | 133 |
by (assume_tac 1); |
134 |
by (rtac (not_less_eq RS subst) 1); |
|
135 |
by (atac 1); |
|
136 |
by (res_inst_tac [("s","Y(Suc(j))"),("t","X(Suc(j))")] subst 1); |
|
137 |
by (Asm_simp_tac 1); |
|
138 |
by (etac is_ub_thelub 1); |
|
139 |
qed "lub_mono2"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
140 |
|
9169 | 141 |
Goal "[|EX j. ALL i. j<i --> X(i)=Y(i); chain(X::nat=>'a::cpo); chain(Y)|]\ |
142 |
\ ==> lub(range(X))=lub(range(Y))"; |
|
143 |
by (blast_tac (claset() addIs [antisym_less, lub_mono2, sym]) 1); |
|
144 |
qed "lub_equal2"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
145 |
|
9169 | 146 |
Goal "[|chain(Y::nat=>'a::cpo);chain(X);\ |
147 |
\ALL i. EX j. Y(i)<< X(j)|]==> lub(range(Y))<<lub(range(X))"; |
|
148 |
by (rtac is_lub_thelub 1); |
|
149 |
by (atac 1); |
|
150 |
by (rtac ub_rangeI 1); |
|
151 |
by (strip_tac 1); |
|
152 |
by (etac allE 1); |
|
153 |
by (etac exE 1); |
|
154 |
by (rtac trans_less 1); |
|
155 |
by (rtac is_ub_thelub 2); |
|
156 |
by (atac 2); |
|
157 |
by (atac 1); |
|
158 |
qed "lub_mono3"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
159 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
160 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
161 |
(* usefull lemmas about UU *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
162 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
163 |
|
9169 | 164 |
Goal "(x=UU)=(x<<UU)"; |
165 |
by (rtac iffI 1); |
|
166 |
by (hyp_subst_tac 1); |
|
167 |
by (rtac refl_less 1); |
|
168 |
by (rtac antisym_less 1); |
|
169 |
by (atac 1); |
|
170 |
by (rtac minimal 1); |
|
171 |
qed "eq_UU_iff"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
172 |
|
9169 | 173 |
Goal "x << UU ==> x = UU"; |
174 |
by (stac eq_UU_iff 1); |
|
175 |
by (assume_tac 1); |
|
176 |
qed "UU_I"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
177 |
|
9169 | 178 |
Goal "~(x::'a::po)<<y ==> ~x=y"; |
179 |
by Auto_tac; |
|
180 |
qed "not_less2not_eq"; |
|
181 |
||
182 |
Goal "[|chain(Y);lub(range(Y))=UU|] ==> ALL i. Y(i)=UU"; |
|
183 |
by (rtac allI 1); |
|
184 |
by (rtac antisym_less 1); |
|
185 |
by (rtac minimal 2); |
|
186 |
by (etac subst 1); |
|
187 |
by (etac is_ub_thelub 1); |
|
188 |
qed "chain_UU_I"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
189 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
190 |
|
9169 | 191 |
Goal "ALL i. Y(i::nat)=UU ==> lub(range(Y::(nat=>'a::pcpo)))=UU"; |
192 |
by (rtac lub_chain_maxelem 1); |
|
193 |
by (etac spec 1); |
|
194 |
by (rtac allI 1); |
|
195 |
by (rtac (antisym_less_inverse RS conjunct1) 1); |
|
196 |
by (etac spec 1); |
|
197 |
qed "chain_UU_I_inverse"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
198 |
|
9169 | 199 |
Goal "~lub(range(Y::(nat=>'a::pcpo)))=UU ==> EX i.~ Y(i)=UU"; |
200 |
by (blast_tac (claset() addIs [chain_UU_I_inverse]) 1); |
|
201 |
qed "chain_UU_I_inverse2"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
202 |
|
9169 | 203 |
Goal "[| x<<y; ~x=UU |] ==> ~y=UU"; |
204 |
by (blast_tac (claset() addIs [UU_I]) 1); |
|
205 |
qed "notUU_I"; |
|
206 |
||
207 |
Goal |
|
208 |
"[|EX j. ~Y(j)=UU;chain(Y::nat=>'a::pcpo)|] ==> EX j. ALL i. j<i-->~Y(i)=UU"; |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
209 |
by (blast_tac (claset() addDs [notUU_I, chain_mono]) 1); |
9169 | 210 |
qed "chain_mono2"; |
3326 | 211 |
|
212 |
(**************************************) |
|
213 |
(* some properties for chfin and flat *) |
|
214 |
(**************************************) |
|
215 |
||
216 |
(* ------------------------------------------------------------------------ *) |
|
4721
c8a8482a8124
renamed is_chain to chain, is_tord to tord, replaced chain_finite by chfin
oheimb
parents:
4098
diff
changeset
|
217 |
(* flat types are chfin *) |
3326 | 218 |
(* ------------------------------------------------------------------------ *) |
219 |
||
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
220 |
(*Used only in an "instance" declaration (Fun1.thy)*) |
9169 | 221 |
Goalw [max_in_chain_def] |
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
222 |
"ALL Y::nat=>'a::flat. chain Y --> (EX n. max_in_chain n Y)"; |
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
223 |
by (Clarify_tac 1); |
9169 | 224 |
by (case_tac "ALL i. Y(i)=UU" 1); |
225 |
by (res_inst_tac [("x","0")] exI 1); |
|
226 |
by (Asm_simp_tac 1); |
|
227 |
by (Asm_full_simp_tac 1); |
|
228 |
by (etac exE 1); |
|
229 |
by (res_inst_tac [("x","i")] exI 1); |
|
230 |
by (strip_tac 1); |
|
231 |
by (etac (le_imp_less_or_eq RS disjE) 1); |
|
232 |
by Safe_tac; |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
233 |
by (blast_tac (claset() addDs [chain_mono, ax_flat RS spec RS spec RS mp]) 1); |
9169 | 234 |
qed "flat_imp_chfin"; |
3326 | 235 |
|
236 |
(* flat subclass of chfin --> adm_flat not needed *) |
|
237 |
||
9169 | 238 |
Goal "(a::'a::flat) ~= UU ==> a << b = (a = b)"; |
239 |
by (safe_tac (HOL_cs addSIs [refl_less])); |
|
240 |
by (dtac (ax_flat RS spec RS spec RS mp) 1); |
|
241 |
by (fast_tac (HOL_cs addSIs [refl_less,ax_flat RS spec RS spec RS mp]) 1); |
|
242 |
qed "flat_eq"; |
|
3326 | 243 |
|
9169 | 244 |
Goal "chain (Y::nat=>'a::chfin) ==> finite_chain Y"; |
245 |
by (force_tac (HOL_cs, simpset() addsimps [chfin,finite_chain_def]) 1); |
|
246 |
qed "chfin2finch"; |
|
3326 | 247 |
|
248 |
(* ------------------------------------------------------------------------ *) |
|
249 |
(* lemmata for improved admissibility introdution rule *) |
|
250 |
(* ------------------------------------------------------------------------ *) |
|
251 |
||
9169 | 252 |
val prems = Goal |
253 |
"[|chain Y; ALL i. P (Y i); \ |
|
254 |
\ (!!Y. [| chain Y; ALL i. P (Y i); ~ finite_chain Y |] ==> P (lub(range Y)))\ |
|
255 |
\ |] ==> P (lub (range Y))"; |
|
256 |
by (cut_facts_tac prems 1); |
|
257 |
by (case_tac "finite_chain Y" 1); |
|
258 |
by (eresolve_tac prems 2); |
|
259 |
by (atac 2); |
|
260 |
by (atac 2); |
|
261 |
by (rewtac finite_chain_def); |
|
262 |
by (safe_tac HOL_cs); |
|
263 |
by (etac (lub_finch1 RS thelubI RS ssubst) 1); |
|
264 |
by (atac 1); |
|
265 |
by (etac spec 1); |
|
266 |
qed "infinite_chain_adm_lemma"; |
|
3326 | 267 |
|
9169 | 268 |
val prems = Goal |
269 |
"[|chain Y; ALL i. P (Y i); \ |
|
270 |
\ (!!Y. [| chain Y; ALL i. P (Y i); \ |
|
271 |
\ ALL i. EX j. i < j & Y i ~= Y j & Y i << Y j|]\ |
|
272 |
\ ==> P (lub (range Y))) |] ==> P (lub (range Y))"; |
|
273 |
by (cut_facts_tac prems 1); |
|
274 |
by (etac infinite_chain_adm_lemma 1); |
|
275 |
by (atac 1); |
|
276 |
by (etac thin_rl 1); |
|
277 |
by (rewtac finite_chain_def); |
|
278 |
by (rewtac max_in_chain_def); |
|
279 |
by (fast_tac (HOL_cs addIs prems |
|
9248
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
paulson
parents:
9169
diff
changeset
|
280 |
addDs [le_imp_less_or_eq] addEs [chain_mono]) 1); |
9169 | 281 |
qed "increasing_chain_adm_lemma"; |