Fixpoint size t :=
  match t with
  | var n => 1
  | app s t => size s + size t
  | lambda s => 1 + size s
  end.Instance term_eq_dec : eq_dec term.Inductive bterm : Type :=
| bvar (x : string) : bterm
| bapp (s t : bterm) : bterm
| blambda (x : string) (s : bterm) : bterm
| bter (s : term) : bterm.Inductive bterm : Type :=
| bvar (x : string) : bterm
| bapp (s t : bterm) : bterm
| blambda (x : string) (s : bterm) : bterm
| bter (s : term) : bterm.Inductive bterm : Type :=
| bvar (x : string) : bterm
| bapp (s t : bterm) : bterm
| blambda (x : string) (s : bterm) : bterm
| bter (s : term) : bterm.Inductive bterm : Type :=
| bvar (x : string) : bterm
| bapp (s t : bterm) : bterm
| blambda (x : string) (s : bterm) : bterm
| bter (s : term) : bterm.Inductive bterm : Type :=
| bvar (x : string) : bterm
| bapp (s t : bterm) : bterm
| blambda (x : string) (s : bterm) : bterm
| bter (s : term) : bterm.Instance eq_dec_string : eq_dec string.Fixpoint convert' (F : list string) (s : bterm) : term := match s with
| bvar x => match pos _ x F with None => 100 | Some t =>  t end
| bapp s t => app (convert' F s) (convert' F t)
| blambda x s => lambda (convert' (x:: F) s)
| bter t => t
end.Notation "s '≻^+' t" := (stepplus s t) (at level 40).Implicit Types s t u v : term.Implicit Types p q : term -> Prop.Implicit Types n m k l : nat.(** ** Substitution and closedness *)

Fixpoint subst s k u :=
  match s with
      | var n => if decision (n = k) then u else (var n)
      | app s t => app (subst s k u) (subst t k u)
      | lambda s => lambda (subst s (S k) u)
  end.Fixpoint bound (k : nat) (t : term) : bool :=
match t with
| var n => if decision (n < k) then true else false
| app s t => andb (bound k s) (bound k t)
| lambda s => bound (S k) s
end.Definition closed s := bound 0 s = true.Definition proc s := closed s /\ lam s.

(* Specifications: *)
Lemma bound_ge k s : bound k s = true -> forall m, m >= k -> bound m s = true.
Lemma bound_closed_k s k n u : bound n s = true -> k >= n -> subst s k u = s.
Lemma closed_subst s k u : closed s -> subst s k u = s.
Lemma closed_app s t : closed (s t) -> closed s /\ closed t.
Lemma app_closed s t : closed s -> closed t -> closed (s t).