packages feed

ideas-math-1.0: src/Domain/Math/Power/Equation/Exercises.hs

-----------------------------------------------------------------------------
-- Copyright 2013, 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
   , rootEqExercise
   ) where

import Prelude hiding ( (^) )

import Data.Function (on)
import Domain.Math.Data.OrList
import Domain.Math.Data.Relation
import Domain.Math.Equation.Views
import Domain.Math.Expr hiding (isPower)
import Domain.Math.Numeric.Views
import Domain.Math.Polynomial.Views
import Domain.Math.Power.Equation.Examples
import Domain.Math.Power.Equation.NormViews
import Domain.Math.Power.Equation.Strategies
import Domain.Math.Power.Rules
import Domain.Math.Power.Utils (sortOrList)
import Ideas.Common.Library

------------------------------------------------------------
-- Exercises

powerEqExercise :: Exercise (Relation Expr)
powerEqExercise = let precision = 2 in makeExercise
  { status         = Provisional
  , parser         = parseRelExpr
  , strategy       = powerEqApproxStrategy
  , navigation     = termNavigator
  , exerciseId     = describe "solve power equation algebraically with x > 0" $
                       newId "algebra.manipulation.exponents.equation"
  , examples       = level Medium $ concatMap (map $ build equationView) $
                       powerEquations ++ [last higherPowerEquations]
  , ready          = predicateView relationSolvedForm
  , suitable       = predicateView (normPowerEqApproxView precision)
  , equivalence    = withoutContext (viewEquivalent (normPowerEqApproxView precision))
  }

expEqExercise :: Exercise (Equation Expr)
expEqExercise = makeExercise
  { status         = Provisional
  , parser         = parseEqExpr
  , strategy       = expEqStrategy
  , navigation     = termNavigator
  , exerciseId     = describe "solve exponential equation algebraically" $
                       newId "algebra.manipulation.exponential.equation"
  , examples       = level Medium $ concat expEquations
  , ready          = predicate $ \ rel -> isVariable (leftHandSide rel)
                           && rightHandSide rel `belongsTo` rationalView
  , suitable       = predicateView normExpEqView
  , equivalence    = withoutContext (viewEquivalent normExpEqView)
  , ruleOrdering   = ruleOrderingWithId [getId root2power]
  }

logEqExercise :: Exercise (OrList (Relation Expr))
logEqExercise = makeExercise
  { status         = Provisional
  , parser         = parseOrsRelExpr
  , strategy       = logEqStrategy
  , navigation     = termNavigator
  , exerciseId     = describe "solve logarithmic equation algebraically" $
                       newId "algebra.manipulation.logarithmic.equation"
  , examples       = level Medium $ map (singleton . build equationView) (concat logEquations)
  , ready          = predicateView relationsSolvedForm
  , suitable       = predicateView (traverseView equationView >>> normLogEqView)
  , equivalence    = withoutContext (viewEquivalent (traverseView equationView >>> normLogEqView))
  , ruleOrdering   = ruleOrderingWithId [getId calcPower]
  }

higherPowerEqExercise :: Exercise (OrList (Equation Expr))
higherPowerEqExercise = makeExercise
  { status         = Provisional
  , parser         = parseOrsEqExpr
  , strategy       = higherPowerEqStrategy
  , navigation     = termNavigator
  , exerciseId     = describe "solve higher power equation algebraically" $
                       newId "algebra.manipulation.exponents.equation"
  , examples       = level Medium $ map singleton $ concat $
                       higherPowerEquations ++ take 3 rootEquations
  , ready          = predicateView relationsSolvedForm
  , suitable       = predicateView (traverseView normPowerEqView)
  , equivalence    = withoutContext (viewEquivalent (normPowerEqView' hasSomeVar >>> higherDegreeEquationsView))
  , ruleOrdering   = ruleOrderingWithId [getId calcPower]
  }

rootEqExercise :: Exercise (OrList (Equation Expr))
rootEqExercise = makeExercise
  { status         = Provisional
  , parser         = parseOrsEqExpr
  , strategy       = rootEqStrategy
  , navigation     = termNavigator
  , exerciseId     = describe "solve higher power equation algebraically" $
                       newId "algebra.manipulation.exponents.equation"
  , examples       = level Medium $ map singleton $ concat $ drop 3 rootEquations
  , ready          = predicateView relationsSolvedForm
  , suitable       = predicateView (traverseView normPowerEqView)
  , equivalence    = withoutContext (on (==) (sortOrList . simplify (normPowerEqView' $ elem "x" . vars)))
  , ruleOrdering   = ruleOrderingWithId [getId calcPower]
  }