CurryInfo: call-analysis-3.2.0 / Overlapping

classes: Info
 
documentation: Info
 
---------------------------------------------------------------------------
Overlapping analysis:
check whether functions are defined with overlapping left-hand sides
(i.e., whether they are defined with OR expressions)

Michael Hanus, February 2012
---------------------------------------------------------------------------
name: Info
 Overlapping
operations: Info
 isOverlappingFunction orInExpr
sourcecode: Info
 

module Overlapping(isOverlappingFunction,orInExpr) where

import FlatCurry.Types

------------------------------------------------------------------------------
-- The overlapping analysis can be applied to individual functions.
-- It assigns to a FlatCurry function definition a flag which is True
-- if this function is defined with overlapping left-hand sides.

isOverlappingFunction :: FuncDecl -> Bool
isOverlappingFunction (Func _ _ _ _ (Rule _ e))   = orInExpr e
isOverlappingFunction (Func _ _ _ _ (External _)) = False

--------------------------------------------------------------------------
-- Check an expression for occurrences of OR:
orInExpr :: Expr -> Bool
orInExpr (Var _) = False
orInExpr (Lit _) = False
orInExpr (Comb _ f es) = f==("Prelude","?") || foldr (||) False (map orInExpr es)
orInExpr (Free _ e) = orInExpr e
orInExpr (Let bs e) = any orInExpr (map snd bs) || orInExpr e
orInExpr (Or _ _) = True
orInExpr (Case _ e bs) = orInExpr e || any orInBranch bs
                   where orInBranch (Branch _ be) = orInExpr be
types: Info
 
unsafe: Info
 safe