{-# LANGUAGE OverloadedStrings #-} module Multiset where import Data.Text () import DSL import Language.REST.MetaTerm import Language.REST.Op import Language.REST.Rewrite import qualified Data.HashSet as S import Prelude hiding (singleton) x \/ y = RWApp "union" [x, y] singleton x = RWApp "m" [x] cons x y = RWApp "cons" [x, y] multisetOf x = RWApp "toMS" [x] ite a b c = RWApp "ite" [a,b,c] hd x = RWApp "head" [x] tl x = RWApp "tail" [x] isEmpty x = RWApp "isEmpty" [x] empty = RWApp "empty" [] xs = RWApp "xs" [] ys = RWApp "ys" [] expandM xs = multisetOf xs ~> ite (isEmpty xs) empty (singleton (hd xs) \/ multisetOf (tl xs)) userRWs = S.fromList $ [ commutes (\/) `named` "mpComm" , assocL (\/) `named` "mpAssoc" , assocR (\/) `named` "mpAssoc" , (singleton x) \/ (multisetOf y) ~> multisetOf (cons x y) ] evalRWs = S.fromList [ multisetOf (cons x y) ~> (singleton x) \/ (multisetOf y) , expandM xs , expandM ys ] perm1s = "union(m(y), union(toMS(cons(a,xs)),toMS(ys)))" perm1t = "union(m(a), union(toMS(xs), toMS(cons(y,ys))))"