Require Export Ensembles.
Require Export Relations_1.
Require Export Partial_Order.
Section Bounds.
Variable U: Type.
Variable D: (PO U).
Local C := (Carrier_of U D).
Local R := (Rel_of U D).
Inductive Upper_Bound [B:(Ensemble U); x:U]: Prop :=
Upper_Bound_definition:
(In U C x) -> ((y: U) (In U B y) -> (R y x)) -> (Upper_Bound B x).
Inductive Lower_Bound [B:(Ensemble U); x:U]: Prop :=
Lower_Bound_definition:
(In U C x) -> ((y: U) (In U B y) -> (R x y)) -> (Lower_Bound B x).
Inductive Lub [B:(Ensemble U); x:U]: Prop :=
Lub_definition:
(Upper_Bound B x) -> ((y: U) (Upper_Bound B y) -> (R x y)) -> (Lub B x).
Inductive Glb [B:(Ensemble U); x:U]: Prop :=
Glb_definition:
(Lower_Bound B x) -> ((y: U) (Lower_Bound B y) -> (R y x)) -> (Glb B x).
Inductive Bottom [bot:U]: Prop :=
Bottom_definition:
(In U C bot) -> ((y: U) (In U C y) -> (R bot y)) -> (Bottom bot).
Inductive Totally_ordered [B:(Ensemble U)]: Prop :=
Totally_ordered_definition:
((Included U B C) ->
(x: U) (y: U) (Included U (Couple U x y) B) -> (R x y) \/ (R y x)) ->
(Totally_ordered B).
Definition Compatible : (Relation U) :=
[x: U] [y: U] (In U C x) -> (In U C y) ->
(EXT z | (In U C z) /\ (Upper_Bound (Couple U x y) z)).
Inductive Directed [X:(Ensemble U)]: Prop :=
Definition_of_Directed:
(Included U X C) ->
(Inhabited U X) ->
((x1: U) (x2: U) (Included U (Couple U x1 x2) X) ->
(EXT x3 | (In U X x3) /\ (Upper_Bound (Couple U x1 x2) x3))) ->
(Directed X).
Inductive Complete : Prop :=
Definition_of_Complete:
((EXT bot | (Bottom bot))) ->
((X: (Ensemble U)) (Directed X) -> (EXT bsup | (Lub X bsup))) ->
Complete.
Inductive Conditionally_complete : Prop :=
Definition_of_Conditionally_complete:
((X: (Ensemble U))
(Included U X C) -> (EXT maj | (Upper_Bound X maj)) ->
(EXT bsup | (Lub X bsup))) -> Conditionally_complete.
End Bounds.
Hints Resolve Totally_ordered_definition Upper_Bound_definition
Lower_Bound_definition Lub_definition Glb_definition
Bottom_definition Definition_of_Complete
Definition_of_Complete Definition_of_Conditionally_complete.
Section Specific_orders.
Variable U: Type.
Record Cpo : Type := Definition_of_cpo {
PO_of_cpo: (PO U);
Cpo_cond: (Complete U PO_of_cpo) }.
Record Chain : Type := Definition_of_chain {
PO_of_chain: (PO U);
Chain_cond: (Totally_ordered U PO_of_chain (Carrier_of U PO_of_chain)) }.
End Specific_orders.