Section ArrowProperties.
Fixpoint Arr (B: list type) (A: type) :=
match B with
| nil => A
| A' :: B => A' → (Arr B A)
end.
End ArrowProperties.
Hint Rewrite ord'_app ord_Arr ord_repeated : simplify.
Hint Rewrite ord_Arr target_Arr target_ord : simplify.
(* ** List Abstraction and Application *)
Fixpoint Lambda (n: nat) (s: exp X) :=
match n with
| 0 => s
| S n => lambda (Lambda n s)
end.
Fixpoint AppR (e: exp X) (A: list (exp X))  :=
match A with
| nil => e
| e' :: A => AppR e A e'
end.
Fixpoint AppL (A: list (exp X)) (e: exp X) :=
match A with
| nil => e
| e' :: A => e' (AppL A e)
end.

Lemma Lambda_injective n (s t: exp X):
Lambda n s = Lambda n t -> s = t.