{-# OPTIONS --safe #-} module Cubical.Relation.Binary.Order.Toset.Properties where open import Cubical.Data.Sum as ⊎ open import Cubical.Data.Empty 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.Base open import Cubical.Relation.Binary.Order.Toset.Base open import Cubical.Relation.Binary.Order.Loset.Base open import Cubical.Relation.Nullary private variable ℓ ℓ' ℓ'' : Level module _ {A : Type ℓ} {R : Rel A A ℓ'} where open BinaryRelation isToset→isPoset : IsToset R → IsPoset R isToset→isPoset toset = isposet (IsToset.is-set toset) (IsToset.is-prop-valued toset) (IsToset.is-refl toset) (IsToset.is-trans toset) (IsToset.is-antisym toset) private transirrefl : isTrans R → isAntisym R → isTrans (IrreflKernel R) transirrefl trans anti a b c (Rab , ¬a≡b) (Rbc , ¬b≡c) = trans a b c Rab Rbc , λ a≡c → ¬a≡b (anti a b Rab (subst (R b) (sym a≡c) Rbc)) isToset→isLosetIrreflKernel : Discrete A → IsToset R → IsLoset (IrreflKernel R) isToset→isLosetIrreflKernel disc toset = isloset (IsToset.is-set toset) (λ a b → isProp× (IsToset.is-prop-valued toset a b) (isProp¬ (a ≡ b))) (isIrreflIrreflKernel R) (transirrefl (IsToset.is-trans toset) (IsToset.is-antisym toset)) (isIrrefl×isTrans→isAsym (IrreflKernel R) (isIrreflIrreflKernel R , transirrefl (IsToset.is-trans toset) (IsToset.is-antisym toset))) (λ a c b (Rac , ¬a≡c) → decRec (λ a≡b → ∥₁.map (⊎.rec (λ Rbc → inr (Rbc , λ b≡c → ¬a≡c (a≡b ∙ b≡c))) λ Rcb → ⊥.rec (¬a≡c (IsToset.is-antisym toset a c Rac (subst (λ x → R c x) (sym a≡b) Rcb)))) (IsToset.is-strongly-connected toset b c)) (λ ¬a≡b → ∥₁.map (⊎.map (λ Rab → Rab , ¬a≡b) (λ Rba → (IsToset.is-trans toset b a c Rba Rac) , λ b≡c → ¬a≡b (IsToset.is-antisym toset a b (subst (λ x → R a x) (sym b≡c) Rac) Rba))) (IsToset.is-strongly-connected toset a b)) (disc a b)) (isConnectedStronglyConnectedIrreflKernel R (IsToset.is-strongly-connected toset)) isTosetInduced : IsToset R → (B : Type ℓ'') → (f : B ↪ A) → IsToset (InducedRelation R (B , f)) isTosetInduced tos B (f , emb) = istoset (Embedding-into-isSet→isSet (f , emb) (IsToset.is-set tos)) (λ a b → IsToset.is-prop-valued tos (f a) (f b)) (λ a → IsToset.is-refl tos (f a)) (λ a b c → IsToset.is-trans tos (f a) (f b) (f c)) (λ a b a≤b b≤a → isEmbedding→Inj emb a b (IsToset.is-antisym tos (f a) (f b) a≤b b≤a)) λ a b → IsToset.is-strongly-connected tos (f a) (f b) Toset→Poset : Toset ℓ ℓ' → Poset ℓ ℓ' Toset→Poset (_ , tos) = _ , posetstr (TosetStr._≤_ tos) (isToset→isPoset (TosetStr.isToset tos)) Toset→Loset : (tos : Toset ℓ ℓ') → Discrete (fst tos) → Loset ℓ (ℓ-max ℓ ℓ') Toset→Loset (_ , tos) disc = _ , losetstr (BinaryRelation.IrreflKernel (TosetStr._≤_ tos)) (isToset→isLosetIrreflKernel disc (TosetStr.isToset tos))