Proof with eauto; try now intuition.
intros p_sem proc_N pN pD [u [[cls_u lam_u] Hu]].
pose (f := fun s => lambda (F (s (tenc s)) N 0)).
pose (v := lambda (Lam (App (App (App (tenc F) (App 0 (Q 0))) (tenc N)) (tenc 0)))).
eapply Reduction with (p := p) (f := f) (v := v).
- value.
- intros. assert (Hf : forall t, f s (tenc t) ≡ F (s (tenc s)) N (tenc t)) by (intros; solvered).
intuition.
+ eapply p_sem in H0; value. eapply pN, H0. intros t t'. rewrite Hf.
destruct H1 as (s' & [] % evaluates_equiv). rewrite H1, F_correct; value. tauto.
+ eapply p_sem with (s := D); value. eauto. intros t t'. rewrite Hf.
intuition.
* destruct H0. eapply F_eva with (t := N). eapply app_eva with (t := tenc t). firstorder.
* exfalso. eapply D_pi. exists t'. eassumption.
- intros. transitivity (Lam ((App ((App ((App (tenc F)) ((App (tenc s)) (Q (tenc s))))) (tenc N))) (tenc 0))). solveeq.
now rewrite Q_correct, !App_correct, Lam_correct.
- exists u. firstorder.
Qed.

Lemma Rice_pi p :
closed_under_proc (fun s t => (forall u, pi s u <-> pi t u)) p ->
(exists u, proc u /\ ~ p u) ->
p (lambda Omega) -> ~ recognisable p.