\import Logic
\import Paths
\import Set
\import Set.Subset
-- | Strict partial orders are also known as quasiorders
\class StrictPoset \extends BaseSet {
| \infix 4 < : E -> E -> \Prop
| <-irreflexive {x : E} : Not (x < x)
| <-transitive \alias \infixr 9 <∘ {x y z : E} : x < y -> y < z -> x < z
| \infix 4 > : E -> E -> \Prop
| > x y => y < x
\func op : StrictPoset E \cowith
| < x y => y < x
| <-irreflexive => <-irreflexive
| <-transitive p q => q <∘ p
\lemma <_/= {x y : E} (x<y : x < y) : x /= y
=> \lam x=y => <-irreflexive (transport (`< y) x=y x<y)
\lemma >_/= {x y : E} (y<x : x > y) : x /= y
=> \lam x=y => <-irreflexive (transport (y <) x=y y<x)
} \where {
\module Reasoning \where {
\lemma \infixr 1 >>> {P : StrictPoset} {x y z : P} => P.<∘
\lemma \infixr 1 >>= {P : StrictPoset} {x y z : P} (x<y : x < y) (y=z : y = z) => transport (x <) y=z x<y
\lemma \infixr 1 >=> {P : StrictPoset} {x y z : P} (x=y : x = y) (y<z : y < z) => transport (`< z) (inv x=y) y<z
\func \infix 2 <<< {P : StrictPoset} (x : P) {y : P} (p : x < y) => p
}
}
\func open-int {A : StrictPoset} (a b : A) : Set A
=> \lam c => \Sigma (a < c) (c < b)