| author | wenzelm | 
| Thu, 05 Jul 2007 00:06:17 +0200 | |
| changeset 23579 | 1a8ca0e480cd | 
| parent 21404 | eb85850d3eb7 | 
| child 23746 | a455e69c31cc | 
| permissions | -rw-r--r-- | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 1 | (* Title: HOL/Induct/Comb.thy | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 2 | ID: $Id$ | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 3 | Author: Lawrence C Paulson | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 4 | Copyright 1996 University of Cambridge | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 5 | *) | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 6 | |
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 7 | header {* Combinatory Logic example: the Church-Rosser Theorem *}
 | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 8 | |
| 16417 | 9 | theory Comb imports Main begin | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 10 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 11 | text {*
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 12 | Curiously, combinators do not include free variables. | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 13 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 14 |   Example taken from \cite{camilleri-melham}.
 | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 15 | |
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 16 | HOL system proofs may be found in the HOL distribution at | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 17 | .../contrib/rule-induction/cl.ml | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 18 | *} | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 19 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 20 | subsection {* Definitions *}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 21 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 22 | text {* Datatype definition of combinators @{text S} and @{text K}. *}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 23 | |
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 24 | datatype comb = K | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 25 | | S | 
| 19736 | 26 | | Ap comb comb (infixl "##" 90) | 
| 27 | ||
| 21210 | 28 | notation (xsymbols) | 
| 19736 | 29 | Ap (infixl "\<bullet>" 90) | 
| 30 | ||
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 31 | |
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 32 | text {*
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 33 |   Inductive definition of contractions, @{text "-1->"} and
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 34 |   (multi-step) reductions, @{text "--->"}.
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 35 | *} | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 36 | |
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 37 | consts | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 38 | contract :: "(comb*comb) set" | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 39 | |
| 19736 | 40 | abbreviation | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 41 | contract_rel1 :: "[comb,comb] => bool" (infixl "-1->" 50) where | 
| 19736 | 42 | "x -1-> y == (x,y) \<in> contract" | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 43 | |
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 44 | abbreviation | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 45 | contract_rel :: "[comb,comb] => bool" (infixl "--->" 50) where | 
| 19736 | 46 | "x ---> y == (x,y) \<in> contract^*" | 
| 15816 | 47 | |
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 48 | inductive contract | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 49 | intros | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 50 | K: "K##x##y -1-> x" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 51 | S: "S##x##y##z -1-> (x##z)##(y##z)" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 52 | Ap1: "x-1->y ==> x##z -1-> y##z" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 53 | Ap2: "x-1->y ==> z##x -1-> z##y" | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 54 | |
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 55 | text {*
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 56 |   Inductive definition of parallel contractions, @{text "=1=>"} and
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 57 |   (multi-step) parallel reductions, @{text "===>"}.
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 58 | *} | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 59 | |
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 60 | consts | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 61 | parcontract :: "(comb*comb) set" | 
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 62 | |
| 19736 | 63 | abbreviation | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 64 | parcontract_rel1 :: "[comb,comb] => bool" (infixl "=1=>" 50) where | 
| 19736 | 65 | "x =1=> y == (x,y) \<in> parcontract" | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 66 | |
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 67 | abbreviation | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 68 | parcontract_rel :: "[comb,comb] => bool" (infixl "===>" 50) where | 
| 19736 | 69 | "x ===> y == (x,y) \<in> parcontract^*" | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 70 | |
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 71 | inductive parcontract | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 72 | intros | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 73 | refl: "x =1=> x" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 74 | K: "K##x##y =1=> x" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 75 | S: "S##x##y##z =1=> (x##z)##(y##z)" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 76 | Ap: "[| x=1=>y; z=1=>w |] ==> x##z =1=> y##w" | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 77 | |
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 78 | text {*
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 79 | Misc definitions. | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 80 | *} | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 81 | |
| 19736 | 82 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 83 | I :: comb where | 
| 19736 | 84 | "I = S##K##K" | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 85 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 86 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
21210diff
changeset | 87 |   diamond   :: "('a * 'a)set => bool" where
 | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 88 |     --{*confluence; Lambda/Commutation treats this more abstractly*}
 | 
