(* --------------------------------------------------- *)
Inductive context_DefEq : available_props -> context -> context -> Prop :=
| Nul_Eqcontext: forall D, context_DefEq D nil nil
| Factor_Eqcontext_tm: forall G1 G2 D A A' x,
context_DefEq D G1 G2 ->
DefEq G1 D A A' a_Star ->
DefEq G2 D A A' a_Star ->
context_DefEq D ([(x, Tm A)] ++ G1) ([(x, Tm A')] ++ G2)
| Factor_Eqcontext_co: forall D G1 G2 Phi1 Phi2 c,
context_DefEq D G1 G2 ->
Iso G1 D Phi1 Phi2 ->
Iso G2 D Phi1 Phi2 ->
context_DefEq D ([(c, Co Phi1)] ++ G1) ([(c, Co Phi2)] ++ G2).
Hint Constructors context_DefEq.

Lemma Typing_swap_co : forall x1 x G a A B,
x1 `notin` fv_co_co_tm a \u fv_co_co_tm B
-> x `notin` dom G \u {{ x1 }}
-> Typing ([(x1, Co A)] ++ G) (open_tm_wrt_co a (g_Var_f x1))
(open_tm_wrt_co B (g_Var_f x1))
-> Typing ([(x, Co A)] ++ G) (open_tm_wrt_co a (g_Var_f x))
(open_tm_wrt_co B (g_Var_f x)).