-- This file is part of the 'term-rewriting' library. It is licensed
-- under an MIT license. See the accompanying 'LICENSE' file for details.
--
-- Authors: Bertram Felgenhauer
-- Tests for Data.Rewriting.Substitution
module Substitution where
import Arbitrary
import Data.Rewriting.Term (Term (..))
import Data.Rewriting.Substitution
import Data.Rewriting.Substitution.Type
import Control.Applicative
import Control.Monad
import Data.Maybe
import Data.Function
import qualified Data.Map as M
propCompose :: Subst' -> Subst' -> Term' -> Bool
propCompose s1 s2 t = (s1 `compose` s2) `apply` t == s1 `apply` (s2 `apply` t)
propUnify1 :: Term' -> Term' -> Bool
propUnify1 s t = Just False /= do
(\u -> u `apply` s == u `apply` t) <$> unify s t
propUnify2 :: Term' -> Term' -> Bool
propUnify2 s t = Just False /= do
equalSubst <$> unify s t <*> unifyRef s t
equalSubst :: (Ord v, Eq f) => Subst f v -> Subst f v -> Bool
equalSubst s1 s2 = ((==) `on` toMap) (id' `compose` s1) (id' `compose` s2)
where
id' = fromMap . M.fromList $
[(v, Var v) | v <- M.keys (toMap s1) ++ M.keys (toMap s2)]