| author | wenzelm | 
| Sat, 24 Oct 2009 19:04:57 +0200 | |
| changeset 33091 | d23e75d4f7da | 
| parent 25895 | 0eaadfa8889e | 
| child 35170 | bb1d1c6a10bb | 
| permissions | -rw-r--r-- | 
| 1479 | 1 | (* Title: HOLCF/ex/Loop.thy | 
| 244 | 2 | ID: $Id$ | 
| 1479 | 3 | Author: Franz Regensburger | 
| 244 | 4 | *) | 
| 5 | ||
| 17291 | 6 | header {* Theory for a loop primitive like while *}
 | 
| 244 | 7 | |
| 17291 | 8 | theory Loop | 
| 9 | imports HOLCF | |
| 10 | begin | |
| 244 | 11 | |
| 19763 | 12 | definition | 
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
19763diff
changeset | 13 |   step  :: "('a -> tr)->('a -> 'a)->'a->'a" where
 | 
| 19763 | 14 | "step = (LAM b g x. If b$x then g$x else x fi)" | 
| 19742 | 15 | |
| 21404 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
19763diff
changeset | 16 | definition | 
| 
eb85850d3eb7
more robust syntax for definition/abbreviation/notation;
 wenzelm parents: 
19763diff
changeset | 17 |   while :: "('a -> tr)->('a -> 'a)->'a->'a" where
 | 
| 19763 | 18 | "while = (LAM b g. fix$(LAM f x. If b$x then f$(g$x) else x fi))" | 
| 244 | 19 | |
| 19742 | 20 | (* ------------------------------------------------------------------------- *) | 
| 21 | (* access to definitions *) | |
| 22 | (* ------------------------------------------------------------------------- *) | |
| 23 | ||
| 24 | ||
| 25 | lemma step_def2: "step$b$g$x = If b$x then g$x else x fi" | |
| 26 | apply (unfold step_def) | |
| 27 | apply simp | |
| 28 | done | |
| 29 | ||
| 30 | lemma while_def2: "while$b$g = fix$(LAM f x. If b$x then f$(g$x) else x fi)" | |
| 31 | apply (unfold while_def) | |
| 32 | apply simp | |
| 33 | done | |
| 34 | ||
| 35 | ||
| 36 | (* ------------------------------------------------------------------------- *) | |
| 37 | (* rekursive properties of while *) | |
| 38 | (* ------------------------------------------------------------------------- *) | |
| 39 | ||
| 40 | lemma while_unfold: "while$b$g$x = If b$x then while$b$g$(g$x) else x fi" | |
| 41 | apply (rule trans) | |
| 42 | apply (rule while_def2 [THEN fix_eq5]) | |
| 43 | apply simp | |
| 44 | done | |
| 45 | ||
| 46 | lemma while_unfold2: "ALL x. while$b$g$x = while$b$g$(iterate k$(step$b$g)$x)" | |
| 47 | apply (induct_tac k) | |
| 48 | apply simp | |
| 49 | apply (rule allI) | |
| 50 | apply (rule trans) | |
| 51 | apply (subst while_unfold) | |
| 52 | apply (rule_tac [2] refl) | |
| 53 | apply (subst iterate_Suc2) | |
| 54 | apply (rule trans) | |
| 55 | apply (erule_tac [2] spec) | |
| 56 | apply (subst step_def2) | |
| 57 | apply (rule_tac p = "b$x" in trE) | |
| 58 | apply simp | |
| 59 | apply (subst while_unfold) | |
| 60 | apply (rule_tac s = "UU" and t = "b$UU" in ssubst) | |
| 61 | apply (erule flat_codom [THEN disjE]) | |
| 62 | apply assumption | |
| 63 | apply (erule spec) | |
| 64 | apply simp | |
| 65 | apply simp | |
| 66 | apply simp | |
| 67 | apply (subst while_unfold) | |
| 68 | apply simp | |
| 69 | done | |
| 70 | ||
| 71 | lemma while_unfold3: "while$b$g$x = while$b$g$(step$b$g$x)" | |
| 72 | apply (rule_tac s = "while$b$g$ (iterate (Suc 0) $ (step$b$g) $x) " in trans) | |
| 73 | apply (rule while_unfold2 [THEN spec]) | |
| 74 | apply simp | |
| 75 | done | |
| 76 | ||
| 77 | ||
| 78 | (* ------------------------------------------------------------------------- *) | |
| 79 | (* properties of while and iterations *) | |
| 80 | (* ------------------------------------------------------------------------- *) | |
| 81 | ||
| 82 | lemma loop_lemma1: "[| EX y. b$y=FF; iterate k$(step$b$g)$x = UU |] | |
| 83 | ==>iterate(Suc k)$(step$b$g)$x=UU" | |
| 84 | apply (simp (no_asm)) | |
| 85 | apply (rule trans) | |
| 86 | apply (rule step_def2) | |
| 87 | apply simp | |
| 88 | apply (erule exE) | |
| 89 | apply (erule flat_codom [THEN disjE]) | |
| 90 | apply simp_all | |
| 91 | done | |
| 92 | ||
| 93 | lemma loop_lemma2: "[|EX y. b$y=FF;iterate (Suc k)$(step$b$g)$x ~=UU |]==> | |
| 94 | iterate k$(step$b$g)$x ~=UU" | |
| 95 | apply (blast intro: loop_lemma1) | |
| 96 | done | |
| 97 | ||
| 98 | lemma loop_lemma3 [rule_format (no_asm)]: | |
| 99 | "[| ALL x. INV x & b$x=TT & g$x~=UU --> INV (g$x); | |
| 100 | EX y. b$y=FF; INV x |] | |
| 101 | ==> iterate k$(step$b$g)$x ~=UU --> INV (iterate k$(step$b$g)$x)" | |
| 102 | apply (induct_tac "k") | |
| 103 | apply (simp (no_asm_simp)) | |
| 104 | apply (intro strip) | |
| 105 | apply (simp (no_asm) add: step_def2) | |
| 106 | apply (rule_tac p = "b$ (iterate n$ (step$b$g) $x) " in trE) | |
| 107 | apply (erule notE) | |
| 108 | apply (tactic {* asm_simp_tac (HOLCF_ss addsimps [thm "step_def2"]) 1 *})
 | |
