Lemma Par_lc1 : forall G D a a' , Par G D a a' -> lc_tm a.
  intros.  induction H; auto. all: lc_solve.
Qed.

(* FIXME: find a good place for this tactic. *)
(* cannot move this to ett_ind.v because need Toplevel_lc ??? *)
Ltac lc_toplevel_inversion :=
  ma

(* Specifications: *)
apply Toplevel_lc in b; inversion b; auto
Hint Resolve Par_lc1 Par_lc2 : lc. Lemma typing_erased_mutual: (forall G b A, Typing G b A -> erased_tm b) /\ (forall G0 phi (H : PropWff G0 phi), forall A B T, phi = Eq A B T
Qed.
Hint Resolve Typing_erased : erased. Lemma typing_erased_type_mutual: (forall G b A, Typing G b A -> erased_tm A) /\ (forall G0 phi (H : PropWff G0 phi), True) /\
eapply Forall_forall in H; eauto. simpl in H. auto.
move: (toplevel_closed H) => h0.
assert (x `notin` singleton y). auto. fsetdec. fsetdec.
(* ------------------------------------------------------------- *)
Qed.
Qed. Lemma subst3 : forall S D b b' x,
Qed.
simpl in h1. auto. fsetdec. auto. Qed. Lemma multipar_subst3 : forall S D b b' x, erased_tm b ->
eapply Par_erased_tm; eauto. Qed.
apply subst4; auto.
x `notin` fv_tm_tm_tm b ->
Lemma Par_open_tm_wrt_co_preservation: forall G D B1 B2 c, Par G D (open_tm_wrt_co B1 (g_Var_f c)) B2 -> exists B', B2 = open_tm_wrt_co B' (g_Var_f c) /\ Par G D (open_tm_wrt_co B1 (g_Var_f c)) (open_tm_wrt_co B' (g_Var_f c)).
intros c G D a a' lc e H.
* constructor; eauto 1.
Proof. intros G D B1 B2 c H.
Qed.
apply (@context_Par_irrelevance _ G2 D D) in H; eauto.
Lemma Par_weaken_available : forall G D a b, Par G D a b -> forall D', D [<=] D' -> Par G D' a b.
Lemma Par_respects_atoms: forall G D a b, Par G D a b -> forall D', D [=] D' -> Par G D' a b.