------------------------------------------------------------------------ -- The Agda standard library -- -- Properties satisfied by posets ------------------------------------------------------------------------ {-# OPTIONS --cubical-compatible --safe #-} open import Data.Product.Base using (_,_) open import Function.Base using (flip; _∘_) open import Relation.Binary.Core using (Rel; _Preserves_⟶_) open import Relation.Binary.Bundles using (Poset; StrictPartialOrder) open import Relation.Binary.Structures using (IsPartialOrder; IsStrictPartialOrder; IsDecPartialOrder) open import Relation.Binary.Definitions using (_Respectsˡ_; _Respectsʳ_; Decidable) import Relation.Binary.Consequences as Consequences open import Relation.Nullary using (¬_; yes; no) open import Relation.Nullary.Negation using (contradiction) module Relation.Binary.Properties.Poset {p₁ p₂ p₃} (P : Poset p₁ p₂ p₃) where open Poset P renaming (Carrier to A) import Relation.Binary.Construct.NonStrictToStrict _≈_ _≤_ as ToStrict import Relation.Binary.Properties.Preorder preorder as PreorderProperties open Eq using (_≉_) ------------------------------------------------------------------------ -- The _≥_ relation is also a poset. open PreorderProperties public using () renaming ( converse-isPreorder to ≥-isPreorder ; converse-preorder to ≥-preorder ) ≥-isPartialOrder : IsPartialOrder _≈_ _≥_ ≥-isPartialOrder = record { isPreorder = ≥-isPreorder ; antisym = flip antisym } ≥-poset : Poset p₁ p₂ p₃ ≥-poset = record { isPartialOrder = ≥-isPartialOrder } open Poset ≥-poset public using () renaming ( refl to ≥-refl ; reflexive to ≥-reflexive ; trans to ≥-trans ; antisym to ≥-antisym ) ------------------------------------------------------------------------ -- Negated order ≰-respˡ-≈ : _≰_ Respectsˡ _≈_ ≰-respˡ-≈ x≈y = _∘ ≤-respˡ-≈ (Eq.sym x≈y) ≰-respʳ-≈ : _≰_ Respectsʳ _≈_ ≰-respʳ-≈ x≈y = _∘ ≤-respʳ-≈ (Eq.sym x≈y) ------------------------------------------------------------------------ -- Partial orders can be turned into strict partial orders infix 4 _<_ _<_ : Rel A _ _<_ = ToStrict._<_ <-isStrictPartialOrder : IsStrictPartialOrder _≈_ _<_ <-isStrictPartialOrder = ToStrict.<-isStrictPartialOrder isPartialOrder <-strictPartialOrder : StrictPartialOrder _ _ _ <-strictPartialOrder = record { isStrictPartialOrder = <-isStrictPartialOrder } open StrictPartialOrder <-strictPartialOrder public using (_≮_; <-resp-≈; <-respʳ-≈; <-respˡ-≈) renaming ( irrefl to <-irrefl ; asym to <-asym ; trans to <-trans ) <⇒≉ : ∀ {x y} → x < y → x ≉ y <⇒≉ = ToStrict.<⇒≉ ≤∧≉⇒< : ∀ {x y} → x ≤ y → x ≉ y → x < y ≤∧≉⇒< = ToStrict.≤∧≉⇒< <⇒≱ : ∀ {x y} → x < y → y ≰ x <⇒≱ = ToStrict.<⇒≱ antisym ≤⇒≯ : ∀ {x y} → x ≤ y → y ≮ x ≤⇒≯ = ToStrict.≤⇒≯ antisym ------------------------------------------------------------------------ -- If ≤ is decidable then so is ≈ ≤-dec⇒≈-dec : Decidable _≤_ → Decidable _≈_ ≤-dec⇒≈-dec _≤?_ x y with x ≤? y | y ≤? x ... | yes x≤y | yes y≤x = yes (antisym x≤y y≤x) ... | yes x≤y | no y≰x = no λ x≈y → contradiction (reflexive (Eq.sym x≈y)) y≰x ... | no x≰y | _ = no λ x≈y → contradiction (reflexive x≈y) x≰y ≤-dec⇒isDecPartialOrder : Decidable _≤_ → IsDecPartialOrder _≈_ _≤_ ≤-dec⇒isDecPartialOrder _≤?_ = record { isPartialOrder = isPartialOrder ; _≟_ = ≤-dec⇒≈-dec _≤?_ ; _≤?_ = _≤?_ } ------------------------------------------------------------------------ -- Other properties mono⇒cong : ∀ {f} → f Preserves _≤_ ⟶ _≤_ → f Preserves _≈_ ⟶ _≈_ mono⇒cong = Consequences.mono⇒cong _≈_ _≈_ Eq.sym reflexive antisym antimono⇒cong : ∀ {f} → f Preserves _≤_ ⟶ _≥_ → f Preserves _≈_ ⟶ _≈_ antimono⇒cong = Consequences.antimono⇒cong _≈_ _≈_ Eq.sym reflexive antisym