Section First_inductive_lemmas.
Variable U : Type.
Variable B : Ensemble U.
Variable D : PO U.
intros H' H'0 X H'1; elim H'1; auto.
intros A H'2 H'3 x H'4 H'5 h; elim h; intros maj E; clear h.
generalize (Upper_downward_stable U D A (Union U (Singleton U x) A) maj);
intro h; lapply h;
[ intro H'6; lapply H'6;
[ intro H'7; lapply H'7;
[ intro H'8; lapply H'8;
[ intro H'9; clear h H'6 H'7 H'8
| clear h H'6 H'7; try assumption ]
| clear h H'6 ]
| clear h ]
| clear h ]; auto 10.
lapply H'3;
[ intro H'6; lapply H'6;
[ intro H'7; clear H'3 H'6 | exists maj; clear H'3; try assumption ]
| idtac ]; auto 10.
elim H'7; intros bsup E0; clear H'7; try exact E0; auto 10.
generalize (H'0 x bsup); intro h; lapply h;
[ intro h0; elim h0; intros bsup0 E1; clear h h0; try exact E1
| clear h ]; clear H'0.
exists bsup0; apply Lub_definition; auto 10.
elim E1; intros H'3 H'6.
elim H'3; intros H'7 H'8.
apply Upper_Bound_definition; auto 10.
intros y H'10; elim H'10.
intros x0 H'11; elim H'11; auto 10.
intros x0 H'11; auto 10.
generalize Rel_of_transitive; intro RoT; red in RoT.
apply RoT with bsup; auto.
elim E0.
intro H'12; elim H'12; auto.
elim E1.
intros H'3 H'6 y H'7.
apply H'6.
elim H'7; intros H'8 H'10.
apply Upper_Bound_definition; auto.
intros y0 H'11; elim H'11; auto 10.
elim H'7.
elim E0; auto 10.
red in |- *.
elim H'9.
intros H'0 H'3; exists maj; intros H'6 H'7; split;
[ idtac | apply Upper_Bound_definition ]; auto 10.
intros y H'10; elim H'10; auto 10.
elim E; auto 10.
elim E0; auto 10.
Qed.

Theorem Pairs_are_enough :
Cpo U D ->
(forall x y : U,
Compatible U D x y -> exists bsup : U, Lub U D (Couple U x y) bsup) ->
Conditionally_complete U D.