{-# LANGUAGE FunctionalDependencies #-}
module FuzzySet(
FuzzySet(..),
alphaCut,
union,
unions,
intersection,
intersections,
complement,
setTnorm,
setResiduum,
) where
import Lattices.ResiduatedLattice
import Lattices.UnitIntervalStructures.Lukasiewicz
import qualified Data.List as SetOp(union, intersect)
class (ResiduatedLattice l, Eq a) => FuzzySet set a l | set -> a l where
mkFuzzySet :: (a -> l) -> [a] -> set
member :: set -> a -> l
universe :: set -> [a]
truthDegrees :: set -> [l]
truthDegrees set
set = [forall set a l. FuzzySet set a l => set -> a -> l
member set
set a
x | a
x <- forall set a l. FuzzySet set a l => set -> [a]
universe set
set]
universeCardinality :: set -> Int
universeCardinality set
s = forall (t :: * -> *) a. Foldable t => t a -> Int
length forall a b. (a -> b) -> a -> b
$ forall set a l. FuzzySet set a l => set -> [a]
universe set
s
mkEmptySet :: (FuzzySet set a l) => set
mkEmptySet :: forall set a l. FuzzySet set a l => set
mkEmptySet = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (forall a b. a -> b -> a
const forall l. BoundedLattice l => l
bot) []
mkSingletonSet :: (FuzzySet set a l, Eq a) => [a] -> (a, l) -> set
mkSingletonSet :: forall set a l. (FuzzySet set a l, Eq a) => [a] -> (a, l) -> set
mkSingletonSet [a]
u (a
x, l
l) = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet 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 :: (FuzzySet set a l, Eq a) => [a] -> set
mkUniversalSet :: forall set a l. (FuzzySet set a l, Eq a) => [a] -> set
mkUniversalSet = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (forall a b. a -> b -> a
const forall l. BoundedLattice l => l
top)
alphaCut :: (FuzzySet set a l) => l -> set -> [a]
alphaCut :: forall set a l. FuzzySet set a l => l -> set -> [a]
alphaCut l
alpha set
set = [a
x | a
x <- [a]
u, a -> l
f a
x forall a. Ord a => a -> a -> Bool
>= l
alpha]
where f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = forall set a l. FuzzySet set a l => set -> [a]
universe set
set
union :: (FuzzySet set a l) => set -> set -> set
union :: forall set a l. FuzzySet set a l => set -> set -> set
union set
set1 set
set2 = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x forall l. BoundedLattice l => l -> l -> l
\/ a -> l
g a
x) [a]
u
where f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = forall a. Eq a => [a] -> [a] -> [a]
SetOp.union (forall set a l. FuzzySet set a l => set -> [a]
universe set
set1) (forall set a l. FuzzySet set a l => set -> [a]
universe set
set2)
unions :: (FuzzySet set a l, Eq a) => [set] -> set
unions :: forall set a l. (FuzzySet set a l, Eq a) => [set] -> set
unions sets :: [set]
sets@(set
set:[set]
_) = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall set a l. FuzzySet set a l => set -> set -> set
union (forall set a l. (FuzzySet set a l, Eq a) => [a] -> set
mkUniversalSet (forall set a l. FuzzySet set a l => set -> [a]
universe set
set)) [set]
sets
intersection :: (FuzzySet set a l) => set -> set -> set
intersection :: forall set a l. FuzzySet set a l => set -> set -> set
intersection set
set1 set
set2 = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x forall l. BoundedLattice l => l -> l -> l
/\ a -> l
g a
x) [a]
u
where f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = forall a. Eq a => [a] -> [a] -> [a]
SetOp.intersect (forall set a l. FuzzySet set a l => set -> [a]
universe set
set1) (forall set a l. FuzzySet set a l => set -> [a]
universe set
set2)
intersections :: (FuzzySet set a l, Eq a) => [set] -> set
intersections :: forall set a l. (FuzzySet set a l, Eq a) => [set] -> set
intersections = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall set a l. FuzzySet set a l => set -> set -> set
intersection forall set a l. FuzzySet set a l => set
mkEmptySet
complement :: (FuzzySet set a l) => set -> set
complement :: forall set a l. FuzzySet set a l => set -> set
complement set
set = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (forall l. ResiduatedLattice l => l -> l
negation forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> l
f) (forall set a l. FuzzySet set a l => set -> [a]
universe set
set)
where f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set
setTnorm :: (FuzzySet set a l) => set -> set -> set
setTnorm :: forall set a l. FuzzySet set a l => set -> set -> set
setTnorm set
set1 set
set2 = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x forall l. ResiduatedLattice l => l -> l -> l
`tnorm` a -> l
g a
x) [a]
u
where f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = forall set a l. FuzzySet set a l => set -> [a]
universe set
set1
setResiduum :: (FuzzySet set a l) => set -> set -> set
setResiduum :: forall set a l. FuzzySet set a l => set -> set -> set
setResiduum set
set1 set
set2 = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x forall l. ResiduatedLattice l => l -> l -> l
--> a -> l
g a
x) [a]
u
where f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = forall set a l. FuzzySet set a l => set -> [a]
universe set
set1
mapMembership :: (FuzzySet set a l) => set -> (a -> a) -> set
mapMembership :: forall set a l. FuzzySet set a l => set -> (a -> a) -> set
mapMembership set
set a -> a
g = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (a -> l
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
g) [a]
u
where
u :: [a]
u = forall set a l. FuzzySet set a l => set -> [a]
universe set
set
f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set
filterMembership :: (FuzzySet set a l) => set -> (a -> Bool) -> set
filterMembership :: forall set a l. FuzzySet set a l => set -> (a -> Bool) -> set
filterMembership set
set a -> Bool
pred = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet a -> l
h [a]
u
where
h :: a -> l
h a
x = if a -> Bool
pred a
x then a -> l
f a
x else forall l. BoundedLattice l => l
bot
f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = forall set a l. FuzzySet set a l => set -> [a]
universe set
set
mapU :: (FuzzySet set a l) => set -> (a -> a) -> set
mapU :: forall set a l. FuzzySet set a l => set -> (a -> a) -> set
mapU set
set a -> a
g = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet a -> l
f [a]
u
where
f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = forall a b. (a -> b) -> [a] -> [b]
map a -> a
g (forall set a l. FuzzySet set a l => set -> [a]
universe set
set)
filterU :: (FuzzySet set a l) => set -> (a -> Bool) -> set
filterU :: forall set a l. FuzzySet set a l => set -> (a -> Bool) -> set
filterU set
set a -> Bool
pred = forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet a -> l
f [a]
u
where
f :: a -> l
f = forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
pred (forall set a l. FuzzySet set a l => set -> [a]
universe set
set)