cases: 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" assumes "P,a1 \<turnstile> a2 :: a3" obtains C :: "char list" and E :: "char list \<Rightarrow> ty option" where "a1 = Eb__" and "a2 = new C__" and "a3 = Class C__" and "is_class P C__"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and D :: "char list" and C :: "char list" where "a1 = Ec__" and "a2 = Cast Ca__ eb__" and "a3 = Class Ca__" and "P,Ec__ \<turnstile> eb__ :: Class D__" and "is_class P Ca__" and "P \<turnstile> Path D__ to Ca__ unique \<or> (\<forall>Cs. \<not> P \<turnstile> Path D__ to Ca__ via Cs )"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and D :: "char list" and C :: "char list" where "a1 = Ed__" and "a2 = \<lparr>Cb__\<rparr>ec__" and "a3 = Class Cb__" and "P,Ed__ \<turnstile> ec__ :: Class D" and "is_class P Cb__" and "P \<turnstile> Path D to Cb__ unique \<or> P \<turnstile> Cb__ \<preceq>\<^sup>* D \<and> (\<forall>Cs. P \<turnstile> Path Cb__ to D via Cs  \<longrightarrow> Subobjs\<^sub>R P Cb__ Cs)"   | v :: "val" and T :: "ty" and E :: "char list \<Rightarrow> ty option" where "a1 = Ee__" and "a2 = Val v" and "a3 = T__" and "typeof v = \<lfloor>T__\<rfloor>"   | E :: "char list \<Rightarrow> ty option" and V :: "char list" and T :: "ty" where "a1 = Ef__" and "a2 = Var V__" and "a3 = Ta__" and "Ef__ V__ = \<lfloor>Ta__\<rfloor>"   | E :: "char list \<Rightarrow> ty option" and e\<^sub>1 :: "expr" and T\<^sub>1 :: "ty" and e\<^sub>2 :: "expr" and T\<^sub>2 :: "ty" and bop :: "bop" and T :: "ty" where "a1 = Eg__" and "a2 = e\<^sub>1'__ \<guillemotleft>bop\<guillemotright> e\<^sub>2__" and "a3 = Tb__" and "P,Eg__ \<turnstile> e\<^sub>1'__ :: T\<^sub>1__" and "P,Eg__ \<turnstile> e\<^sub>2__ :: T\<^sub>2__" and "case bop of Eq \<Rightarrow> T\<^sub>1__ = T\<^sub>2__ \<and> Tb__ = Boolean | Add \<Rightarrow> T\<^sub>1__ = Integer \<and> T\<^sub>2__ = Integer \<and> Tb__ = Integer"   | E :: "char list \<Rightarrow> ty option" and V :: "char list" and T :: "ty" and e :: "expr" and T' :: "ty" where "a1 = Eh__" and "a2 = Va__:=ed__" and "a3 = Tc__" and "Eh__ Va__ = \<lfloor>Tc__\<rfloor>" and "P,Eh__ \<turnstile> ed__ :: T'a__" and "P \<turnstile> T'a__ \<le> Tc__"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and C :: "char list" and F :: "char list" and T :: "ty" and Cs :: "char list list" where "a1 = Ei__" and "a2 = ee__\<bullet>F__{Cs__}" and "a3 = Td__" and "P,Ei__ \<turnstile> ee__ :: Class Cc__" and "P \<turnstile> Cc__ has least F__:Td__ via Cs__"   | E :: "char list \<Rightarrow> ty option" and e\<^sub>1 :: "expr" and C :: "char list" and F :: "char list" and T :: "ty" and Cs :: "char list list" and e\<^sub>2 :: "expr" and T' :: "ty" where "a1 = Ej__" and "a2 = e\<^sub>1''__\<bullet>F{Csa__} := e\<^sub>2'__" and "a3 = Te__" and "P,Ej__ \<turnstile> e\<^sub>1''__ :: Class Cd__" and "P \<turnstile> Cd__ has least F:Te__ via Csa__" and "P,Ej__ \<turnstile> e\<^sub>2'__ :: T'b__" and "P \<turnstile> T'b__ \<le> Te__"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and C' :: "char list" and C :: "char list" and M :: "char list" and Ts :: "ty list" and T :: "ty" and m :: "char list list \<times> expr" and Cs :: "char list list" and es :: "expr list" and Ts' :: "ty list" where "a1 = Ek__" and "a2 = Call ef__ \<lfloor>Ce__\<rfloor> M__ esb__" and "a3 = Tf__" and "P,Ek__ \<turnstile> ef__ :: Class C'" and "P \<turnstile> Path C' to Ce__ unique" and "P \<turnstile> Ce__ has least M__ = (Tsa__, Tf__, m__) via Csb__" and "P,Ek__ \<turnstile> esb__ [::] Ts'a__" and "P \<turnstile> Ts'a__ [\<le>] Tsa__"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and C :: "char list" and M :: "char list" and Ts :: "ty list" and T :: "ty" and m :: "char list list \<times> expr" and Cs :: "char list list" and es :: "expr list" and Ts' :: "ty list" where "a1 = El__" and "a2 = Call eg__ None M es" and "a3 = Tg__" and "P,El__ \<turnstile> eg__ :: Class Cf__" and "P \<turnstile> Cf__ has least M = (Ts, Tg__, m) via Cs" and "P,El__ \<turnstile> es [::] Ts'" and "P \<turnstile> Ts' [\<le>] Ts"   | T :: "ty" and E :: "char list \<Rightarrow> ty option" and V :: "char list" and e :: "expr" and T' :: "ty" where "a1 = Em__" and "a2 = {V:Th__; eh__}" and "a3 = T'" and "is_type P Th__" and "P,Em__(V \<mapsto> Th__) \<turnstile> eh__ :: T'"   | E :: "char list \<Rightarrow> ty option" and e\<^sub>1 :: "expr" and T\<^sub>1 :: "ty" and e\<^sub>2 :: "expr" and T\<^sub>2 :: "ty" where "a1 = En__" and "a2 = e\<^sub>1'''__;; e\<^sub>2''__" and "a3 = T\<^sub>2" and "P,En__ \<turnstile> e\<^sub>1'''__ :: T\<^sub>1" and "P,En__ \<turnstile> e\<^sub>2''__ :: T\<^sub>2"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and e\<^sub>1 :: "expr" and T :: "ty" and e\<^sub>2 :: "expr" where "a1 = Eo__" and "a2 = if (ei__) e\<^sub>1 else e\<^sub>2" and "a3 = Ti__" and "P,Eo__ \<turnstile> ei__ :: Boolean" and "P,Eo__ \<turnstile> e\<^sub>1 :: Ti__" and "P,Eo__ \<turnstile> e\<^sub>2 :: Ti__"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and c :: "expr" and T :: "ty" where "a1 = Ep__" and "a2 = while (ej__) c" and "a3 = Void" and "P,Ep__ \<turnstile> ej__ :: Boolean" and "P,Ep__ \<turnstile> c :: T"   | E :: "char list \<Rightarrow> ty option" and e :: "expr" and C :: "char list" where "a1 = E" and "a2 = throw e" and "a3 = Void" and "P,E \<turnstile> e :: Class C"