Module FlatCurry.Goodies

Author
Sebastian Fischer
Version
November 2020

This library provides selector functions, test and update operations as well as some useful auxiliary functions for FlatCurry data terms. Most of the provided functions are based on general transformation functions that replace constructors with user-defined functions. For recursive datatypes the transformations are defined inductively over the term structure. This is quite usual for transformations on FlatCurry terms, so the provided functions can be used to implement specific transformations without having to explicitly state the recursion. Essentially, the tedious part of such transformations - descend in fairly complex term structures - is abstracted away, which hopefully makes the code more clear and brief.

Exported Datatypes:
Exported Functions:
allVarsallVarsInFuncallVarsInProgallVarsInRuleargTypesbranchExprbranchPatterncaseBranchescaseExprcaseTypecombArgscombNamecombTypeconsArgsconsArityconsNameconsVisibilitydomainfreeExprfreeVarsfuncArgsfuncArityfuncBodyfuncNamefuncRHSfuncRulefuncTypefuncVisibilityisCaseisCombisCombTypeConsCallisCombTypeConsPartCallisCombTypeFuncCallisCombTypeFuncPartCallisConsCallisConsPartCallisConsPatternisExternalisForallTypeisFreeisFuncCallisFuncPartCallisFuncTypeisGroundisLetisLitisOrisRuleExternalisTConsisTVarisTypeDataisTypeNewisTypeSynisVarletBindsletBodyliteralmissingArgsmissingCombArgsnewConsArgnewConsNamenewConsVisibilityopFixityopNameopPrecedenceorExpspatArgspatConspatExprpatLiteralprogFuncsprogImportsprogNameprogOpsprogTypesrangeresultTypernmAllVarsrnmAllVarsInFuncrnmAllVarsInProgrnmAllVarsInRulernmAllVarsInTypeExprrnmProgruleArgsruleBodyruleExtDecltConsArgstConsNametrBranchtrCombTypetrConstrExprtrFunctrNewConstrOptrPatterntrProgtrRuletrTypetrTypeExprtVarIndextypeConsDeclstypeNametypeParamstypeSyntypeVisibilityupdBranchupdBranchesupdBranchExprupdBranchPatternupdCasesupdCombsupdConsupdConsArgsupdConsArityupdConsNameupdConsVisibilityupdForallTypesupdFreesupdFuncupdFuncArgsupdFuncArityupdFuncBodyupdFuncNameupdFuncRuleupdFuncTypeupdFuncTypesupdFuncVisibilityupdLetsupdLiteralsupdNewConsupdNewConsArgupdNewConsNameupdNewConsVisibilityupdOpupdOpFixityupdOpNameupdOpPrecedenceupdOrsupdPatArgsupdPatConsupdPatLiteralupdPatternupdProgupdProgExpsupdProgFuncsupdProgImportsupdProgNameupdProgOpsupdProgTypesupdQNamesupdQNamesInConsDeclupdQNamesInFuncupdQNamesInNewConsDeclupdQNamesInProgupdQNamesInRuleupdQNamesInTypeupdQNamesInTypeExprupdRuleupdRuleArgsupdRuleBodyupdRuleExtDeclupdTConsupdTVarsupdTypeupdTypeConsDeclsupdTypedsupdTypeNameupdTypeNewConsDeclupdTypeParamsupdTypeSynonymupdTypeVisibilityupdVarsvarNr

Exported Datatypes


type Update a b = (b -> b) -> a -> a

Exported Functions


trProg :: (String -> [String] -> [TypeDecl] -> [FuncDecl] -> [OpDecl] -> a) -> Prog -> a  Deterministic 

transform program


progName :: Prog -> String  Deterministic 

get name from program


progImports :: Prog -> [String]  Deterministic 

get imports from program


progTypes :: Prog -> [TypeDecl]  Deterministic 

get type declarations from program


progFuncs :: Prog -> [FuncDecl]  Deterministic 

get functions from program


progOps :: Prog -> [OpDecl]  Deterministic 

get infix operators from program


