{-# OPTIONS --safe #-}
module Cubical.Relation.Binary.Order.Properties where
open import Cubical.Data.Sigma
open import Cubical.Data.Sum as ⊎
open import Cubical.Foundations.Prelude
open import Cubical.Foundations.HLevels
open import Cubical.Functions.Embedding
open import Cubical.HITs.PropositionalTruncation as ∥₁
open import Cubical.Relation.Binary.Base
open import Cubical.Relation.Binary.Order.Poset
open import Cubical.Relation.Binary.Order.Toset
open import Cubical.Relation.Binary.Order.Preorder.Base
private
variable
ℓ ℓ' ℓ'' : Level
module _
{A : Type ℓ}
{_≲_ : Rel A A ℓ'}
(pre : IsPreorder _≲_)
where
private
prop : ∀ a b → isProp (a ≲ b)
prop = IsPreorder.is-prop-valued pre
module _
(P : Embedding A ℓ'')
where
private
subtype : Type ℓ''
subtype = fst P
toA : subtype → A
toA = fst (snd P)
isMinimal : (n : subtype) → Type (ℓ-max ℓ' ℓ'')
isMinimal n = (x : subtype) → toA x ≲ toA n → toA n ≲ toA x
isPropIsMinimal : ∀ n → isProp (isMinimal n)
isPropIsMinimal n = isPropΠ2 λ x _ → prop (toA n) (toA x)
Minimal : Type (ℓ-max ℓ' ℓ'')
Minimal = Σ[ n ∈ subtype ] isMinimal n
isMaximal : (n : subtype) → Type (ℓ-max ℓ' ℓ'')
isMaximal n = (x : subtype) → toA n ≲ toA x → toA x ≲ toA n
isPropIsMaximal : ∀ n → isProp (isMaximal n)
isPropIsMaximal n = isPropΠ2 λ x _ → prop (toA x) (toA n)
Maximal : Type (ℓ-max ℓ' ℓ'')
Maximal = Σ[ n ∈ subtype ] isMaximal n
isLeast : (n : subtype) → Type (ℓ-max ℓ' ℓ'')
isLeast n = (x : subtype) → toA n ≲ toA x
isPropIsLeast : ∀ n → isProp (isLeast n)
isPropIsLeast n = isPropΠ λ x → prop (toA n) (toA x)
Least : Type (ℓ-max ℓ' ℓ'')
Least = Σ[ n ∈ subtype ] isLeast n
isGreatest : (n : subtype) → Type (ℓ-max ℓ' ℓ'')
isGreatest n = (x : subtype) → toA x ≲ toA n
isPropIsGreatest : ∀ n → isProp (isGreatest n)
isPropIsGreatest n = isPropΠ λ x → prop (toA x) (toA n)
Greatest : Type (ℓ-max ℓ' ℓ'')
Greatest = Σ[ n ∈ subtype ] isGreatest n
module _
{B : Type ℓ''}
(P : B → A)
where
isLowerBound : (n : A) → Type (ℓ-max ℓ' ℓ'')
isLowerBound n = (x : B) → n ≲ P x
isPropIsLowerBound : ∀ n → isProp (isLowerBound n)
isPropIsLowerBound n = isPropΠ λ x → prop n (P x)
LowerBound : Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
LowerBound = Σ[ n ∈ A ] isLowerBound n
isUpperBound : (n : A) → Type (ℓ-max ℓ' ℓ'')
isUpperBound n = (x : B) → P x ≲ n
isPropIsUpperBound : ∀ n → isProp (isUpperBound n)
isPropIsUpperBound n = isPropΠ λ x → prop (P x) n
UpperBound : Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
UpperBound = Σ[ n ∈ A ] isUpperBound n
module _
{B : Type ℓ''}
(P : B → A)
where
isMaximalLowerBound : (n : A) → Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
isMaximalLowerBound n
= Σ[ islb ∈ isLowerBound P n ]
isMaximal (LowerBound P
, (EmbeddingΣProp (isPropIsLowerBound P))) (n , islb)
isPropIsMaximalLowerBound : ∀ n → isProp (isMaximalLowerBound n)
isPropIsMaximalLowerBound n
= isPropΣ (isPropIsLowerBound P n)
λ islb → isPropIsMaximal (LowerBound P
, EmbeddingΣProp (isPropIsLowerBound P)) (n , islb)
MaximalLowerBound : Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
MaximalLowerBound = Σ[ n ∈ A ] isMaximalLowerBound n
isMinimalUpperBound : (n : A) → Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
isMinimalUpperBound n
= Σ[ isub ∈ isUpperBound P n ]
isMinimal (UpperBound P
, EmbeddingΣProp (isPropIsUpperBound P)) (n , isub)
isPropIsMinimalUpperBound : ∀ n → isProp (isMinimalUpperBound n)
isPropIsMinimalUpperBound n
= isPropΣ (isPropIsUpperBound P n)
λ isub → isPropIsMinimal (UpperBound P
, EmbeddingΣProp (isPropIsUpperBound P)) (n , isub)
MinimalUpperBound : Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
MinimalUpperBound = Σ[ n ∈ A ] isMinimalUpperBound n
isInfimum : (n : A) → Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
isInfimum n
= Σ[ islb ∈ isLowerBound P n ]
isGreatest (LowerBound P
, EmbeddingΣProp (isPropIsLowerBound P)) (n , islb)
isPropIsInfimum : ∀ n → isProp (isInfimum n)
isPropIsInfimum n
= isPropΣ (isPropIsLowerBound P n)
λ islb → isPropIsGreatest (LowerBound P
, EmbeddingΣProp (isPropIsLowerBound P)) (n , islb)
Infimum : Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
Infimum = Σ[ n ∈ A ] isInfimum n
isSupremum : (n : A) → Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
isSupremum n
= Σ[ isub ∈ isUpperBound P n ]
isLeast (UpperBound P
, EmbeddingΣProp (isPropIsUpperBound P)) (n , isub)
isPropIsSupremum : ∀ n → isProp (isSupremum n)
isPropIsSupremum n
= isPropΣ (isPropIsUpperBound P n)
λ isub → isPropIsLeast (UpperBound P
, EmbeddingΣProp (isPropIsUpperBound P)) (n , isub)
Supremum : Type (ℓ-max (ℓ-max ℓ ℓ') ℓ'')
Supremum = Σ[ n ∈ A ] isSupremum n
module _
{A : Type ℓ}
{_≲_ : Rel A A ℓ'}
(pre : IsPreorder _≲_)
where
module _
{P : Embedding A ℓ''}
where
private
toA : (fst P) → A
toA = fst (snd P)
isLeast→isMinimal : ∀ n → isLeast pre P n → isMinimal pre P n
isLeast→isMinimal _ isl x _ = isl x
isGreatest→isMaximal : ∀ n → isGreatest pre P n → isMaximal pre P n
isGreatest→isMaximal _ isg x _ = isg x
isLeast→isLowerBound : ∀ n → isLeast pre P n → isLowerBound pre toA (toA n)
isLeast→isLowerBound _ isl = isl
isGreatest→isUpperBound : ∀ n → isGreatest pre P n → isUpperBound pre toA (toA n)
isGreatest→isUpperBound _ isg = isg
isLeast→isInfimum : ∀ n → isLeast pre P n → isInfimum pre toA (toA n)
isLeast→isInfimum n isl = (isLeast→isLowerBound n isl) , (λ x → snd x n)
isGreatest→isSupremum : ∀ n → isGreatest pre P n → isSupremum pre toA (toA n)
isGreatest→isSupremum n isg = (isGreatest→isUpperBound n isg) , (λ x → snd x n)
module _
{B : Type ℓ''}
{P : B → A}
where
isInfimum→isLowerBound : ∀ n → isInfimum pre P n → isLowerBound pre P n
isInfimum→isLowerBound _ = fst
isSupremum→isUpperBound : ∀ n → isSupremum pre P n → isUpperBound pre P n
isSupremum→isUpperBound _ = fst
module _
{A : Type ℓ}
{_≤_ : Rel A A ℓ'}
(pos : IsPoset _≤_)
where
private
pre : IsPreorder _≤_
pre = isPoset→isPreorder pos
anti : BinaryRelation.isAntisym _≤_
anti = IsPoset.is-antisym pos
module _
{P : Embedding A ℓ''}
where
private
toA : (fst P) → A
toA = fst (snd P)
emb : isEmbedding toA
emb = snd (snd P)
isLeast→ContrMinimal : ∀ n → isLeast pre P n → ∀ m → isMinimal pre P m → n ≡ m
isLeast→ContrMinimal n isln m ismm
= isEmbedding→Inj emb n m (anti (toA n) (toA m) (isln m) (ismm n (isln m)))
isGreatest→ContrMaximal : ∀ n → isGreatest pre P n → ∀ m → isMaximal pre P m → n ≡ m
isGreatest→ContrMaximal n isgn m ismm
= isEmbedding→Inj emb n m (anti (toA n) (toA m) (ismm n (isgn m)) (isgn m))
isLeastUnique : ∀ n m → isLeast pre P n → isLeast pre P m → n ≡ m
isLeastUnique n m isln islm
= isEmbedding→Inj emb n m (anti (toA n) (toA m) (isln m) (islm n))
isGreatestUnique : ∀ n m → isGreatest pre P n → isGreatest pre P m → n ≡ m
isGreatestUnique n m isgn isgm
= isEmbedding→Inj emb n m (anti (toA n) (toA m) (isgm n) (isgn m))
module _
{B : Type ℓ''}
{P : B → A}
where
isInfimum→ContrMaximalLowerBound : ∀ n → isInfimum pre P n
→ ∀ m → isMaximalLowerBound pre P m
→ n ≡ m
isInfimum→ContrMaximalLowerBound n (isln , isglbn) m (islm , ismlbm)
= anti n m (ismlbm (n , isln) (isglbn (m , islm))) (isglbn (m , islm))
isSupremum→ContrMinimalUpperBound : ∀ n → isSupremum pre P n
→ ∀ m → isMinimalUpperBound pre P m
→ n ≡ m
isSupremum→ContrMinimalUpperBound n (isun , islubn) m (isum , ismubm)
= anti n m (islubn (m , isum)) (ismubm (n , isun) (islubn (m , isum)))
isInfimumUnique : ∀ n m → isInfimum pre P n → isInfimum pre P m → n ≡ m
isInfimumUnique n m (isln , infn) (islm , infm)
= anti n m (infm (n , isln)) (infn (m , islm))
isSupremumUnique : ∀ n m → isSupremum pre P n → isSupremum pre P m → n ≡ m
isSupremumUnique n m (isun , supn) (isum , supm)
= anti n m (supn (m , isum)) (supm (n , isun))
module _
{A : Type ℓ}
{P : Embedding A ℓ''}
{_≤_ : Rel A A ℓ'}
(tos : IsToset _≤_)
where
private
prop : ∀ a b → isProp (a ≤ b)
prop = IsToset.is-prop-valued tos
conn : BinaryRelation.isStronglyConnected _≤_
conn = IsToset.is-strongly-connected tos
pre : IsPreorder _≤_
pre = isPoset→isPreorder (isToset→isPoset tos)
toA : (fst P) → A
toA = fst (snd P)
isMinimal→isLeast : ∀ n → isMinimal pre P n → isLeast pre P n
isMinimal→isLeast n ism m
= ∥₁.rec (prop _ _) (⊎.rec (λ n≤m → n≤m) (λ m≤n → ism m m≤n)) (conn (toA n) (toA m))
isMaximal→isGreatest : ∀ n → isMaximal pre P n → isGreatest pre P n
isMaximal→isGreatest n ism m
= ∥₁.rec (prop _ _) (⊎.rec (λ n≤m → ism m n≤m) (λ m≤n → m≤n)) (conn (toA n) (toA m))