\import Logic
\import Logic.Meta
\import Operations
\import Order.PartialOrder
\class DirectedSet \extends Preorder
| isInhabitted : ∃ E
| isDirected (x y : E) : ∃ (z : E) (x <= z) (y <= z)
\instance ProductDirectedSet (X Y : DirectedSet) : DirectedSet (\Sigma X Y)
| Preorder => ProductPreorder X Y
| isInhabitted => \case X.isInhabitted, Y.isInhabitted \with {
| inP x, inP y => inP (x,y)
}
| isDirected s t => \case isDirected s.1 t.1, isDirected s.2 t.2 \with {
| inP (x,p,q), inP (y,p',q') => inP ((x,y), (p,p'), (q,q'))
}
\instance DirectedSetHasProduct : HasProduct DirectedSet
| Product => ProductDirectedSet