packages feed

compdata-0.13.1: benchmark/Functions/Standard/FreeVars.hs

module Functions.Standard.FreeVars where

import DataTypes.Standard
import Data.Generics.Uniplate.Direct

instance Uniplate PExpr where
    uniplate (PInt x) = plate PInt |- x
    uniplate (PBool x) = plate PBool |- x
    uniplate (PPair x y) = plate PPair |* x |* y
    uniplate (PMult x y) = plate PMult |* x |* y
    uniplate (PPlus x y) = plate PPlus |* x |* y
    uniplate (PIf x y z) = plate PIf |* x |* y |* z
    uniplate (PEq x y) = plate PEq |* x |* y
    uniplate (PLt x y) = plate PLt |* x |* y
    uniplate (PAnd x y) = plate PAnd |* x |* y
    uniplate (PNot x) = plate PNot |* x
    uniplate (PProj x y) = plate PProj |- x |* y
    uniplate (PNeg x) = plate PNeg |* x
    uniplate (PMinus x y) = plate PMinus |* x |* y
    uniplate (PGt x y) = plate PGt |* x |* y
    uniplate (POr x y) = plate POr |* x |* y
    uniplate (PImpl x y) = plate PImpl |* x |* y


contVar :: Int -> PExpr -> Bool
contVar v e = 
    case e of
      PInt i -> i == v
      PBool{} -> False
      PPair x y -> re x || re y
      PPlus x y -> re x || re y
      PMult x y -> re x || re y
      PIf x y z -> re x || re y || re z
      PEq x y -> re x || re y
      PLt x y -> re x || re y
      PAnd x y -> re x || re y
      PNot x -> re x
      PProj _ x -> re x
      PNeg x -> re x
      PMinus x y -> re x || re y
      PGt x y -> re x || re y
      POr x y -> re x || re y
      PImpl x y -> re x || re y
    where re = contVar v

freeVars :: PExpr -> [Int]
freeVars e = 
    case e of
      PInt i -> [i]
      PBool{} -> []
      PPair x y -> re2 x y
      PPlus x y -> re2 x y
      PMult x y -> re2 x y
      PIf x y z -> re3 x y z
      PEq x y -> re2 x y
      PLt x y -> re2 x y
      PAnd x y -> re2 x y
      PNot x -> re x
      PProj _ x -> re x
      PNeg x -> re x
      PMinus x y -> re2 x y
      PGt x y -> re2 x y
      POr x y -> re2 x y
      PImpl x y -> re2 x y
    where re = freeVars
          re2 x y = re x ++ re y
          re3 x y z = re x ++ re y ++ re z

contVarGen :: Int -> PExpr -> Bool
contVarGen v e = elem v [ j | (PInt j) <- universe e]

freeVarsGen :: PExpr -> [Int]
freeVarsGen e = [ j | (PInt j) <- universe e]