Section First_inductive_lemma.
Variable U : Type.
Variable C : Cpo U.
Let D : PO U := PO_of_cpo U C.
Inductive Lubs_of_finite_parts (X : Ensemble U) : Ensemble U :=
Lubs_of_finite_parts_def :
forall (bsup : U) (Y : Ensemble U),
Included U Y X ->
Finite U Y -> Lub U D Y bsup -> In U (Lubs_of_finite_parts X) bsup.
intros X K H' L; apply Definition_of_Directed.
red in |- *; simpl in |- *; intros x H'0; elim H'0; auto with sets.
intros bsup Y H'1 H'2 H'3; apply Lub_is_in_Carrier with (X := Y);
auto with sets.
elim (Empty_set_has_lub U C); intros bsup E.
apply Inhabited_intro with (x := bsup).
apply Lubs_of_finite_parts_def with (Y := Empty_set U); auto with sets.
intros x1 x2 H'4; red in H'4.
lapply (H'4 x1); [ intro H'1; elim H'1 | idtac ]; auto with sets.
intros bsup Y H'0 H'2 H'3; try assumption.
lapply (H'4 x2); [ intro H'6; elim H'6 | idtac ]; auto with sets.
intros bsup0 Y0 H'5 H'7 H'8; try assumption.
lapply (Union_preserves_Finite U Y Y0);
[ intro H'12; lapply H'12; [ intro H'13; clear H'12 | clear H'12 ] | idtac ];
auto with sets.
elim (K (Union U Y Y0)); [ intros bsup1 E | idtac | idtac ]; auto with sets.
exists bsup1; split.
apply Lubs_of_finite_parts_def with (Y := Union U Y Y0); auto with sets.
apply Upper_Bound_Couple_intro.
apply Lub_is_in_Carrier with (X := Y); auto with sets.
apply Lub_is_in_Carrier with (X := Y0); auto with sets.
apply Lub_is_in_Carrier with (X := Union U Y Y0); auto with sets.
elim H'3.
intros H'10 H'11; apply H'11.
elim E; intros H'12 H'14;
apply Upper_downward_stable with (B := Union U Y Y0);
auto with sets.
elim H'8.
intros H'10 H'11; apply H'11.
elim E; intros H'12 H'14;
apply Upper_downward_stable with (B := Union U Y Y0);
auto with sets.
Qed.

Theorem Lub_is_LFP :
forall X : Ensemble U,
Included U X (Carrier_of U D) ->
forall bsup : U, Lub U D (Lubs_of_finite_parts X) bsup -> Lub U D X bsup.