nom-0.1.0.0: src/Language/Nominal/Properties/NameSpec.hs
module Language.Nominal.Properties.NameSpec
where
import Test.QuickCheck
import Language.Nominal.Name
-- import Language.Nominal.Nom
import Language.Nominal.Binder
-- $setup
-- >>> :set -XScopedTypeVariables
-- >>> import Test.QuickCheck
-- >>> import Language.Nominal.Properties.SpecUtilities
-- | @'withLabel'@ does indeed overwrite the label.
--
-- prop> \(n :: Name String) t -> nameLabel (n `withLabel` t) == t
--
prop_namelabel :: Name String -> String -> Bool
prop_namelabel n t = t == nameLabel (n `withLabel` t)
-- | Not all names are equal (even with trivial labels)
prop_twonames :: Name () -> Name () -> Property
prop_twonames n1 n2 =
expectFailure $ n1 == n2
-- | (n' n).x = x (we expect this to fail)
prop_singleswap :: Name String -> Name String -> [Name String] -> Property
prop_singleswap n1 n2 l =
expectFailure $ swpN n1 n2 l == l
-- | n',n#x => (n' n).x = x. Test on x a tuple.
prop_freshswap :: Name String -> Name String -> (Name String, Name String, Name String) -> Property
prop_freshswap n1 n2 l =
n1 `freshFor` l ==> n2 `freshFor` l ==>
swpN n1 n2 l == l
-- | (n' n).(n' n).x = x
prop_doubleswap :: Name String -> Name String -> [Name String] -> Bool
prop_doubleswap n1 n2 l =
swpN n1 n2 (swpN n1 n2 l) == l
-- | n'',n'#x => (n'' n').(n' n).m = (n'' n).m
prop_doubleswap_fresh' :: Name String -> Name String -> Name String -> Name String -> Property
prop_doubleswap_fresh' n n' n'' m =
n' `freshFor` m ==> n'' `freshFor` m ==>
swpN n'' n' (swpN n' n m) === swpN n'' n m
-- | n'#x => (n'' n').(n' n).x = (n'' n).x
prop_doubleswap_fresh :: Name String -> Name String -> Name String -> [Name String] -> Property
prop_doubleswap_fresh n n' n'' l =
n' `freshFor` l ==> n'' `freshFor` l ==>
swpN n'' n' (swpN n' n l) === swpN n'' n l
-- | (n' n).x = (n n').x
prop_swap_symm :: Name String -> Name String -> [Name String] -> Bool
prop_swap_symm n' n x = swpN n' n x == swpN n n' x