{-# LANGUAGE FlexibleContexts #-}
module Recognize.Strategy.Applications
( normalize, simplify, pSolveLinear
) where
import Control.Arrow
import Data.Maybe
import Domain.Math.Data.Relation
import Domain.Math.Expr
import Ideas.Common.Library hiding (simplify)
import Recognize.Data.Attribute
import Recognize.Data.Math
import Recognize.Data.Diagnosis
import Recognize.Parsing.Parse
import Recognize.Strategy.Derivation
import Recognize.Strategy.Exercises
import Recognize.Strategy.Recognizer
import Recognize.Expr.Normalform
import Util.Cache
normalize :: Expr -> (Expr, [Attribute])
normalize = cached "normalize" $ \e ->
first nfComAssoc $ fromMaybe (e,[]) $ deriveExprSteps normalizeExercise e
simplify :: Expr -> (Expr, [Attribute])
simplify = cached "simplify" $ \e ->
first nfComAssoc $ fromMaybe (e,[]) $ deriveExprSteps simplifyExercise e
deriveExprSteps :: (Show e, ToAttribute e) => Exercise e -> e -> Maybe (e,[Attribute])
deriveExprSteps ex e = do
deriv <- defaultDerivation ex e
attrs <- fromDerivation $ updateSteps (\_ s _ -> fst s) deriv
let term = lastTerm deriv
se <- fromContext term
return (se, attrs)
pSolveLinear :: (ParseLog m, Parse m Math, Relational f) => Maybe (f Expr, Math) -> m (Relation Expr, [Step])
pSolveLinear mfe = pExercise recognizerExercise mrel
where
mrel = fmap (first (\fe -> leftHandSide fe .==. rightHandSide fe)) mfe