author | wenzelm |
Mon, 25 Feb 2002 20:48:14 +0100 | |
changeset 12937 | 0c4fd7529467 |
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"; |