| author | oheimb | 
| Thu, 31 May 2001 17:06:00 +0200 | |
| changeset 11351 | c5c403d30c77 | 
| parent 10734 | 66604af28f94 | 
| child 14706 | 71590b7733b7 | 
| 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 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 7 | header {*
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 8 |  \title{The accessible part of a relation}
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 9 |  \author{Lawrence C Paulson}
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 10 | *} | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 11 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 12 | theory Accessible_Part = Main: | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 13 | |
| 
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 | subsection {* Inductive definition *}
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 16 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 17 | text {*
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 18 |  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 | 19 |  relation; see also \cite{paulin-tlca}.
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 20 | *} | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 21 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 22 | consts | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 23 |   acc :: "('a \<times> 'a) set => 'a set"
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 24 | inductive "acc r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 25 | intros | 
| 10734 | 26 | 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 | 27 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 28 | syntax | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 29 |   termi :: "('a \<times> 'a) set => 'a set"
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 30 | translations | 
| 10388 | 31 | "termi r" == "acc (r\<inverse>)" | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 32 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 33 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 34 | subsection {* Induction rules *}
 | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 35 | |
| 10734 | 36 | theorem acc_induct: | 
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 37 | "a \<in> acc r ==> | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 38 | (!!x. x \<in> acc r ==> \<forall>y. (y, x) \<in> r --> P y ==> P x) ==> P a" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 39 | proof - | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 40 | assume major: "a \<in> acc r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 41 | assume hyp: "!!x. x \<in> acc r ==> \<forall>y. (y, x) \<in> r --> P y ==> P x" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 42 | show ?thesis | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 43 | apply (rule major [THEN acc.induct]) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 44 | apply (rule hyp) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 45 | apply (rule accI) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 46 | apply fast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 47 | apply fast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 48 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 49 | qed | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 50 | |
| 10734 | 51 | theorems acc_induct_rule = acc_induct [rule_format, induct set: acc] | 
| 52 | ||
| 10248 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 53 | 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 | 54 | apply (erule acc.elims) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 55 | apply fast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 56 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 57 | |
| 10388 | 58 | 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 | 59 | apply (erule rtrancl_induct) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 60 | apply blast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 61 | apply (blast dest: acc_downward) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 62 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 63 | |
| 10388 | 64 | 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 | 65 | apply (blast dest: acc_downwards_aux) | 
| 
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_wfI: "\<forall>x. x \<in> acc r ==> wf r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 69 | apply (rule wfUNIVI) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 70 | apply (induct_tac P x rule: acc_induct) | 
| 
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 | apply blast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 73 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 74 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 75 | theorem acc_wfD: "wf r ==> x \<in> acc r" | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 76 | apply (erule wf_induct) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 77 | apply (rule accI) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 78 | apply blast | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 79 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 80 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 81 | 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 | 82 | apply (blast intro: acc_wfI dest: acc_wfD) | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 83 | done | 
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 84 | |
| 
d99e5eeb16f4
The accessible part of a relation (from HOL/Induct/Acc);
 wenzelm parents: diff
changeset | 85 | end |