70 (*---------------------------------------------------------------------------- |
70 (*---------------------------------------------------------------------------- |
71 * Minimal-element characterization of well-foundedness |
71 * Minimal-element characterization of well-foundedness |
72 *---------------------------------------------------------------------------*) |
72 *---------------------------------------------------------------------------*) |
73 |
73 |
74 Goalw [wf_def] "wf r ==> x:Q --> (? z:Q. ! y. (y,z):r --> y~:Q)"; |
74 Goalw [wf_def] "wf r ==> x:Q --> (? z:Q. ! y. (y,z):r --> y~:Q)"; |
75 bd spec 1; |
75 by (dtac spec 1); |
76 by (etac (mp RS spec) 1); |
76 by (etac (mp RS spec) 1); |
77 by (Blast_tac 1); |
77 by (Blast_tac 1); |
78 val lemma1 = result(); |
78 val lemma1 = result(); |
79 |
79 |
80 Goalw [wf_def] "(! Q x. x:Q --> (? z:Q. ! y. (y,z):r --> y~:Q)) ==> wf r"; |
80 Goalw [wf_def] "(! Q x. x:Q --> (? z:Q. ! y. (y,z):r --> y~:Q)) ==> wf r"; |
138 |
138 |
139 Goal "[| !i:I. wf(r i); \ |
139 Goal "[| !i:I. wf(r i); \ |
140 \ !i:I.!j:I. r i ~= r j --> Domain(r i) Int Range(r j) = {} & \ |
140 \ !i:I.!j:I. r i ~= r j --> Domain(r i) Int Range(r j) = {} & \ |
141 \ Domain(r j) Int Range(r i) = {} \ |
141 \ Domain(r j) Int Range(r i) = {} \ |
142 \ |] ==> wf(UN i:I. r i)"; |
142 \ |] ==> wf(UN i:I. r i)"; |
143 by(asm_full_simp_tac (HOL_basic_ss addsimps [wf_eq_minimal]) 1); |
143 by (asm_full_simp_tac (HOL_basic_ss addsimps [wf_eq_minimal]) 1); |
144 by(Clarify_tac 1); |
144 by (Clarify_tac 1); |
145 by(rename_tac "A a" 1); |
145 by (rename_tac "A a" 1); |
146 by(case_tac "? i:I. ? a:A. ? b:A. (b,a) : r i" 1); |
146 by (case_tac "? i:I. ? a:A. ? b:A. (b,a) : r i" 1); |
147 by(Clarify_tac 1); |
147 by (Clarify_tac 1); |
148 by(EVERY1[dtac bspec, atac, |
148 by (EVERY1[dtac bspec, atac, |
149 eres_inst_tac[("x","{a. a:A & (? b:A. (b,a) : r i)}")]allE]); |
149 eres_inst_tac[("x","{a. a:A & (? b:A. (b,a) : r i)}")]allE]); |
150 by(EVERY1[etac allE,etac impE]); |
150 by (EVERY1[etac allE,etac impE]); |
151 by(Blast_tac 1); |
151 by (Blast_tac 1); |
152 by(Clarify_tac 1); |
152 by (Clarify_tac 1); |
153 by(rename_tac "z'" 1); |
153 by (rename_tac "z'" 1); |
154 by(res_inst_tac [("x","z'")] bexI 1); |
154 by (res_inst_tac [("x","z'")] bexI 1); |
155 ba 2; |
155 by (assume_tac 2); |
156 by(Clarify_tac 1); |
156 by (Clarify_tac 1); |
157 by(rename_tac "j" 1); |
157 by (rename_tac "j" 1); |
158 by(case_tac "r j = r i" 1); |
158 by (case_tac "r j = r i" 1); |
159 by(EVERY1[etac allE,etac impE,atac]); |
159 by (EVERY1[etac allE,etac impE,atac]); |
160 by(Asm_full_simp_tac 1); |
160 by (Asm_full_simp_tac 1); |
161 by(Blast_tac 1); |
161 by (Blast_tac 1); |
162 by(blast_tac (claset() addEs [equalityE]) 1); |
162 by (blast_tac (claset() addEs [equalityE]) 1); |
163 by(Asm_full_simp_tac 1); |
163 by (Asm_full_simp_tac 1); |
164 by(case_tac "? i. i:I" 1); |
164 by (case_tac "? i. i:I" 1); |
165 by(Clarify_tac 1); |
165 by (Clarify_tac 1); |
166 by(EVERY1[dtac bspec, atac, eres_inst_tac[("x","A")]allE]); |
166 by (EVERY1[dtac bspec, atac, eres_inst_tac[("x","A")]allE]); |
167 by(Blast_tac 1); |
167 by (Blast_tac 1); |
168 by(Blast_tac 1); |
168 by (Blast_tac 1); |
169 qed "wf_UN"; |
169 qed "wf_UN"; |
170 |
170 |
171 Goalw [Union_def] |
171 Goalw [Union_def] |
172 "[| !r:R. wf r; \ |
172 "[| !r:R. wf r; \ |
173 \ !r:R.!s:R. r ~= s --> Domain r Int Range s = {} & \ |
173 \ !r:R.!s:R. r ~= s --> Domain r Int Range s = {} & \ |
174 \ Domain s Int Range r = {} \ |
174 \ Domain s Int Range r = {} \ |
175 \ |] ==> wf(Union R)"; |
175 \ |] ==> wf(Union R)"; |
176 br wf_UN 1; |
176 by (rtac wf_UN 1); |
177 by(Blast_tac 1); |
177 by (Blast_tac 1); |
178 by(Blast_tac 1); |
178 by (Blast_tac 1); |
179 qed "wf_Union"; |
179 qed "wf_Union"; |
180 |
180 |
181 Goal "[| wf r; wf s; Domain r Int Range s = {}; Domain s Int Range r = {} \ |
181 Goal "[| wf r; wf s; Domain r Int Range s = {}; Domain s Int Range r = {} \ |
182 \ |] ==> wf(r Un s)"; |
182 \ |] ==> wf(r Un s)"; |
183 br(simplify (simpset()) (read_instantiate[("R","{r,s}")]wf_Union)) 1; |
183 by (rtac (simplify (simpset()) (read_instantiate[("R","{r,s}")]wf_Union)) 1); |
184 by(Blast_tac 1); |
184 by (Blast_tac 1); |
185 by(Blast_tac 1); |
185 by (Blast_tac 1); |
186 qed "wf_Un"; |
186 qed "wf_Un"; |
187 |
187 |
188 (*--------------------------------------------------------------------------- |
188 (*--------------------------------------------------------------------------- |
189 * Wellfoundedness of `image' |
189 * Wellfoundedness of `image' |
190 *---------------------------------------------------------------------------*) |
190 *---------------------------------------------------------------------------*) |
191 |
191 |
192 Goal "[| wf r; inj f |] ==> wf(prod_fun f f `` r)"; |
192 Goal "[| wf r; inj f |] ==> wf(prod_fun f f `` r)"; |
193 by(asm_full_simp_tac (HOL_basic_ss addsimps [wf_eq_minimal]) 1); |
193 by (asm_full_simp_tac (HOL_basic_ss addsimps [wf_eq_minimal]) 1); |
194 by(Clarify_tac 1); |
194 by (Clarify_tac 1); |
195 by(case_tac "? p. f p : Q" 1); |
195 by (case_tac "? p. f p : Q" 1); |
196 by(eres_inst_tac [("x","{p. f p : Q}")]allE 1); |
196 by (eres_inst_tac [("x","{p. f p : Q}")]allE 1); |
197 by(fast_tac (claset() addDs [injD]) 1); |
197 by (fast_tac (claset() addDs [injD]) 1); |
198 by(Blast_tac 1); |
198 by (Blast_tac 1); |
199 qed "wf_prod_fun_image"; |
199 qed "wf_prod_fun_image"; |
200 |
200 |
201 (*** acyclic ***) |
201 (*** acyclic ***) |
202 |
202 |
203 val acyclicI = prove_goalw WF.thy [acyclic_def] |
203 val acyclicI = prove_goalw WF.thy [acyclic_def] |