src/HOL/WF.ML
changeset 5318 72bf8039b53f
parent 5316 7a8975451a89
child 5330 8c9fadda81f4
equal deleted inserted replaced
5317:3a9214482762 5318:72bf8039b53f
    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]