ideas-0.7: src/Domain/Math/Power/Strategies.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 : alex.gerdes@ou.nl
-- Stability : provisional
-- Portability : portable (depends on ghc)
--
-----------------------------------------------------------------------------
module Domain.Math.Power.Strategies
( -- * Power strategies
simplifyPowerStrategy
, powerOfStrategy
, calcPowerStrategy
, nonNegBrokenExpStrategy
) where
import Prelude hiding (repeat, not)
import Common.Classes
import Common.Context
import Common.Id
import Common.Navigator
import Common.Strategy
import Common.Transformation
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
-- | Strategies ---------------------------------------------------------------
simplifyPowerStrategy :: LabeledStrategy (Context Expr)
simplifyPowerStrategy = cleanUpStrategyRules "Simplify" powerRules
powerOfStrategy :: LabeledStrategy (Context Expr)
powerOfStrategy = cleanUpStrategyRules "Write as power of" powerRules
nonNegBrokenExpStrategy :: LabeledStrategy (Context Expr)
nonNegBrokenExpStrategy = cleanUpStrategy (change cleanup . applyTop cleanup) strategy
where
rs = [ addExponents, subExponents, mulExponents, reciprocalInv
, distributePower, distributePowerDiv, power2root, zeroPower
, calcPowerPlus, calcPowerMinus
]
strategy = label "Write with non-negative exponent" $ exhaustiveStrategy rs
cleanup = applyD divisionNumerator
. applyD myFractionTimes
. mergeConstants
. simplifyWith simplifyConfig {withMergeAlike = False}
calcPowerStrategy :: LabeledStrategy (Context Expr)
calcPowerStrategy = cleanUpStrategy cleanup strategy
where
strategy = label "Calculate power" $ exhaustiveStrategy rules
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 (change cleanUp. applyTop cleanUp) . label l . exhaustiveStrategy
cleanUp :: Expr -> Expr
cleanUp = mergeConstants
. simplifyWith simplifyConfig {withMergeAlike = False}