Advise-me-0.1: src/Recognize/Strategy/Exercises.hs
-----------------------------------------------------------------------------
-- Copyright 2019, Advise-Me project team. This file is distributed under
-- the terms of the Apache License 2.0. For more information, see the files
-- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution.
-----------------------------------------------------------------------------
-- |
-- Maintainer : bastiaan.heeren@ou.nl
-- Stability : provisional
-- Portability : portable (depends on ghc)
--
-- Custom exercises used within the AdviseMe code.
--
-----------------------------------------------------------------------------
module Recognize.Strategy.Exercises where
import Domain.Math.CleanUp
import Domain.Math.Data.Relation
import Domain.Math.Equation.Views
import Domain.Math.Expr
import Domain.Math.Numeric.Views
import Domain.Math.Polynomial.BuggyRules
import Domain.Math.Polynomial.Views
import Ideas.Common.Library
import Recognize.Strategy.Strategies
import Recognize.Strategy.Views
-- | Exercise used by the strategy recognizer for recognizing linear equations.
-- This exercise uses the `recognizerStrategy` strategy and has two additional characteristics:
--
-- * Expressions are seen as equal up to 1 decimal (1.15 == 1.2)
-- * Relations are equal regardless of the relation type (a < b == a > b)
recognizerExercise :: Exercise (Relation Expr)
recognizerExercise = makeExercise
{ exerciseId = describe "Evaluate an equation to solved form" $ newId "eval.equation.solvedform"
, status = Experimental
, strategy = recognizerStrategy
, prettyPrinter = show
, navigation = termNavigator
, ready = predicateView relationSolvedForm
, similarity = withoutContext (viewEquivalent (traverseView cleanUpACView >>> approxRelView >>> relEqualityView))
}
-- | Exercise for simplifying expressions
simplifyExercise :: Exercise Expr
simplifyExercise = makeExercise
{ exerciseId = describe "simplify expression that may contain variables" $
newId "algebra.manipulation.polynomial.rational"
, equivalence = withoutContext (viewEquivalent (polyViewWith rationalView))
, ready = predicateView $ polyViewWith rationalView
, strategy = simplifyStrategy
, navigation = termNavigator
}
-- | Exercise for normalizing expressions
normalizeExercise :: Exercise Expr
normalizeExercise = makeExercise
{ exerciseId = describe "normalize an expressions (includes simplifying fractions)" $
newId "algebra.manipulation.polynomial.rational"
, equivalence = withoutContext (viewEquivalent (polyViewWith rationalView))
, ready = predicateView $ polyViewWith rationalView
, strategy = normalizeStrategy
, navigation = termNavigator
, extraRules = map liftToContext buggyRulesExpr
}