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