module Domain.Math.Expr.Symbols
(
plusSymbol, timesSymbol, minusSymbol, divideSymbol, rationalSymbol
, rootSymbol, gcdSymbol, lcmSymbol
, powerSymbol, negateSymbol, sinSymbol, cosSymbol, lnSymbol
, diffSymbol, piSymbol, lambdaSymbol, listSymbol
, absSymbol, signumSymbol, logSymbol, expSymbol, tanSymbol, asinSymbol
, atanSymbol, acosSymbol, sinhSymbol, tanhSymbol, coshSymbol, asinhSymbol
, atanhSymbol, acoshSymbol, bottomSymbol, fcompSymbol, mixedFractionSymbol
, isPlus, isTimes, isMinus, isDivide, isPower, isNegate, isRoot
, isPowerSymbol, isRootSymbol, isLogSymbol, isDivideSymbol
, isMixedFractionSymbol
, (^), root, mixed
) where
import Control.Monad
import Ideas.Common.Rewriting
import Prelude hiding ((^))
import qualified Ideas.Text.OpenMath.Dictionary.Arith1 as OM
import qualified Ideas.Text.OpenMath.Dictionary.Calculus1 as OM
import qualified Ideas.Text.OpenMath.Dictionary.Fns1 as OM
import qualified Ideas.Text.OpenMath.Dictionary.List1 as OM
import qualified Ideas.Text.OpenMath.Dictionary.Nums1 as OM
import qualified Ideas.Text.OpenMath.Dictionary.Transc1 as OM
plusSymbol, timesSymbol, minusSymbol, divideSymbol, rootSymbol,
powerSymbol, negateSymbol, absSymbol, gcdSymbol, lcmSymbol :: Symbol
plusSymbol = newSymbol OM.plusSymbol
timesSymbol = newSymbol OM.timesSymbol
minusSymbol = newSymbol OM.minusSymbol
divideSymbol = newSymbol OM.divideSymbol
rootSymbol = newSymbol OM.rootSymbol
powerSymbol = newSymbol OM.powerSymbol
negateSymbol = newSymbol OM.unaryMinusSymbol
absSymbol = newSymbol OM.absSymbol
gcdSymbol = newSymbol OM.gcdSymbol
lcmSymbol = newSymbol OM.lcmSymbol
logSymbol, sinSymbol, cosSymbol, lnSymbol, expSymbol, tanSymbol,
sinhSymbol, tanhSymbol, coshSymbol :: Symbol
logSymbol = newSymbol OM.logSymbol
sinSymbol = newSymbol OM.sinSymbol
cosSymbol = newSymbol OM.cosSymbol
lnSymbol = newSymbol OM.lnSymbol
expSymbol = newSymbol OM.expSymbol
tanSymbol = newSymbol OM.tanSymbol
sinhSymbol = newSymbol OM.sinhSymbol
tanhSymbol = newSymbol OM.tanhSymbol
coshSymbol = newSymbol OM.coshSymbol
diffSymbol, lambdaSymbol, listSymbol, piSymbol, rationalSymbol :: Symbol
diffSymbol = newSymbol OM.diffSymbol
lambdaSymbol = newSymbol OM.lambdaSymbol
listSymbol = newSymbol OM.listSymbol
piSymbol = newSymbol OM.piSymbol
rationalSymbol = newSymbol OM.rationalSymbol
signumSymbol, asinSymbol, atanSymbol, acosSymbol, asinhSymbol, atanhSymbol,
acoshSymbol, bottomSymbol, fcompSymbol, mixedFractionSymbol :: Symbol
signumSymbol = newSymbol "signum"
asinSymbol = newSymbol "asin"
atanSymbol = newSymbol "atan"
acosSymbol = newSymbol "acos"
asinhSymbol = newSymbol "asinh"
atanhSymbol = newSymbol "atanh"
acoshSymbol = newSymbol "acosh"
bottomSymbol = newSymbol "error"
fcompSymbol = newSymbol "compose"
mixedFractionSymbol = newSymbol ("extra", "mixedfraction")
isPlus, isTimes, isMinus, isDivide, isPower, isRoot ::
(WithFunctions a, MonadPlus m) => a -> m (a, a)
isNegate :: (WithFunctions a, MonadPlus m) => a -> m a
isPlus = isAssoBinary plusSymbol
isTimes = isAssoBinary timesSymbol
isMinus = isBinary minusSymbol
isDivide = isBinary divideSymbol
isNegate = isUnary negateSymbol
isPower = isBinary powerSymbol
isRoot = isBinary rootSymbol
isPowerSymbol, isRootSymbol, isLogSymbol, isDivideSymbol,
isMixedFractionSymbol :: Symbol -> Bool
isPowerSymbol = (== powerSymbol)
isRootSymbol = (== rootSymbol)
isLogSymbol = (== logSymbol)
isDivideSymbol = (== divideSymbol)
isMixedFractionSymbol = (== mixedFractionSymbol)
infixr 8 ^
(^) :: WithFunctions a => a -> a -> a
(^) = binary powerSymbol
root :: WithFunctions a => a -> a -> a
root = binary rootSymbol
mixed :: (Num a, WithFunctions a) => Integer -> Integer -> Integer -> a
mixed a b c = function mixedFractionSymbol $ map fromInteger [a, b, c]
isAssoBinary :: (WithFunctions a, Monad m) => Symbol -> a -> m (a, a)
isAssoBinary s a =
case isFunction s a of
Just [x, y] -> return (x, y)
Just (x:xs) | length xs > 1 -> return (x, function s xs)
_ -> fail "isAssoBinary"