blob: 2383740f4be3ba4e22c2bca3f95f15da411596c5 [file] [log] [blame] [edit]
(*
* Copyright 2016, NICTA
*
* This software may be distributed and modified according to the terms of
* the GNU General Public License version 2. Note that NO WARRANTY is provided.
* See "LICENSE_GPLv2.txt" for details.
*
* @TAG(NICTA_GPL)
*)
theory Loops
imports "../adt/BilbyT"
begin
(*
lemma mapAccum_x_inv_wp:
assumes x: "\<And>s. I s \<Longrightarrow> Q s"
assumes y: "\<And>x. x \<in> set xs \<Longrightarrow> \<lbrace>P\<rbrace> m x \<lbrace>\<lambda>rv. I\<rbrace>"
assumes z: "\<And>s. I s \<Longrightarrow> P s"
shows "I a \<longrightarrow> (case mapAccum f xs a of (xs',a') \<Rightarrow> Q a')"
apply (rule hoare_post_imp)
apply (erule x)
apply (rule mapM_x_wp)
apply (rule hoare_pre_imp [OF _ y])
apply (erule z)
apply assumption
apply simp
done
*)
definition
seq32_no_break :: "(U32 \<times> U32 \<times> U32 \<times> (('acc \<times> 'obs \<times> U32) \<Rightarrow> 'acc) \<times> 'acc \<times> 'obs) \<Rightarrow> 'acc"
where
"seq32_no_break \<equiv> (\<lambda>(begin,end,inc,body,acc,obs).
fold (\<lambda>n acc. body(acc, obs, n)) (if end > 0 then [begin,begin+inc .e. end - 1] else []) acc)"
fun arr_iteratei
:: "nat \<Rightarrow> 'x list \<Rightarrow> ('\<sigma> \<Rightarrow>bool) \<Rightarrow> ('x \<Rightarrow> '\<sigma> \<Rightarrow> 'ob \<Rightarrow> '\<sigma>) \<Rightarrow> '\<sigma> \<Rightarrow> 'ob \<Rightarrow> '\<sigma>"
where
"arr_iteratei i l c f \<sigma> obs = (
if i=0 \<or> \<not> c \<sigma> then \<sigma>
else arr_iteratei (i - 1) l c f (f (l ! (length l-i)) \<sigma> obs) obs
)"
declare arr_iteratei.simps[simp del] (* This is required to prevent infinite unfolding of arr_iteratei *)
lemma "arr_iteratei 2 [(1::nat)] (\<lambda>_. True) (\<lambda>x s _. s + x) 0 undefined = 2"
apply(simp add: arr_iteratei.simps)
done
lemma "arr_iteratei 1 [(1::nat),3] (\<lambda>_. True) (\<lambda>x s _. s + x) 0 undefined = 3"
apply(simp add: arr_iteratei.simps)
done
end