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. *)
(* -------------------------------------------------------------- *)
(* ------------------------------------------------------------- *)

(* Challenging lemma: coercible terms have coercible types.   NOTE: this result for AnnDefEq is *not* AnnPropWff G (Eq A B).  *)
Lemma AnnDefEqAnnIso_regularity :
(forall G0 a A, AnnTyping G0 a A -> True ) /\
(forall G0 phi,   AnnPropWff G0 phi -> True ) /\
(forall G D g p1 p2, AnnIso G D g p1 p2 ->
AnnPropWff G p1 /\ AnnPropWff G p2) /\
(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) /\
(forall G0, AnnCtx G0 -> True).