{-# 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 = [set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set a
x | a
x <- set -> [a]
forall set a l. FuzzySet set a l => set -> [a]
universe set
set]
universeCardinality :: set -> Int
universeCardinality set
s = [a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([a] -> Int) -> [a] -> Int
forall a b. (a -> b) -> a -> b
$ set -> [a]
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (l -> a -> l
forall a b. a -> b -> a
const l
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) = (a -> l) -> [a] -> set
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 a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
x = l
l
| Bool
otherwise = l
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (l -> a -> l
forall a b. a -> b -> a
const l
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 l -> l -> Bool
forall a. Ord a => a -> a -> Bool
>= l
alpha]
where f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = set -> [a]
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x l -> l -> l
forall l. BoundedLattice l => l -> l -> l
\/ a -> l
g a
x) [a]
u
where f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = [a] -> [a] -> [a]
forall a. Eq a => [a] -> [a] -> [a]
SetOp.union (set -> [a]
forall set a l. FuzzySet set a l => set -> [a]
universe set
set1) (set -> [a]
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]
_) = (set -> set -> set) -> set -> [set] -> set
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr set -> set -> set
forall set a l. FuzzySet set a l => set -> set -> set
union ([a] -> set
forall set a l. (FuzzySet set a l, Eq a) => [a] -> set
mkUniversalSet (set -> [a]
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x l -> l -> l
forall l. BoundedLattice l => l -> l -> l
/\ a -> l
g a
x) [a]
u
where f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = [a] -> [a] -> [a]
forall a. Eq a => [a] -> [a] -> [a]
SetOp.intersect (set -> [a]
forall set a l. FuzzySet set a l => set -> [a]
universe set
set1) (set -> [a]
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 = (set -> set -> set) -> set -> [set] -> set
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr set -> set -> set
forall set a l. FuzzySet set a l => set -> set -> set
intersection set
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (l -> l
forall l. ResiduatedLattice l => l -> l
negation (l -> l) -> (a -> l) -> a -> l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> l
f) (set -> [a]
forall set a l. FuzzySet set a l => set -> [a]
universe set
set)
where f :: a -> l
f = set -> a -> l
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x l -> l -> l
forall l. ResiduatedLattice l => l -> l -> l
`tnorm` a -> l
g a
x) [a]
u
where f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = set -> [a]
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (\a
x -> a -> l
f a
x l -> l -> l
forall l. ResiduatedLattice l => l -> l -> l
--> a -> l
g a
x) [a]
u
where f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set1
g :: a -> l
g = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set2
u :: [a]
u = set -> [a]
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet (a -> l
f (a -> l) -> (a -> a) -> a -> l
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
g) [a]
u
where
u :: [a]
u = set -> [a]
forall set a l. FuzzySet set a l => set -> [a]
universe set
set
f :: a -> l
f = set -> a -> l
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 = (a -> l) -> [a] -> set
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 l
forall l. BoundedLattice l => l
bot
f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = set -> [a]
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet a -> l
f [a]
u
where
f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = (a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map a -> a
g (set -> [a]
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 = (a -> l) -> [a] -> set
forall set a l. FuzzySet set a l => (a -> l) -> [a] -> set
mkFuzzySet a -> l
f [a]
u
where
f :: a -> l
f = set -> a -> l
forall set a l. FuzzySet set a l => set -> a -> l
member set
set
u :: [a]
u = (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
pred (set -> [a]
forall set a l. FuzzySet set a l => set -> [a]
universe set
set)