Module Type fc_subst_sig.
(* Axiom context_fv_mutual : (forall G (a : tm) A (H: AnnTyping G a A), fv_tm_tm_tm a [<=] dom G /\ fv_co_co_tm a [<=] dom G /\ fv_tm_tm_tm A [<=] dom G /\ fv_co_co_tm A [<=] dom G) /\ (forall G phi (H : AnnPropWff G phi), fv_tm_tm_constraint phi [<=] dom G /\ fv_co_co_constraint phi [<=] dom G) /\ (forall G D g p1 p2 (H : AnnIso G D g p1 p2), fv_tm_tm_co         g  [<=] dom G /\ fv_co_co_co         g  [<=] dom G /\ fv_tm_tm_constraint p1 [<=] dom G /\ fv_co_co_constraint p1 [<=] dom G /\ fv_tm_tm_constraint p2 [<=] dom G /\ fv_co_co_constraint p2 [<=] dom G) /\ (forall G D g A B (H : AnnDefEq G D g A B), fv_tm_tm_co g [<=] dom G /\ fv_co_co_co g [<=] dom G /\ fv_tm_tm_tm A [<=] dom G /\ fv_co_co_tm A [<=] dom G /\ fv_tm_tm_tm B [<=] dom G /\ fv_co_co_tm B [<=] dom G) /\ (forall G (H : AnnCtx G), (forall x A, binds x (Tm A)   G -> fv_tm_tm_tm         A   [<=] dom G /\ fv_co_co_tm         A   [<=] dom G) /\ (forall c phi, binds c (Co phi) G -> fv_tm_tm_constraint phi [<=] dom G /\ fv_co_co_constraint phi [<=] dom G)).  Definition AnnTyping_context_fv  := @first  _ _ _ _ _ context_fv_mutual. Definition AnnPropWff_context_fv := @second _ _ _ _ _ context_fv_mutual. Definition AnnIso_context_fv     := @third  _ _ _ _ _ context_fv_mutual. Definition AnnDefEq_context_fv   := @fourth _ _ _ _ _ context_fv_mutual. Definition AnnCtx_context_fv     := @fifth  _ _ _ _ _ context_fv_mutual. *)
(* -----  exists forms of the binding constructors ----------- *)

Axiom An_CAbsCong_inversion :
forall (G : context) (D : available_props) (g1 g3 g4 : co) A1 A2,
AnnDefEq G D (g_CAbsCong g1 g3 g4) A1 A2
-> exists phi1 phi2 a1 a2 a3 B1 B2 B,
A1 = (a_CAbs phi1 a1) /\
A2 = (a_CAbs phi2 a3) /\
AnnIso G D g1 phi1 phi2 /\
AnnTyping G (a_CAbs phi1 a1) (a_CPi phi1 B1) /\
AnnTyping G (a_CAbs phi2 a3) (a_CPi phi2 B2) /\
AnnTyping G (a_CAbs phi1 a2) B /\
AnnDefEq G (dom G) g4 (a_CPi phi1 B1) (a_CPi phi2 B2) /\
forall c1,
c1`notin` dom G (* \u D \u fv_co_co_tm a2 \u fv_co_co_tm a1 \u fv_co_co_co g3
\u fv_co_co_co g1 \u fv_co_co_tm a3 *)
→ (AnnDefEq ([(c1, Co phi1)] ++ G) D (open_co_wrt_co g3 (g_Var_f c1))
(open_tm_wrt_co a1 (g_Var_f c1)) (open_tm_wrt_co a2 (g_Var_f c1))) /\
(open_tm_wrt_co a3 (g_Var_f c1) =
open_tm_wrt_co a2 (g_Cast (g_Var_f c1) (g_Sym g1))).