ideas-0.5.8: src/Domain/Math/Polynomial/Exercises.hs
-----------------------------------------------------------------------------
-- Copyright 2009, 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.Polynomial.Exercises where
import Domain.Math.Polynomial.Rules
import Domain.Math.Polynomial.Strategies
import Domain.Math.Polynomial.Views
import Domain.Math.Polynomial.CleanUp
import Domain.Math.Polynomial.BuggyRules
import Common.Exercise
import Common.Rewriting
import Domain.Math.Data.Equation
import Domain.Math.Equation.Views
import Domain.Math.Expr
import Domain.Math.Data.OrList
import Domain.Math.Examples.DWO1
import Domain.Math.Expr.Parser
import Common.View
import Common.Context
import Data.List
------------------------------------------------------------
-- Exercises
linearExercise :: Exercise (Equation Expr)
linearExercise = makeExercise
{ description = "solve a linear equation"
, exerciseCode = makeCode "math" "lineq"
, status = Provisional
, parser = parseWith (pEquation pExpr)
, similarity = eqEquation cleanUpSimple
, equivalence = viewEquivalent linearEquationView
, isReady = solvedEquation
, extraRules = linearRules
, strategy = ignoreContext linearStrategy
, examples = concat linearEquations
}
quadraticExercise :: Exercise (OrList (Equation Expr))
quadraticExercise = makeExercise
{ description = "solve a quadratic equation"
, exerciseCode = makeCode "math" "quadreq"
, status = Provisional
, parser = parseWith (pOrList (pEquation pExpr))
, similarity = eqOrList cleanUpExpr2
, equivalence = viewEquivalent quadraticEquationsView
, isReady = solvedEquations
, extraRules = map ignoreContext $ quadraticRules ++ abcBuggyRules
, strategy = ignoreContext quadraticStrategy
, examples = map (orList . return) (concat quadraticEquations)
}
higherDegreeExercise :: Exercise (OrList (Equation Expr))
higherDegreeExercise = makeExercise
{ description = "solve an equation (higher degree)"
, exerciseCode = makeCode "math" "higherdegree"
, status = Provisional
, parser = parseWith (pOrList (pEquation pExpr))
, similarity = eqOrList cleanUpExpr2
, equivalence = viewEquivalent higherDegreeEquationsView
, isReady = solvedEquations
, extraRules = map ignoreContext higherDegreeRules
, strategy = ignoreContext higherDegreeStrategy
, examples = map (orList . return) higherDegreeEquations
}
--------------------------------------------
-- Equality
eqOrList :: (Expr -> Expr) -> OrList (Equation Expr) -> OrList (Equation Expr) -> Bool
eqOrList f x y = normOrList f x == normOrList f y
eqEquation :: (Expr -> Expr) -> Equation Expr -> Equation Expr -> Bool
eqEquation f x y = normEquation f x == normEquation f y
normOrList :: (Expr -> Expr) -> OrList (Equation Expr) -> OrList (Equation Expr)
normOrList f = normalize . fmap (normEquation f)
normEquation :: (Expr -> Expr) -> Equation Expr -> Equation Expr
normEquation f eq
| a <= b = a :==: b
| otherwise = b :==: a
where
a :==: b = fmap (normExpr f) eq
normExpr :: (Expr -> Expr) -> Expr -> Expr
normExpr f = normalizeWith [plusOperator, timesOperator] . f
where
plusOperator = acOperator (+) isPlus
timesOperator = acOperator (*) isTimes