Module unique := fc_unique wf subst.
Set Bullet Behavior "Strict Subproofs".
Set Implicit Arguments.
(* ------------------------------------------------------------- *)
(* -------------------------------------------------------------- *)
(*  Interlude: some lemmas about how erasure and typing interact. *)
(* -------------------------------------------------------------- *)
(* Lemma erase_abs : forall AB0 rho B, erase AB0 = (a_UAbs rho B) -> exists A1 B0, erase AB0 = erase (a_Abs rho A1 B0) /\ erase B0 = B. *)
(* Lemma erase_capp : forall AB0 A C G, erase AB0 = (a_CApp A g_Triv) -> AnnTyping G AB0 C -> exists A1 g0 g D, erase AB0 = erase (a_CApp A1 g0) /\ erase A1 = A /\ AnnTyping G (a_CApp A1 g0) D /\ AnnDefEq G (dom G) g C D. *)
(* -------------------------------------------------------------- *)
(* ------------------------------------------------------------- *)
Definition  AnnDefEq_regularity :
(forall G D g A B,   AnnDefEq G D g A B ->
exists C1 C2 g', AnnTyping G A C1 /\ AnnTyping G B C2
/\ AnnDefEq G (dom G) g' C1 C2) :=
fourth AnnDefEqAnnIso_regularity.
Definition AnnIso_regularity :
forall G D g phi1 phi2, AnnIso G D g phi1 phi2 ->
AnnPropWff G phi1 /\ AnnPropWff G phi2 :=
third AnnDefEqAnnIso_regularity.
(* --------------------------------------------------------- *)
(* Smart constructors for the annotated language *)
(* ---------------------------------------------- *)
(* ---------------------------------------------- *)

Lemma An_CPiCong_exists2
: ∀ (c : atom) (G : context) (D : available_props)
(g1 g3 : co) (phi1 : constraint) (B1 : tm)
(phi2 : constraint) (B3 B2 : tm),
AnnIso G D g1 phi1 phi2
→ c
`notin` (union (dom G)
(union D
(union (fv_co_co_tm B2)
(union (fv_co_co_tm B1)
(union (fv_co_co_co g3)
(union (fv_co_co_co g1)
(fv_co_co_tm B3)))))))
→ 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))
→ AnnTyping G (a_CPi phi1 B1) a_Star
→ AnnTyping G (a_CPi phi1 B2) a_Star
→ AnnDefEq G D (g_CPiCong g1 g3) (a_CPi phi1 B1) (a_CPi phi2 B3).