# Least upper bounds in large posets ```agda module order-theory.least-upper-bounds-large-posets where ``` <details><summary>Imports</summary> ```agda open import foundation.dependent-pair-types open import foundation.logical-equivalences open import foundation.universe-levels open import order-theory.dependent-products-large-posets open import order-theory.large-posets open import order-theory.least-upper-bounds-posets open import order-theory.similarity-of-elements-large-posets open import order-theory.upper-bounds-large-posets ``` </details> ## Idea A **least upper bound** of a family of elements `a : I → P` in a [large poset](order-theory.large-posets.md) `P` is an element `x` in `P` such that the [logical equivalence](foundation.logical-equivalences.md) ```text is-upper-bound-family-of-elements-Large-Poset P a y ↔ (x ≤ y) ``` holds for every element in `P`. ## Definitions ### The predicate on large posets of being a least upper bound of a family of elements ```agda module _ {α : Level → Level} {β : Level → Level → Level} (P : Large-Poset α β) {l1 l2 l3 : Level} {I : UU l1} (x : I → type-Large-Poset P l2) where is-least-upper-bound-family-of-elements-Large-Poset : type-Large-Poset P l3 → UUω is-least-upper-bound-family-of-elements-Large-Poset y = {l4 : Level} (z : type-Large-Poset P l4) → is-upper-bound-family-of-elements-Large-Poset P x z ↔ leq-Large-Poset P y z leq-is-least-upper-bound-family-of-elements-Large-Poset : (y : type-Large-Poset P l3) → is-least-upper-bound-family-of-elements-Large-Poset y → {l4 : Level} (z : type-Large-Poset P l4) → is-upper-bound-family-of-elements-Large-Poset P x z → leq-Large-Poset P y z leq-is-least-upper-bound-family-of-elements-Large-Poset y H z K = forward-implication (H z) K ``` ### The predicate on families of elements in large posets of having least upper bounds ```agda module _ {α : Level → Level} {β : Level → Level → Level} (γ : Level) (P : Large-Poset α β) {l1 l2 : Level} {I : UU l1} (x : I → type-Large-Poset P l2) where record has-least-upper-bound-family-of-elements-Large-Poset : UUω where field sup-has-least-upper-bound-family-of-elements-Large-Poset : type-Large-Poset P (γ ⊔ l1 ⊔ l2) is-least-upper-bound-sup-has-least-upper-bound-family-of-elements-Large-Poset : is-least-upper-bound-family-of-elements-Large-Poset P x sup-has-least-upper-bound-family-of-elements-Large-Poset open has-least-upper-bound-family-of-elements-Large-Poset public ``` ## Properties ### Least upper bounds of families of elements are upper bounds ```agda module _ {α : Level → Level} {β : Level → Level → Level} (P : Large-Poset α β) {l1 l2 : Level} {I : UU l1} {x : I → type-Large-Poset P l2} where is-upper-bound-is-least-upper-bound-family-of-elements-Large-Poset : {l3 : Level} {y : type-Large-Poset P l3} → is-least-upper-bound-family-of-elements-Large-Poset P x y → is-upper-bound-family-of-elements-Large-Poset P x y is-upper-bound-is-least-upper-bound-family-of-elements-Large-Poset H = backward-implication (H _) (refl-leq-Large-Poset P _) ``` ### Least upper bounds of families of elements are unique up to similairity of elements ```agda module _ {α : Level → Level} {β : Level → Level → Level} (P : Large-Poset α β) {l1 l2 : Level} {I : UU l1} {x : I → type-Large-Poset P l2} where sim-is-least-upper-bound-family-of-elements-Large-Poset : {l3 l4 : Level} {y : type-Large-Poset P l3} {z : type-Large-Poset P l4} → is-least-upper-bound-family-of-elements-Large-Poset P x y → is-least-upper-bound-family-of-elements-Large-Poset P x z → sim-Large-Poset P y z pr1 (sim-is-least-upper-bound-family-of-elements-Large-Poset H K) = forward-implication ( H _) ( is-upper-bound-is-least-upper-bound-family-of-elements-Large-Poset P K) pr2 (sim-is-least-upper-bound-family-of-elements-Large-Poset H K) = forward-implication ( K _) ( is-upper-bound-is-least-upper-bound-family-of-elements-Large-Poset P H) ``` ### A family of least upper bounds of families of elements in a family of large poset is a least upper bound in their dependent product ```agda module _ {α : Level → Level} {β : Level → Level → Level} {l1 : Level} {I : UU l1} (P : I → Large-Poset α β) {l2 l3 : Level} {J : UU l2} (a : J → type-Π-Large-Poset P l3) {l4 : Level} (x : type-Π-Large-Poset P l4) where is-least-upper-bound-Π-Large-Poset : ( (i : I) → is-least-upper-bound-family-of-elements-Large-Poset ( P i) ( λ j → a j i) ( x i)) → is-least-upper-bound-family-of-elements-Large-Poset (Π-Large-Poset P) a x is-least-upper-bound-Π-Large-Poset H y = logical-equivalence-reasoning is-upper-bound-family-of-elements-Large-Poset (Π-Large-Poset P) a y ↔ ( (i : I) → is-upper-bound-family-of-elements-Large-Poset ( P i) ( λ j → a j i) ( y i)) by inv-iff ( logical-equivalence-is-upper-bound-family-of-elements-Π-Large-Poset ( P) ( a) ( y)) ↔ leq-Π-Large-Poset P x y by iff-Π-iff-family (λ i → H i (y i)) ``` ### Least upper bounds in small posets from least upper bounds in large posets ```agda module _ {α : Level → Level} {β : Level → Level → Level} (P : Large-Poset α β) {l1 l2 : Level} {I : UU l1} (x : I → type-Large-Poset P l2) where is-least-upper-bound-family-of-elements-poset-Large-Poset : (y : type-Large-Poset P l2) → is-least-upper-bound-family-of-elements-Large-Poset P x y → is-least-upper-bound-family-of-elements-Poset ( poset-Large-Poset P l2) (x) (y) is-least-upper-bound-family-of-elements-poset-Large-Poset y is-lub-y z = is-lub-y z ```