ideas-math-1.0: src/Domain/Math/Fraction/Exercises.hs
module Domain.Math.Fraction.Exercises
( simpleFractionAddition
) where
import Domain.Math.Expr
import Domain.Math.Fraction.Rules
import Domain.Math.Fraction.Strategies
import Domain.Math.Numeric.Views
import Ideas.Common.Library
import Ideas.Common.Utils.Uniplate
simpleFractionAddition :: Exercise Expr
simpleFractionAddition = makeExercise
{ status = Alpha
, exerciseId = describe "Fraction exercise for STEPS" $
newId "arithmetic.fractions.steps"
, parser = parseExpr
, strategy = expandAndAdd
, navigation = termNavigator
, equivalence = withoutContext areEqual
, extraRules = map use [gcdRule, lcmRule, expandRule, reduceRule]
}
areEqual :: Expr -> Expr -> Bool
areEqual = viewEquivalent (extraSymbols >>> rationalView)
-- This view handles the reduce and expand symbols for the euquivalence test.
-- Semantically, reduce(a,b) = a.
extraSymbols :: View Expr Expr
extraSymbols = makeView (Just . f) id
where
f expr =
case getFunction expr of
Just (s, [x, _])
| s == reduceFractionSymbol -> f x
| s == expandFractionSymbol -> f x
_ -> descend f expr