on master help sign in
Added domain and range functions.
0856f03Armando Santos
src/LAoP/Relation/Internal.hs+27−5
@@ -89,6 +89,8 @@ module LAoP.Relation.Internal
89 injection,
89 injection,
90 surjection,
90 surjection,
91 bijection,
91 bijection,
92+ domain,
93+ range,
92
94
93 -- * Function division
95 -- * Function division
94 divisionF,
96 divisionF,
@@ -133,6 +135,7 @@ module LAoP.Relation.Internal
133 linearOrder,
135 linearOrder,
134 equivalence,
136 equivalence,
135 partialEquivalence,
137 partialEquivalence,
138+ difunctional,
136
139
137 -- * Conditionals
140 -- * Conditionals
138 equalizer,
141 equalizer,
@@ -606,26 +609,31 @@ irreflexive r = (r `intersection` identity) == zeros
606connected :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
609connected :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
607connected r = (r `union` conv r) == ones
610connected r = (r `union` conv r) == ones
608
611
609−-- | A 'Relation @r@ is a preorder iff @'reflexive' r && 'transitive' r@
612+-- | A 'Relation' @r@ is a preorder iff @'reflexive' r && 'transitive' r@
610preorder :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
613preorder :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
611preorder r = reflexive r && transitive r
614preorder r = reflexive r && transitive r
612
615
613−-- | A 'Relation @r@ is a partial order iff @'antiSymmetric' r && 'preorder' r@
616+-- | A 'Relation' @r@ is a partial order iff @'antiSymmetric' r && 'preorder' r@
614partialOrder :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
617partialOrder :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
615partialOrder r = antiSymmetric r && preorder r
618partialOrder r = antiSymmetric r && preorder r
616
619
617−-- | A 'Relation @r@ is a linear order iff @'connected' r && 'partialOrder' r@
620+-- | A 'Relation' @r@ is a linear order iff @'connected' r && 'partialOrder' r@
618linearOrder :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
621linearOrder :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
619linearOrder r = connected r && partialOrder r
622linearOrder r = connected r && partialOrder r
620
623
621−-- | A 'Relation @r@ is an equivalence iff @'symmetric' r && 'preorder' r@
624+-- | A 'Relation' @r@ is an equivalence iff @'symmetric' r && 'preorder' r@
622equivalence :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
625equivalence :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
623equivalence r = symmetric r && preorder r
626equivalence r = symmetric r && preorder r
624
627
625−-- | A 'Relation @r@ is a partial equivalence iff @'partialOrder' r && 'equivalence' r@
628+-- | A 'Relation' @r@ is a partial equivalence iff @'partialOrder' r && 'equivalence' r@
626partialEquivalence :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
629partialEquivalence :: (KnownNat (I.Count (I.Normalize a)), I.FromLists Boolean (I.Normalize a) (I.Normalize a)) => Relation a a -> Bool
627partialEquivalence r = partialOrder r && equivalence r
630partialEquivalence r = partialOrder r && equivalence r
628
631
632+-- | A 'Relation' @r@ is 'difunctional' or regular wherever @r `comp`
633+-- 'conv' r `comp` r == r@
634+difunctional :: Relation a b -> Bool
635+difunctional r = r `comp` conv r `comp` r == r
636+
629-- Relational pairing
637-- Relational pairing
630
638
631-- | Relational pairing.
639-- | Relational pairing.
@@ -828,6 +836,20 @@ cond ::
828 => (b -> Bool) -> Relation b c -> Relation b c -> Relation b c
836 => (b -> Bool) -> Relation b c -> Relation b c -> Relation b c
829cond p r s = eitherR r s `comp` guard p
837cond p r s = eitherR r s `comp` guard p
830
838
839+-- | Relational domain.
840+domain ::
841+ ( KnownNat (I.Count (I.Normalize a)),
842+ I.FromLists Boolean (I.Normalize a) (I.Normalize a)
843+ ) => Relation a b -> Relation a a
844+domain r = ker r `intersection` identity
845+
846+-- | Relational range.
847+range ::
848+ ( I.FromLists Boolean (I.Normalize b) (I.Normalize b),
849+ KnownNat (I.Count (I.Normalize b))
850+ ) => Relation a b -> Relation b b
851+range r = img r `intersection` identity
852+
831-- Relation pretty print
853-- Relation pretty print
832
854
833-- | Relation pretty printing
855-- | Relation pretty printing