We discuss a framework for the application of abstract interpretation as an aid during program development, rather than in the more traditional application of program optimization. Program validation and detection of errors is first performed statically by comparing (partial) specifications written in terms of assertions against information obtained from (global) static analysis of the program. The results of this process are expressed in the user assertion language. Assertions (or parts of assertions) which cannot be checked statically are translated into run-time tests. The framework allows the use of assertions to be optional. It also allows using very general properties in assertions, beyond the predefined set understandable by the static analyzer and including properties defined by user programs. We also report briefly on an implementation of the framework. The resulting tool generates and checks assertions for Prolog, CLP(R), and CHIP/CLP(fd) programs, and integrates compile-time and run-time checking in a uniform way. The tool allows using properties such as types, modes, non-failure, determinacy, and computational cost, and can treat modules separately, performing incremental analysis. Contents 1 Introduction 1 2 Overall Framework Architecture and Operation 2.1 Check Assertions 2.2 Run-time checking of assertions 2.3 Compile-time checking of assertions 3 The Assertion Language 3.1 Assertions on Success States 3.2 Assertions Restricted to a Subset of the Calis 3.3 Assertions on Cali States 3.4 Assertions on the Computation of Predicates 4 Defining Properties 4.1 Writing Properties of Execution States: Compatibility Vs. Instantiation Properties 4.2 Writing Properties of Computations 11 5 A Simple Run-time Checking Scheme 11 5.1 Properties 11 5.2 Success Assertions 5.3 Calis Assertions 5.4 Comp Assertions 6 Compile-Time Checking 7 A Sample Debugging Session with the CIAO System 8 A Preliminary Experimental Evaluation 9 Discussion 21 References 23