| 109 | apply (tactic "asm_simp_tac HOLCF_ss 1") | |
| 110 | apply (rule mp) | |
| 111 | apply (erule spec) | |
| 112 | apply (tactic {* asm_simp_tac (HOLCF_ss delsimps [thm "iterate_Suc"]
 | |
| 113 | addsimps [thm "loop_lemma2"]) 1 *}) | |
| 114 | apply (rule_tac s = "iterate (Suc n) $ (step$b$g) $x" | |
| 115 | and t = "g$ (iterate n$ (step$b$g) $x) " in ssubst) | |
| 116 | prefer 2 apply (assumption) | |
| 117 | apply (simp add: step_def2) | |
| 118 | apply (simp del: iterate_Suc add: loop_lemma2) | |
| 119 | done | |
| 120 | ||
| 121 | lemma loop_lemma4 [rule_format]: | |
| 122 | "ALL x. b$(iterate k$(step$b$g)$x)=FF --> while$b$g$x= iterate k$(step$b$g)$x" | |
| 123 | apply (induct_tac k) | |
| 124 | apply (simp (no_asm)) | |
| 125 | apply (intro strip) | |
| 126 | apply (simplesubst while_unfold) | |
| 127 | apply simp | |
| 128 | apply (rule allI) | |
| 129 | apply (simplesubst iterate_Suc2) | |
| 130 | apply (intro strip) | |
| 131 | apply (rule trans) | |
| 132 | apply (rule while_unfold3) | |
| 133 | apply simp | |
| 134 | done | |
| 135 | ||
| 136 | lemma loop_lemma5 [rule_format (no_asm)]: | |
| 137 | "ALL k. b$(iterate k$(step$b$g)$x) ~= FF ==> | |
| 138 | ALL m. while$b$g$(iterate m$(step$b$g)$x)=UU" | |
| 139 | apply (simplesubst while_def2) | |
| 140 | apply (rule fix_ind) | |
| 25895 
0eaadfa8889e
converted adm_all and adm_ball to rule_format; cleaned up
 huffman parents: 