updProg :: (String -> String) -> ([String] -> [String]) -> ([TypeDecl] -> [TypeDecl]) -> ([FuncDecl] -> [FuncDecl]) -> ([OpDecl] -> [OpDecl]) -> Prog -> Prog  Deterministic 

update program


updProgName :: (String -> String) -> Prog -> Prog  Deterministic 

update name of program


updProgImports :: ([String] -> [String]) -> Prog -> Prog  Deterministic 

update imports of program


updProgTypes :: ([TypeDecl] -> [TypeDecl]) -> Prog -> Prog  Deterministic 

update type declarations of program


updProgFuncs :: ([FuncDecl] -> [FuncDecl]) -> Prog -> Prog  Deterministic 

update functions of program


updProgOps :: ([OpDecl] -> [OpDecl]) -> Prog -> Prog  Deterministic 

update infix operators of program


allVarsInProg :: Prog -> [Int]  Deterministic 

get all program variables (also from patterns)


updProgExps :: (Expr -> Expr) -> Prog -> Prog  Deterministic 

lift transformation on expressions to program


rnmAllVarsInProg :: (Int -> Int) -> Prog -> Prog  Deterministic 

rename programs variables


updQNamesInProg :: ((String, String) -> (String, String)) -> Prog -> Prog  Deterministic 

update all qualified names in program


rnmProg :: String -> Prog -> Prog  Deterministic 

rename program (update name of and all qualified names in program)


trType :: ((String, String) -> Visibility -> [(Int, Kind)] -> [ConsDecl] -> a) -> ((String, String) -> Visibility -> [(Int, Kind)] -> TypeExpr -> a) -> ((String, String) -> Visibility -> [(Int, Kind)] -> NewConsDecl -> a) -> TypeDecl -> a  Deterministic 

transform type declaration


typeName :: TypeDecl -> (String, String)  Deterministic 

get name of type declaration


typeVisibility :: TypeDecl -> Visibility  Deterministic 

get visibility of type declaration


typeParams :: TypeDecl -> [(Int, Kind)]  Deterministic 

get type parameters of type declaration


typeConsDecls :: TypeDecl -> [ConsDecl]  Deterministic 

get constructor declarations from type declaration


typeSyn :: TypeDecl -> TypeExpr  Deterministic 

get synonym of type declaration


isTypeData :: TypeDecl -> Bool  Deterministic 

is type declaration a basic data type?


isTypeSyn :: TypeDecl -> Bool  Deterministic 

is type declaration a type synonym?


isTypeNew :: TypeDecl -> Bool  Deterministic 

is type declaration a newtype?


updType :: ((String, String) -> (String, String)) -> (Visibility -> Visibility) -> ([(Int, Kind)] -> [(Int, Kind)]) -> ([ConsDecl] -> [ConsDecl]) -> (NewConsDecl -> NewConsDecl) -> (TypeExpr -> TypeExpr) -> TypeDecl -> TypeDecl  Deterministic 

update type declaration


updTypeName :: ((String, String) -> (String, String)) -> TypeDecl -> TypeDecl  Deterministic 

update name of type declaration


updTypeVisibility :: (Visibility -> Visibility) -> TypeDecl -> TypeDecl  Deterministic 

update visibility of type declaration


updTypeParams :: ([(Int, Kind)] -> [(Int, Kind)]) -> TypeDecl -> TypeDecl  Deterministic 

update type parameters of type declaration


updTypeConsDecls :: ([ConsDecl] -> [ConsDecl]) -> TypeDecl -> TypeDecl  Deterministic 

update constructor declarations of type declaration


updTypeNewConsDecl :: (NewConsDecl -> NewConsDecl) -> TypeDecl -> TypeDecl  Deterministic 

update newtype constructor declaration of type declaration


updTypeSynonym :: (TypeExpr -> TypeExpr) -> TypeDecl -> TypeDecl  Deterministic 

update synonym of type declaration


updQNamesInType :: ((String, String) -> (String, String)) -> TypeDecl -> TypeDecl  Deterministic 

update all qualified names in type declaration


