(* Realizer [e:env; t:term] Cases (whnf e t) of (Prod C D) => (inleft ? (pair ? ? C D)) | _ => (inright (prod term term)) end. *)
intros.
case (whnf e t); auto with pts.
simple destruct x; intros.
right; red in |- *; intros.
cut (cumul_hn_inv e (Srt s) (Prod C D)); intros.
inversion_clear H1.
apply inv_cumul_hn with t (Prod C D); auto with arith pts.
right; red in |- *; intros.
cut (cumul_hn_inv e (Ref n) (Prod C D)); intros.
inversion_clear H1.
apply inv_cumul_hn with t (Prod C D); auto with arith pts.
right; red in |- *; intros.
cut (cumul_hn_inv e (Abs t0 t1) (Prod C D)); intros.
inversion_clear H1.
apply inv_cumul_hn with t (Prod C D); auto with arith pts.
right; red in |- *; intros.
cut (cumul_hn_inv e (App t0 t1) (Prod C D)); intros.
inversion_clear H1.
apply inv_cumul_hn with t (Prod C D); auto with arith pts.
left.
exists (t0, t1).
split.
apply sound_wf_type_cumul with t; auto with arith pts.
simpl in |- *.
split; intros; auto 10 with arith pts.
apply cumul_trans with t; auto 10 with arith pts.
Qed.

Lemma cumul_infer_axiom :
forall s : sort,
ppal_dec (axiom s)
(fun s1 s2 => forall e : env, rt_cumul e (Srt s1) (Srt s2)).