11 Goal "|- VARS m s a b. \ |
11 Goal "|- VARS m s a b. \ |
12 \ {a=A & b=B} \ |
12 \ {a=A & b=B} \ |
13 \ m := 0; s := 0; \ |
13 \ m := 0; s := 0; \ |
14 \ WHILE m~=a \ |
14 \ WHILE m~=a \ |
15 \ INV {s=m*b & a=A & b=B} \ |
15 \ INV {s=m*b & a=A & b=B} \ |
16 \ DO s := s+b; m := m+1 OD \ |
16 \ DO s := s+b; m := m+(1::nat) OD \ |
17 \ {s = A*B}"; |
17 \ {s = A*B}"; |
18 by (hoare_tac (Asm_full_simp_tac) 1); |
18 by (hoare_tac (Asm_full_simp_tac) 1); |
19 qed "multiply_by_add"; |
19 qed "multiply_by_add"; |
20 |
20 |
21 (** Euclid's algorithm for GCD **) |
21 (** Euclid's algorithm for GCD **) |
48 [diff_mult_distrib,diff_mult_distrib2,add_mult_distrib,add_mult_distrib2]; |
48 [diff_mult_distrib,diff_mult_distrib2,add_mult_distrib,add_mult_distrib2]; |
49 |
49 |
50 Goal "|- VARS a b x y. \ |
50 Goal "|- VARS a b x y. \ |
51 \ {0<A & 0<B & a=A & b=B & x=B & y=A} \ |
51 \ {0<A & 0<B & a=A & b=B & x=B & y=A} \ |
52 \ WHILE a ~= b \ |
52 \ WHILE a ~= b \ |
53 \ INV {0<a & 0<b & gcd A B = gcd a b & #2*A*B = a*x + b*y} \ |
53 \ INV {0<a & 0<b & gcd A B = gcd a b & # 2*A*B = a*x + b*y} \ |
54 \ DO IF a<b THEN (b := b-a; x := x+y) ELSE (a := a-b; y := y+x) FI OD \ |
54 \ DO IF a<b THEN (b := b-a; x := x+y) ELSE (a := a-b; y := y+x) FI OD \ |
55 \ {a = gcd A B & #2*A*B = a*(x+y)}"; |
55 \ {a = gcd A B & # 2*A*B = a*(x+y)}"; |
56 by (hoare_tac (K all_tac) 1); |
56 by (hoare_tac (K all_tac) 1); |
57 by(Asm_simp_tac 1); |
57 by(Asm_simp_tac 1); |
58 by(asm_simp_tac (simpset() addsimps |
58 by(asm_simp_tac (simpset() addsimps |
59 (distribs @ [gcd_diff_r,not_less_iff_le, gcd_diff_l])) 1); |
59 (distribs @ [gcd_diff_r,not_less_iff_le, gcd_diff_l])) 1); |
60 by(arith_tac 1); |
60 by(arith_tac 1); |
63 |
63 |
64 (** Power by iterated squaring and multiplication **) |
64 (** Power by iterated squaring and multiplication **) |
65 |
65 |
66 Goal "|- VARS a b c. \ |
66 Goal "|- VARS a b c. \ |
67 \ {a=A & b=B} \ |
67 \ {a=A & b=B} \ |
68 \ c := 1; \ |
68 \ c := (1::nat); \ |
69 \ WHILE b ~= 0 \ |
69 \ WHILE b ~= 0 \ |
70 \ INV {A^B = c * a^b} \ |
70 \ INV {A^B = c * a^b} \ |
71 \ DO WHILE b mod #2 = 0 \ |
71 \ DO WHILE b mod # 2 = 0 \ |
72 \ INV {A^B = c * a^b} \ |
72 \ INV {A^B = c * a^b} \ |
73 \ DO a := a*a; b := b div #2 OD; \ |
73 \ DO a := a*a; b := b div # 2 OD; \ |
74 \ c := c*a; b := b-1 \ |
74 \ c := c*a; b := b - 1 \ |
75 \ OD \ |
75 \ OD \ |
76 \ {c = A^B}"; |
76 \ {c = A^B}"; |
77 by (hoare_tac (Asm_full_simp_tac) 1); |
77 by (hoare_tac (Asm_full_simp_tac) 1); |
78 by (case_tac "b" 1); |
78 by (case_tac "b" 1); |
79 by (asm_full_simp_tac (simpset() addsimps [mod_less]) 1); |
79 by (asm_full_simp_tac (simpset() addsimps [mod_less]) 1); |
109 |
109 |
110 (* without multiplication *) |
110 (* without multiplication *) |
111 |
111 |
112 Goal "|- VARS u w r x. \ |
112 Goal "|- VARS u w r x. \ |
113 \ {True} \ |
113 \ {True} \ |
114 \ x := X; u := 1; w := 1; r := 0; \ |
114 \ x := X; u := 1; w := 1; r := (0::nat); \ |
115 \ WHILE w <= x \ |
115 \ WHILE w <= x \ |
116 \ INV {u = r+r+1 & w = (r+1)*(r+1) & r*r <= x & x=X} \ |
116 \ INV {u = r+r+1 & w = (r+1)*(r+1) & r*r <= x & x=X} \ |
117 \ DO r := r+1; w := w+u+2; u := u+2 OD \ |
117 \ DO r := r + 1; w := w + u + # 2; u := u + # 2 OD \ |
118 \ {r*r <= X & X < (r+1)*(r+1)}"; |
118 \ {r*r <= X & X < (r+1)*(r+1)}"; |
119 by (hoare_tac (SELECT_GOAL Auto_tac) 1); |
119 by (hoare_tac (SELECT_GOAL Auto_tac) 1); |
120 qed "sqrt_without_multiplication"; |
120 qed "sqrt_without_multiplication"; |
121 |
121 |
122 |
122 |
173 that the elements between u and l are equal to pivot. |
173 that the elements between u and l are equal to pivot. |
174 |
174 |
175 Ambiguity warnings of parser are due to := being used |
175 Ambiguity warnings of parser are due to := being used |
176 both for assignment and list update. |
176 both for assignment and list update. |
177 *) |
177 *) |
178 Goal "m - 1' < n ==> m < Suc n"; |
178 Goal "m - Suc 0 < n ==> m < Suc n"; |
179 by (arith_tac 1); |
179 by (arith_tac 1); |
180 qed "lemma"; |
180 qed "lemma"; |
181 |
181 |
182 Goal |
182 Goal |
183 "[| leq == %A i. !k. k<i --> A!k <= pivot; \ |
183 "[| leq == %A i. !k. k<i --> A!k <= pivot; \ |
184 \ geq == %A i. !k. i<k & k<length A --> pivot <= A!k |] ==> \ |
184 \ geq == %A i. !k. i<k & k<length A --> pivot <= A!k |] ==> \ |
185 \ |- VARS A u l.\ |
185 \ |- VARS A u l.\ |
186 \ {0 < length(A::('a::order)list)} \ |
186 \ {0 < length(A::('a::order)list)} \ |
187 \ l := 0; u := length A - 1'; \ |
187 \ l := 0; u := length A - Suc 0; \ |
188 \ WHILE l <= u \ |
188 \ WHILE l <= u \ |
189 \ INV {leq A l & geq A u & u<length A & l<=length A} \ |
189 \ INV {leq A l & geq A u & u<length A & l<=length A} \ |
190 \ DO WHILE l < length A & A!l <= pivot \ |
190 \ DO WHILE l < length A & A!l <= pivot \ |
191 \ INV {leq A l & geq A u & u<length A & l<=length A} \ |
191 \ INV {leq A l & geq A u & u<length A & l<=length A} \ |
192 \ DO l := l+1 OD; \ |
192 \ DO l := l+1 OD; \ |
193 \ WHILE 0 < u & pivot <= A!u \ |
193 \ WHILE 0 < u & pivot <= A!u \ |
194 \ INV {leq A l & geq A u & u<length A & l<=length A} \ |
194 \ INV {leq A l & geq A u & u<length A & l<=length A} \ |
195 \ DO u := u-1 OD; \ |
195 \ DO u := u - 1 OD; \ |
196 \ IF l <= u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI \ |
196 \ IF l <= u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI \ |
197 \ OD \ |
197 \ OD \ |
198 \ {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}"; |
198 \ {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}"; |
199 (* expand and delete abbreviations first *) |
199 (* expand and delete abbreviations first *) |
200 by (asm_simp_tac HOL_basic_ss 1); |
200 by (asm_simp_tac HOL_basic_ss 1); |