module Data.Bool.Order where
 
private
  R : Bool → Bool → Type
  R false _     = ⊤
  R true  true  = ⊤
  R true  false = ⊥
record _≤_ (x y : Bool) : Type where
  constructor lift
  field
    .lower : R x y
 
≤-refl : ∀ {x} → x ≤ x
≤-refl {true}  = lift tt
≤-refl {false} = lift tt
≤-trans : ∀ {x y z} → x ≤ y → y ≤ z → x ≤ z
≤-trans {true}  {true}  {true}  p q = _
≤-trans {false} {true}  {true}  p q = _
≤-trans {false} {false} {true}  p q = _
≤-trans {false} {false} {false} p q = _
≤-antisym : ∀ {x y} → x ≤ y → y ≤ x → x ≡ y
≤-antisym {true}  {true}  p q = refl
≤-antisym {false} {false} p q = refl
 
implies→≤ : ∀ {x y} → (So x → So y) → x ≤ y
implies→≤ {true}  {true}  f = _
implies→≤ {false} {true}  f = _
implies→≤ {false} {false} f = _
implies→≤ {true}  {false} f with () ← f oh
≤→implies : ∀ {x y} → x ≤ y → So x → So y
≤→implies {true} {true} p q = oh
so-antisym : ∀ {x y} → (So x → So y) → (So y → So x) → x ≡ y
so-antisym p q = ≤-antisym (implies→≤ p) (implies→≤ q)
 
and-≤l : ∀ x y → and x y ≤ x
and-≤l true true   = _
and-≤l true false  = _
and-≤l false true  = _
and-≤l false false = _
and-≤r : ∀ x y → and x y ≤ y
and-≤r true  true  = _
and-≤r true  false = _
and-≤r false true  = _
and-≤r false false = _
and-univ : ∀ x y z → x ≤ y → x ≤ z → x ≤ and y z
and-univ false _    _    _ _ = _
and-univ true  true true _ _ = _
or-≤l : ∀ x y → x ≤ or x y
or-≤l true  true  = _
or-≤l true  false = _
or-≤l false true  = _
or-≤l false false = _
or-≤r : ∀ x y → y ≤ or x y
or-≤r true  true  = _
or-≤r true  false = _
or-≤r false true  = _
or-≤r false false = _
or-univ : ∀ x y z → y ≤ x → z ≤ x → or y z ≤ x
or-univ true  true  true  _ _ = _
or-univ true  true  false _ _ = _
or-univ true  false true  _ _ = _
or-univ true  false false _ _ = _
or-univ false false false _ _ = _
≤-not : ∀ x y → x ≤ y → not y ≤ not x
≤-not true  true  _ = _
≤-not false true  _ = _
≤-not false false _ = _
not-≤ : ∀ x y → not x ≤ not y → y ≤ x
not-≤ true  true  _ = _
not-≤ true  false _ = _
not-≤ false false _ = _