{-# LANGUAGE OverloadedStrings #-}
module Arith where
import DSL
import Language.REST.Internal.Rewrite (Rewrite)
import Language.REST.MetaTerm
import Language.REST.Op
import qualified Data.HashSet as S
neg :: MetaTerm -> MetaTerm
neg x1 = RWApp (Op "neg") [x1]
double :: MetaTerm -> MetaTerm
double x1 = RWApp (Op "double") [x1]
twicePlus :: MetaTerm -> MetaTerm -> MetaTerm
twicePlus x1 y1 = RWApp (Op "twicePlus") [x1, y1]
(<#) :: MetaTerm -> MetaTerm -> MetaTerm
x1 <# y1 = RWApp (Op "<") [x1, y1]
evalRWs :: S.HashSet Rewrite
evalRWs =
S.fromList
[
suc' x <# suc' y ~> x <# y
, suc' x #+ y ~> suc' (x #+ y)
, zero' #+ x ~> x
, suc' x #* y ~> y #+ (x #* y)
, zero' #* y ~> zero'
, ack' zero' x ~> suc' x
, ack' (suc' x) zero' ~> ack' x one'
, ack' (suc' x) (suc' y) ~> ack' x (ack' (suc' x) y)
, double x ~> x #+ x
, twicePlus x y ~> (x #+ x) #+ y
]
userRWs :: S.HashSet Rewrite
userRWs =
S.fromList $
[ x #+ y ~> y #+ x
, x #* y ~> y #* x
, (x #+ y) #* v ~> (x #* v) #+ (y #* v)
, neg x #+ x ~> zero'
-- , (x #* v) #+ (y #* v) ~> (x #+ y) #* v
-- , x ~> x #+ zero'
] ++ [ x #+ (y #+ v) ~> (x #+ y) #+ v]