{-# LANGUAGE MultiParamTypeClasses, ExistentialQuantification #-}
module Recognize.Data.Attribute where
import Control.Arrow
import Data.List.NonEmpty
import Ideas.Common.Rewriting.Term
import Ideas.Text.XML hiding (Attribute)
import Domain.Math.Expr
import Domain.Math.Data.Relation
import Recognize.Data.Op
import Recognize.Data.RuleId
data Attribute =
Expand Op
| Implicit Op
| Forget Op
| ForgetSym Symbol
| Normalized
| InvalidEquation
Expr
Expr
| UnequalRelations
(Relation Expr)
(Relation Expr)
| Recovery
| NonMatchingParentheses
| IncorrectDistribution
| IncorrectFactorization
| InvertedFraction
| InvalidCommutativity Symbol
| AtomMixedUp
Expr
Expr
| Sloppiness
| OperatorMixedUp
Symbol
Symbol
| Misconception
Concept
Concept
| AsymmetricRelation
| InequalityStrictness
| Approximation
| RoundingError
| CommonMistake
| CapturedWildcard String Expr
| PartialMatch Expr
| MatchedBy Expr Expr
| ARule
RuleId
(NonEmpty Expr)
Expr
| ARuleR
RuleId
(Relation Expr)
(Relation Expr)
| Label String
| LabelE String Expr
| FinalAnswer Expr
| NExpr Expr
| Other String
deriving (Eq, Show,Ord)
instance ToXML Attribute where
toXML e = case e of
Expand o -> makeXML "expand" (text o)
Implicit o -> makeXML "implicit" (text o)
Forget o -> makeXML "forget" (text o)
ForgetSym o -> makeXML "forgetsym" (text o)
InvalidCommutativity o -> makeXML "invalidcommutativity" (text o)
Normalized -> makeXML "normalized" mempty
(InvalidEquation e1 e2) -> makeXML "invalidequation" $ mconcat [element "left" [text e1], element "right" [text e2]]
Recovery -> makeXML "recovery" mempty
NonMatchingParentheses -> makeXML "nonmatchingparentheses" mempty
IncorrectDistribution -> makeXML "incorrectdistribution" mempty
IncorrectFactorization -> makeXML "incorrectfactorization" mempty
InvertedFraction -> makeXML "invertedfraction" mempty
CapturedWildcard s e -> makeXML "capturedwildcard" $ mconcat [element "wildcard" [text s],element "expr" [text e]]
AtomMixedUp e1 e2 -> makeXML "atommixedup" $ mconcat [element "left" [text e1], element "right" [text e2]]
Sloppiness -> makeXML "sloppiness" mempty
OperatorMixedUp w c -> makeXML "operatormixedup" $ mconcat [element "wrong" [text w], element "correct" [text c]]
Misconception w c -> makeXML "misconception" $ mconcat [element "wrong" [text w], element "correct" [text c]]
AsymmetricRelation -> makeXML "asymmetricrelation" mempty
InequalityStrictness -> makeXML "inequalitystrictness" mempty
RoundingError -> makeXML "roundingerror" mempty
CommonMistake -> makeXML "commonmistake" mempty
Approximation -> makeXML "approximation" mempty
Other s -> makeXML "other" (string s)
isMistake :: Attribute -> Bool
isMistake (InvalidEquation _ _) = True
isMistake NonMatchingParentheses = True
isMistake (InvalidCommutativity _) = True
isMistake (ForgetSym _) = True
isMistake IncorrectDistribution = True
isMistake IncorrectFactorization = True
isMistake InvertedFraction = True
isMistake (AtomMixedUp _ _) = True
isMistake Sloppiness = True
isMistake (OperatorMixedUp _ _) = True
isMistake (Misconception _ _) = True
isMistake AsymmetricRelation = True
isMistake InequalityStrictness = True
isMistake RoundingError = True
isMistake CommonMistake = True
isMistake _ = False
isApproximation :: Attribute -> Bool
isApproximation Approximation = True
isApproximation _ = False
isLabelAttr :: Attribute -> Bool
isLabelAttr (Label _) = True
isLabelAttr (LabelE _ _) = True
isLabelAttr _ = False
isCommonMistake :: Attribute -> Bool
isCommonMistake CommonMistake = True
isCommonMistake _ = False
data Concept = Area | Perimeter | Square | Triangle | Volume | Rectangle | HalfPerimeter
deriving (Eq, Show, Ord)
infixl 7 <!
(<!) :: [(a, [Attribute])] -> Attribute -> [(a, [Attribute])]
xs <! a = second (a:) <$> xs