Ltac do_rho :=
match goal with
H : ∀ x : atom, x `notin` ?L → RhoCheck Irrel x (erase_tm (open_tm_wrt_tm ?b (a_Var_f x))) |-
?x `notin` fv_tm_tm_tm (open_tm_wrt_tm (erase ?b) (a_Var_f ?x)) =>
let h := fresh in
let F := fresh in
assert (F : x `notin` L); auto;
move: (H x F) => h; inversion h; subst;
replace (a_Var_f x) with (erase (a_Var_f x)); auto;
rewrite open_tm_erase_tm; auto
end.
(* A specialized version of eauto that only uses the most common lc lemmas to cut down the search space. *)
Ltac eauto_lc := simpl; eauto using AnnTyping_lc1, Value_lc,
AnnDefEq_lc3, AnnPropWff_lc.

(* We need to know that the term type checks.  But if it does, our annotated operational semantics corresponds with reduction_in_one. *)
Lemma head_reduction_in_one : forall G a b,
head_reduction G a b -> forall A,  AnnTyping G a A ->
reduction_in_one (erase a) (erase b) \/ erase a = erase b.