trCons :: ((String, String) -> Int -> Visibility -> [TypeExpr] -> a) -> ConsDecl -> a  Deterministic 

transform constructor declaration


consName :: ConsDecl -> (String, String)  Deterministic 

get name of constructor declaration


consArity :: ConsDecl -> Int  Deterministic 

get arity of constructor declaration


consVisibility :: ConsDecl -> Visibility  Deterministic 

get visibility of constructor declaration


consArgs :: ConsDecl -> [TypeExpr]  Deterministic 

get arguments of constructor declaration


updCons :: ((String, String) -> (String, String)) -> (Int -> Int) -> (Visibility -> Visibility) -> ([TypeExpr] -> [TypeExpr]) -> ConsDecl -> ConsDecl  Deterministic 

update constructor declaration


updConsName :: ((String, String) -> (String, String)) -> ConsDecl -> ConsDecl  Deterministic 

update name of constructor declaration


updConsArity :: (Int -> Int) -> ConsDecl -> ConsDecl  Deterministic 

update arity of constructor declaration


updConsVisibility :: (Visibility -> Visibility) -> ConsDecl -> ConsDecl  Deterministic 

update visibility of constructor declaration


updConsArgs :: ([TypeExpr] -> [TypeExpr]) -> ConsDecl -> ConsDecl  Deterministic 

update arguments of constructor declaration


updQNamesInConsDecl :: ((String, String) -> (String, String)) -> ConsDecl -> ConsDecl  Deterministic 

update all qualified names in constructor declaration


trNewCons :: ((String, String) -> Visibility -> TypeExpr -> a) -> NewConsDecl -> a  Deterministic 

transform newtype constructor declaration


newConsArg :: NewConsDecl -> TypeExpr  Deterministic 


newConsName :: NewConsDecl -> (String, String)  Deterministic 


newConsVisibility :: NewConsDecl -> Visibility  Deterministic 


updNewCons :: ((String, String) -> (String, String)) -> (Visibility -> Visibility) -> (TypeExpr -> TypeExpr) -> NewConsDecl -> NewConsDecl  Deterministic 

update newtype constructor declaration


updNewConsName :: ((String, String) -> (String, String)) -> NewConsDecl -> NewConsDecl  Deterministic 

update name of newtype constructor declaration


updNewConsVisibility :: (Visibility -> Visibility) -> NewConsDecl -> NewConsDecl  Deterministic 

update visibility of newtype constructor declaration


updNewConsArg :: (TypeExpr -> TypeExpr) -> NewConsDecl -> NewConsDecl  Deterministic 

update argument of newtype constructor declaration


updQNamesInNewConsDecl :: ((String, String) -> (String, String)) -> NewConsDecl -> NewConsDecl  Deterministic 


tVarIndex :: TypeExpr -> Int  Deterministic 

get index from type variable


domain :: TypeExpr -> TypeExpr  Deterministic 

get domain from functional type


range :: TypeExpr -> TypeExpr  Deterministic 

get range from functional type


tConsName :: TypeExpr -> (String, String)  Deterministic 

get name from constructed type


tConsArgs :: TypeExpr -> [TypeExpr]  Deterministic 

get arguments from constructed type


trTypeExpr :: (Int -> a) -> ((String, String) -> [a] -> a) -> (a -> a -> a) -> ([(Int, Kind)] -> a -> a) -> TypeExpr -> a  Deterministic 

transform type expression


isTVar :: TypeExpr -> Bool  Deterministic 

is type expression a type variable?


isTCons :: TypeExpr -> Bool  Deterministic 

is type declaration a constructed type?


isFuncType :: TypeExpr -> Bool  Deterministic 

is type declaration a functional type?


isForallType :: TypeExpr -> Bool  Deterministic 

is type declaration a forall type?


updTVars :: (Int -> TypeExpr) -> TypeExpr -> TypeExpr  Deterministic 

update all type variables


updTCons :: ((String, String) -> [TypeExpr] -> TypeExpr) -> TypeExpr -> TypeExpr  Deterministic 

update all type constructors


updFuncTypes :: (TypeExpr -> TypeExpr -> TypeExpr) -> TypeExpr -> TypeExpr  Deterministic 

