intros (u & proc_u & Hu).
assert (forall s, {v | u (tenc s) ▷ v}). {
intros. eapply computable_eva. destruct (Hu s). exists T. tauto.
exists F; tauto.
}
exists (fun s =>  let (v, _) := H s in if decision (v = T) then true else false).
intros. destruct _. decide (x = T).
- subst. firstorder. eapply decidable_spec; eauto.
- firstorder. congruence. exfalso. eapply decidable_spec; eauto.
destruct (Hu s) as [ [? [H4 ?] %evaluates_equiv] | []].
destruct T_equiv_F.
assert (x ≡ T) by now rewrite <- e, <- H4. eapply unique_normal_forms in H6. subst. congruence.
eapply evaluates_abst; eauto. value. firstorder using evaluates_equiv.
Qed.
Fixpoint unenc s :=
match s with
| lambda (lambda 1) => Some 0
| lambda (lambda (app 0 s)) => match unenc s with Some n => Some (S n) | x=>x end
| _ => None
end.

Lemma unenc_correct2 t n : unenc t = Some n -> enc n = t.
Fixpoint decode (s : term) :=
match s with
| lambda (lambda (lambda (app (var 2) t))) => match unenc t with Some n => Some (var n) | None => None end
| lambda (lambda (lambda (app (app (var 1) s) t))) => match decode s, decode t with
| Some s, Some t => Some (s t)
| _, _ => None
end
| lambda (lambda (lambda (app (var 0) s))) => match decode s with
| Some s => Some (lambda s)
| None => None
end
| _ => None
end.