author | paulson |
Tue, 04 Jul 2000 15:58:11 +0200 | |
changeset 9245 | 428385c4bc50 |
parent 9169 | 85a47aa21f74 |
child 9248 | e1dee89de037 |
permissions | -rw-r--r-- |
9245 | 1 |
(* Title: HOLCF/Porder |
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 |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
4 |
Copyright 1993 Technische Universitaet Muenchen |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
5 |
|
9245 | 6 |
Conservative extension of theory Porder0 by constant definitions |
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 |
|
625 | 9 |
(* ------------------------------------------------------------------------ *) |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
10 |
(* lubs are unique *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
11 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
12 |
|
9245 | 13 |
|
14 |
val prems = goalw thy [is_lub, is_ub] |
|
15 |
"[| S <<| x ; S <<| y |] ==> x=y"; |
|
16 |
by (cut_facts_tac prems 1); |
|
17 |
by (etac conjE 1); |
|
18 |
by (etac conjE 1); |
|
19 |
by (rtac antisym_less 1); |
|
20 |
by (rtac mp 1); |
|
21 |
by ((etac allE 1) THEN (atac 1) THEN (atac 1)); |
|
22 |
by (rtac mp 1); |
|
23 |
by ((etac allE 1) THEN (atac 1) THEN (atac 1)); |
|
24 |
qed "unique_lub"; |
|
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 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
27 |
(* chains are monotone functions *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
28 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
29 |
|
9245 | 30 |
val prems = goalw thy [chain] "chain F ==> x<y --> F x<<F y"; |
31 |
by (cut_facts_tac prems 1); |
|
32 |
by (induct_tac "y" 1); |
|
33 |
by (rtac impI 1); |
|
34 |
by (etac less_zeroE 1); |
|
35 |
by (stac less_Suc_eq 1); |
|
36 |
by (strip_tac 1); |
|
37 |
by (etac disjE 1); |
|
38 |
by (rtac trans_less 1); |
|
39 |
by (etac allE 2); |
|
40 |
by (atac 2); |
|
41 |
by (fast_tac HOL_cs 1); |
|
42 |
by (hyp_subst_tac 1); |
|
43 |
by (etac allE 1); |
|
44 |
by (atac 1); |
|
45 |
qed "chain_mono"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
46 |
|
9169 | 47 |
Goal "[| chain F; x <= y |] ==> F x << F y"; |
48 |
by (rtac (le_imp_less_or_eq RS disjE) 1); |
|
49 |
by (atac 1); |
|
50 |
by (etac (chain_mono RS mp) 1); |
|
51 |
by (atac 1); |
|
52 |
by (hyp_subst_tac 1); |
|
53 |
by (rtac refl_less 1); |
|
54 |
qed "chain_mono3"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
55 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
56 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
57 |
(* ------------------------------------------------------------------------ *) |
9245 | 58 |
(* The range of a chain is a totally ordered << *) |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
59 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
60 |
|
9245 | 61 |
val _ = goalw thy [tord] |
62 |
"!!F. chain(F) ==> tord(range(F))"; |
|
63 |
by (Safe_tac); |
|
64 |
by (rtac nat_less_cases 1); |
|
65 |
by (ALLGOALS (fast_tac (claset() addIs [refl_less, chain_mono RS mp]))); |
|
66 |
qed "chain_tord"; |
|
67 |
||
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
68 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
69 |
(* ------------------------------------------------------------------------ *) |
625 | 70 |
(* technical lemmas about lub and is_lub *) |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
71 |
(* ------------------------------------------------------------------------ *) |
2640 | 72 |
bind_thm("lub",lub_def RS meta_eq_to_obj_eq); |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
73 |
|
9169 | 74 |
Goal "? x. M <<| x ==> M <<| lub(M)"; |
75 |
by (stac lub 1); |
|
76 |
by (etac (select_eq_Ex RS iffD2) 1); |
|
77 |
qed "lubI"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
78 |
|
9169 | 79 |
Goal "M <<| lub(M) ==> ? x. M <<| x"; |
80 |
by (etac exI 1); |
|
81 |
qed "lubE"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
82 |
|
9169 | 83 |
Goal "(? x. M <<| x) = M <<| lub(M)"; |
84 |
by (stac lub 1); |
|
85 |
by (rtac (select_eq_Ex RS subst) 1); |
|
86 |
by (rtac refl 1); |
|
87 |
qed "lub_eq"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
88 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
89 |
|
9169 | 90 |
Goal "M <<| l ==> lub(M) = l"; |
91 |
by (rtac unique_lub 1); |
|
92 |
by (stac lub 1); |
|
93 |
by (etac selectI 1); |
|
94 |
by (atac 1); |
|
95 |
qed "thelubI"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
96 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
97 |
|
5068 | 98 |
Goal "lub{x} = x"; |
3018 | 99 |
by (rtac thelubI 1); |
4098 | 100 |
by (simp_tac (simpset() addsimps [is_lub,is_ub]) 1); |
2841
c2508f4ab739
Added "discrete" CPOs and modified IMP to use those rather than "lift"
nipkow
parents:
2640
diff
changeset
|
101 |
qed "lub_singleton"; |
c2508f4ab739
Added "discrete" CPOs and modified IMP to use those rather than "lift"
nipkow
parents:
2640
diff
changeset
|
102 |
Addsimps [lub_singleton]; |
c2508f4ab739
Added "discrete" CPOs and modified IMP to use those rather than "lift"
nipkow
parents:
2640
diff
changeset
|
103 |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
104 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
105 |
(* access to some definition as inference rule *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
106 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
107 |
|
9245 | 108 |
val prems = goalw thy [is_lub] |
109 |
"S <<| x ==> S <| x & (! u. S <| u --> x << u)"; |
|
110 |
by (cut_facts_tac prems 1); |
|
111 |
by (atac 1); |
|
112 |
qed "is_lubE"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
113 |
|
9245 | 114 |
val prems = goalw thy [is_lub] |
115 |
"S <| x & (! u. S <| u --> x << u) ==> S <<| x"; |
|
116 |
by (cut_facts_tac prems 1); |
|
117 |
by (atac 1); |
|
118 |
qed "is_lubI"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
119 |
|
9245 | 120 |
val prems = goalw thy [chain] "chain F ==> !i. F(i) << F(Suc(i))"; |
121 |
by (cut_facts_tac prems 1); |
|
122 |
by (atac 1); |
|
123 |
qed "chainE"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
124 |
|
9245 | 125 |
val prems = goalw thy [chain] "!i. F i << F(Suc i) ==> chain F"; |
126 |
by (cut_facts_tac prems 1); |
|
127 |
by (atac 1); |
|
128 |
qed "chainI"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
129 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
130 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
131 |
(* technical lemmas about (least) upper bounds of chains *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
132 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
133 |
|
9245 | 134 |
val prems = goalw thy [is_ub] "range S <| x ==> !i. S(i) << x"; |
135 |
by (cut_facts_tac prems 1); |
|
136 |
by (strip_tac 1); |
|
137 |
by (rtac mp 1); |
|
138 |
by (etac spec 1); |
|
139 |
by (rtac rangeI 1); |
|
140 |
qed "ub_rangeE"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
141 |
|
9245 | 142 |
val prems = goalw thy [is_ub] "!i. S i << x ==> range S <| x"; |
143 |
by (cut_facts_tac prems 1); |
|
144 |
by (strip_tac 1); |
|
145 |
by (etac rangeE 1); |
|
146 |
by (hyp_subst_tac 1); |
|
147 |
by (etac spec 1); |
|
148 |
qed "ub_rangeI"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
149 |
|
1779 | 150 |
bind_thm ("is_ub_lub", is_lubE RS conjunct1 RS ub_rangeE RS spec); |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
151 |
(* range(?S1) <<| ?x1 ==> ?S1(?x) << ?x1 *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
152 |
|
1779 | 153 |
bind_thm ("is_lub_lub", is_lubE RS conjunct2 RS spec RS mp); |
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
154 |
(* [| ?S3 <<| ?x3; ?S3 <| ?x1 |] ==> ?x3 << ?x1 *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
155 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
156 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
157 |
(* results about finite chains *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
158 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
159 |
|
9245 | 160 |
val prems = goalw thy [max_in_chain_def] |
161 |
"[| chain C; max_in_chain i C|] ==> range C <<| C i"; |
|
162 |
by (cut_facts_tac prems 1); |
|
163 |
by (rtac is_lubI 1); |
|
164 |
by (rtac conjI 1); |
|
165 |
by (rtac ub_rangeI 1); |
|
166 |
by (rtac allI 1); |
|
167 |
by (res_inst_tac [("m","i")] nat_less_cases 1); |
|
168 |
by (rtac (antisym_less_inverse RS conjunct2) 1); |
|
169 |
by (etac (disjI1 RS less_or_eq_imp_le RS rev_mp) 1); |
|
170 |
by (etac spec 1); |
|
171 |
by (rtac (antisym_less_inverse RS conjunct2) 1); |
|
172 |
by (etac (disjI2 RS less_or_eq_imp_le RS rev_mp) 1); |
|
173 |
by (etac spec 1); |
|
174 |
by (etac (chain_mono RS mp) 1); |
|
175 |
by (atac 1); |
|
176 |
by (strip_tac 1); |
|
177 |
by (etac (ub_rangeE RS spec) 1); |
|
178 |
qed "lub_finch1"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
179 |
|
9245 | 180 |
val prems= goalw thy [finite_chain_def] |
181 |
"finite_chain(C) ==> range(C) <<| C(@ i. max_in_chain i C)"; |
|
182 |
by (cut_facts_tac prems 1); |
|
183 |
by (rtac lub_finch1 1); |
|
184 |
by (etac conjunct1 1); |
|
185 |
by (rtac (select_eq_Ex RS iffD2) 1); |
|
186 |
by (etac conjunct2 1); |
|
187 |
qed "lub_finch2"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
188 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
189 |
|
9169 | 190 |
Goal "x<<y ==> chain (%i. if i=0 then x else y)"; |
191 |
by (rtac chainI 1); |
|
192 |
by (rtac allI 1); |
|
193 |
by (induct_tac "i" 1); |
|
194 |
by (Asm_simp_tac 1); |
|
195 |
by (Asm_simp_tac 1); |
|
196 |
qed "bin_chain"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
197 |
|
9245 | 198 |
val prems = goalw thy [max_in_chain_def,le_def] |
199 |
"x<<y ==> max_in_chain (Suc 0) (%i. if (i=0) then x else y)"; |
|
200 |
by (cut_facts_tac prems 1); |
|
201 |
by (rtac allI 1); |
|
202 |
by (induct_tac "j" 1); |
|
203 |
by (Asm_simp_tac 1); |
|
204 |
by (Asm_simp_tac 1); |
|
205 |
qed "bin_chainmax"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
206 |
|
9169 | 207 |
Goal "x << y ==> range(%i::nat. if (i=0) then x else y) <<| y"; |
208 |
by (res_inst_tac [("s","if (Suc 0) = 0 then x else y")] subst 1 |
|
209 |
THEN rtac lub_finch1 2); |
|
210 |
by (etac bin_chain 2); |
|
211 |
by (etac bin_chainmax 2); |
|
212 |
by (Simp_tac 1); |
|
213 |
qed "lub_bin_chain"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
214 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
215 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
216 |
(* the maximal element in a chain is its lub *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
217 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
218 |
|
9169 | 219 |
Goal "[|? i. Y i=c;!i. Y i<<c|] ==> lub(range Y) = c"; |
220 |
by (rtac thelubI 1); |
|
221 |
by (rtac is_lubI 1); |
|
222 |
by (rtac conjI 1); |
|
223 |
by (etac ub_rangeI 1); |
|
224 |
by (strip_tac 1); |
|
225 |
by (etac exE 1); |
|
226 |
by (hyp_subst_tac 1); |
|
227 |
by (etac (ub_rangeE RS spec) 1); |
|
228 |
qed "lub_chain_maxelem"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
229 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
230 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
231 |
(* the lub of a constant chain is the constant *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
232 |
(* ------------------------------------------------------------------------ *) |
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
233 |
|
9169 | 234 |
Goal "range(%x. c) <<| c"; |
235 |
by (rtac is_lubI 1); |
|
236 |
by (rtac conjI 1); |
|
237 |
by (rtac ub_rangeI 1); |
|
238 |
by (strip_tac 1); |
|
239 |
by (rtac refl_less 1); |
|
240 |
by (strip_tac 1); |
|
241 |
by (etac (ub_rangeE RS spec) 1); |
|
242 |
qed "lub_const"; |
|
243
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
243 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
244 |
|
c22b85994e17
Franz Regensburger's Higher-Order Logic of Computable Functions embedding LCF
nipkow
parents:
diff
changeset
|
245 |