Preorder

Definition 1.25. A preorder relation on a set X is a binary relation on X, here denoted with infix notation ≤, such that

(a) x ≤ x; and

(b) if x ≤ y and y ≤ z, then x ≤ z.

The first condition is called reflexivity and the second is called transitivity. If x ≤ y and y ≤ x, we write x ≅ y and say x and y are equivalent. We call a pair (X, ≤) consisting of a set equipped with a preorder relation a preorder.

module definitions.chapter1.Preorder where

open import Data.Product using (_×_)

-- A preorder relation on a set X is a binary relation satisfying
-- reflexivity and transitivity
record IsPreorder {A : Set} (_≤_ : A  A  Set) : Set where
  field
    -- (a) Reflexivity: x ≤ x
    reflexive  :  {x}  x  x

    -- (b) Transitivity: if x ≤ y and y ≤ z, then x ≤ z
    transitive :  {x y z}  x  y  y  z  x  z

  -- If x ≤ y and y ≤ x, we write x ≅ y and say x and y are equivalent
  -- Note: This is element equivalence within a preorder.
  -- Preorder isomorphism (P ≅ Q) is defined separately in definitions.Isomorphism
  _≅_ : A  A  Set
  x  y = (x  y) × (y  x)

-- A preorder is a pair (X, ≤) consisting of a set equipped with
-- a preorder relation
record Preorder : Set₁ where
  field
    Carrier    : Set
    _≤_        : Carrier  Carrier  Set
    isPreorder : IsPreorder _≤_

  open IsPreorder isPreorder public

  -- Equational reasoning for preorders
  module ≤-Reasoning where
    infix  3 _∎
    infixr 2 _≤⟨_⟩_
    infix  1 begin_

    begin_ :  {x y}  x  y  x  y
    begin p = p

    _≤⟨_⟩_ :  x {y z}  x  y  y  z  x  z
    x ≤⟨ p  q = transitive p q

    _∎ :  x  x  x
    x  = reflexive