We address the problem of verifying that the functions of a program meet
their contracts, specified by pre/postconditions. We follow an approach based
on constrained Horn clauses (CHCs) by which the verification problem is reduced
to the problem of checking satisfiability of a set of clauses derived from the
given program and contracts. We consider programs that manipulate algebraic
data types (ADTs) and a class of contracts specified by catamorphisms, that is,
functions defined by simple recursion schemata on the given ADTs. We show by
several examples that state-of-the-art CHC satisfiability tools are not
effective at solving the satisfiability problems obtained by direct translation
of the contracts into CHCs. To overcome this difficulty, we propose a
transformation technique that removes the ADT terms from CHCs and derives new
sets of clauses that work on basic sorts only, such as integers and booleans.
Thus, when using the derived CHCs there is no need for induction rules on ADTs.
We prove that the transformation is sound, that is, if the derived set of CHCs
is satisfiable, then so is the original set. We also prove that the
transformation always terminates for the class of contracts specified by
catamorphisms. Finally, we present the experimental results obtained by an
implementation of our technique when verifying many non-trivial contracts for
ADT manipulating programs.Comment: Paper presented at the 38th International Conference on Logic
Programming (ICLP 2022), 16 pages; added Journal reference and related DO