(*  ----------------------------------------------------------- *)

(* Specifications: *)
Lemma erasure_AnnDefEq : forall G D g A'' B'' S A' B',
AnnDefEq G D g A'' B'' ->
AnnTyping G A'' S -> erase S = a_Star ->
erase A'' = erase A' -> erase B'' = erase B' ->
AnnTyping G A' a_Star -> AnnTyping G B' a_Star ->
exists g', AnnDefEq G D g' A' B'.
Lemma AnnDefEq_invert_a_Star : forall G0 D g1 A1' A2' S,
AnnDefEq G0 D g1 A1' A2' ->
AnnTyping G0 A1' S ->
erase S = a_Star ->
exists A1'', exists A2'', exists g, erase A1'' = erase A1'
/\ erase A2'' = erase A2'
/\ AnnDefEq G0 D g A1'' A2''
/\ AnnTyping G0 A1'' a_Star
/\ AnnTyping G0 A2'' a_Star.
Lemma Path_to_Path : forall  a0, lc_tm a0 -> forall T a,
Path T a -> erase a0 = a -> Path T a0.
Lemma annotation_mutual :
(forall G a A, Typing G a A ->
forall G0, erase_context G0 = G -> AnnCtx G0 ->
exists a0 A0,
(erase a0) = a /\
(erase A0) = A /\
AnnTyping G0 a0 A0) /\
(forall G phi, PropWff G phi ->
forall G0, erase_context G0 = G -> AnnCtx G0 ->
exists phi0,
erase_constraint phi0 = phi /\
AnnPropWff G0 phi0) /\
(forall G D p1 p2, Iso G D p1 p2 ->
forall G0, erase_context G0 = G -> AnnCtx G0 ->
exists g0 p1' p2',
(erase_constraint p1') = p1 /\
(erase_constraint p2') = p2 /\
AnnIso G0 D g0 p1' p2') /\
(forall G D a b A, DefEq G D a b A ->
forall G0, erase_context G0 = G -> AnnCtx G0 ->
exists g a0 b0 A0,
(erase a0) = a /\
(erase b0) = b /\
(erase A0) = A /\
AnnDefEq G0 D g a0 b0 /\ AnnTyping G0 a0 A0 /\ AnnTyping G0 b0 A0) /\
(forall G, Ctx G -> True).