Types for representing ICurry programs
Author: Marc Andre Wittorf
An Extended assignment
              Type synonym: IEAssign = (IVarIndex,IEExpr)
            
An Extended module
Constructors:
IEProg
                    ::  String ->  [String] ->  [IEDataType] ->  [IEFunction] -> IEProg
              
              Type synonym: IEQName = (IQName,Int)
            
An Extended visibility
Constructors:
Public
                    :: IEVisibility
                : Visible and usable from other modules
              Private
                    :: IEVisibility
                : Invisible and not usable from other modules
              An Extended data type
              Type synonym: IEDataType = (IEQName,IEVisibility,[ITVarIndex],[IEConstructor])
            
An Extended constructor
Constructors:
IEConstructor
                    ::  IEQName ->  IEVisibility ->  [IETExpr] -> IEConstructor
              An Extended type expression
Constructors:
IETVar
                    ::  ITVarIndex -> IETExpr
                : a type argument
              IETFunc
                    ::  IETExpr ->  IETExpr -> IETExpr
                : a functional type
              IETCons
                    ::  IEQName ->  [IETExpr] -> IETExpr
                : a type application
              An Extended function
Constructors:
IEFunction
                    ::  IEQName ->  IEVisibility ->  IEFuncBody -> IEFunction
              An Extended function's behavior
Constructors:
IEExternal
                    ::  IArity ->  String -> IEFuncBody
                : the function is externally defined
              IEFuncBody
                    ::  [IVarIndex] ->  IEBlock -> IEFuncBody
                : the function is defined here
              An Extended block
Constructors:
IESimpleBlock
                    ::  [IEAssign] ->  IEExpr -> IEBlock
                : unconditional evaluation
              IECaseConsBlock
                    ::  [IEAssign] ->  IVarIndex ->  [IEConsBranch] -> IEBlock
                : conditional evaluation over constructor terms
              IECaseLitBlock
                    ::  [IEAssign] ->  IVarIndex ->  [IELitBranch] -> IEBlock
                : conditional evaluation over literals
              An Extended branch over constructors
Constructors:
An Extended branch over literals
Constructors:
An Extended expression
Constructors:
IEVar
                    ::  IVarIndex -> IEExpr
                : a variable
              IELit
                    ::  ILiteral -> IEExpr
                : a literal
              IEFCall
                    ::  IEQName ->  [IEExpr] -> IEExpr
                : a function call
              IECCall
                    ::  IEQName ->  [IEExpr] -> IEExpr
                : a constructor call
              IEOr
                    ::  [IEExpr] -> IEExpr
                : -deterministic choice