hegg-0.6.0.0: test/T2.hs
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverloadedStrings #-}
module T2 where
-- Tests whether this saturates just like mwillsey claims that it does in egg!
import Prelude hiding (not)
import Test.Tasty.HUnit
import Data.Equality.Matching
import Data.Equality.Extraction
import Data.Equality.Saturation
data Lang a = And a a
| Or a a
| Not a
| ToElim a
| Sym Int
deriving (Functor, Foldable, Traversable, Eq, Ord, Show)
x, y :: Pattern Lang
x = "x"
y = "y"
not :: Pattern Lang -> Pattern Lang
not = pat . Not
rules :: [Rewrite () Lang]
rules =
[ pat (x `And` y) := not (pat (not x `Or` not y))
, pat (x `Or` y) := not (pat (not x `And` not y))
, not (not x) := pat (ToElim x)
, pat (ToElim x) := x
]
main :: IO ()
main = do
fst (equalitySaturation (Fix $ (Fix $ Not $ Fix $ Sym 0) `And` (Fix $ Not $ Fix $ Sym 1)) rules depthCost) @?= Fix (Not $ Fix $ (Fix $ Sym 0) `Or` (Fix $ Sym 1))
pure ()