| 19736 | 89 | "diamond(r) = (\<forall>x y. (x,y) \<in> r --> | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 90 | (\<forall>y'. (x,y') \<in> r --> | 
| 19736 | 91 | (\<exists>z. (y,z) \<in> r & (y',z) \<in> r)))" | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 92 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 93 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 94 | subsection {*Reflexive/Transitive closure preserves Church-Rosser property*}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 95 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 96 | text{*So does the Transitive closure, with a similar proof*}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 97 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 98 | text{*Strip lemma.  
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 99 | The induction hypothesis covers all but the last diamond of the strip.*} | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 100 | lemma diamond_strip_lemmaE [rule_format]: | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 101 | "[| diamond(r); (x,y) \<in> r^* |] ==> | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 102 | \<forall>y'. (x,y') \<in> r --> (\<exists>z. (y',z) \<in> r^* & (y,z) \<in> r)" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 103 | apply (unfold diamond_def) | 
| 16563 | 104 | apply (erule rtrancl_induct) | 
| 105 | apply (meson rtrancl_refl) | |
| 106 | apply (meson rtrancl_trans r_into_rtrancl) | |
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 107 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 108 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 109 | lemma diamond_rtrancl: "diamond(r) ==> diamond(r^*)" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 110 | apply (simp (no_asm_simp) add: diamond_def) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 111 | apply (rule impI [THEN allI, THEN allI]) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 112 | apply (erule rtrancl_induct, blast) | 
| 16588 | 113 | apply (meson rtrancl_trans r_into_rtrancl diamond_strip_lemmaE) | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 114 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 115 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 116 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 117 | subsection {* Non-contraction results *}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 118 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 119 | text {* Derive a case for each combinator constructor. *}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 120 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 121 | inductive_cases | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 122 | K_contractE [elim!]: "K -1-> r" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 123 | and S_contractE [elim!]: "S -1-> r" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 124 | and Ap_contractE [elim!]: "p##q -1-> r" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 125 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 126 | declare contract.K [intro!] contract.S [intro!] | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 127 | declare contract.Ap1 [intro] contract.Ap2 [intro] | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 128 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 129 | lemma I_contract_E [elim!]: "I -1-> z ==> P" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 130 | by (unfold I_def, blast) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 131 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 132 | lemma K1_contractD [elim!]: "K##x -1-> z ==> (\<exists>x'. z = K##x' & x -1-> x')" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 133 | by blast | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 134 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 135 | lemma Ap_reduce1 [intro]: "x ---> y ==> x##z ---> y##z" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 136 | apply (erule rtrancl_induct) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 137 | apply (blast intro: rtrancl_trans)+ | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 138 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 139 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 140 | lemma Ap_reduce2 [intro]: "x ---> y ==> z##x ---> z##y" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 141 | apply (erule rtrancl_induct) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 142 | apply (blast intro: rtrancl_trans)+ | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 143 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 144 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 145 | (** Counterexample to the diamond property for -1-> **) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 146 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 147 | lemma KIII_contract1: "K##I##(I##I) -1-> I" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 148 | by (rule contract.K) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 149 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 150 | lemma KIII_contract2: "K##I##(I##I) -1-> K##I##((K##I)##(K##I))" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 151 | by (unfold I_def, blast) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 152 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 153 | lemma KIII_contract3: "K##I##((K##I)##(K##I)) -1-> I" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 154 | by blast | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 155 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 156 | lemma not_diamond_contract: "~ diamond(contract)" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 157 | apply (unfold diamond_def) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 158 | apply (best intro: KIII_contract1 KIII_contract2 KIII_contract3) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 159 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 160 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 161 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 162 | subsection {* Results about Parallel Contraction *}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 163 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 164 | text {* Derive a case for each combinator constructor. *}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 165 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 166 | inductive_cases | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 167 | K_parcontractE [elim!]: "K =1=> r" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 168 | and S_parcontractE [elim!]: "S =1=> r" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 169 | and Ap_parcontractE [elim!]: "p##q =1=> r" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 170 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 171 | declare parcontract.intros [intro] | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 172 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 173 | (*** Basic properties of parallel contraction ***) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 174 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 175 | subsection {* Basic properties of parallel contraction *}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 176 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 177 | lemma K1_parcontractD [dest!]: "K##x =1=> z ==> (\<exists>x'. z = K##x' & x =1=> x')" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 178 | by blast | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 179 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 180 | lemma S1_parcontractD [dest!]: "S##x =1=> z ==> (\<exists>x'. z = S##x' & x =1=> x')" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 181 | by blast | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 182 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 183 | lemma S2_parcontractD [dest!]: | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 184 | "S##x##y =1=> z ==> (\<exists>x' y'. z = S##x'##y' & x =1=> x' & y =1=> y')" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 185 | by blast | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 186 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 187 | text{*The rules above are not essential but make proofs much faster*}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 188 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 189 | text{*Church-Rosser property for parallel contraction*}
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 190 | lemma diamond_parcontract: "diamond parcontract" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 191 | apply (unfold diamond_def) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 192 | apply (rule impI [THEN allI, THEN allI]) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 193 | apply (erule parcontract.induct, fast+) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 194 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 195 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 196 | text {*
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 197 |   \medskip Equivalence of @{prop "p ---> q"} and @{prop "p ===> q"}.
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 198 | *} | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 199 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 200 | lemma contract_subset_parcontract: "contract <= parcontract" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 201 | apply (rule subsetI) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 202 | apply (simp only: split_tupled_all) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 203 | apply (erule contract.induct, blast+) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 204 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 205 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 206 | text{*Reductions: simply throw together reflexivity, transitivity and
 | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 207 | the one-step reductions*} | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 208 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 209 | declare r_into_rtrancl [intro] rtrancl_trans [intro] | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 210 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 211 | (*Example only: not used*) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 212 | lemma reduce_I: "I##x ---> x" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 213 | by (unfold I_def, blast) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 214 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 215 | lemma parcontract_subset_reduce: "parcontract <= contract^*" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 216 | apply (rule subsetI) | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 217 | apply (simp only: split_tupled_all) | 
| 16563 | 218 | apply (erule parcontract.induct, blast+) | 
| 13075 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 219 | done | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 220 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 221 | lemma reduce_eq_parreduce: "contract^* = parcontract^*" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 222 | by (rule equalityI contract_subset_parcontract [THEN rtrancl_mono] | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 223 | parcontract_subset_reduce [THEN rtrancl_subset_rtrancl])+ | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 224 | |
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 225 | lemma diamond_reduce: "diamond(contract^*)" | 
| 
d3e1d554cd6d
conversion of some HOL/Induct proof scripts to Isar
 paulson parents: 
11359diff
changeset | 226 | by (simp add: reduce_eq_parreduce diamond_rtrancl diamond_parcontract) | 
| 3120 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 227 | |
| 
c58423c20740
New directory to contain examples of (co)inductive definitions
 paulson parents: diff
changeset | 228 | end |