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]