packages feed

term-rewriting-0.3: test/Rule.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.Rules

module Rule where

import Samples
import Arbitrary

import Data.Rewriting.Rule

import Test.HUnit

tests :: Test
tests = TestLabel "Rules Tests" $ TestList [
    TestCase $ assertEqual "isLeftLinear"
        True (isLeftLinear $ x --> f[x, x]),
    TestCase $ assertEqual "~isLeftLinear"
        False (isLeftLinear $ f[x,g[a,b,x],y] --> z),
    TestCase $ assertEqual "isCollapsing"
        True (isCollapsing $ g[a, b] --> x),
    TestCase $ assertEqual "~isCollapsing"
        False (isCollapsing $ z --> g[x,h[x]]),
    TestList []]

propLeftRightLinearDual :: Term' -> Term' -> Bool
propLeftRightLinearDual = dual isLeftLinear isRightLinear

propCollapsingExpandingDual :: Term' -> Term' -> Bool
propCollapsingExpandingDual = dual isCollapsing isExpanding

propErasingCreatingDual :: Term' -> Term' -> Bool
propErasingCreatingDual = dual isErasing isCreating

propLinear :: Term' -> Term' -> Bool
propLinear l r = isLinear (Rule l r) ==
    (isLeftLinear (Rule l r) && isRightLinear (Rule l r))

propValid :: Term' -> Term' -> Bool
propValid l r = isValid (Rule l r) ==
    not (isCreating (Rule l r) || isExpanding (Rule l r))

dual :: (Rule' -> Bool) -> (Rule' -> Bool) -> Term' -> Term' -> Bool
dual p q a b = p (Rule a b) == q (Rule b a)