update all functional types


updForallTypes :: ([(Int, Kind)] -> TypeExpr -> TypeExpr) -> TypeExpr -> TypeExpr  Deterministic 

update all forall types


argTypes :: TypeExpr -> [TypeExpr]  Deterministic 

get argument types from functional type

Further infos:
  • solution complete, i.e., able to compute all solutions

resultType :: TypeExpr -> TypeExpr  Deterministic 

get result type from (nested) functional type

Further infos:
  • solution complete, i.e., able to compute all solutions

rnmAllVarsInTypeExpr :: (Int -> Int) -> TypeExpr -> TypeExpr  Deterministic 

rename variables in type expression


updQNamesInTypeExpr :: ((String, String) -> (String, String)) -> TypeExpr -> TypeExpr  Deterministic 

update all qualified names in type expression


trOp :: ((String, String) -> Fixity -> Int -> a) -> OpDecl -> a  Deterministic 

transform operator declaration


opName :: OpDecl -> (String, String)  Deterministic 

get name from operator declaration


opFixity :: OpDecl -> Fixity  Deterministic 

get fixity of operator declaration


opPrecedence :: OpDecl -> Int  Deterministic 

get precedence of operator declaration


updOp :: ((String, String) -> (String, String)) -> (Fixity -> Fixity) -> (Int -> Int) -> OpDecl -> OpDecl  Deterministic 

update operator declaration


updOpName :: ((String, String) -> (String, String)) -> OpDecl -> OpDecl  Deterministic 

update name of operator declaration


updOpFixity :: (Fixity -> Fixity) -> OpDecl -> OpDecl  Deterministic 

update fixity of operator declaration


updOpPrecedence :: (Int -> Int) -> OpDecl -> OpDecl  Deterministic 

update precedence of operator declaration


trFunc :: ((String, String) -> Int -> Visibility -> TypeExpr -> Rule -> a) -> FuncDecl -> a  Deterministic 

transform function


funcName :: FuncDecl -> (String, String)  Deterministic 

get name of function


funcArity :: FuncDecl -> Int  Deterministic 

get arity of function


funcVisibility :: FuncDecl -> Visibility  Deterministic 

get visibility of function


funcType :: FuncDecl -> TypeExpr  Deterministic 

get type of function


funcRule :: FuncDecl -> Rule  Deterministic 

get rule of function


updFunc :: ((String, String) -> (String, String)) -> (Int -> Int) -> (Visibility -> Visibility) -> (TypeExpr -> TypeExpr) -> (Rule -> Rule) -> FuncDecl -> FuncDecl  Deterministic 

update function


updFuncName :: ((String, String) -> (String, String)) -> FuncDecl -> FuncDecl  Deterministic 

update name of function


updFuncArity :: (Int -> Int) -> FuncDecl -> FuncDecl  Deterministic 

update arity of function


updFuncVisibility :: (Visibility -> Visibility) -> FuncDecl -> FuncDecl  Deterministic 

update visibility of function


updFuncType :: (TypeExpr -> TypeExpr) -> FuncDecl -> FuncDecl  Deterministic 

update type of function


updFuncRule :: (Rule -> Rule) -> FuncDecl -> FuncDecl  Deterministic 

update rule of function


isExternal :: FuncDecl -> Bool  Deterministic 

is function externally defined?


allVarsInFunc :: FuncDecl -> [Int]  Deterministic 

get variable names in a function declaration


funcArgs :: FuncDecl -> [Int]  Deterministic 

get arguments of function, if not externally defined


funcBody :: FuncDecl -> Expr  Deterministic 

get body of function, if not externally defined


funcRHS :: FuncDecl -> [Expr]  Deterministic 

Further infos:
  • partially defined

rnmAllVarsInFunc :: (Int -> Int) -> FuncDecl -> FuncDecl  Deterministic 

rename all variables in function


updQNamesInFunc :: ((String, String) -> (String, String)) -> FuncDecl -> FuncDecl  Deterministic 

update all qualified names in function


