| author | nipkow | 
| Thu, 05 Feb 2004 04:30:38 +0100 | |
| changeset 14376 | 9fe787a90a48 | 
| parent 11704 | 3c50a2cd6f00 | 
| child 15354 | 9234f5765d9c | 
| permissions | -rw-r--r-- | 
| 8177 | 1  | 
(* Title: HOL/IMPP/EvenOdd.ML  | 
2  | 
ID: $Id$  | 
|
3  | 
Author: David von Oheimb  | 
|
4  | 
Copyright 1999 TUM  | 
|
5  | 
*)  | 
|
6  | 
||
7  | 
section "even";  | 
|
8  | 
||
9  | 
Goalw [even_def] "even 0";  | 
|
10  | 
by (Simp_tac 1);  | 
|
11  | 
qed "even_0";  | 
|
12  | 
Addsimps [even_0];  | 
|
13  | 
||
| 
11701
 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 
wenzelm 
parents: 
11464 
diff
changeset
 | 
14  | 
Goalw [even_def] "even (Suc 0) = False";  | 
| 11364 | 15  | 
by (Simp_tac 1);  | 
| 8177 | 16  | 
qed "not_even_1";  | 
17  | 
Addsimps [not_even_1];  | 
|
18  | 
||
19  | 
Goalw [even_def] "even (Suc (Suc n)) = even n";  | 
|
| 
11704
 
3c50a2cd6f00
* sane numerals (stage 2): plain "num" syntax (removed "#");
 
wenzelm 
parents: 
11701 
diff
changeset
 | 
20  | 
by (subgoal_tac "Suc (Suc n) = n+2" 1);  | 
| 8177 | 21  | 
by (Simp_tac 2);  | 
| 10962 | 22  | 
by (etac ssubst 1);  | 
23  | 
by (rtac dvd_reduce 1);  | 
|
| 8177 | 24  | 
qed "even_step";  | 
25  | 
Addsimps[even_step];  | 
|
26  | 
||
27  | 
||
28  | 
section "Arg, Res";  | 
|
29  | 
||
30  | 
Addsimps[Arg_neq_Res,Arg_neq_Res RS not_sym];  | 
|
31  | 
Addsimps[Even_neq_Odd, Even_neq_Odd RS not_sym];  | 
|
32  | 
||
33  | 
Goalw [Z_eq_Arg_plus_def] "(Z=Arg+n) Z s = (Z = s<Arg>+n)";  | 
|
| 10962 | 34  | 
by (rtac refl 1);  | 
| 8177 | 35  | 
qed "Z_eq_Arg_plus_def2";  | 
36  | 
||
37  | 
Goalw [Res_ok_def] "Res_ok Z s = (even Z = (s<Res> = 0))";  | 
|
| 10962 | 38  | 
by (rtac refl 1);  | 
| 8177 | 39  | 
qed "Res_ok_def2";  | 
40  | 
||
41  | 
val Arg_Res_css = (claset(),simpset()addsimps[Z_eq_Arg_plus_def2,Res_ok_def2]);  | 
|
42  | 
||
43  | 
Goalw [body_def, bodies_def] "body Odd = Some odd";  | 
|
44  | 
by Auto_tac;  | 
|
45  | 
qed "body_Odd";  | 
|
46  | 
Goalw [body_def, bodies_def] "body Even = Some evn";  | 
|
47  | 
by Auto_tac;  | 
|
48  | 
qed "body_Even";  | 
|
49  | 
Addsimps[body_Odd, body_Even];  | 
|
50  | 
||
51  | 
section "verification";  | 
|
52  | 
||
| 
11701
 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 
wenzelm 
parents: 
11464 
diff
changeset
 | 
53  | 
Goalw [odd_def] "{{Z=Arg+0}. BODY Even .{Res_ok}}|-{Z=Arg+Suc 0}. odd .{Res_ok}";
 | 
| 10962 | 54  | 
by (rtac hoare_derivs.If 1);  | 
55  | 
by (rtac (hoare_derivs.Ass RS conseq1) 1);  | 
|
| 8177 | 56  | 
by (clarsimp_tac Arg_Res_css 1);  | 
| 10962 | 57  | 
by (rtac export_s 1);  | 
58  | 
by (rtac (hoare_derivs.Call RS conseq1) 1);  | 
|
| 
11701
 
