-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | L-Fuzzy Set Theory implementation in Haskell -- -- If X is a collection of objects denoted generically by x, then a fuzzy -- set F(A) in X is a set of ordered pairs. Each of them consists of an -- element x and a membership function which maps x to the membership -- space M. The current implementation is inspired by the work of Goguen, -- Joseph A. "L-fuzzy sets." Journal of mathematical analysis and -- applications 18.1 (1967). @package lfst @version 1.0.0 -- | Membership types for the Fuzzy Set definition module Membership -- | Membership value between 0 and 1 with Godel join and meet operators newtype GodelMembership Godel :: Double -> GodelMembership -- | Membership value between 0 and 1 with Goguen join and meet operators newtype GoguenMembership Goguen :: Double -> GoguenMembership -- | Membership value between 0 and 1 with Lukasiewicz join and meet -- operators newtype LukasiewiczMembership Lukas :: Double -> LukasiewiczMembership instance GHC.Num.Num Membership.LukasiewiczMembership instance GHC.Classes.Ord Membership.LukasiewiczMembership instance GHC.Classes.Eq Membership.LukasiewiczMembership instance GHC.Show.Show Membership.LukasiewiczMembership instance GHC.Num.Num Membership.GoguenMembership instance GHC.Classes.Ord Membership.GoguenMembership instance GHC.Classes.Eq Membership.GoguenMembership instance GHC.Show.Show Membership.GoguenMembership instance GHC.Num.Num Membership.GodelMembership instance GHC.Classes.Ord Membership.GodelMembership instance GHC.Classes.Eq Membership.GodelMembership instance GHC.Show.Show Membership.GodelMembership instance Algebra.Lattice.JoinSemiLattice Membership.GodelMembership instance Algebra.Lattice.MeetSemiLattice Membership.GodelMembership instance Algebra.Lattice.Lattice Membership.GodelMembership instance Algebra.Lattice.BoundedJoinSemiLattice Membership.GodelMembership instance Algebra.Lattice.BoundedMeetSemiLattice Membership.GodelMembership instance Algebra.Lattice.BoundedLattice Membership.GodelMembership instance Algebra.Lattice.JoinSemiLattice Membership.GoguenMembership instance Algebra.Lattice.MeetSemiLattice Membership.GoguenMembership instance Algebra.Lattice.Lattice Membership.GoguenMembership instance Algebra.Lattice.BoundedJoinSemiLattice Membership.GoguenMembership instance Algebra.Lattice.BoundedMeetSemiLattice Membership.GoguenMembership instance Algebra.Lattice.BoundedLattice Membership.GoguenMembership instance Algebra.Lattice.JoinSemiLattice Membership.LukasiewiczMembership instance Algebra.Lattice.MeetSemiLattice Membership.LukasiewiczMembership instance Algebra.Lattice.Lattice Membership.LukasiewiczMembership instance Algebra.Lattice.BoundedJoinSemiLattice Membership.LukasiewiczMembership instance Algebra.Lattice.BoundedMeetSemiLattice Membership.LukasiewiczMembership instance Algebra.Lattice.BoundedLattice Membership.LukasiewiczMembership -- | If X is a collection of objects denoted generically by x, then a fuzzy -- set F(A) in X is a set of ordered pairs. Each of them consists of an -- element x and a membership function which maps x to the membership -- space M. module FuzzySet -- | FuzzySet type definition newtype FuzzySet m i FS :: (Map i m) -> FuzzySet m i -- | Returns the preimage of the given set in input prop> preimage (^2) -- 25 [1..5] == [5] preimage :: (Eq i, Eq j) => (i -> j) -> j -> [i] -> [i] -- | Returns an empty fuzzy set empty :: (Ord i, BoundedLattice m) => FuzzySet m i -- | Inserts a new pair (i, m) to the fuzzy set prop> add godel1 (i, -- L.bottom) == godel1 prop> add goguen1 (i, L.bottom) == goguen1 -- prop> add lukas1 (i, L.bottom) == lukas1 add :: (Ord i, Eq m, BoundedLattice m) => FuzzySet m i -> (i, m) -> FuzzySet m i -- | Returns the fuzzy set's support prop> support godel1 == [1, 2] -- prop> support goguen1 == [1, 2] prop> support lukas1 == [1, 2] support :: (Ord i, BoundedLattice m) => FuzzySet m i -> [i] -- | Returns the element i's membership if i belongs to the support returns -- its membership, otherwise returns bottom lattice value prop> mu -- godel1 1 == Godel 0.2 prop> mu godel1 10 == L.bottom prop> mu -- goguen1 1 == Goguen 0.2 prop> mu goguen1 10 == L.bottom prop> mu -- lukas1 1 == Lukas 0.2 prop> mu lukas1 10 == L.bottom mu :: (Ord i, BoundedLattice m) => FuzzySet m i -> i -> m -- | Returns the crisp subset of given fuzzy set consisting of all elements -- with membership equals to one prop> core (fromList [(-1, Godel -- 0.5), (0, Godel 0.8), (1, Godel 1.0), (2, Godel 0.4)]) == [1] prop> -- core (fromList [(-1, Goguen 0.5), (0, Goguen 0.8), (1, Goguen 1.0), -- (2, Goguen 0.4)]) == [1] prop> core (fromList [(-1, Lukas 0.5), (0, -- Lukas 0.8), (1, Lukas 1.0), (2, Lukas 0.4)]) == [1] core :: (Ord i, Eq m, BoundedLattice m) => FuzzySet m i -> [i] -- | Returns those elements whose memberships are greater or equal than the -- given alpha prop> alphaCut (fromList [(-1, Godel 0.5), (0, Godel -- 0.8), (1, Godel 1.0), (2, Godel 0.4)]) (Godel 0.5) == [-1, 0, 1] -- prop> alphaCut (fromList [(-1, Goguen 0.5), (0, Goguen 0.8), (1, -- Goguen 1.0), (2, Goguen 0.4)]) (Goguen 0.5) == [-1, 0, 1] prop> -- alphaCut (fromList [(-1, Lukas 0.5), (0, Lukas 0.8), (1, Lukas 1.0), -- (2, Lukas 0.4)]) (Lukas 0.5) == [-1, 0, 1] alphaCut :: (Ord i, Ord m, BoundedLattice m) => FuzzySet m i -> m -> [i] -- | Builds a fuzzy set from a list of pairs prop> fromList [(1, Godel -- 0.2)] == add empty (1, Godel 0.2) prop> fromList [(1, Goguen 0.2)] -- == add empty (1, Goguen 0.2) prop> fromList [(1, Lukas 0.2)] == add -- empty (1, Lukas 0.2) fromList :: (Ord i, Eq m, BoundedLattice m) => [(i, m)] -> FuzzySet m i -- | Applies a unary function to the specified fuzzy set prop> map1 (*2) -- godel1 == fromList [(1, Godel 0.4), (2, Godel 1.0)] prop> map1 (*2) -- goguen1 == fromList [(1, Goguen 0.4), (2, Goguen 1.0)] prop> map1 -- (*2) lukas1 == fromList [(1, Lukas 0.4), (2, Lukas 1.0)] map1 :: (Ord i, Eq m, BoundedLattice m) => (m -> m) -> FuzzySet m i -> FuzzySet m i -- | Applies a binary function to the two specified fuzzy sets prop> -- map2 (+) godel1 godel2 == fromList [(1, Godel 0.2), (2, Godel 0.7), -- (3, Godel 0.2)] prop> map2 (+) goguen1 goguen2 == fromList [(1, -- Goguen 0.2), (2, Goguen 0.7), (3, Goguen 0.2)] prop> map2 (+) -- lukas1 lukas2 == fromList [(1, Lukas 0.2), (2, Lukas 0.7), (3, Lukas -- 0.2)] map2 :: (Ord i, Eq m, BoundedLattice m) => (m -> m -> m) -> FuzzySet m i -> FuzzySet m i -> FuzzySet m i -- | Returns the union between the two specified fuzzy sets prop> union -- godel1 godel2 == fromList [(1, Godel 0.2), (2, Godel 0.5), (3, Godel -- 0.2)] prop> union goguen1 goguen2 == fromList [(1, Goguen 0.2), (2, -- Goguen 0.6), (3, Goguen 0.2)] prop> union lukas1 lukas2 == fromList -- [(1, Lukas 0.2), (2, Lukas 0.7), (3, Lukas 0.2)] union :: (Ord i, Eq m, BoundedLattice m) => FuzzySet m i -> FuzzySet m i -> FuzzySet m i -- | Returns the intersection between the two specified fuzzy sets prop> -- intersection godel1 godel2 == fromList [(2, Godel 0.2)] prop> -- intersection goguen1 goguen2 == fromList [(2, Goguen 0.1)] prop> -- intersection lukas1 lukas2 == empty intersection :: (Ord i, Eq m, BoundedLattice m) => FuzzySet m i -> FuzzySet m i -> FuzzySet m i -- | Returns the complement of the specified fuzzy set prop> complement -- godel1 == fromList [(1, Godel 0.8), (2, Godel 0.5)] prop> -- complement goguen1 == fromList [(1, Goguen 0.8), (2, Goguen 0.5)] -- prop> complement lukas1 == fromList [(1, Lukas 0.8), (2, Lukas -- 0.5)] complement :: (Ord i, Num m, Eq m, BoundedLattice m) => FuzzySet m i -> FuzzySet m i -- | Returns the algebraic sum between the two specified fuzzy sets -- prop> algebraicSum godel1 godel2 == fromList [(1, Godel 0.2), (2, -- Godel 0.7), (3, Godel 0.2)] prop> algebraicSum goguen1 goguen2 == -- fromList [(1, Goguen 0.2), (2, Goguen 0.7), (3, Goguen 0.2)] prop> -- algebraicSum lukas1 lukas2 == fromList [(1, Lukas 0.2), (2, Lukas -- 0.7), (3, Lukas 0.2)] algebraicSum :: (Ord i, Eq m, Num m, BoundedLattice m) => FuzzySet m i -> FuzzySet m i -> FuzzySet m i -- | Returns the algebraic product between the two specified fuzzy sets -- prop> algebraicProduct godel1 godel2 == fromList [(2, Godel 0.1)] -- prop> algebraicProduct goguen1 goguen2 == fromList [(2, Goguen -- 0.1)] prop> algebraicProduct lukas1 lukas2 == fromList [(2, Lukas -- 0.1)] algebraicProduct :: (Ord i, Eq m, Num m, BoundedLattice m) => FuzzySet m i -> FuzzySet m i -> FuzzySet m i -- | Returns the cartesian product between two fuzzy sets using the -- specified function prop> generalizedProduct (+) godel1 godel2 == -- fromList [((1, 2), Godel 0.4), ((1, 3), Godel 0.4), ((2, 2), Godel -- 0.7), ((2, 3), Godel 0.7)] prop> generalizedProduct (+) goguen1 -- goguen2 == fromList [((1, 2), Goguen 0.4), ((1, 3), Goguen 0.4), ((2, -- 2), Goguen 0.7), ((2, 3), Goguen 0.7)] prop> generalizedProduct (+) -- lukas1 lukas2 == fromList [((1, 2), Lukas 0.4), ((1, 3), Lukas 0.4), -- ((2, 2), Lukas 0.7), ((2, 3), Lukas 0.7)] generalizedProduct :: (Ord i, Ord j, Eq m, BoundedLattice m) => (m -> m -> m) -> FuzzySet m i -> FuzzySet m j -> FuzzySet m (i, j) -- | Defines a mapping between sub-categories preserving morphisms class ExoFunctor f i where type family SubCatConstraintI f i :: Constraint type family SubCatConstraintJ f j :: Constraint SubCatConstraintI f i = () SubCatConstraintJ f j = () fmap :: (ExoFunctor f i, SubCatConstraintI f i, SubCatConstraintJ f j) => (i -> j) -> f i -> f j instance (GHC.Classes.Ord m, GHC.Classes.Ord i) => GHC.Classes.Ord (FuzzySet.FuzzySet m i) instance (GHC.Classes.Eq m, GHC.Classes.Eq i) => GHC.Classes.Eq (FuzzySet.FuzzySet m i) instance (GHC.Classes.Ord i, Algebra.Lattice.BoundedLattice m, GHC.Show.Show i, GHC.Show.Show m) => GHC.Show.Show (FuzzySet.FuzzySet m i) instance (Algebra.Lattice.BoundedLattice m, GHC.Classes.Eq m) => FuzzySet.ExoFunctor (FuzzySet.FuzzySet m) i