a_Prod_inv: fixes \<Gamma> :: "(Syntax.var, ty) fmap"   and e :: "Syntax.term"   and eP :: "Syntax.term"   and eV :: "Syntax.term"   and \<tau>\<^sub>1 :: "ty"   and \<tau>\<^sub>2 :: "ty" assumes "\<Gamma> \<turnstile> e, eP, eV : Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2" obtains x :: "Syntax.var" where "ea__ = Var x__" and "ePa__ = Var x__" and "eVa__ = Var x__" and "\<Gamma> $$ x__ = Some (Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2)"   | e\<^sub>1 :: "Syntax.term" and eP\<^sub>1 :: "Syntax.term" and eV\<^sub>1 :: "Syntax.term" and \<tau>\<^sub>1' :: "ty" and e\<^sub>2 :: "Syntax.term" and eP\<^sub>2 :: "Syntax.term" and eV\<^sub>2 :: "Syntax.term" where "ea__ = App e\<^sub>1__ e\<^sub>2'__" and "ePa__ = App eP\<^sub>1'__ eP\<^sub>2'__" and "eVa__ = App eV\<^sub>1__ eV\<^sub>2'__" and "\<Gamma> \<turnstile> e\<^sub>1__, eP\<^sub>1'__, eV\<^sub>1__ : Fun \<tau>\<^sub>1'__ (Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2)" and "\<Gamma> \<turnstile> e\<^sub>2'__, eP\<^sub>2'__, eV\<^sub>2'__ : \<tau>\<^sub>1'__"   | x :: "Syntax.var" and e\<^sub>1 :: "Syntax.term" and eP\<^sub>1 :: "Syntax.term" and eV\<^sub>1 :: "Syntax.term" and \<tau>\<^sub>1' :: "ty" and e\<^sub>2 :: "Syntax.term" and eP\<^sub>2 :: "Syntax.term" and eV\<^sub>2 :: "Syntax.term" where "ea__ = Syntax.Let e\<^sub>1'__ x e\<^sub>2''__" and "ePa__ = Syntax.Let eP\<^sub>1''__ x eP\<^sub>2''__" and "eVa__ = Syntax.Let eV\<^sub>1'__ x eV\<^sub>2''__" and "atom x \<sharp> (\<Gamma>, e\<^sub>1'__, eP\<^sub>1''__, eV\<^sub>1'__)" and "\<Gamma> \<turnstile> e\<^sub>1'__, eP\<^sub>1''__, eV\<^sub>1'__ : \<tau>\<^sub>1''__" and "\<Gamma>(x $$:= \<tau>\<^sub>1''__) \<turnstile> e\<^sub>2''__, eP\<^sub>2''__, eV\<^sub>2''__ : Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2"   | e :: "Syntax.term" and eP :: "Syntax.term" and eV :: "Syntax.term" and \<tau>\<^sub>1' :: "ty" and \<tau>\<^sub>2' :: "ty" and e\<^sub>1 :: "Syntax.term" and eP\<^sub>1 :: "Syntax.term" and eV\<^sub>1 :: "Syntax.term" and e\<^sub>2 :: "Syntax.term" and eP\<^sub>2 :: "Syntax.term" and eV\<^sub>2 :: "Syntax.term" where "ea__ = Case eb__ e\<^sub>1''__ e\<^sub>2'''__" and "ePa__ = Case ePb__ eP\<^sub>1'''__ eP\<^sub>2'''__" and "eVa__ = Case eVb__ eV\<^sub>1''__ eV\<^sub>2'''__" and "\<Gamma> \<turnstile> eb__, ePb__, eVb__ : Syntax.Sum \<tau>\<^sub>1'''__ \<tau>\<^sub>2'__" and "\<Gamma> \<turnstile> e\<^sub>1''__, eP\<^sub>1'''__, eV\<^sub>1''__ : Fun \<tau>\<^sub>1'''__ (Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2)" and "\<Gamma> \<turnstile> e\<^sub>2'''__, eP\<^sub>2'''__, eV\<^sub>2'''__ : Fun \<tau>\<^sub>2'__ (Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2)"   | e\<^sub>1 :: "Syntax.term" and eP\<^sub>1 :: "Syntax.term" and eV\<^sub>1 :: "Syntax.term" and e\<^sub>2 :: "Syntax.term" and eP\<^sub>2 :: "Syntax.term" and eV\<^sub>2 :: "Syntax.term" where "ea__ = Syntax.Pair e\<^sub>1 e\<^sub>2" and "ePa__ = Syntax.Pair eP\<^sub>1 eP\<^sub>2" and "eVa__ = Syntax.Pair eV\<^sub>1 eV\<^sub>2" and "\<Gamma> \<turnstile> e\<^sub>1, eP\<^sub>1, eV\<^sub>1 : \<tau>\<^sub>1" and "\<Gamma> \<turnstile> e\<^sub>2, eP\<^sub>2, eV\<^sub>2 : \<tau>\<^sub>2"   | e :: "Syntax.term" and eP :: "Syntax.term" and eV :: "Syntax.term" and \<tau>\<^sub>2' :: "ty" where "ea__ = Prj1 ec__" and "ePa__ = Prj1 ePc__" and "eVa__ = Prj1 eVc__" and "\<Gamma> \<turnstile> ec__, ePc__, eVc__ : Syntax.Prod (Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2) \<tau>\<^sub>2'"   | e :: "Syntax.term" and eP :: "Syntax.term" and eV :: "Syntax.term" and \<tau>\<^sub>1' :: "ty" where "ea__ = Prj2 ed__" and "ePa__ = Prj2 ePd__" and "eVa__ = Prj2 eVd__" and "\<Gamma> \<turnstile> ed__, ePd__, eVd__ : Syntax.Prod \<tau>\<^sub>1' (Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2)"   | \<alpha> :: "Syntax.tvar" and e :: "Syntax.term" and eP :: "Syntax.term" and eV :: "Syntax.term" and \<tau> :: "ty" where "ea__ = Unroll ee__" and "ePa__ = Unroll ePe__" and "eVa__ = Unroll eVe__" and "Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2 = subst_type \<tau> (Mu \<alpha> \<tau>) \<alpha>" and "atom \<alpha> \<sharp> \<Gamma>" and "\<Gamma> \<turnstile> ee__, ePe__, eVe__ : Mu \<alpha> \<tau>"   | e :: "Syntax.term" and eP :: "Syntax.term" and eV :: "Syntax.term" where "ea__ = Unauth e" and "ePa__ = Unauth eP" and "eVa__ = Unauth eV" and "\<Gamma> \<turnstile> e, eP, eV : AuthT (Syntax.Prod \<tau>\<^sub>1 \<tau>\<^sub>2)"