packages feed

moonlight-pale-0.1.0.0: src-test-laws/Moonlight/Pale/Test/Laws/Algebraic.hs

{-| Predicates for algebraic, lattice, module, and action laws. -}
module Moonlight.Pale.Test.Laws.Algebraic
  ( monoidAssociativity,
    monoidLeftIdentity,
    monoidRightIdentity,
    groupLeftInverse,
    groupRightInverse,
    abelianCommutativity,
    semigroupAssociativity,
    ringAdditiveAssociativity,
    ringAdditiveCommutativity,
    ringAdditiveLeftIdentity,
    ringAdditiveRightIdentity,
    ringAdditiveLeftInverse,
    ringAdditiveRightInverse,
    ringMultiplicativeAssociativity,
    ringMultiplicativeLeftIdentity,
    ringMultiplicativeRightIdentity,
    ringDistributivityLeft,
    ringDistributivityRight,
    ringMultiplicativeCommutativity,
    latticeAbsorptionJoin,
    latticeAbsorptionMeet,
    latticeIdempotenceJoin,
    latticeIdempotenceMeet,
    latticeAssociativityJoin,
    latticeAssociativityMeet,
    latticeCommutativityJoin,
    latticeCommutativityMeet,
    distributiveLatticeJoinOverMeet,
    distributiveLatticeMeetOverJoin,
    booleanAlgebraComplementJoin,
    booleanAlgebraComplementMeet,
    idempotentLaw,
    moduleDistributivityScalar,
    moduleDistributivityVector,
    moduleCompatibility,
    moduleIdentity,
    actionAssociativity,
    actionIdentity,
  )
where

import Moonlight.Core (AdditiveGroup (..), AdditiveMonoid (..), MultiplicativeMonoid (..), Ring)

monoidAssociativity :: Eq a => (a -> a -> a) -> a -> a -> a -> Bool
monoidAssociativity op x y z = op (op x y) z == op x (op y z)

monoidLeftIdentity :: Eq a => (a -> a -> a) -> a -> a -> Bool
monoidLeftIdentity op e x = op e x == x

monoidRightIdentity :: Eq a => (a -> a -> a) -> a -> a -> Bool
monoidRightIdentity op e x = op x e == x

groupLeftInverse :: Eq a => (a -> a -> a) -> (a -> a) -> a -> a -> Bool
groupLeftInverse op inv e x = op (inv x) x == e

groupRightInverse :: Eq a => (a -> a -> a) -> (a -> a) -> a -> a -> Bool
groupRightInverse op inv e x = op x (inv x) == e

abelianCommutativity :: Eq a => (a -> a -> a) -> a -> a -> Bool
abelianCommutativity op x y = op x y == op y x

semigroupAssociativity :: Eq a => (a -> a -> a) -> a -> a -> a -> Bool
semigroupAssociativity = monoidAssociativity

ringAdditiveAssociativity :: (Eq a, AdditiveGroup a) => a -> a -> a -> Bool
ringAdditiveAssociativity x y z = add (add x y) z == add x (add y z)

ringAdditiveCommutativity :: (Eq a, AdditiveGroup a) => a -> a -> Bool
ringAdditiveCommutativity x y = add x y == add y x

ringAdditiveLeftIdentity :: (Eq a, AdditiveGroup a) => a -> Bool
ringAdditiveLeftIdentity x = add zero x == x

ringAdditiveRightIdentity :: (Eq a, AdditiveGroup a) => a -> Bool
ringAdditiveRightIdentity x = add x zero == x

ringAdditiveLeftInverse :: (Eq a, AdditiveGroup a) => a -> Bool
ringAdditiveLeftInverse x = add (neg x) x == zero

ringAdditiveRightInverse :: (Eq a, AdditiveGroup a) => a -> Bool
ringAdditiveRightInverse x = add x (neg x) == zero

ringMultiplicativeAssociativity :: (Eq a, MultiplicativeMonoid a) => a -> a -> a -> Bool
ringMultiplicativeAssociativity x y z = mul (mul x y) z == mul x (mul y z)

ringMultiplicativeLeftIdentity :: (Eq a, MultiplicativeMonoid a) => a -> Bool
ringMultiplicativeLeftIdentity x = mul one x == x

ringMultiplicativeRightIdentity :: (Eq a, MultiplicativeMonoid a) => a -> Bool
ringMultiplicativeRightIdentity x = mul x one == x

ringDistributivityLeft :: (Eq a, Ring a) => a -> a -> a -> Bool
ringDistributivityLeft x y z = mul x (add y z) == add (mul x y) (mul x z)

