packages feed

AERN-Basics-2011.1: src/Numeric/AERN/Basics/Laws/Operation.hs

{-|
    Module      :  Numeric.AERN.Basics.Laws.Relation
    Description :  common properties of binary operations 
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable
    
    Common properties of binary operations.
-}
module Numeric.AERN.Basics.Laws.Operation
(
    idempotent, commutative, associative, 
    partialIdempotent, partialCommutative, partialAssociative, 
    modular, leftDistributive,  rightDistributive
)
where

import Numeric.AERN.Basics.Laws.Utilities

--import qualified Algebra.Laws as NP -- numeric-prelude

idempotent :: (Rel t) -> (Op t) -> t -> Bool
idempotent (==) (*) e = 
    (e * e) == e
    
commutative :: (Rel t) -> (Op t) -> t -> t -> Bool
commutative (==) (*) e1 e2 = 
    (e1 * e2) == (e2 * e1)

associative :: (Rel t) -> (Op t) -> t -> t -> t -> Bool
associative (==) (*) e1 e2 e3 = 
    ((e1 * e2) * e3) == (e1 * (e2 * e3))

modular :: (Rel t) -> (Op t) -> (Op t) -> t -> t -> t -> Bool
modular (==) (/\) (\/) e1 e2 e3 =
    ((e1 /\ e3) \/ (e2 /\ e3)) == (((e1 /\ e3) \/ e2) /\ e3)

leftDistributive :: (Rel t) -> (Op t) -> (Op t) -> t -> t -> t -> Bool
leftDistributive (==) (/\) (\/) e1 e2 e3 =
    (e1 \/ (e2 /\ e3)) == ((e1 \/ e2) /\ (e1 \/ e3))

rightDistributive :: (Rel t) -> (Op t) -> (Op t) -> t -> t -> t -> Bool
rightDistributive (==) (/\) (\/) e1 e2 e3 =
    ((e2 /\ e3) \/ e1) == ((e2 \/ e1) /\ (e3 \/ e1))

partialIdempotent :: (Rel t) -> (PartOp t) -> t -> Bool
partialIdempotent (==) (*?) e = 
    case e *? e of 
        Just r -> r == e
        _ -> True

partialCommutative :: (Rel t) -> (PartOp t) -> t -> t -> Bool
partialCommutative (==) (*?) e1 e2 = 
    case (e1 *? e2, e2 *? e1) of 
        (Just e12, Just e21) -> e12 == e21 
        _ -> True

partialAssociative :: (Rel t) -> (PartOp t) -> t -> t -> t -> Bool
partialAssociative (==) (*?) e1 e2 e3 = 
    case (e1 *? e2, e2 *? e3) of 
        (Just e12, Just e23) -> 
            case (e12 *? e3, e1 *? e23) of
                (Just eLR, Just eRL) -> eLR == eRL 
                _ -> True
        _ -> True