ideas-math-1.2: src/Domain/Math/Numeric/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 : bastiaan.heeren@ou.nl
-- Stability : provisional
-- Portability : portable (depends on ghc)
--
-----------------------------------------------------------------------------
-- $Id: Strategies.hs 7527 2015-04-08 07:58:06Z bastiaan $
module Domain.Math.Numeric.Strategies
( naturalStrategy, integerStrategy
, rationalStrategy, fractionStrategy
, fractionLiberalStrategy
) where
import Domain.Math.Expr
import Domain.Math.Numeric.Rules
import Domain.Math.Numeric.Views
import Ideas.Common.Library
------------------------------------------------------------
-- Strategies
naturalStrategy :: LabeledStrategy (Context Expr)
naturalStrategy = label "simplify" $
repeatS $ 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" $
repeatS $ somewhere $ alternatives $ map use
[ calcPlusWith "integer" integerNF
, calcMinusWith "integer" integerNF
, calcTimesWith "integer" integerNF
, calcDivisionWith "integer" integerNF
, doubleNegate, negateZero
]
rationalStrategy :: LabeledStrategy (Context Expr)
rationalStrategy = label "simplify" $
repeatS $ somewhere $ alternatives $ map use
[ calcPlusWith "rational" rationalRelaxedForm
, calcMinusWith "rational" rationalRelaxedForm
, calcTimesWith "rational" rationalRelaxedForm
, calcDivisionWith "integer" integerNF
, doubleNegate, negateZero, divisionDenominator
, divisionNumerator, simplerFraction
]
fractionStrategy :: LabeledStrategy (Context Expr)
fractionStrategy = label "simplify" $
repeatS $
somewhere
( use (calcPlusWith "integer" integerNF)
<|> use (calcMinusWith "integer" integerNF)
<|> use (calcTimesWith "integer" integerNF) -- not needed?
-- <|> use (calcDivisionWith "integer" integerNF) -- not needed?
) |>
somewhere
(use fractionTimesCancelDenNom <|> use fractionTimesCancelNomDen) |>
somewhere
( use doubleNegate <|> use negateZero <|> use divisionDenominator
<|> use fractionPlus <|> use fractionTimes <|> use divisionNumerator
) |>
somewhere (use fractionPlusScale) |>
somewhere (use simplerFraction)
fractionLiberalStrategy :: LabeledStrategy (Context Expr)
fractionLiberalStrategy = label "simplify" $
repeatS $
somewhere
( use (calcPlusWith "integer" integerNF)
<|> use (calcMinusWith "integer" integerNF)
<|> use (calcTimesWith "integer" integerNF) -- not needed?
-- <|> use (calcDivisionWith "integer" integerNF) -- not needed?
<|> use fractionTimesCancelDenNom
<|> use fractionTimesCancelNomDen
<|> use doubleNegate
<|> use negateZero
<|> use divisionDenominator
<|> use fractionPlus
<|> use fractionTimes
<|> use divisionNumerator
<|> use fractionPlusScale
<|> use simplerFraction
)