An abstract interpretation framework for semantics and diagnosis of Lazy functional-logic languages

interpretation [29, 31], a technique for constructing verified analyses of program execution behavior, has been extensively applied to logic programming [57, 67, 44, 23]. The relevant feature of abstract interpretation is that, once the property intended to be observed has been modeled by an abstract domain, we have a methodology to systematically derive an abstract semantics, which in turn allows us to effectively compute a (correct) approximation of the property. By using this approach, most of the theoremproving, in the logical theory involved in program verification, boils down to computing on the abstract domain. This is obtained in general at the expense of precision. A program analysis is viewed as a non-standard, abstract semantics defined over a domain of data description. An abstract semantics is constructed by replacing operations in a suitable concrete semantics with the corresponding abstract operations defined on data descriptions, namely, abstract domains. Such domains are called abstract because they abstract, from the concrete computation domain, the properties of interest. The definition of an appropriate concrete semantics, capable of modeling those program properties of interest, is a key point in abstract interpretation [29] and semantic-based data-flow analysis. Program analyses are then defined by providing finitely computable abstract interpretations which preserve interesting aspects of program behavior. Formal justification of program analyses is reduced to proving conditions on the relation between data and data descriptions and on the elementary operations defined on the data description. In program analysis, abstract interpretation theory is often used to establish the correctness of specific analysis algorithms and abstract domains. We are more concerned instead in its application to the systematic derivation of the (optimal) abstract semantics from the abstract domain. Abstract interpretation is inherently semantic sensitive and different semantic definition styles lead to different approaches to program analysis, the main are the top-down and the bottom-up approaches. In the case of functional logic programs, the most popular approach is the top-down, which propagates the information as narrowing does. In this class there are ad hoc algorithms, frameworks based on an operational semantics and frameworks based on a denotational semantics. The bottom-up approach propagates the information as in the computation of the least fixpoint of the immediate consequence operator. The main difference between the top-down and the bottom-up approach is usually related to goal dependency. In particular, a top-down analysis starts with a specific goal, while the bottom-up approach determines an approximation of properties of programs which is goal independent. Note, however, that goal-independent (concrete and abstract) semantics can also be defined in a top-down way. I.4 Program debugging The time and effort spent on validation of computer programs is known to take well over half of the total time for software development. Debugging is an essential ingredient in software development. Indeed the testing phase may also arise after the installation of the software and throughout its lifetime. An advantage of declarative languages is that they facilitate declarative programming. They make it possible, at least to a certain extent,