272 \<acute>I := \<acute>I + 1 |
272 \<acute>I := \<acute>I + 1 |
273 OD |
273 OD |
274 .{\<acute>S = (SUM j<n. j)}." |
274 .{\<acute>S = (SUM j<n. j)}." |
275 by hoare auto |
275 by hoare auto |
276 |
276 |
277 subsection{*Time*} |
277 |
|
278 subsection{* Time *} |
278 |
279 |
279 text{* |
280 text{* |
280 A simple embedding of time in Hoare logic: function @{text timeit} |
281 A simple embedding of time in Hoare logic: function @{text timeit} |
281 inserts an extra variable to keep track of the elapsed time. |
282 inserts an extra variable to keep track of the elapsed time. |
282 *} |
283 *} |
283 |
284 |
284 record tstate = time :: nat |
285 record tstate = time :: nat |
285 |
286 |
286 types 'a time = "\<lparr>time::nat, \<dots>::'a\<rparr>" |
287 types 'a time = "\<lparr>time :: nat, \<dots> :: 'a\<rparr>" |
287 |
288 |
288 consts timeit :: "'a time com \<Rightarrow> 'a time com" |
289 consts timeit :: "'a time com \<Rightarrow> 'a time com" |
289 primrec |
290 primrec |
290 "timeit(Basic f) = (Basic f; Basic(%s. s\<lparr>time := Suc(time s)\<rparr>))" |
291 "timeit (Basic f) = (Basic f; Basic(\<lambda>s. s\<lparr>time := Suc (time s)\<rparr>))" |
291 "timeit(c1;c2) = (timeit c1; timeit c2)" |
292 "timeit (c1; c2) = (timeit c1; timeit c2)" |
292 "timeit(Cond b c1 c2) = Cond b (timeit c1) (timeit c2)" |
293 "timeit (Cond b c1 c2) = Cond b (timeit c1) (timeit c2)" |
293 "timeit(While b iv c) = While b iv (timeit c)" |
294 "timeit (While b iv c) = While b iv (timeit c)" |
294 |
|
295 |
295 |
296 record tvars = tstate + |
296 record tvars = tstate + |
297 I :: nat |
297 I :: nat |
298 J :: nat |
298 J :: nat |
299 |
299 |
300 lemma lem: "(0::nat) < n \<Longrightarrow> n+n \<le> Suc(n*n)" |
300 lemma lem: "(0::nat) < n \<Longrightarrow> n + n \<le> Suc (n * n)" |
301 by(induct n, simp_all) |
301 by (induct n) simp_all |
302 |
302 |
303 lemma "|- .{i = \<acute>I & \<acute>time = 0}. |
303 lemma "|- .{i = \<acute>I & \<acute>time = 0}. |
304 timeit( |
304 timeit( |
305 WHILE \<acute>I \<noteq> 0 |
305 WHILE \<acute>I \<noteq> 0 |
306 INV .{2*\<acute>time + \<acute>I*\<acute>I + 5*\<acute>I = i*i + 5*i}. |
306 INV .{2*\<acute>time + \<acute>I*\<acute>I + 5*\<acute>I = i*i + 5*i}. |
310 INV .{0 < \<acute>I & 2*\<acute>time + \<acute>I*\<acute>I + 3*\<acute>I + 2*\<acute>J - 2 = i*i + 5*i}. |
310 INV .{0 < \<acute>I & 2*\<acute>time + \<acute>I*\<acute>I + 3*\<acute>I + 2*\<acute>J - 2 = i*i + 5*i}. |
311 DO \<acute>J := \<acute>J - 1 OD; |
311 DO \<acute>J := \<acute>J - 1 OD; |
312 \<acute>I := \<acute>I - 1 |
312 \<acute>I := \<acute>I - 1 |
313 OD |
313 OD |
314 ) .{2*\<acute>time = i*i + 5*i}." |
314 ) .{2*\<acute>time = i*i + 5*i}." |
315 apply simp |
315 apply simp |
316 apply hoare |
316 apply hoare |
317 apply simp |
317 apply simp |
|
318 apply clarsimp |
|
319 apply clarsimp |
|
320 apply arith |
|
321 prefer 2 |
318 apply clarsimp |
322 apply clarsimp |
319 apply clarsimp |
323 apply (clarsimp simp: nat_distrib) |
|
324 apply (frule lem) |
320 apply arith |
325 apply arith |
321 prefer 2 |
326 done |
322 apply clarsimp |
|
323 apply (clarsimp simp:nat_distrib) |
|
324 apply(frule lem) |
|
325 apply arith |
|
326 done |
|
327 |
327 |
328 end |
328 end |