ideas-0.7: src/Domain/Math/Numeric/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 : bastiaan.heeren@ou.nl
-- Stability : provisional
-- Portability : portable (depends on ghc)
--
-----------------------------------------------------------------------------
module Domain.Math.Numeric.Strategies
( naturalStrategy, integerStrategy
, rationalStrategy, fractionStrategy
) where
import Common.Context
import Common.Strategy
import Common.View
import Domain.Math.Expr
import Domain.Math.Numeric.Rules
import Domain.Math.Numeric.Views
import Prelude hiding (repeat)
------------------------------------------------------------
-- Strategies
naturalStrategy :: LabeledStrategy (Context Expr)
naturalStrategy = label "simplify" $
repeat $ somewhere $ alternatives $ map use
[ calcPlusWith "natural" natView
, calcMinusWith "natural" natView
, calcTimesWith "natural" natView
, calcDivisionWith "natural" natView
, doubleNegate, negateZero, plusNegateLeft, plusNegateRight
, minusNegateLeft, minusNegateRight, timesNegateLeft
, timesNegateRight, divisionNegateLeft, divisionNegateRight
]
where
natView = makeView f fromInteger
where
f (Nat n) = Just n
f _ = Nothing
integerStrategy :: LabeledStrategy (Context Expr)
integerStrategy = label "simplify" $
repeat $ somewhere $ alternatives $ map use
[ calcPlusWith "integer" integerNormalForm
, calcMinusWith "integer" integerNormalForm
, calcTimesWith "integer" integerNormalForm
, calcDivisionWith "integer" integerNormalForm
, doubleNegate, negateZero
]
rationalStrategy :: LabeledStrategy (Context Expr)
rationalStrategy = label "simplify" $
repeat $ somewhere $ alternatives $ map use
[ calcPlusWith "rational" rationalRelaxedForm
, calcMinusWith "rational" rationalRelaxedForm
, calcTimesWith "rational" rationalRelaxedForm
, calcDivisionWith "integer" integerNormalForm
, doubleNegate, negateZero, divisionDenominator
, divisionNumerator, simplerFraction
]
fractionStrategy :: LabeledStrategy (Context Expr)
fractionStrategy = label "simplify" $
repeat $
somewhere
( use (calcPlusWith "integer" integerNormalForm)
<|> use (calcMinusWith "integer" integerNormalForm)
<|> use (calcTimesWith "integer" integerNormalForm) -- not needed?
-- <|> use (calcDivisionWith "integer" integerNormalForm) -- not needed?
) |>
somewhere
( use doubleNegate <|> use negateZero <|> use divisionDenominator
<|> use fractionPlus <|> use fractionTimes <|> use divisionNumerator
) |>
somewhere (use fractionPlusScale) |>
somewhere (use simplerFraction)