ideas-math-1.2: src/Domain/Math/Power/Strategies.hs
-----------------------------------------------------------------------------
-- Copyright 2015, 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 : alex.gerdes@ou.nl
-- Stability : provisional
-- Portability : portable (depends on ghc)
--
-----------------------------------------------------------------------------
-- $Id: Strategies.hs 7527 2015-04-08 07:58:06Z bastiaan $
module Domain.Math.Power.Strategies
( -- * Power strategies
simplifyPowerStrategy
, calcPowerStrategy
, nonNegBrokenExpStrategy
) where
import Domain.Math.Expr
import Domain.Math.Numeric.Rules (divisionNumerator, divisionDenominator)
import Domain.Math.Power.Rules
import Domain.Math.Power.Utils
import Domain.Math.Simplification
import Ideas.Common.Library hiding (simplifyWith)
-- Strategies ---------------------------------------------------------------
-- | Simplify an expression containing powers as far as possible
simplifyPowerStrategy :: LabeledStrategy (Context Expr)
simplifyPowerStrategy = cleanUpStrategyRules "Simplify" powerRules
nonNegBrokenExpStrategy :: LabeledStrategy (Context Expr)
nonNegBrokenExpStrategy = cleanUpStrategy (changeInContext cleanup . applyTop cleanup) $
label "Write with non-negative exponent" $ exhaustiveStrategy rs
where
rs = [ addExponents, subExponents, mulExponents, reciprocalInv
, distributePower, distributePowerDiv, power2root, zeroPower
, calcPowerPlus, calcPowerMinus
]
cleanup = applyD divisionNumerator
. applyD myFractionTimes
. mergeConstants
. simplifyWith simplifyConfig {withMergeAlike = False}
calcPowerStrategy :: LabeledStrategy (Context Expr)
calcPowerStrategy = cleanUpStrategy cleanup $
label "Calculate power" $ exhaustiveStrategy rules
where
rules = calcPower : divisionDenominator : reciprocalInv : divBase : rationalRules
cleanup = applyTop (applyD myFractionTimes)
. applyD (exhaustiveStrategy $ myFractionTimes : naturalRules)
-- Rule collections ---------------------------------------------------------
powerRules :: [Rule Expr]
powerRules =
[ addExponents, subExponents, mulExponents, distributePower, zeroPower
, reciprocalVar, root2power, calcPower, calcPowerPlus, calcPowerMinus
, pushNegOut
]
-- | Help functions -----------------------------------------------------------
cleanUpStrategyRules :: IsId n => n -> [Rule Expr] -> LabeledStrategy (Context Expr)
cleanUpStrategyRules l =
cleanUpStrategy (changeInContext cleanUp. applyTop cleanUp) . label l . exhaustiveStrategy
cleanUp :: Expr -> Expr
cleanUp = mergeConstants
. simplifyWith simplifyConfig {withMergeAlike = False}