{-# LANGUAGE RebindableSyntax #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module NumHask.Algebra.Quantale
( Quantale,
Residuated (..),
StarAutonomous (..),
)
where
import Data.Bool (Bool (..))
import Data.Set (Set)
import Data.Set qualified as Set
import NumHask.Algebra.Lattice (CompleteJoinSemiLattice (..))
import NumHask.Algebra.Multiplicative (Multiplicative (..))
import NumHask.Free.Carriers (MinPlus (..), Warshall (..))
import Prelude qualified as P
class (CompleteJoinSemiLattice a, Multiplicative a) => Quantale a
class (Quantale a) => Residuated a where
{-# MINIMAL lres, rres #-}
lres :: a -> a -> a
rres :: a -> a -> a
class (Quantale a) => StarAutonomous a where
{-# MINIMAL neg #-}
neg :: a -> a
par :: a -> a -> a
par a
a a
b = a -> a
forall a. StarAutonomous a => a -> a
neg (a -> a
forall a. StarAutonomous a => a -> a
neg a
a a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a -> a
forall a. StarAutonomous a => a -> a
neg a
b)
bot :: a
bot = a -> a
forall a. StarAutonomous a => a -> a
neg a
forall a. Multiplicative a => a
one
instance Quantale Bool
instance Residuated Bool where
lres :: Bool -> Bool -> Bool
lres Bool
a Bool
b = Bool -> Bool
P.not Bool
a Bool -> Bool -> Bool
P.|| Bool
b
rres :: Bool -> Bool -> Bool
rres = Bool -> Bool -> Bool
forall a. Residuated a => a -> a -> a
lres
instance StarAutonomous Bool where
neg :: Bool -> Bool
neg = Bool -> Bool
P.not
par :: Bool -> Bool -> Bool
par = Bool -> Bool -> Bool
(P.||)
bot :: Bool
bot = Bool
False
instance Quantale Warshall
instance Residuated Warshall where
lres :: Warshall -> Warshall -> Warshall
lres (Warshall Bool
a) (Warshall Bool
b) = Bool -> Warshall
Warshall (Bool -> Bool
P.not Bool
a Bool -> Bool -> Bool
P.|| Bool
b)
rres :: Warshall -> Warshall -> Warshall
rres = Warshall -> Warshall -> Warshall
forall a. Residuated a => a -> a -> a
lres
instance StarAutonomous Warshall where
neg :: Warshall -> Warshall
neg (Warshall Bool
a) = Bool -> Warshall
Warshall (Bool -> Bool
P.not Bool
a)
par :: Warshall -> Warshall -> Warshall
par (Warshall Bool
a) (Warshall Bool
b) = Bool -> Warshall
Warshall (Bool
a Bool -> Bool -> Bool
P.|| Bool
b)
bot :: Warshall
bot = Bool -> Warshall
Warshall Bool
P.False
instance Quantale (MinPlus P.Double)
instance Residuated (MinPlus P.Double) where
lres :: MinPlus Double -> MinPlus Double -> MinPlus Double
lres (MinPlus Double
a) (MinPlus Double
b) = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus (Double
b Double -> Double -> Double
forall a. Num a => a -> a -> a
P.- Double
a)
rres :: MinPlus Double -> MinPlus Double -> MinPlus Double
rres = MinPlus Double -> MinPlus Double -> MinPlus Double
forall a. Residuated a => a -> a -> a
lres
instance StarAutonomous (MinPlus P.Double) where
neg :: MinPlus Double -> MinPlus Double
neg (MinPlus Double
a) = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus (Double -> Double
forall a. Num a => a -> a
P.negate Double
a)
par :: MinPlus Double -> MinPlus Double -> MinPlus Double
par (MinPlus Double
a) (MinPlus Double
b) = Double -> MinPlus Double
forall a. a -> MinPlus a
MinPlus (Double
a Double -> Double -> Double
forall a. Num a => a -> a -> a
P.+ Double
b)
bot :: MinPlus Double
bot = MinPlus Double -> MinPlus Double
forall a. StarAutonomous a => a -> a
neg MinPlus Double
forall a. Multiplicative a => a
one
instance (P.Ord a, Multiplicative a) => Multiplicative (Set a) where
one :: Set a
one = a -> Set a
forall a. a -> Set a
Set.singleton a
forall a. Multiplicative a => a
one
Set a
s * :: Set a -> Set a -> Set a
* Set a
t = [a] -> Set a
forall a. Ord a => [a] -> Set a
Set.fromList [a
x a -> a -> a
forall a. Multiplicative a => a -> a -> a
* a
y | a
x <- Set a -> [a]
forall a. Set a -> [a]
Set.toList Set a
s, a
y <- Set a -> [a]
forall a. Set a -> [a]
Set.toList Set a
t]
instance (P.Ord a, Multiplicative a) => Quantale (Set a)