packages feed

term-rewriting-0.3: test/CriticalPair.hs

-- 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