3d51fbf81c17
sane numerals (stage 1): added generic 1, removed 1' and 2 on nat,
 
wenzelm 
parents: 
11464 
diff
changeset
 | 
59  | 
by  (res_inst_tac [("P","Z=Arg+Suc (Suc 0)")] conseq12 1);
 | 
| 10962 | 60  | 
by (rtac single_asm 1);  | 
| 8177 | 61  | 
by (auto_tac Arg_Res_css);  | 
62  | 
qed "Odd_lemma";  | 
|
63  | 
||
64  | 
Goalw [evn_def] "{{Z=Arg+1}. BODY Odd .{Res_ok}}|-{Z=Arg+0}. evn .{Res_ok}";
 | 
|
| 10962 | 65  | 
by (rtac hoare_derivs.If 1);  | 
66  | 
by (rtac (hoare_derivs.Ass RS conseq1) 1);  | 
|
| 8177 | 67  | 
by (clarsimp_tac Arg_Res_css 1);  | 
| 10962 | 68  | 
by (rtac hoare_derivs.Comp 1);  | 
69  | 
by (rtac hoare_derivs.Ass 2);  | 
|
| 8177 | 70  | 
by (Clarsimp_tac 1);  | 
71  | 
by (res_inst_tac [("Q","%Z s. ?P Z s & Res_ok Z s")] hoare_derivs.Comp 1);
 | 
|
| 10962 | 72  | 
by (rtac export_s 1);  | 
| 8177 | 73  | 
by  (res_inst_tac [("I1","%Z l. Z = l Arg & 0 < Z"),
 | 
74  | 
		   ("Q1","Res_ok")] (Call_invariant RS conseq12) 1);
 | 
|
| 10962 | 75  | 
by (rtac (single_asm RS conseq2) 1);  | 
| 8177 | 76  | 
by (clarsimp_tac Arg_Res_css 1);  | 
77  | 
by (force_tac Arg_Res_css 1);  | 
|
| 10962 | 78  | 
by (rtac export_s 1);  | 
| 8177 | 79  | 
by (res_inst_tac [("I1","%Z l. even Z = (l Res = 0)"),
 | 
80  | 
		  ("Q1","%Z s. even Z = (s<Arg>=0)")]
 | 
|
81  | 
(Call_invariant RS conseq12) 1);  | 
|
| 10962 | 82  | 
by (rtac (single_asm RS conseq2) 1);  | 
| 8177 | 83  | 
by (clarsimp_tac Arg_Res_css 1);  | 
84  | 
by (force_tac Arg_Res_css 1);  | 
|
85  | 
qed "Even_lemma";  | 
|
86  | 
||
87  | 
||
88  | 
Goal "{}|-{Z=Arg+0}. BODY Even .{Res_ok}";
 | 
|
| 10962 | 89  | 
by (rtac BodyN 1);  | 
| 8177 | 90  | 
by (Simp_tac 1);  | 
| 10962 | 91  | 
by (rtac (Even_lemma RS hoare_derivs.cut) 1);  | 
92  | 
by (rtac BodyN 1);  | 
|
| 8177 | 93  | 
by (Simp_tac 1);  | 
| 10962 | 94  | 
by (rtac (Odd_lemma RS thin) 1);  | 
| 8177 | 95  | 
by (Simp_tac 1);  | 
96  | 
qed "Even_ok_N";  | 
|
97  | 
||
98  | 
Goal "{}|-{Z=Arg+0}. BODY Even .{Res_ok}";
 | 
|
| 10962 | 99  | 
by (rtac conseq1 1);  | 
| 8177 | 100  | 
by  (res_inst_tac [("Procs","{Odd, Even}"), ("pn","Even"), 
 | 
101  | 
      ("P","%pn. Z=Arg+(if pn = Odd then 1 else 0)"),
 | 
|
102  | 
      ("Q","%pn. Res_ok")] Body1 1);
 | 
|
103  | 
by Auto_tac;  | 
|
| 10962 | 104  | 
by (rtac hoare_derivs.insert 1);  | 
105  | 
by (rtac (Odd_lemma RS thin) 1);  | 
|
| 8177 | 106  | 
by (Simp_tac 1);  | 
| 10962 | 107  | 
by (rtac (Even_lemma RS thin) 1);  | 
| 8177 | 108  | 
by (Simp_tac 1);  | 
109  | 
qed "Even_ok_S";  |