(* ------------------------------------- *)
(* This is proved in the preservation file. Lemma reduction_erasure : forall G a a', head_reduction G a a' -> reduction_in_one (erase a) (erase a') \/ erase a = erase a'. *)
(* ------------------------------------- *)

(* Specifications: *)
Lemma multi_trans : forall r a b, multi r a b -> forall c, multi r b c -> multi r a c.
(* ------------------------------------- *)
Lemma multi_An_AbsTerm_exists : ∀ (G : list (atom * sort)) (x : atom) (A a a' : tm),
x `notin` union (fv_tm a) (union (fv_tm a') (dom G))
→ AnnTyping G A a_Star
→ multi (head_reduction ([(x, Tm A)] ++ G)) (open_tm_wrt_tm a (a_Var_f x))
(open_tm_wrt_tm a' (a_Var_f x))
→ multi (head_reduction G) (a_Abs Irrel A a) (a_Abs Irrel A a').
Lemma multi_An_ConvTerm : ∀ (G : context) (a : tm) (g : co) (a' : tm),
lc_co g → multi (head_reduction G) a a'
→ multi (head_reduction G) (a_Conv a g) (a_Conv a' g).
Lemma multi_An_AppLeft : ∀ (G : context) (a b: tm) rho (a' : tm),
lc_tm b → multi (head_reduction G) a a'
→ multi (head_reduction G) (a_App a rho b) (a_App a' rho b).
Lemma multi_An_CAppLeft : ∀ (G : context) (a: tm) (g:co) (a' : tm),
lc_co g → multi (head_reduction G) a a'
→ multi (head_reduction G) (a_CApp a g) (a_CApp a' g).