{-# OPTIONS --type-in-type
    #-}

open import NeilPrelude

module PreOrder {A : Set} (_≤'_ : A → A → Set)

                    (reflex  : Reflexive _≤'_)
                    (transit : Transitive _≤'_)

where

infix 3 _≤_ _≥_

_≤_ : A → A → Set
_≤_ = _≤'_

_≥_ : A → A → Set
a ≥ b = b ≤ a

reflexive : Reflexive _≤_
reflexive = reflex

transitive : Transitive _≤_
transitive = transit

transitive2 : Transitive2 _≤_
transitive2 ab bc cd = transitive ab (transitive bc cd)

transitive3 : Transitive3 _≤_
transitive3 ab bc cd de = transitive2 ab bc (transitive cd de)

≡implies≤ : {a b : A} → a ≡ b → a ≤ b
≡implies≤ refl = reflex

≤subst : {a b c d : A} → b ≡ a → d ≡ c → a ≤ c → b ≤ d
≤subst refl refl = id

≤substL : {a b c : A} → b ≡ a → a ≤ c → b ≤ c
≤substL = flip ≤subst refl

≤substR : {a b c : A} → c ≡ b → a ≤ b → a ≤ c
≤substR = ≤subst refl

-----------------------------------------------------------------

infixr 1 _≤⟨_⟩_
infix  2 _QED

_≤⟨_⟩_ : {b c : A} → (a : A) → a ≤ b → b ≤ c → a ≤ c
_ ≤⟨ ab ⟩ bc = transitive ab bc

_QED : (a : A) → a ≤ a
_ QED = reflex

-----------------------------------------------------------------