(* Parallel beta reduction *)
Inductive par_red1 : lambda -> lambda -> Prop :=
| par_beta :
forall M M' : lambda,
par_red1 M M' ->
forall N N' : lambda,
par_red1 N N' -> par_red1 (App (Abs M) N) (subst N' M')
| ref_par_red : forall n : nat, par_red1 (Ref n) (Ref n)
| abs_par_red :
forall M M' : lambda, par_red1 M M' -> par_red1 (Abs M) (Abs M')
| app_par_red :
forall M M' : lambda,
par_red1 M M' ->
forall N N' : lambda, par_red1 N N' -> par_red1 (App M N) (App M' N').
Hint Resolve par_beta ref_par_red abs_par_red app_par_red.

(* Specifications: *)
Lemma refl_par_red1 : forall M : lambda, par_red1 M M.
Hint Resolve refl_par_red1.
Lemma red1_par_red1 : forall M N : lambda, red1 M N -> par_red1 M N.
Inductive par_red : lambda -> lambda -> Prop :=
| one_step_par_red : forall M N : lambda, par_red1 M N -> par_red M N
| trans_par_red :
forall M N P : lambda, par_red M N -> par_red N P -> par_red M P.