simps: fixes P :: "(char list \<times> base list \<times> (char list \<times> ty) list \<times> (char list \<times> ty list \<times> ty \<times> char list list \<times> expr) list) list"   and a1 :: "char list \<Rightarrow> ty option"   and a2 :: "expr"   and a3 :: "ty" shows "(P,a1 \<turnstile> a2 :: a3) = ((\<exists>C E. a1 = E \<and> a2 = new C \<and> a3 = Class C \<and> is_class P C) \<or> (\<exists>E e D C. a1 = E \<and> a2 = Cast C e \<and> a3 = Class C \<and> P,E \<turnstile> e :: Class D \<and> is_class P C \<and> (P \<turnstile> Path D to C unique \<or> (\<forall>Cs. \<not> P \<turnstile> Path D to C via Cs ))) \<or> (\<exists>E e D C. a1 = E \<and> a2 = \<lparr>C\<rparr>e \<and> a3 = Class C \<and> P,E \<turnstile> e :: Class D \<and> is_class P C \<and> (P \<turnstile> Path D to C unique \<or> P \<turnstile> C \<preceq>\<^sup>* D \<and> (\<forall>Cs. P \<turnstile> Path C to D via Cs  \<longrightarrow> Subobjs\<^sub>R P C Cs))) \<or> (\<exists>v T E. a1 = E \<and> a2 = Val v \<and> a3 = T \<and> typeof v = \<lfloor>T\<rfloor>) \<or> (\<exists>E V T. a1 = E \<and> a2 = Var V \<and> a3 = T \<and> E V = \<lfloor>T\<rfloor>) \<or> (\<exists>E e\<^sub>1 T\<^sub>1 e\<^sub>2 T\<^sub>2 bop T. a1 = E \<and> a2 = e\<^sub>1 \<guillemotleft>bop\<guillemotright> e\<^sub>2 \<and> a3 = T \<and> P,E \<turnstile> e\<^sub>1 :: T\<^sub>1 \<and> P,E \<turnstile> e\<^sub>2 :: T\<^sub>2 \<and> (case bop of Eq \<Rightarrow> T\<^sub>1 = T\<^sub>2 \<and> T = Boolean | Add \<Rightarrow> T\<^sub>1 = Integer \<and> T\<^sub>2 = Integer \<and> T = Integer)) \<or> (\<exists>E V T e T'. a1 = E \<and> a2 = V:=e \<and> a3 = T \<and> E V = \<lfloor>T\<rfloor> \<and> P,E \<turnstile> e :: T' \<and> P \<turnstile> T' \<le> T) \<or> (\<exists>E e C F T Cs. a1 = E \<and> a2 = e\<bullet>F{Cs} \<and> a3 = T \<and> P,E \<turnstile> e :: Class C \<and> P \<turnstile> C has least F:T via Cs) \<or> (\<exists>E e\<^sub>1 C F T Cs e\<^sub>2 T'. a1 = E \<and> a2 = e\<^sub>1\<bullet>F{Cs} := e\<^sub>2 \<and> a3 = T \<and> P,E \<turnstile> e\<^sub>1 :: Class C \<and> P \<turnstile> C has least F:T via Cs \<and> P,E \<turnstile> e\<^sub>2 :: T' \<and> P \<turnstile> T' \<le> T) \<or> (\<exists>E e C' C M Ts T m Cs es Ts'. a1 = E \<and> a2 = Call e \<lfloor>C\<rfloor> M es \<and> a3 = T \<and> P,E \<turnstile> e :: Class C' \<and> P \<turnstile> Path C' to C unique \<and> P \<turnstile> C has least M = (Ts, T, m) via Cs \<and> P,E \<turnstile> es [::] Ts' \<and> P \<turnstile> Ts' [\<le>] Ts) \<or> (\<exists>E e C M Ts T m Cs es Ts'. a1 = E \<and> a2 = Call e None M es \<and> a3 = T \<and> P,E \<turnstile> e :: Class C \<and> P \<turnstile> C has least M = (Ts, T, m) via Cs \<and> P,E \<turnstile> es [::] Ts' \<and> P \<turnstile> Ts' [\<le>] Ts) \<or> (\<exists>T E V e T'. a1 = E \<and> a2 = {V:T; e} \<and> a3 = T' \<and> is_type P T \<and> P,E(V \<mapsto> T) \<turnstile> e :: T') \<or> (\<exists>E e\<^sub>1 T\<^sub>1 e\<^sub>2 T\<^sub>2. a1 = E \<and> a2 = e\<^sub>1;; e\<^sub>2 \<and> a3 = T\<^sub>2 \<and> P,E \<turnstile> e\<^sub>1 :: T\<^sub>1 \<and> P,E \<turnstile> e\<^sub>2 :: T\<^sub>2) \<or> (\<exists>E e e\<^sub>1 T e\<^sub>2. a1 = E \<and> a2 = if (e) e\<^sub>1 else e\<^sub>2 \<and> a3 = T \<and> P,E \<turnstile> e :: Boolean \<and> P,E \<turnstile> e\<^sub>1 :: T \<and> P,E \<turnstile> e\<^sub>2 :: T) \<or> (\<exists>E e c T. a1 = E \<and> a2 = while (e) c \<and> a3 = Void \<and> P,E \<turnstile> e :: Boolean \<and> P,E \<turnstile> c :: T) \<or> (\<exists>E e C. a1 = E \<and> a2 = throw e \<and> a3 = Void \<and> P,E \<turnstile> e :: Class C))"