{-# LANGUAGE OverloadedStrings #-} module Set where import Arith as A import DSL import Language.REST.Internal.Rewrite (Rewrite) import Language.REST.MetaTerm import qualified Data.HashSet as S emptyset :: MetaTerm emptyset = RWApp "∅" [] (/\), (\/) :: MetaTerm -> MetaTerm -> MetaTerm x1 /\ y1 = RWApp "intersect" [x1, y1] x1 \/ y1 = RWApp "union" [x1, y1] s0, s1 :: MetaTerm s0 = RWApp "s₀" [] s1 = RWApp "s₁" [] isSubset :: MetaTerm -> MetaTerm -> Rewrite isSubset mt1 mt2 = mt1 \/ mt2 ~> mt2 userRWs :: S.HashSet Rewrite userRWs = S.union A.evalRWs $ S.fromList [ distribL (/\) (\/) , distribR (/\) (\/) , distribL (\/) (/\) , distribR (\/) (/\) , assocL (\/) , assocL (/\) , x /\ x ~> x , x \/ x ~> x , x \/ emptyset ~> x , commutes (\/) , commutes (/\) -- Example 1 -- , s1 /\ s0 ~> emptyset -- Example 2 , s0 \/ s1 ~> s0 ] evalRWs :: S.HashSet Rewrite evalRWs = S.union A.userRWs $ S.fromList -- [ RWApp "t2" [] ~> emptyset , isSubset (RWApp "right1" []) (RWApp "right" []) ] disjointExample, disjointExample2 :: String disjointExample = "union(union(left, right1), union(left,right))" disjointExample2 = "union(left, union(right1, union(left,right)))" example1, example2 :: String example1 = "f(intersect(union(s₀,s₁), s₀))" example2 = "f(union(intersect(s₀,s₁), s₀))"