(** ** Named procedures *)
Definition T : term := .\"x","y"; "x".
Definition F : term := .\"x","y"; "y".
Definition omega : term := .\"x"; "x" "x".
Definition Omega := omega omega.
Definition D: term := lambda (omega omega).
(** ** Evaluation relation *)
Inductive evaluates : term -> term -> Prop :=
evaluates_lam s : evaluates (lambda s) (lambda s)
| evaluates_app s t u v w : evaluates s (lambda u) -> evaluates t v -> evaluates (subst u 0 v) w ->
evaluates (s t) w.
Hint Constructors evaluates.
Notation "s '▷' t" := (evaluates s t) (at level 50).
Definition eva s := exists t, evaluates s t.
Hint Unfold eva.

(* Specifications: *)
Lemma evaluates_abst s t : s ▷ t -> lam t.
Lemma evaluates_functional s t1 t2 :
s ▷ t1 -> s ▷ t2 -> t1 = t2.