src/HOL/IMP/ACom.thy
changeset 47613 e72e44cee6f2
parent 46225 d0a2c4a80a00
child 47818 151d137f1095
--- a/src/HOL/IMP/ACom.thy	Thu Apr 19 17:32:35 2012 +0200
+++ b/src/HOL/IMP/ACom.thy	Thu Apr 19 20:19:13 2012 +0200
@@ -41,6 +41,13 @@
 "anno a (WHILE b DO c) =
   ({a} WHILE b DO anno a c {a})"
 
+fun annos :: "'a acom \<Rightarrow> 'a list" where
+"annos (SKIP {a}) = [a]" |
+"annos (x::=e {a}) = [a]" |
+"annos (C1;C2) = annos C1 @ annos C2" |
+"annos (IF b THEN C1 ELSE C2 {a}) = a #  annos C1 @ annos C2" |
+"annos ({i} WHILE b DO C {a}) = i # a # annos C"
+
 fun map_acom :: "('a \<Rightarrow> 'b) \<Rightarrow> 'a acom \<Rightarrow> 'b acom" where
 "map_acom f (SKIP {P}) = SKIP {f P}" |
 "map_acom f (x ::= e {P}) = (x ::= e {f P})" |
@@ -106,4 +113,16 @@
   (EX I d1 P. c = {I} WHILE b DO d1 {P} & strip d1 = c1)"
 by (cases c) simp_all
 
+
+lemma set_annos_anno[simp]: "set (annos (anno a C)) = {a}"
+by(induction C)(auto)
+
+lemma size_annos_same: "strip C1 = strip C2 \<Longrightarrow> size(annos C1) = size(annos C2)"
+apply(induct C2 arbitrary: C1)
+apply (auto simp: strip_eq_SKIP strip_eq_Assign strip_eq_Semi strip_eq_If strip_eq_While)
+done
+
+lemmas size_annos_same2 = eqTrueI[OF size_annos_same]
+
+
 end