{-# OPTIONS --safe #-} module Cubical.Relation.Binary.Order.Proset.Properties where open import Cubical.Data.Sigma open import Cubical.Data.Sum as ⊎ open import Cubical.Foundations.Equiv open import Cubical.Foundations.Function open import Cubical.Foundations.HLevels open import Cubical.Foundations.Prelude open import Cubical.Functions.Embedding open import Cubical.HITs.PropositionalTruncation as ∥₁ open import Cubical.Relation.Binary.Base open import Cubical.Relation.Binary.Order.Proset.Base open import Cubical.Relation.Binary.Order.Quoset.Base open import Cubical.Relation.Nullary private variable ℓ ℓ' ℓ'' : Level module _ {A : Type ℓ} {R : Rel A A ℓ'} where open BinaryRelation isProset→isEquivRelSymKernel : IsProset R → isEquivRel (SymKernel R) isProset→isEquivRelSymKernel proset = equivRel (λ a → (IsProset.is-refl proset a) , (IsProset.is-refl proset a)) (isSymSymKernel R) (λ a b c (Rab , Rba) (Rbc , Rcb) → IsProset.is-trans proset a b c Rab Rbc , IsProset.is-trans proset c b a Rcb Rba) isProset→isQuosetAsymKernel : IsProset R → IsQuoset (AsymKernel R) isProset→isQuosetAsymKernel proset = isquoset (IsProset.is-set proset) (λ a b → isProp× (IsProset.is-prop-valued proset a b) (isProp¬ (R b a))) (λ a (Raa , ¬Raa) → ¬Raa (IsProset.is-refl proset a)) (λ a b c (Rab , ¬Rba) (Rbc , ¬Rcb) → IsProset.is-trans proset a b c Rab Rbc , λ Rca → ¬Rcb (IsProset.is-trans proset c a b Rca Rab)) (isAsymAsymKernel R) isProsetInduced : IsProset R → (B : Type ℓ'') → (f : B ↪ A) → IsProset (InducedRelation R (B , f)) isProsetInduced pre B (f , emb) = isproset (Embedding-into-isSet→isSet (f , emb) (IsProset.is-set pre)) (λ a b → IsProset.is-prop-valued pre (f a) (f b)) (λ a → IsProset.is-refl pre (f a)) λ a b c → IsProset.is-trans pre (f a) (f b) (f c) isProsetDual : IsProset R → IsProset (Dual R) isProsetDual pre = isproset (IsProset.is-set pre) (λ a b → IsProset.is-prop-valued pre b a) (IsProset.is-refl pre) (λ a b c Rab Rbc → IsProset.is-trans pre c b a Rbc Rab) Proset→Quoset : Proset ℓ ℓ' → Quoset ℓ ℓ' Proset→Quoset (_ , pre) = quoset _ (BinaryRelation.AsymKernel (ProsetStr._≲_ pre)) (isProset→isQuosetAsymKernel (ProsetStr.isProset pre)) DualProset : Proset ℓ ℓ' → Proset ℓ ℓ' DualProset (_ , pre) = proset _ (BinaryRelation.Dual (ProsetStr._≲_ pre)) (isProsetDual (ProsetStr.isProset pre)) module _ {A : Type ℓ} {_≲_ : Rel A A ℓ'} (pre : IsProset _≲_) where private prop = IsProset.is-prop-valued pre rfl = IsProset.is-refl pre trans = IsProset.is-trans pre module _ (P : Embedding A ℓ'') where private subtype = fst P 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 isUpperBoundOfSelf→isGreatestOfSelf : ∀{n} → isUpperBound {B = A} (λ x → x) n → isGreatest (A , (id↪ A)) n isUpperBoundOfSelf→isGreatestOfSelf ub = ub isLowerBoundOfSelf→isLeastOfSelf : ∀{n} → isLowerBound {B = A} (λ x → x) n → isLeast (A , (id↪ A)) n isLowerBoundOfSelf→isLeastOfSelf lb = lb isInfimumOfUpperBounds→isUpperBound : {B : Type ℓ''} → (P : B → A) → ∀ n → isInfimum {B = UpperBound P} fst n → isUpperBound P n isInfimumOfUpperBounds→isUpperBound P _ (_ , gt) x = gt ((P x) , λ { (_ , upy) → upy x }) isInfimumOfUpperBounds→isSupremum : {B : Type ℓ''} → (P : B → A) → ∀ n → isInfimum {B = UpperBound P} fst n → isSupremum P n isInfimumOfUpperBounds→isSupremum P n (lt , gt) = isInfimumOfUpperBounds→isUpperBound P n (lt , gt) , lt isSupremumOfLowerBounds→isLowerBound : {B : Type ℓ''} → (P : B → A) → ∀ n → isSupremum {B = LowerBound P} fst n → isLowerBound P n isSupremumOfLowerBounds→isLowerBound P _ (_ , ls) x = ls ((P x) , λ { (_ , lwy) → lwy x }) isSupremumOfLowerBounds→isInfimum : {B : Type ℓ''} → (P : B → A) → ∀ n → isSupremum {B = LowerBound P} fst n → isInfimum P n isSupremumOfLowerBounds→isInfimum P n (gs , ls) = isSupremumOfLowerBounds→isLowerBound P n (gs , ls) , gs isMeet : A → A → A → Type (ℓ-max ℓ ℓ') isMeet a b a∧b = ∀ x → x ≲ a∧b ≃ (x ≲ a × x ≲ b) isJoin : A → A → A → Type (ℓ-max ℓ ℓ') isJoin a b a∨b = ∀ x → a∨b ≲ x ≃ (a ≲ x × b ≲ x) Meet : ∀ a b → Type (ℓ-max ℓ ℓ') Meet a b = Σ[ a∧b ∈ A ] isMeet a b a∧b Join : ∀ a b → Type (ℓ-max ℓ ℓ') Join a b = Σ[ a∨b ∈ A ] isJoin a b a∨b isPropIsMeet : ∀ a b a∧b → isProp (isMeet a b a∧b) isPropIsMeet a b c = isPropΠ λ x → isOfHLevel≃ 1 (prop x c) (isProp× (prop x a) (prop x b)) isPropIsJoin : ∀ a b a∨b → isProp (isJoin a b a∨b) isPropIsJoin a b c = isPropΠ λ x → isOfHLevel≃ 1 (prop c x) (isProp× (prop a x) (prop b x)) isReflIsMeet : ∀ a → isMeet a a a isReflIsMeet a x = propBiimpl→Equiv (prop x a) (isProp× (prop x a) (prop x a)) (λ a → a , a) fst isReflIsJoin : ∀ a → isJoin a a a isReflIsJoin a x = propBiimpl→Equiv (prop a x) (isProp× (prop a x) (prop a x)) (λ a → a , a) fst isMeet≃isInfimum : ∀ a b c → isMeet a b c ≃ isInfimum {B = Σ[ x ∈ A ] (x ≡ a) ⊎ (x ≡ b)} fst c isMeet≃isInfimum a b a∧b = propBiimpl→Equiv (isPropIsMeet a b a∧b) (isPropIsInfimum fst a∧b) (λ fun → ⊎.rec (λ x≡a → subst (a∧b ≲_) (sym x≡a) (fun a∧b .fst (rfl a∧b) .fst)) (λ x≡b → subst (a∧b ≲_) (sym x≡b) (fun a∧b .fst (rfl a∧b) .snd)) ∘ snd , λ { (c , uprc) → invEq (fun c) ((uprc (a , (inl refl))) , (uprc (b , (inr refl)))) }) λ { (lb , gt) x → propBiimpl→Equiv (prop x a∧b) (isProp× (prop x a) (prop x b)) (λ x≤a∧b → (trans x a∧b a x≤a∧b (lb (a , inl refl))) , (trans x a∧b b x≤a∧b (lb (b , inr refl)))) λ { (x≤a , x≤b) → gt (x , (⊎.rec (λ y≡a → subst (x ≲_) (sym y≡a) x≤a) (λ y≡b → subst (x ≲_) (sym y≡b) x≤b) ∘ snd)) } } isJoin≃isSupremum : ∀ a b c → isJoin a b c ≃ isSupremum {B = Σ[ x ∈ A ] (x ≡ a) ⊎ (x ≡ b)} fst c isJoin≃isSupremum a b a∨b = propBiimpl→Equiv (isPropIsJoin a b a∨b) (isPropIsSupremum fst a∨b) (λ fun → ⊎.rec (λ x≡a → subst (_≲ a∨b) (sym x≡a) (fun a∨b .fst (rfl a∨b) .fst)) (λ x≡b → subst (_≲ a∨b) (sym x≡b) (fun a∨b .fst (rfl a∨b) .snd)) ∘ snd , λ { (c , lwrc) → invEq (fun c) ((lwrc (a , (inl refl))) , (lwrc (b , (inr refl)))) }) λ { (ub , lt) x → propBiimpl→Equiv (prop a∨b x) (isProp× (prop a x) (prop b x)) (λ a∨b≤x → trans a a∨b x (ub (a , inl refl)) a∨b≤x , trans b a∨b x (ub (b , inr refl)) a∨b≤x) λ { (a≤x , b≤x) → lt (x , (⊎.rec (λ y≡a → subst (_≲ x) (sym y≡a) a≤x) (λ y≡b → subst (_≲ x) (sym y≡b) b≤x) ∘ snd)) } } isMeetComm : ∀ a b a∧b → isMeet a b a∧b → isMeet b a a∧b isMeetComm _ _ _ fun x = compEquiv (fun x) Σ-swap-≃ isJoinComm : ∀ a b a∨b → isJoin a b a∨b → isJoin b a a∨b isJoinComm _ _ _ fun x = compEquiv (fun x) Σ-swap-≃ isMeetAssoc : ∀ a b c a∧b b∧c a∧b∧c → isMeet a b a∧b → isMeet b c b∧c → isMeet a b∧c a∧b∧c → isMeet a∧b c a∧b∧c isMeetAssoc a b c a∧b b∧c a∧b∧c funa∧b funb∧c funa∧b∧c x = compEquiv (funa∧b∧c x) (propBiimpl→Equiv (isProp× (prop x a) (prop x b∧c)) (isProp× (prop x a∧b) (prop x c)) (λ { (x≤a , x≤b∧c) → invEq (funa∧b x) (x≤a , (funb∧c x .fst x≤b∧c .fst)) , funb∧c x .fst x≤b∧c .snd }) λ { (x≤a∧b , x≤c) → funa∧b x .fst x≤a∧b .fst , invEq (funb∧c x) ((funa∧b x .fst x≤a∧b .snd) , x≤c) }) isJoinAssoc : ∀ a b c a∨b b∨c a∨b∨c → isJoin a b a∨b → isJoin b c b∨c → isJoin a b∨c a∨b∨c → isJoin a∨b c a∨b∨c isJoinAssoc a b c a∨b b∨c a∨b∨c funa∨b funb∨c funa∨b∨c x = compEquiv (funa∨b∨c x) (propBiimpl→Equiv (isProp× (prop a x) (prop b∨c x)) (isProp× (prop a∨b x) (prop c x)) (λ { (a≤x , b∨c≤x) → invEq (funa∨b x) (a≤x , (funb∨c x .fst b∨c≤x .fst)) , funb∨c x .fst b∨c≤x .snd }) λ { (a∨b≤x , c≤x) → funa∨b x .fst a∨b≤x .fst , invEq (funb∨c x) ((funa∨b x .fst a∨b≤x .snd) , c≤x) }) isMeetIsotone : ∀ a b c d a∧c b∧d → isMeet a c a∧c → isMeet b d b∧d → a ≲ b → c ≲ d → a∧c ≲ b∧d isMeetIsotone a b c d a∧c b∧d meeta∧c meetb∧d a≲b c≲d = invEq (meetb∧d a∧c) (trans a∧c a b a∧c≲a a≲b , trans a∧c c d a∧c≲c c≲d) where a∧c≲a = equivFun (meeta∧c a∧c) (rfl a∧c) .fst a∧c≲c = equivFun (meeta∧c a∧c) (rfl a∧c) .snd isJoinIsotone : ∀ a b c d a∨c b∨d → isJoin a c a∨c → isJoin b d b∨d → a ≲ b → c ≲ d → a∨c ≲ b∨d isJoinIsotone a b c d a∨c b∨d joina∨c joinb∨d a≲b c≲d = invEq (joina∨c b∨d) (trans a b b∨d a≲b b≲b∨d , trans c d b∨d c≲d d≲b∨d) where b≲b∨d = equivFun (joinb∨d b∨d) (rfl b∨d) .fst d≲b∨d = equivFun (joinb∨d b∨d) (rfl b∨d) .snd