This package contains an initial prototype for analyzing call patterns in Curry programs. This analysis is described in this paper:
Michael Hanus: Call Pattern Analysis for Functional Logic Programs, Proc. of the 10th International ACM SIGPLAN Conference on Principles and Practice of Declarative Programming (PPDP'08), ACM Press, pp. 67-78, 2008
Moreover, the package contains also a transformation tool to improve lazy non-deterministic computations by a demand analysis, which is described in this paper:
Michael Hanus: Improving Lazy Non-Deterministic Computations by Demand Analysis, Technical Communications of the 28th International Conference on Logic Programming (ICLP 2012), Leibniz International Proceedings in Informatics (LIPIcs), vol. 17, pp. 130-143, 2012
After installing this package, use the command
curry-calls to analyze and transform your program.
The implementation contains an analysis with depth-bounded terms. The default depth bound is 2. It can be changed to
curry-calls -d <k> prog.
Currently, the main program must contain all rules, i.e., no modules are imported for the program analysis. In particular, primitive functions must be also defined in the program file (compare
For examples containing higher-order applications (compare
benchmarks_callpattern/mapadddouble.curry), rules to define an higher-order application operator "apply" are implicitly generated.
Some modules in the directory
Analysis.curry: The main analysis implementation.
TRS.curry: Some basic definitions to deal with term rewriting systems.
ReadFlatTRS.curry: An implementation of an I/O action to read a Curry program and return the corresponding rewrite rules.
OrCaseLifter.curry: A transformation on FlatCurry program that removes deeply nested case expressions by introducing auxiliary functions. Used by ReadFlatTRS.