packages feed

g2-0.2.0.0: src/G2/Equiv/InitRewrite.hs

module G2.Equiv.InitRewrite (initWithRHS, initWithLHS) where

import G2.Language
import qualified G2.Language.ExprEnv as E
import qualified G2.Language.Typing as T
import qualified G2.Language.Expr as X

import G2.Execution.Memory

initWithRHS :: State t -> Bindings -> RewriteRule -> (State t, Bindings)
initWithRHS s b r =
  let s' = s {
             curr_expr = CurrExpr Evaluate (ru_rhs r)
           , expr_env = foldr E.insertSymbolic (expr_env s) (ru_bndrs r)
           }
      b' = b { input_names = map idName $ ru_bndrs r }
  in
  markAndSweepPreserving emptyMemConfig s' b'

initWithLHS :: State t -> Bindings -> RewriteRule -> (State t, Bindings)
initWithLHS s b r =
  -- make LHS into a single expr
  let f_name = ru_head r
      f_maybe = E.lookup f_name (expr_env s)
  in
  case f_maybe of
    Nothing -> error "function name not found"
    Just f -> let t = T.typeOf f
                  i = Id f_name t
                  v = Var i
                  app = X.mkApp (v:ru_args r)
                  s' = s {
                         curr_expr = CurrExpr Evaluate app
                       , expr_env = foldr E.insertSymbolic (expr_env s) (ru_bndrs r)
                       }
                  b' = b { input_names = map idName $ ru_bndrs r }
              in
              markAndSweepPreserving emptyMemConfig s' b'