| author | ballarin | 
| Fri, 09 Sep 2005 12:18:15 +0200 | |
| changeset 17316 | fc7cc8137b97 | 
| parent 14981 | e73f8140af78 | 
| child 18075 | 43000d7a017c | 
| permissions | -rw-r--r-- | 
| 1461 | 1 | (* Title: HOLCF/ex/Loop.ML | 
| 244 | 2 | ID: $Id$ | 
| 1461 | 3 | Author: Franz Regensburger | 
| 244 | 4 | |
| 9169 | 5 | Theory for a loop primitive like while | 
| 244 | 6 | *) | 
| 7 | ||
| 9169 | 8 | (* ------------------------------------------------------------------------- *) | 
| 9 | (* access to definitions *) | |
| 10 | (* ------------------------------------------------------------------------- *) | |
| 244 | 11 | |
| 12 | ||
| 10835 | 13 | Goalw [step_def] "step$b$g$x = If b$x then g$x else x fi"; | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 14 | by (Simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 15 | qed "step_def2"; | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 16 | |
| 10835 | 17 | Goalw [while_def] "while$b$g = fix$(LAM f x. If b$x then f$(g$x) else x fi)"; | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 18 | by (Simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 19 | qed "while_def2"; | 
| 244 | 20 | |
| 21 | ||
| 22 | (* ------------------------------------------------------------------------- *) | |
| 23 | (* rekursive properties of while *) | |
| 24 | (* ------------------------------------------------------------------------- *) | |
| 25 | ||
| 10835 | 26 | Goal "while$b$g$x = If b$x then while$b$g$(g$x) else x fi"; | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 27 | by (fix_tac5 while_def2 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 28 | by (Simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 29 | qed "while_unfold"; | 
| 244 | 30 | |
| 10835 | 31 | Goal "ALL x. while$b$g$x = while$b$g$(iterate k (step$b$g) x)"; | 
| 13454 | 32 | by (induct_tac "k" 1); | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 33 | by (simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 34 | by (rtac allI 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 35 | by (rtac trans 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 36 | by (stac while_unfold 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 37 | by (rtac refl 2); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 38 | by (stac iterate_Suc2 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 39 | by (rtac trans 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 40 | by (etac spec 2); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 41 | by (stac step_def2 1); | 
| 10835 | 42 | by (res_inst_tac [("p","b$x")] trE 1);
 | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 43 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 44 | by (stac while_unfold 1); | 
| 10835 | 45 | by (res_inst_tac [("s","UU"),("t","b$UU")]ssubst 1);
 | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 46 | by (etac (flat_codom RS disjE) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 47 | by (atac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 48 | by (etac spec 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 49 | by (simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 50 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 51 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 52 | by (stac while_unfold 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 53 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 54 | qed "while_unfold2"; | 
| 244 | 55 | |
| 10835 | 56 | Goal "while$b$g$x = while$b$g$(step$b$g$x)"; | 
| 57 | by (res_inst_tac [("s", "while$b$g$(iterate (Suc 0) (step$b$g) x)")] trans 1);
 | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 58 | by (rtac (while_unfold2 RS spec) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 59 | by (Simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 60 | qed "while_unfold3"; | 
| 244 | 61 | |
| 62 | ||
| 9169 | 63 | (* ------------------------------------------------------------------------- *) | 
| 64 | (* properties of while and iterations *) | |
| 65 | (* ------------------------------------------------------------------------- *) | |
| 244 | 66 | |
| 10835 | 67 | Goal "[| EX y. b$y=FF; iterate k (step$b$g) x = UU |] \ | 
| 68 | \ ==>iterate(Suc k) (step$b$g) x=UU"; | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 69 | by (Simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 70 | by (rtac trans 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 71 | by (rtac step_def2 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 72 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 73 | by (etac exE 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 74 | by (etac (flat_codom RS disjE) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 75 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 76 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 77 | qed "loop_lemma1"; | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 78 | |
| 10835 | 79 | Goal "[|EX y. b$y=FF;iterate (Suc k) (step$b$g) x ~=UU |]==>\ | 
| 80 | \ iterate k (step$b$g) x ~=UU"; | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 81 | |
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 82 | by (blast_tac (claset() addIs [loop_lemma1]) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 83 | qed "loop_lemma2"; | 
| 244 | 84 | |
| 10835 | 85 | Goal "[| ALL x. INV x & b$x=TT & g$x~=UU --> INV (g$x);\ | 
| 86 | \ EX y. b$y=FF; INV x |] \ | |
| 87 | \ ==> iterate k (step$b$g) x ~=UU --> INV (iterate k (step$b$g) x)"; | |
| 13454 | 88 | by (induct_tac "k" 1); | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 89 | by (Asm_simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 90 | by (strip_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 91 | by (simp_tac (simpset() addsimps [step_def2]) 1); | 
| 13454 | 92 | by (res_inst_tac [("p","b$(iterate n (step$b$g) x)")] trE 1);
 | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 93 | by (etac notE 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 94 | by (asm_simp_tac (HOLCF_ss addsimps [step_def2] ) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 95 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 96 | by (rtac mp 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 97 | by (etac spec 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 98 | by (asm_simp_tac (HOLCF_ss delsimps [iterate_Suc] addsimps [loop_lemma2] ) 1); | 
| 13454 | 99 | by (res_inst_tac [("s","iterate (Suc n) (step$b$g) x"),
 | 
| 100 |                   ("t","g$(iterate n (step$b$g) x)")] ssubst 1);
 | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 101 | by (atac 2); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 102 | by (asm_simp_tac (HOLCF_ss addsimps [step_def2] ) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 103 | by (asm_simp_tac (HOLCF_ss delsimps [iterate_Suc] addsimps [loop_lemma2] ) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 104 | qed_spec_mp "loop_lemma3"; | 
| 244 | 105 | |
| 10835 | 106 | Goal "ALL x. b$(iterate k (step$b$g) x)=FF --> while$b$g$x= iterate k (step$b$g) x"; | 
| 13454 | 107 | by (induct_tac "k" 1); | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 108 | by (Simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 109 | by (strip_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 110 | by (stac while_unfold 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 111 | by (asm_simp_tac HOLCF_ss 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 112 | by (rtac allI 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 113 | by (stac iterate_Suc2 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 114 | by (strip_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 115 | by (rtac trans 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 116 | by (rtac while_unfold3 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 117 | by (Asm_simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 118 | qed_spec_mp "loop_lemma4"; | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 119 | |
| 10835 | 120 | Goal "ALL k. b$(iterate k (step$b$g) x) ~= FF ==>\ | 
| 121 | \ ALL m. while$b$g$(iterate m (step$b$g) x)=UU"; | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 122 | by (stac while_def2 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 123 | by (rtac fix_ind 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 124 | by (rtac (allI RS adm_all) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 125 | by (rtac adm_eq 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 126 | by (cont_tacR 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 127 | by (Simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 128 | by (rtac allI 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 129 | by (Simp_tac 1); | 
| 10835 | 130 | by (res_inst_tac [("p","b$(iterate m (step$b$g) x)")] trE 1);
 | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 131 | by (Asm_simp_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 132 | by (Asm_simp_tac 1); | 
| 10835 | 133 | by (res_inst_tac [("s","xa$(iterate (Suc m) (step$b$g) x)")] trans 1);
 | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 134 | by (etac spec 2); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 135 | by (rtac cfun_arg_cong 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 136 | by (rtac trans 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 137 | by (rtac (iterate_Suc RS sym) 2); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 138 | by (asm_simp_tac (HOLCF_ss addsimps [step_def2]) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 139 | by (Blast_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 140 | qed_spec_mp "loop_lemma5"; | 
| 244 | 141 | |
| 142 | ||
| 10835 | 143 | Goal "ALL k. b$(iterate k (step$b$g) x) ~= FF ==> while$b$g$x=UU"; | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 144 | by (res_inst_tac [("t","x")] (iterate_0 RS subst) 1);
 | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 145 | by (etac (loop_lemma5) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 146 | qed "loop_lemma6"; | 
| 244 | 147 | |
| 10835 | 148 | Goal "while$b$g$x ~= UU ==> EX k. b$(iterate k (step$b$g) x) = FF"; | 
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 149 | by (blast_tac (claset() addIs [loop_lemma6]) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 150 | qed "loop_lemma7"; | 
| 244 | 151 | |
| 152 | ||
| 1168 
74be52691d62
The curried version of HOLCF is now just called HOLCF. The old
 regensbu parents: 
1043diff
changeset | 153 | (* ------------------------------------------------------------------------- *) | 
| 
74be52691d62
The curried version of HOLCF is now just called HOLCF. The old
 regensbu parents: 
1043diff
changeset | 154 | (* an invariant rule for loops *) | 
| 
74be52691d62
The curried version of HOLCF is now just called HOLCF. The old
 regensbu parents: 
1043diff
changeset | 155 | (* ------------------------------------------------------------------------- *) | 
| 244 | 156 | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 157 | Goal | 
| 10835 | 158 | "[| (ALL y. INV y & b$y=TT & g$y ~= UU --> INV (g$y));\ | 
| 159 | \ (ALL y. INV y & b$y=FF --> Q y);\ | |
| 160 | \ INV x; while$b$g$x~=UU |] ==> Q (while$b$g$x)"; | |
| 161 | by (res_inst_tac [("P","%k. b$(iterate k (step$b$g) x)=FF")] exE 1);
 | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 162 | by (etac loop_lemma7 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 163 | by (stac (loop_lemma4) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 164 | by (atac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 165 | by (dtac spec 1 THEN etac mp 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 166 | by (rtac conjI 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 167 | by (atac 2); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 168 | by (rtac (loop_lemma3) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 169 | by (assume_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 170 | by (blast_tac (claset() addIs [loop_lemma6]) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 171 | by (assume_tac 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 172 | by (rotate_tac ~1 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 173 | by (asm_full_simp_tac (simpset() addsimps [loop_lemma4]) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 174 | qed "loop_inv2"; | 
| 244 | 175 | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 176 | val [premP,premI,premTT,premFF,premW] = Goal | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 177 | "[| P(x); \ | 
| 3842 | 178 | \ !!y. P y ==> INV y;\ | 
| 10835 | 179 | \ !!y. [| INV y; b$y=TT; g$y~=UU|] ==> INV (g$y);\ | 
| 180 | \ !!y. [| INV y; b$y=FF|] ==> Q y;\ | |
| 181 | \ while$b$g$x ~= UU |] ==> Q (while$b$g$x)"; | |
| 9248 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 182 | by (rtac loop_inv2 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 183 | by (rtac (premP RS premI) 3); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 184 | by (rtac premW 3); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 185 | by (blast_tac (claset() addIs [premTT]) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 186 | by (blast_tac (claset() addIs [premFF]) 1); | 
| 
e1dee89de037
massive tidy-up: goal -> Goal, remove use of prems, etc.
 paulson parents: 
9169diff
changeset | 187 | qed "loop_inv"; |