-- 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
{-# LANGUAGE StandaloneDeriving #-}
-- selected samples for tests
module Samples where
import Data.Rewriting.Term (Term (..))
import qualified Data.Rewriting.Term as Term
import Data.Rewriting.Rule (Rule (..))
import Data.Rewriting.Pos (Pos)
import Data.Rewriting.CriticalPair (CP (..))
import Data.Rewriting.Substitution (GSubst (..))
import qualified Data.Rewriting.Substitution as Subst
import qualified Data.Rewriting.Context as Ctxt
a = Fun 'a' []
b = Fun 'b' []
c = Fun 'c' []
f = Fun 'f'
g = Fun 'g'
h = Fun 'h'
x = Var 'x'
y = Var 'y'
z = Var 'z'
(-->) = Rule
trs1 = [f[x, x] --> g[a, x], f[a, y] --> h[a], a --> b]
cps1 = [mkCP r1 r2 [], mkCP r3 r2 [0]]
where [r1, r2, r3] = trs1
mkCP :: (Eq f, Ord v) => Rule f v -> Rule f v -> Pos -> CP f v v
mkCP lRule rRule pos = let
(llhs, lrhs) = (Term.map id Left (lhs lRule), Term.map id Left (rhs lRule))
(rlhs, rrhs) = (Term.map id Right (lhs rRule), Term.map id Right (rhs rRule))
Just subst = Subst.unify llhs (rlhs !!! pos)
Just rlhs' = Ctxt.ofTerm rlhs pos
in
CP{ top = subst `Subst.apply` rlhs, right = subst `Subst.apply` rrhs,
left = rlhs' `Ctxt.apply` (subst `Subst.apply` lrhs),
leftRule = lRule, rightRule = rRule, leftPos = pos, subst = subst }
deriving instance (Show f, Show v, Show v') => Show (CP f v v')
(!!!) :: Term f v -> Pos -> Term f v
t !!! [] = t
Fun _ ts !!! (p:ps) = (ts !! p) !!! ps