| author | nipkow | 
| Sun, 09 Apr 2006 19:41:30 +0200 | |
| changeset 19390 | 6c7383f80ad1 | 
| parent 19363 | 667b5ea637dd | 
| permissions | -rw-r--r-- | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 1 | (* Title: HOL/Library/Accessible_Part.thy | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 3 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 4 | Copyright 1994 University of Cambridge | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 5 | *) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 6 | |
| 14706 | 7 | header {* The accessible part of a relation *}
 | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 8 | |
| 15131 | 9 | theory Accessible_Part | 
| 15140 | 10 | imports Main | 
| 15131 | 11 | begin | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 12 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 13 | subsection {* Inductive definition *}
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 14 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 15 | text {*
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 16 |  Inductive definition of the accessible part @{term "acc r"} of a
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 17 |  relation; see also \cite{paulin-tlca}.
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 18 | *} | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 19 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 20 | consts | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 21 |   acc :: "('a \<times> 'a) set => 'a set"
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 22 | inductive "acc r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 23 | intros | 
| 10734 | 24 | accI: "(!!y. (y, x) \<in> r ==> y \<in> acc r) ==> x \<in> acc r" | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 25 | |
| 19363 | 26 | abbreviation | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 27 |   termi :: "('a \<times> 'a) set => 'a set"
 | 
| 19086 | 28 | "termi r == acc (r\<inverse>)" | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 29 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 30 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 31 | subsection {* Induction rules *}
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 32 | |
| 10734 | 33 | theorem acc_induct: | 
| 18241 | 34 | assumes major: "a \<in> acc r" | 
| 35 | assumes hyp: "!!x. x \<in> acc r ==> \<forall>y. (y, x) \<in> r --> P y ==> P x" | |
| 36 | shows "P a" | |
| 37 | apply (rule major [THEN acc.induct]) | |
| 38 | apply (rule hyp) | |
| 39 | apply (rule accI) | |
| 40 | apply fast | |
| 41 | apply fast | |
| 42 | done | |
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 43 | |
| 10734 | 44 | theorems acc_induct_rule = acc_induct [rule_format, induct set: acc] | 
| 45 | ||
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 46 | theorem acc_downward: "b \<in> acc r ==> (a, b) \<in> r ==> a \<in> acc r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 47 | apply (erule acc.elims) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 48 | apply fast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 49 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 50 | |
| 10388 | 51 | lemma acc_downwards_aux: "(b, a) \<in> r\<^sup>* ==> a \<in> acc r --> b \<in> acc r" | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 52 | apply (erule rtrancl_induct) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 53 | apply blast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 54 | apply (blast dest: acc_downward) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 55 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 56 | |
| 10388 | 57 | theorem acc_downwards: "a \<in> acc r ==> (b, a) \<in> r\<^sup>* ==> b \<in> acc r" | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 58 | apply (blast dest: acc_downwards_aux) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 59 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 60 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 61 | theorem acc_wfI: "\<forall>x. x \<in> acc r ==> wf r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 62 | apply (rule wfUNIVI) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 63 | apply (induct_tac P x rule: acc_induct) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 64 | apply blast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 65 | apply blast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 66 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 67 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 68 | theorem acc_wfD: "wf r ==> x \<in> acc r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 69 | apply (erule wf_induct) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 70 | apply (rule accI) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 71 | apply blast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 72 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 73 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 74 | theorem wf_acc_iff: "wf r = (\<forall>x. x \<in> acc r)" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 75 | apply (blast intro: acc_wfI dest: acc_wfD) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 76 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 77 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 78 | end |