10 section \<open>ARITHMETIC\<close> |
10 section \<open>ARITHMETIC\<close> |
11 |
11 |
12 subsection \<open>multiplication by successive addition\<close> |
12 subsection \<open>multiplication by successive addition\<close> |
13 |
13 |
14 lemma multiply_by_add: "VARS m s a b |
14 lemma multiply_by_add: "VARS m s a b |
15 {a=A & b=B} |
15 {a=A \<and> b=B} |
16 m := 0; s := 0; |
16 m := 0; s := 0; |
17 WHILE m~=a |
17 WHILE m\<noteq>a |
18 INV {s=m*b & a=A & b=B} |
18 INV {s=m*b \<and> a=A \<and> b=B} |
19 DO s := s+b; m := m+(1::nat) OD |
19 DO s := s+b; m := m+(1::nat) OD |
20 {s = A*B}" |
20 {s = A*B}" |
21 by vcg_simp |
21 by vcg_simp |
22 |
22 |
23 lemma multiply_by_add_time: "VARS m s a b t |
23 lemma multiply_by_add_time: "VARS m s a b t |
24 {a=A & b=B & t=0} |
24 {a=A \<and> b=B \<and> t=0} |
25 m := 0; t := t+1; s := 0; t := t+1; |
25 m := 0; t := t+1; s := 0; t := t+1; |
26 WHILE m~=a |
26 WHILE m\<noteq>a |
27 INV {s=m*b & a=A & b=B & t = 2*m + 2} |
27 INV {s=m*b \<and> a=A \<and> b=B \<and> t = 2*m + 2} |
28 DO s := s+b; t := t+1; m := m+(1::nat); t := t+1 OD |
28 DO s := s+b; t := t+1; m := m+(1::nat); t := t+1 OD |
29 {s = A*B \<and> t = 2*A + 2}" |
29 {s = A*B \<and> t = 2*A + 2}" |
30 by vcg_simp |
30 by vcg_simp |
31 |
31 |
32 lemma multiply_by_add2: "VARS M N P :: int |
32 lemma multiply_by_add2: "VARS M N P :: int |
33 {m=M & n=N} |
33 {m=M \<and> n=N} |
34 IF M < 0 THEN M := -M; N := -N ELSE SKIP FI; |
34 IF M < 0 THEN M := -M; N := -N ELSE SKIP FI; |
35 P := 0; |
35 P := 0; |
36 WHILE 0 < M |
36 WHILE 0 < M |
37 INV {0 <= M & (EX p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N)} |
37 INV {0 \<le> M \<and> (\<exists>p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N)} |
38 DO P := P+N; M := M - 1 OD |
38 DO P := P+N; M := M - 1 OD |
39 {P = m*n}" |
39 {P = m*n}" |
40 apply vcg_simp |
40 apply vcg_simp |
41 apply (auto simp add:int_distrib) |
41 apply (auto simp add:int_distrib) |
42 done |
42 done |
43 |
43 |
44 lemma multiply_by_add2_time: "VARS M N P t :: int |
44 lemma multiply_by_add2_time: "VARS M N P t :: int |
45 {m=M & n=N & t=0} |
45 {m=M \<and> n=N \<and> t=0} |
46 IF M < 0 THEN M := -M; t := t+1; N := -N; t := t+1 ELSE SKIP FI; |
46 IF M < 0 THEN M := -M; t := t+1; N := -N; t := t+1 ELSE SKIP FI; |
47 P := 0; t := t+1; |
47 P := 0; t := t+1; |
48 WHILE 0 < M |
48 WHILE 0 < M |
49 INV {0 \<le> M & (EX p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N & t \<ge> 0 & t \<le> 2*(p-M)+3)} |
49 INV {0 \<le> M & (\<exists>p. p = (if m<0 then -m else m) & p*N = m*n & P = (p-M)*N & t \<ge> 0 & t \<le> 2*(p-M)+3)} |
50 DO P := P+N; t := t+1; M := M - 1; t := t+1 OD |
50 DO P := P+N; t := t+1; M := M - 1; t := t+1 OD |
51 {P = m*n & t \<le> 2*abs m + 3}" |
51 {P = m*n & t \<le> 2*abs m + 3}" |
52 apply vcg_simp |
52 apply vcg_simp |
53 apply (auto simp add:int_distrib) |
53 apply (auto simp add:int_distrib) |
54 done |
54 done |
281 subsection \<open>Search for a key\<close> |
281 subsection \<open>Search for a key\<close> |
282 |
282 |
283 lemma zero_search: "VARS A i |
283 lemma zero_search: "VARS A i |
284 {True} |
284 {True} |
285 i := 0; |
285 i := 0; |
286 WHILE i < length A & A!i ~= key |
286 WHILE i < length A & A!i \<noteq> key |
287 INV {!j. j<i --> A!j ~= key} |
287 INV {\<forall>j. j<i --> A!j \<noteq> key} |
288 DO i := i+1 OD |
288 DO i := i+1 OD |
289 {(i < length A --> A!i = key) & |
289 {(i < length A --> A!i = key) & |
290 (i = length A --> (!j. j < length A --> A!j ~= key))}" |
290 (i = length A --> (\<forall>j. j < length A \<longrightarrow> A!j \<noteq> key))}" |
291 apply vcg_simp |
291 apply vcg_simp |
292 apply(blast elim!: less_SucE) |
292 apply(blast elim!: less_SucE) |
293 done |
293 done |
294 |
294 |
295 lemma zero_search_time: "VARS A i t |
295 lemma zero_search_time: "VARS A i t |
296 {t=0} |
296 {t=0} |
297 i := 0; t := t+1; |
297 i := 0; t := t+1; |
298 WHILE i < length A & A!i ~= key |
298 WHILE i < length A \<and> A!i \<noteq> key |
299 INV {(\<forall>j. j<i --> A!j ~= key) & i \<le> length A & t = i+1} |
299 INV {(\<forall>j. j<i \<longrightarrow> A!j \<noteq> key) \<and> i \<le> length A \<and> t = i+1} |
300 DO i := i+1; t := t+1 OD |
300 DO i := i+1; t := t+1 OD |
301 {(i < length A --> A!i = key) & |
301 {(i < length A \<longrightarrow> A!i = key) \<and> |
302 (i = length A --> (!j. j < length A --> A!j ~= key)) & t \<le> length A + 1}" |
302 (i = length A \<longrightarrow> (\<forall>j. j < length A --> A!j \<noteq> key)) \<and> t \<le> length A + 1}" |
303 apply vcg_simp |
303 apply vcg_simp |
304 apply(blast elim!: less_SucE) |
304 apply(blast elim!: less_SucE) |
305 done |
305 done |
306 |
306 |
307 text \<open> |
307 text \<open> |
316 lemma lem: "m - Suc 0 < n ==> m < Suc n" |
316 lemma lem: "m - Suc 0 < n ==> m < Suc n" |
317 by arith |
317 by arith |
318 |
318 |
319 |
319 |
320 lemma Partition: |
320 lemma Partition: |
321 "[| leq == %A i. !k. k<i --> A!k <= pivot; |
321 "[| leq == \<lambda>A i. \<forall>k. k<i \<longrightarrow> A!k \<le> pivot; |
322 geq == %A i. !k. i<k & k<length A --> pivot <= A!k |] ==> |
322 geq == \<lambda>A i. \<forall>k. i<k \<and> k<length A \<longrightarrow> pivot \<le> A!k |] ==> |
323 VARS A u l |
323 VARS A u l |
324 {0 < length(A::('a::order)list)} |
324 {0 < length(A::('a::order)list)} |
325 l := 0; u := length A - Suc 0; |
325 l := 0; u := length A - Suc 0; |
326 WHILE l <= u |
326 WHILE l \<le> u |
327 INV {leq A l & geq A u & u<length A & l<=length A} |
327 INV {leq A l \<and> geq A u \<and> u<length A \<and> l\<le>length A} |
328 DO WHILE l < length A & A!l <= pivot |
328 DO WHILE l < length A \<and> A!l \<le> pivot |
329 INV {leq A l & geq A u & u<length A & l<=length A} |
329 INV {leq A l & geq A u \<and> u<length A \<and> l\<le>length A} |
330 DO l := l+1 OD; |
330 DO l := l+1 OD; |
331 WHILE 0 < u & pivot <= A!u |
331 WHILE 0 < u & pivot \<le> A!u |
332 INV {leq A l & geq A u & u<length A & l<=length A} |
332 INV {leq A l & geq A u \<and> u<length A \<and> l\<le>length A} |
333 DO u := u - 1 OD; |
333 DO u := u - 1 OD; |
334 IF l <= u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI |
334 IF l \<le> u THEN A := A[l := A!u, u := A!l] ELSE SKIP FI |
335 OD |
335 OD |
336 {leq A u & (!k. u<k & k<l --> A!k = pivot) & geq A l}" |
336 {leq A u & (\<forall>k. u<k \<and> k<l --> A!k = pivot) \<and> geq A l}" |
337 \<comment> \<open>expand and delete abbreviations first\<close> |
337 \<comment> \<open>expand and delete abbreviations first\<close> |
338 apply (simp) |
338 apply (simp) |
339 apply (erule thin_rl)+ |
339 apply (erule thin_rl)+ |
340 apply vcg_simp |
340 apply vcg_simp |
341 apply (force simp: neq_Nil_conv) |
341 apply (force simp: neq_Nil_conv) |