packages feed

ideas-0.6: src/Domain/Math/Expr/Symbols.hs

-----------------------------------------------------------------------------
-- Copyright 2010, Open Universiteit Nederland. This file is distributed 
-- under the terms of the GNU General Public License. For more information, 
-- see the file "LICENSE.txt", which is included in the distribution.
-----------------------------------------------------------------------------
-- |
-- Maintainer  :  bastiaan.heeren@ou.nl
-- Stability   :  provisional
-- Portability :  portable (depends on ghc)
--
-- Exports relevant OpenMath symbols, converted to the 
-- Symbol data type from @Common.Rewriting@.
--
-----------------------------------------------------------------------------
module Domain.Math.Expr.Symbols where

import Control.Monad
import Domain.Math.Expr.Symbolic
import Domain.Math.Data.Relation (relationSymbols)

-- OpenMath dictionaries
import qualified Text.OpenMath.Dictionary.Arith1    as Arith1
import qualified Text.OpenMath.Dictionary.Calculus1 as Calculus1
import qualified Text.OpenMath.Dictionary.Fns1      as Fns1
import qualified Text.OpenMath.Dictionary.List1     as List1
import qualified Text.OpenMath.Dictionary.Nums1     as Nums1
import qualified Text.OpenMath.Dictionary.Transc1   as Transc1

-------------------------------------------------------------
-- Converted OpenMath symbols

plusSymbol, timesSymbol, minusSymbol, divideSymbol,
   rootSymbol, powerSymbol, negateSymbol :: Symbol
plusSymbol       = toSymbol Arith1.plusSymbol
timesSymbol      = toSymbol Arith1.timesSymbol
minusSymbol      = toSymbol Arith1.minusSymbol 
divideSymbol     = toSymbol Arith1.divideSymbol
rootSymbol       = toSymbol Arith1.rootSymbol
powerSymbol      = toSymbol Arith1.powerSymbol
negateSymbol     = toSymbol Arith1.unaryMinusSymbol

sinSymbol, cosSymbol, lnSymbol :: Symbol
sinSymbol        = toSymbol Transc1.sinSymbol
cosSymbol        = toSymbol Transc1.cosSymbol
lnSymbol         = toSymbol Transc1.lnSymbol

diffSymbol, piSymbol, lambdaSymbol, listSymbol :: Symbol
diffSymbol       = toSymbol Calculus1.diffSymbol
piSymbol         = toSymbol Nums1.piSymbol
lambdaSymbol     = toSymbol Fns1.lambdaSymbol
listSymbol       = toSymbol List1.listSymbol

-------------------------------------------------------------
-- Operator fixities

type OperatorTable = [(Associativity, [(Symbol, String)])]

data Associativity = InfixLeft | InfixRight | PrefixNon
                   | InfixNon
   deriving (Show, Eq)

operatorTable :: OperatorTable
operatorTable =
     (InfixNon, [ (s, op) | (_, (op, s)) <- relationSymbols]) :
   [ (InfixLeft,  [(plusSymbol, "+"), (minusSymbol, "-")])    -- 6
   , (PrefixNon,  [(negateSymbol, "-")])                      -- 6+
   , (InfixLeft,  [(timesSymbol, "*"), (divideSymbol, "/")])  -- 7
   , (InfixRight, [(powerSymbol, "^")])                       -- 8
   ]

-------------------------------------------------------------
-- Extra math symbols

absSymbol    = toSymbol "abs"   
signumSymbol = toSymbol "signum" 
logSymbol    = toSymbol "log"            -- in Haskell, logbase e = log
expSymbol    = toSymbol "exp"            -- exp 1 ~= 2.718
tanSymbol    = toSymbol "tan"       
asinSymbol   = toSymbol "asin"   
atanSymbol   = toSymbol "atan"   
acosSymbol   = toSymbol "acos"   
sinhSymbol   = toSymbol "sinh"   
tanhSymbol   = toSymbol "tanh"   
coshSymbol   = toSymbol "cosh"   
asinhSymbol  = toSymbol "asinh"  
atanhSymbol  = toSymbol "atanh" 
acoshSymbol  = toSymbol "acosh"  
bottomSymbol = toSymbol "error"
fcompSymbol  = toSymbol "compose"

-------------------------------------------------------------
-- Some match functions

isPlus, isTimes, isMinus, isDivide :: 
   (Symbolic a, MonadPlus m) => a -> m (a, a)
isNegate :: (Symbolic a, MonadPlus m) => a -> m a
   
isPlus   = isAssoBinary plusSymbol
isTimes  = isAssoBinary timesSymbol  
isMinus  = isBinary     minusSymbol  
isDivide = isBinary     divideSymbol 
isNegate = isUnary      negateSymbol 

infixr 8 ^

(^) :: Symbolic a => a -> a -> a
(^) = binary powerSymbol

root :: Symbolic a => a -> a -> a
root = binary rootSymbol