src/HOL/Isar_examples/HoareEx.thy
changeset 18193 54419506df9e
parent 16417 9bc16273c2d4
child 20272 0ca998e83447
equal deleted inserted replaced
18192:6e2fd2d276d3 18193:54419506df9e
   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