Section Confluence.
Context {X: Const}.
Reserved Notation "s ≫ t" (at level 60).
Inductive par : exp X -> exp X -> Prop :=
| parVar x: var x ≫ var x
| parConst c: const c ≫ const c
| parLam s s': s ≫ s' -> (lambda s) ≫ lambda s'
| parBeta s s' t t' u: s ≫ s' -> t ≫ t' -> u = beta s' t' -> (lambda s) t ≫ u
| parApp s s' t t': s ≫ s' -> t ≫ t' -> s t ≫ s' t'
where "s ≫ t" := (par s t).
Hint Constructors par : core.
Global Instance par_lam_proper: Proper (star par ++> star par) lam.
Global Instance par_app_proper: Proper (star par ++> star par ++> star par) app.
Global Instance sandwich_step: subrelation step par.
Global Instance sandwich_steps: subrelation par (star step).
Fixpoint rho (e: exp X) :=
match e with
| var x => var x
| const c => const c
| lambda s => lambda (rho s)
| app (lambda s) t => beta (rho s) (rho t)
| app s t => (rho s) (rho t)
end.

Lemma confluence_step: confluent (@step X).