intros;
cut
((exists m : nat, P m /\ (forall i : nat, P i -> i >= m)) \/
(forall p : nat, n >= p -> ~ P p)).
intro; elim H1; auto with core arith.
intro; generalize (H2 n (le_n n)); intros; absurd (P n); auto with core arith.
elim n.
elim (H 0); intros.
left; exists 0; auto with core arith.
right; unfold ge in |- *; intros; cut (p = 0).
intro; rewrite H3; auto with core arith.
auto with core arith.
intros; elim H1; auto with core arith.
intro; elim (H (S n0)); intro.
left; exists (S n0); split; auto with core arith.
cut (forall p : nat, S n0 <= p \/ p < S n0).
intros; elim (H4 i); auto with core arith.
unfold lt in |- *; intro; generalize (le_S_n i n0 H6); intro; unfold ge in H2;
elim (H2 i H7); auto with core arith.
intro; apply le_or_lt.
right; intros; cut (p < S n0 \/ p = S n0).
intro; elim H5; intro.
generalize (lt_n_Sm_le p n0 H6).
intro; unfold ge in H2; generalize (H2 p H7); auto with core arith.
rewrite H6; auto with core arith.
apply (le_lt_or_eq p (S n0) H4).
Qed.

(* Specifications: *)
(**********)
Lemma inser_trans :
forall n m p q : nat,
n <= m /\ m < p -> {n <= m /\ m < q} + {q <= m /\ m < p}.