updFuncArgs :: ([Int] -> [Int]) -> FuncDecl -> FuncDecl  Deterministic 

update arguments of function, if not externally defined


updFuncBody :: (Expr -> Expr) -> FuncDecl -> FuncDecl  Deterministic 

update body of function, if not externally defined


trRule :: ([Int] -> Expr -> a) -> (String -> a) -> Rule -> a  Deterministic 

transform rule


ruleArgs :: Rule -> [Int]  Deterministic 

get rules arguments if it's not external


ruleBody :: Rule -> Expr  Deterministic 

get rules body if it's not external


ruleExtDecl :: Rule -> String  Deterministic 

get rules external declaration


isRuleExternal :: Rule -> Bool  Deterministic 

is rule external?


updRule :: ([Int] -> [Int]) -> (Expr -> Expr) -> (String -> String) -> Rule -> Rule  Deterministic 

update rule


updRuleArgs :: ([Int] -> [Int]) -> Rule -> Rule  Deterministic 

update rules arguments


updRuleBody :: (Expr -> Expr) -> Rule -> Rule  Deterministic 

update rules body


updRuleExtDecl :: (String -> String) -> Rule -> Rule  Deterministic 

update rules external declaration


allVarsInRule :: Rule -> [Int]  Deterministic 

get variable names in a functions rule


rnmAllVarsInRule :: (Int -> Int) -> Rule -> Rule  Deterministic 

rename all variables in rule


updQNamesInRule :: ((String, String) -> (String, String)) -> Rule -> Rule  Deterministic 

update all qualified names in rule


trCombType :: a -> (Int -> a) -> a -> (Int -> a) -> CombType -> a  Deterministic 

transform combination type


isCombTypeFuncCall :: CombType -> Bool  Deterministic 

is type of combination FuncCall?


isCombTypeFuncPartCall :: CombType -> Bool  Deterministic 

is type of combination FuncPartCall?


isCombTypeConsCall :: CombType -> Bool  Deterministic 

is type of combination ConsCall?


isCombTypeConsPartCall :: CombType -> Bool  Deterministic 

is type of combination ConsPartCall?


missingArgs :: CombType -> Int  Deterministic 


varNr :: Expr -> Int  Deterministic 

get internal number of variable


literal :: Expr -> Literal  Deterministic 

get literal if expression is literal expression


combType :: Expr -> CombType  Deterministic 

get combination type of a combined expression


combName :: Expr -> (String, String)  Deterministic 

get name of a combined expression


combArgs :: Expr -> [Expr]  Deterministic 

get arguments of a combined expression


missingCombArgs :: Expr -> Int  Deterministic 

get number of missing arguments if expression is combined


letBinds :: Expr -> [(Int, Expr)]  Deterministic 

get indices of variables in let declaration


letBody :: Expr -> Expr  Deterministic 

get body of let declaration


freeVars :: Expr -> [Int]  Deterministic 

get variable indices from declaration of free variables


freeExpr :: Expr -> Expr  Deterministic 

get expression from declaration of free variables


orExps :: Expr -> [Expr]  Deterministic 

get expressions from or-expression


caseType :: Expr -> CaseType  Deterministic 

get case-type of case expression


caseExpr :: Expr -> Expr  Deterministic 

get scrutinee of case expression


caseBranches :: Expr -> [BranchExpr]  Deterministic 

get branch expressions from case expression


isVar :: Expr -> Bool  Deterministic 

is expression a variable?


isLit :: Expr -> Bool  Deterministic 

is expression a literal expression?


isComb :: Expr -> Bool  Deterministic 

is expression combined?


isLet :: Expr -> Bool  Deterministic 

is expression a let expression?


isFree :: Expr -> Bool  Deterministic 

is expression a declaration of free variables?


isOr :: Expr -> Bool  Deterministic 

is expression an or-expression?


isCase :: Expr -> Bool  Deterministic 

is expression a case expression?


