ideas-0.7: src/Domain/Math/Power/Equation/Exercises.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.Equation.Exercises
( powerEqExercise
, expEqExercise
, logEqExercise
, higherPowerEqExercise
) where
import Prelude hiding ( (^) )
import Common.Context
import Common.Exercise
import Common.View
import Domain.Math.Data.OrList
import Domain.Math.Data.Relation
import Domain.Math.Equation.Views
import Domain.Math.Examples.DWO4
import Domain.Math.Expr hiding (isPower)
import Domain.Math.Numeric.Views
import Domain.Math.Power.Rules
import Domain.Math.Power.Equation.Strategies
import Domain.Math.Power.Equation.NormViews
------------------------------------------------------------
-- Exercises
powerEqExercise :: Exercise (Relation Expr)
powerEqExercise = let precision = 2 in makeExercise
{ status = Provisional
, parser = parseExprWith (pRelation pExpr)
, strategy = powerEqApproxStrategy
, navigation = termNavigator
, exerciseId = describe "solve power equation algebraically with x > 0" $
newId "algebra.manipulation.exponents.equation"
, examples = concatMap (map $ build equationView) $
powerEquations ++ [last higherPowerEquations]
, isReady = solvedRelation
, isSuitable = (`belongsTo` (normPowerEqApproxView precision))
, equivalence = viewEquivalent (normPowerEqApproxView precision)
}
expEqExercise :: Exercise (Equation Expr)
expEqExercise = makeExercise
{ status = Provisional
, parser = parseExprWith (pEquation pExpr)
, strategy = expEqStrategy
, navigation = termNavigator
, exerciseId = describe "solve exponential equation algebraically" $
newId "algebra.manipulation.exponential.equation"
, examples = concat expEquations
, isReady = \ rel -> isVariable (leftHandSide rel)
&& rightHandSide rel `belongsTo` rationalView
, isSuitable = (`belongsTo` normExpEqView)
, equivalence = viewEquivalent normExpEqView
, ruleOrdering = ruleOrderingWithId [ getId root2power ]
}
logEqExercise :: Exercise (OrList (Relation Expr))
logEqExercise = makeExercise
{ status = Provisional
, parser = parseExprWith (pOrList (pRelation pExpr))
, strategy = logEqStrategy
, navigation = termNavigator
, exerciseId = describe "solve logarithmic equation algebraically" $
newId "algebra.manipulation.logarithmic.equation"
, examples = map (orList . return . build equationView) (concat logEquations)
, isReady = solvedRelations
, isSuitable = (`belongsTo` (switchView equationView >>> normLogEqView))
, equivalence = viewEquivalent (switchView equationView >>> normLogEqView)
, ruleOrdering = ruleOrderingWithId [ getId calcPower
, getId calcRoot ]
}
higherPowerEqExercise :: Exercise (OrList (Equation Expr))
higherPowerEqExercise = makeExercise
{ status = Provisional
, parser = parseExprWith (pOrList (pEquation pExpr))
, strategy = higherPowerEqStrategy
, navigation = termNavigator
, exerciseId = describe "solve higher power equation algebraically" $
newId "algebra.manipulation.exponents.equation"
, examples = map (orList . return) $ concat $ init higherPowerEquations
, isReady = solvedRelations
, isSuitable = maybe False and . disjunctions . fmap (`belongsTo` normPowerEqView)
, equivalence = let f = normalize . fmap (simplify normPowerEqView')
in \ x y -> f x == f y
, ruleOrdering = ruleOrderingWithId [ getId calcPower
, getId calcRoot ]
}