module Test.QuickSpec.Equation where
import Test.QuickSpec.Term
import Test.QuickSpec.Signature hiding (vars)
import Test.QuickSpec.Utils.Typed
import Data.Monoid
import Data.List
import Data.Ord
data Equation = Term :=: Term deriving (Eq, Ord)
showEquation :: Sig -> Equation -> String
showEquation sig (t :=: u) =
show (mapVars f t) ++ " == " ++ show (mapVars f u)
where f = disambiguate sig (vars t ++ vars u)
instance Show Equation where
show = showEquation mempty
data TypedEquation a = Expr a :==: Expr a
eraseEquation :: TypedEquation a -> Equation
eraseEquation (e1 :==: e2) = term e1 :=: term e2
instance Eq (TypedEquation a) where
e1 == e2 = e1 `compare` e2 == EQ
instance Ord (TypedEquation a) where
compare = comparing eraseEquation
instance Show (TypedEquation a) where
show = show . eraseEquation
showTypedEquation :: Sig -> TypedEquation a -> String
showTypedEquation sig e = showEquation sig (eraseEquation e)
equations :: [Several Expr] -> [Some TypedEquation]
equations = sortBy (comparing (some eraseEquation)) .
concatMap (several toEquations)
where toEquations (x:xs) = [Some (y :==: x) | y <- xs]