trExpr :: (Int -> a) -> (Literal -> a) -> (CombType -> (String, String) -> [a] -> a) -> ([(Int, a)] -> a -> a) -> ([Int] -> a -> a) -> (a -> a -> a) -> (CaseType -> a -> [b] -> a) -> (Pattern -> a -> b) -> (a -> TypeExpr -> a) -> Expr -> a  Deterministic 

transform expression


updVars :: (Int -> Expr) -> Expr -> Expr  Deterministic 

update all variables in given expression


updLiterals :: (Literal -> Expr) -> Expr -> Expr  Deterministic 

update all literals in given expression


updCombs :: (CombType -> (String, String) -> [Expr] -> Expr) -> Expr -> Expr  Deterministic 

update all combined expressions in given expression


updLets :: ([(Int, Expr)] -> Expr -> Expr) -> Expr -> Expr  Deterministic 

update all let expressions in given expression


updFrees :: ([Int] -> Expr -> Expr) -> Expr -> Expr  Deterministic 

update all free declarations in given expression


updOrs :: (Expr -> Expr -> Expr) -> Expr -> Expr  Deterministic 

update all or expressions in given expression


updCases :: (CaseType -> Expr -> [BranchExpr] -> Expr) -> Expr -> Expr  Deterministic 

update all case expressions in given expression


updBranches :: (Pattern -> Expr -> BranchExpr) -> Expr -> Expr  Deterministic 

update all case branches in given expression


updTypeds :: (Expr -> TypeExpr -> Expr) -> Expr -> Expr  Deterministic 

update all typed expressions in given expression


isFuncCall :: Expr -> Bool  Deterministic 

is expression a call of a function where all arguments are provided?


isFuncPartCall :: Expr -> Bool  Deterministic 

is expression a partial function call?


isConsCall :: Expr -> Bool  Deterministic 

is expression a call of a constructor?


isConsPartCall :: Expr -> Bool  Deterministic 

is expression a partial constructor call?


isGround :: Expr -> Bool  Deterministic 

is expression fully evaluated?


allVars :: Expr -> [Int]  Deterministic 

get all variables (also pattern variables) in expression


rnmAllVars :: (Int -> Int) -> Expr -> Expr  Deterministic 

rename all variables (also in patterns) in expression


updQNames :: ((String, String) -> (String, String)) -> Expr -> Expr  Deterministic 

update all qualified names in expression


trBranch :: (Pattern -> Expr -> a) -> BranchExpr -> a  Deterministic 

transform branch expression


branchPattern :: BranchExpr -> Pattern  Deterministic 

get pattern from branch expression


branchExpr :: BranchExpr -> Expr  Deterministic 

get expression from branch expression


updBranch :: (Pattern -> Pattern) -> (Expr -> Expr) -> BranchExpr -> BranchExpr  Deterministic 

update branch expression


updBranchPattern :: (Pattern -> Pattern) -> BranchExpr -> BranchExpr  Deterministic 

update pattern of branch expression


updBranchExpr :: (Expr -> Expr) -> BranchExpr -> BranchExpr  Deterministic 

update expression of branch expression


trPattern :: ((String, String) -> [Int] -> a) -> (Literal -> a) -> Pattern -> a  Deterministic 

transform pattern


patCons :: Pattern -> (String, String)  Deterministic 

get name from constructor pattern


patArgs :: Pattern -> [Int]  Deterministic 

get arguments from constructor pattern


patLiteral :: Pattern -> Literal  Deterministic 

get literal from literal pattern


isConsPattern :: Pattern -> Bool  Deterministic 

is pattern a constructor pattern?


updPattern :: ((String, String) -> (String, String)) -> ([Int] -> [Int]) -> (Literal -> Literal) -> Pattern -> Pattern  Deterministic 

update pattern


updPatCons :: ((String, String) -> (String, String)) -> Pattern -> Pattern  Deterministic 

update constructors name of pattern


updPatArgs :: ([Int] -> [Int]) -> Pattern -> Pattern  Deterministic 

update arguments of constructor pattern


updPatLiteral :: (Literal -> Literal) -> Pattern -> Pattern  Deterministic 

update literal of pattern


patExpr :: Pattern -> Expr  Deterministic 

build expression from pattern