ringDistributivityRight :: (Eq a, Ring a) => a -> a -> a -> Bool
ringDistributivityRight x y z = mul (add x y) z == add (mul x z) (mul y z)

ringMultiplicativeCommutativity :: (Eq a, MultiplicativeMonoid a) => a -> a -> Bool
ringMultiplicativeCommutativity x y = mul x y == mul y x

latticeAbsorptionJoin :: Eq a => (a -> a -> a) -> (a -> a -> a) -> a -> a -> Bool
latticeAbsorptionJoin ljoin lmeet x y = ljoin x (lmeet x y) == x

latticeAbsorptionMeet :: Eq a => (a -> a -> a) -> (a -> a -> a) -> a -> a -> Bool
latticeAbsorptionMeet ljoin lmeet x y = lmeet x (ljoin x y) == x

latticeIdempotenceJoin :: Eq a => (a -> a -> a) -> a -> Bool
latticeIdempotenceJoin ljoin x = ljoin x x == x

latticeIdempotenceMeet :: Eq a => (a -> a -> a) -> a -> Bool
latticeIdempotenceMeet lmeet x = lmeet x x == x

latticeAssociativityJoin :: Eq a => (a -> a -> a) -> a -> a -> a -> Bool
latticeAssociativityJoin ljoin x y z = ljoin (ljoin x y) z == ljoin x (ljoin y z)

latticeAssociativityMeet :: Eq a => (a -> a -> a) -> a -> a -> a -> Bool
latticeAssociativityMeet lmeet x y z = lmeet (lmeet x y) z == lmeet x (lmeet y z)

latticeCommutativityJoin :: Eq a => (a -> a -> a) -> a -> a -> Bool
latticeCommutativityJoin ljoin x y = ljoin x y == ljoin y x

latticeCommutativityMeet :: Eq a => (a -> a -> a) -> a -> a -> Bool
latticeCommutativityMeet lmeet x y = lmeet x y == lmeet y x

distributiveLatticeJoinOverMeet :: Eq a => (a -> a -> a) -> (a -> a -> a) -> a -> a -> a -> Bool
distributiveLatticeJoinOverMeet ljoin lmeet x y z =
  ljoin x (lmeet y z) == lmeet (ljoin x y) (ljoin x z)

distributiveLatticeMeetOverJoin :: Eq a => (a -> a -> a) -> (a -> a -> a) -> a -> a -> a -> Bool
distributiveLatticeMeetOverJoin ljoin lmeet x y z =
  lmeet x (ljoin y z) == ljoin (lmeet x y) (lmeet x z)

booleanAlgebraComplementJoin :: Eq a => (a -> a -> a) -> (a -> a) -> a -> a -> Bool
booleanAlgebraComplementJoin ljoin compl topElement x =
  ljoin x (compl x) == topElement

booleanAlgebraComplementMeet :: Eq a => (a -> a -> a) -> (a -> a) -> a -> a -> Bool
booleanAlgebraComplementMeet lmeet compl bottomElement x =
  lmeet x (compl x) == bottomElement

idempotentLaw :: Eq a => (a -> a) -> a -> Bool
idempotentLaw f x = f (f x) == f x

moduleDistributivityScalar ::
  (Eq m) =>
  (r -> r -> r) ->
  (m -> m -> m) ->
  (r -> m -> m) ->
  r ->
  r ->
  m ->
  Bool
moduleDistributivityScalar rAdd mAdd mScale r s x =
  mScale (rAdd r s) x == mAdd (mScale r x) (mScale s x)

moduleDistributivityVector ::
  (Eq m) =>
  (m -> m -> m) ->
  (r -> m -> m) ->
  r ->
  m ->
  m ->
  Bool
moduleDistributivityVector mAdd mScale r x y =
  mScale r (mAdd x y) == mAdd (mScale r x) (mScale r y)

moduleCompatibility ::
  (Eq m) =>
  (r -> r -> r) ->
  (r -> m -> m) ->
  r ->
  r ->
  m ->
  Bool
moduleCompatibility rMul mScale r s x =
  mScale (rMul r s) x == mScale r (mScale s x)

moduleIdentity :: (Eq m) => r -> (r -> m -> m) -> m -> Bool
moduleIdentity rOne mScale x = mScale rOne x == x

actionAssociativity ::
  (Eq s) =>
  (m -> m -> m) ->
  (m -> s -> s) ->
  m ->
  m ->
  s ->
  Bool
actionAssociativity mOp mAct g h x =
  mAct (mOp g h) x == mAct g (mAct h x)

actionIdentity :: (Eq s) => m -> (m -> s -> s) -> s -> Bool
actionIdentity e mAct x = mAct e x == x