(* --------------------------------------------------------------------- *)
(* This is the place for "smart constructors" and "smart inversion" lemmas. They are especialy useful for constructing derivations from a particular variable and avoiding the co-finite quantification stuff.  *)
(* In a locally nameless development, these should be stated and immediately proven after substitution. *)

Lemma An_CPiCong_inversion :  ∀ (G : context) D (g1 g3 : co)
(A1 A2 : tm),
AnnDefEq G D (g_CPiCong g1 g3) A1 A2
-> exists phi1 phi2 B1 B2 B3,
A1 = (a_CPi phi1 B1) /\
A2 = (a_CPi phi2 B3) /\
AnnIso G D g1 phi1 phi2 /\
AnnTyping G (a_CPi phi1 B1) a_Star /\
AnnTyping G (a_CPi phi2 B3) a_Star /\
AnnTyping G (a_CPi phi1 B2) a_Star /\
(forall c, c  `notin` dom G
→ (AnnDefEq ([(c, Co phi1)] ++ G) D (open_co_wrt_co g3 (g_Var_f c))
(open_tm_wrt_co B1 (g_Var_f c)) (open_tm_wrt_co B2 (g_Var_f c))) /\
(open_tm_wrt_co B3 (g_Var_f c) =
open_tm_wrt_co B2 (g_Cast (g_Var_f c) (g_Sym g1)))).