21404diff
changeset | 141 | apply (rule adm_all) | 
| 19742 | 142 | apply (rule adm_eq) | 
| 143 | apply (tactic "cont_tacR 1") | |
| 144 | apply (simp (no_asm)) | |
| 145 | apply (rule allI) | |
| 146 | apply (simp (no_asm)) | |
| 147 | apply (rule_tac p = "b$ (iterate m$ (step$b$g) $x) " in trE) | |
| 148 | apply (simp (no_asm_simp)) | |
| 149 | apply (simp (no_asm_simp)) | |
| 150 | apply (rule_tac s = "xa$ (iterate (Suc m) $ (step$b$g) $x) " in trans) | |
| 151 | apply (erule_tac [2] spec) | |
| 152 | apply (rule cfun_arg_cong) | |
| 153 | apply (rule trans) | |
| 154 | apply (rule_tac [2] iterate_Suc [symmetric]) | |
| 155 | apply (simp add: step_def2) | |
| 156 | apply blast | |
| 157 | done | |
| 158 | ||
| 159 | lemma loop_lemma6: "ALL k. b$(iterate k$(step$b$g)$x) ~= FF ==> while$b$g$x=UU" | |
| 160 | apply (rule_tac t = "x" in iterate_0 [THEN subst]) | |
| 161 | apply (erule loop_lemma5) | |
| 162 | done | |
| 163 | ||
| 164 | lemma loop_lemma7: "while$b$g$x ~= UU ==> EX k. b$(iterate k$(step$b$g)$x) = FF" | |
| 165 | apply (blast intro: loop_lemma6) | |
| 166 | done | |
| 167 | ||
| 168 | ||
| 169 | (* ------------------------------------------------------------------------- *) | |
| 170 | (* an invariant rule for loops *) | |
| 171 | (* ------------------------------------------------------------------------- *) | |
| 172 | ||
| 173 | lemma loop_inv2: | |
| 174 | "[| (ALL y. INV y & b$y=TT & g$y ~= UU --> INV (g$y)); | |
| 175 | (ALL y. INV y & b$y=FF --> Q y); | |
| 176 | INV x; while$b$g$x~=UU |] ==> Q (while$b$g$x)" | |
| 177 | apply (rule_tac P = "%k. b$ (iterate k$ (step$b$g) $x) =FF" in exE) | |
| 178 | apply (erule loop_lemma7) | |
| 179 | apply (simplesubst loop_lemma4) | |
| 180 | apply assumption | |
| 181 | apply (drule spec, erule mp) | |
| 182 | apply (rule conjI) | |
| 183 | prefer 2 apply (assumption) | |
| 184 | apply (rule loop_lemma3) | |
| 185 | apply assumption | |
| 186 | apply (blast intro: loop_lemma6) | |
| 187 | apply assumption | |
| 188 | apply (rotate_tac -1) | |
| 189 | apply (simp add: loop_lemma4) | |
| 190 | done | |
| 191 | ||
| 192 | lemma loop_inv: | |
| 193 | assumes premP: "P(x)" | |
| 194 | and premI: "!!y. P y ==> INV y" | |
| 195 | and premTT: "!!y. [| INV y; b$y=TT; g$y~=UU|] ==> INV (g$y)" | |
| 196 | and premFF: "!!y. [| INV y; b$y=FF|] ==> Q y" | |
| 197 | and premW: "while$b$g$x ~= UU" | |
| 198 | shows "Q (while$b$g$x)" | |
| 199 | apply (rule loop_inv2) | |
| 200 | apply (rule_tac [3] premP [THEN premI]) | |
| 201 | apply (rule_tac [3] premW) | |
| 202 | apply (blast intro: premTT) | |
| 203 | apply (blast intro: premFF) | |
| 204 | done | |
| 244 | 205 | |
| 206 | end | |
| 17291 | 207 |