Relation.Binary.Construct.NaturalOrder.Right
{-# OPTIONS --cubical-compatible --safe #-}
open import Algebra.Core using (Opβ)
open import Data.Product.Base using (_,_; _Γ_)
open import Data.Sum.Base using (injβ; injβ; map)
open import Relation.Binary.Core using (Rel; _β_)
open import Relation.Binary.Bundles
using (Preorder; Poset; DecPoset; TotalOrder; DecTotalOrder)
open import Relation.Binary.Structures
using (IsEquivalence; IsPreorder; IsPartialOrder; IsDecPartialOrder
; IsTotalOrder; IsDecTotalOrder)
open import Relation.Binary.Definitions
using (Symmetric; Transitive; Reflexive; Antisymmetric; Total; _RespectsΚ³_
; _RespectsΛ‘_; _Respectsβ_; Decidable)
open import Relation.Nullary.Negation using (Β¬_)
import Relation.Binary.Reasoning.Setoid as β-Reasoning
module Relation.Binary.Construct.NaturalOrder.Right
{a β} {A : Set a} (_β_ : Rel A β) (_β_ : Opβ A) where
open import Algebra.Definitions _β_
open import Algebra.Structures _β_
open import Algebra.Lattice.Structures _β_
infix 4 _β€_
_β€_ : Rel A β
x β€ y = x β (y β x)
reflexive : IsMagma _β_ β Idempotent _β_ β _β_ β _β€_
reflexive magma idem {x} {y} xβy = begin
x ββ¨ sym (idem x) β©
x β x ββ¨ β-cong xβy refl β©
y β x β
where open IsMagma magma; open β-Reasoning setoid
refl : Symmetric _β_ β Idempotent _β_ β Reflexive _β€_
refl sym idem {x} = sym (idem x)
antisym : IsEquivalence _β_ β Commutative _β_ β Antisymmetric _β_ _β€_
antisym isEq comm {x} {y} xβ€y yβ€x = begin
x ββ¨ xβ€y β©
y β x ββ¨ comm y x β©
x β y ββ¨ yβ€x β¨
y β
where open β-Reasoning (record { isEquivalence = isEq })
total : Symmetric _β_ β Transitive _β_ β Selective _β_ β Commutative _β_ β Total _β€_
total sym trans sel comm x y =
map (Ξ» xβyβx β trans (sym xβyβx) (comm x y)) sym (sel x y)
trans : IsSemigroup _β_ β Transitive _β€_
trans semi {x} {y} {z} xβ€y yβ€z = begin
x ββ¨ xβ€y β©
y β x ββ¨ β-cong yβ€z S.refl β©
(z β y) β x ββ¨ assoc z y x β©
z β (y β x) ββ¨ β-cong S.refl (sym xβ€y) β©
z β x β
where open module S = IsSemigroup semi; open β-Reasoning S.setoid
respΚ³ : IsMagma _β_ β _β€_ RespectsΚ³ _β_
respΚ³ magma {x} {y} {z} yβz xβ€y = begin
x ββ¨ xβ€y β©
y β x ββ¨ β-cong yβz M.refl β©
z β x β
where open module M = IsMagma magma; open β-Reasoning M.setoid
respΛ‘ : IsMagma _β_ β _β€_ RespectsΛ‘ _β_
respΛ‘ magma {x} {y} {z} yβz yβ€x = begin
z ββ¨ sym yβz β©
y ββ¨ yβ€x β©
x β y ββ¨ β-cong M.refl yβz β©
x β z β
where open module M = IsMagma magma; open β-Reasoning M.setoid
respβ : IsMagma _β_ β _β€_ Respectsβ _β_
respβ magma = respΚ³ magma , respΛ‘ magma
dec : Decidable _β_ β Decidable _β€_
dec _β_ x y = x β (y β x)
isPreorder : IsBand _β_ β IsPreorder _β_ _β€_
isPreorder band = record
{ isEquivalence = isEquivalence
; reflexive = reflexive isMagma idem
; trans = trans isSemigroup
}
where open IsBand band hiding (reflexive; trans)
isPartialOrder : IsSemilattice _β_ β IsPartialOrder _β_ _β€_
isPartialOrder semilattice = record
{ isPreorder = isPreorder isBand
; antisym = antisym isEquivalence comm
}
where open IsSemilattice semilattice
isDecPartialOrder : IsSemilattice _β_ β Decidable _β_ β
IsDecPartialOrder _β_ _β€_
isDecPartialOrder semilattice _β_ = record
{ isPartialOrder = isPartialOrder semilattice
; _β_ = _β_
; _β€?_ = dec _β_
}
isTotalOrder : IsSemilattice _β_ β Selective _β_ β IsTotalOrder _β_ _β€_
isTotalOrder latt sel = record
{ isPartialOrder = isPartialOrder latt
; total = total sym S.trans sel comm
}
where open module S = IsSemilattice latt
isDecTotalOrder : IsSemilattice _β_ β Selective _β_ β
Decidable _β_ β IsDecTotalOrder _β_ _β€_
isDecTotalOrder latt sel _β_ = record
{ isTotalOrder = isTotalOrder latt sel
; _β_ = _β_
; _β€?_ = dec _β_
}
preorder : IsBand _β_ β Preorder a β β
preorder band = record
{ isPreorder = isPreorder band
}
poset : IsSemilattice _β_ β Poset a β β
poset latt = record
{ isPartialOrder = isPartialOrder latt
}
decPoset : IsSemilattice _β_ β Decidable _β_ β DecPoset a β β
decPoset latt dec = record
{ isDecPartialOrder = isDecPartialOrder latt dec
}
totalOrder : IsSemilattice _β_ β Selective _β_ β TotalOrder a β β
totalOrder latt sel = record
{ isTotalOrder = isTotalOrder latt sel
}
decTotalOrder : IsSemilattice _β_ β Selective _β_ β
Decidable _β_ β DecTotalOrder a β β
decTotalOrder latt sel dec = record
{ isDecTotalOrder = isDecTotalOrder latt sel dec
}