-- 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.CriticalPair module CriticalPair where import Arbitrary import Samples import Data.Rewriting.Term (Term (..)) import qualified Data.Rewriting.Term as Term import Data.Rewriting.Rule (Rule (..)) import Data.Rewriting.Pos (Pos) import qualified Data.Rewriting.Substitution as Subst import qualified Data.Rewriting.Rules as Rules import qualified Data.Rewriting.Context as Ctxt import Data.Rewriting.CriticalPair import qualified Data.Set as S import Test.HUnit type CP' = CP Fun' Var' Var' maxSize = 4 propValidCPs' :: [Rule'] -> Bool propValidCPs' = all validCP . cps' . take maxSize -- propValidCPs :: [Rule'] -> [Rule'] -> Bool -- propValidCPs rs rs' = all validCP (cps (take maxSize rs) (take maxSize rs')) propOuterCPs' :: [Rule'] -> Bool propOuterCPs' = all (null . leftPos) . cpsOut' . take maxSize propInnerCPs' :: [Rule'] -> Bool propInnerCPs' = all (not . null . leftPos) . cpsIn' . take maxSize tests :: Test tests = TestLabel "Critical Pair Tests" $ TestList [ TestCase $ assertEqual "CPs of fixed TRS" (cpSet cps1) (cpSet $ cps' trs1) ] cpSet :: (Ord f, Ord v) => [CP f v v] -> S.Set (Term f (Either v v), Term f (Either v v), Term f (Either v v), Rule f v, Rule f v, Pos) cpSet = S.fromList . map (\cp -> (top cp, left cp, right cp, leftRule cp, rightRule cp, leftPos cp)) validCP :: (Ord v, Eq f) => CP f v v -> Bool validCP CP{ left = left, top = top, right = right, leftPos = pos, leftRule = lRule, rightRule = rRule, subst = subst } = subst `Subst.apply` Term.map id Right (lhs rRule) == top && subst `Subst.apply` Term.map id Right (rhs rRule) == right && subst `Subst.apply` Term.map id Left (lhs lRule) == top !!! pos && subst `Subst.apply` Term.map id Left (rhs lRule) == left !!! pos && Ctxt.ofTerm top pos == Ctxt.ofTerm left pos