{-# LANGUAGE OverloadedStrings #-}
module Arith where
import Data.Text
import DSL
import Language.REST.MetaTerm
import Language.REST.Op
import qualified Data.HashSet as S
neg x = RWApp (Op "neg") [x]
double x = RWApp (Op "double") [x]
twicePlus x y = RWApp (Op "twicePlus") [x, y]
evalRWs =
S.fromList
[ (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.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]