{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Fuzzy.Sets.LSet(
LSet(LSet),
FuzzySet(member, universe),
fromPairs,
fromFunction,
toPairs,
mkEmptySet,
mkSingletonSet,
mkUniversalSet
) where
import Lattices.UnitInterval
import Lattices.ResiduatedLattice
import FuzzySet
import Data.Maybe(fromMaybe)
data (ResiduatedLattice l) => LSet a l = LSet
{
forall a l. ResiduatedLattice l => LSet a l -> a -> l
membership :: a -> l
, forall a l. ResiduatedLattice l => LSet a l -> [a]
universe :: ![a]
}
instance (Eq a, Show a, Show l, ResiduatedLattice l) => Show (LSet a l) where
show :: LSet a l -> String
show :: LSet a l -> String
show LSet a l
set = String
"FuzzySet { " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show (forall l a. (ResiduatedLattice l, Eq a) => LSet a l -> [(a, l)]
toPairs LSet a l
set) forall a. [a] -> [a] -> [a]
++ String
" }"
instance (ResiduatedLattice l, Eq a) => FuzzySet (LSet a l) a l where
member :: LSet a l -> a -> l
member :: LSet a l -> a -> l
member (LSet a -> l
f [a]
_) = a -> l
f
universe :: LSet a l -> [a]
universe :: LSet a l -> [a]
universe (LSet a -> l
_ [a]
u) = [a]
u
mkFuzzySet :: (a -> l) -> [a] -> LSet a l
mkFuzzySet :: (a -> l) -> [a] -> LSet a l
mkFuzzySet = forall a l. (a -> l) -> [a] -> LSet a l
LSet
fromPairs :: (ResiduatedLattice l, Eq a) => [(a, l)] -> LSet a l
fromPairs :: forall l a. (ResiduatedLattice l, Eq a) => [(a, l)] -> LSet a l
fromPairs [(a, l)]
xs = forall a l. (a -> l) -> [a] -> LSet a l
LSet a -> l
f [a]
u
where
f :: a -> l
f a
x = forall a. a -> Maybe a -> a
fromMaybe forall l. BoundedLattice l => l
bot (forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup a
x [(a, l)]
xs)
u :: [a]
u = forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(a, l)]
xs
fromFunction :: (ResiduatedLattice l) => (a -> l) -> [a] -> LSet a l
fromFunction :: forall l a. ResiduatedLattice l => (a -> l) -> [a] -> LSet a l
fromFunction = forall a l. (a -> l) -> [a] -> LSet a l
LSet
toPairs :: (ResiduatedLattice l, Eq a) => LSet a l -> [(a, l)]
toPairs :: forall l a. (ResiduatedLattice l, Eq a) => LSet a l -> [(a, l)]
toPairs (LSet a -> l
f [a]
universe) = [(a
u, a -> l
f a
u) | a
u <- [a]
universe]
mkEmptySet :: (ResiduatedLattice l) => LSet a l
mkEmptySet :: forall l a. ResiduatedLattice l => LSet a l
mkEmptySet = forall a l. (a -> l) -> [a] -> LSet a l
LSet (forall a b. a -> b -> a
const forall l. BoundedLattice l => l
bot) []
mkSingletonSet :: (ResiduatedLattice l, Eq a) => [a] -> (a, l) -> LSet a l
mkSingletonSet :: forall l a.
(ResiduatedLattice l, Eq a) =>
[a] -> (a, l) -> LSet a l
mkSingletonSet [a]
u (a
x, l
l) = forall a l. (a -> l) -> [a] -> LSet a l
LSet a -> l
f [a]
u
where
f :: a -> l
f a
y
| a
y forall a. Eq a => a -> a -> Bool
== a
x = l
l
| Bool
otherwise = forall l. BoundedLattice l => l
bot
mkUniversalSet :: (ResiduatedLattice l, Eq a) => [a] -> LSet a l
mkUniversalSet :: forall l a. (ResiduatedLattice l, Eq a) => [a] -> LSet a l
mkUniversalSet = forall a l. (a -> l) -> [a] -> LSet a l
LSet (forall a b. a -> b -> a
const forall l. BoundedLattice l => l
top)