@ARTICLE{Hanus20FI,
author       = {Hanus, M.},
title        = {Combining Static and Dynamic Contract Checking for Curry},
year         = {2020},
journal      = {Fundamenta Informaticae},
number       = {4},
pages        = {285-314},
volume       = {173},
abstract = {
Static type systems are usually not sufficient to express all
requirements on function calls.  Hence, contracts with pre- and
postconditions can be used to express more complex constraints on
operations.  Contracts can be checked at run time to ensure that
operations are only invoked with reasonable arguments and return
intended results.  Although such dynamic contract checking
provides more reliable program execution, it requires execution
time and could lead to program crashes that might be detected
with more advanced methods at compile time.  To improve this
situation for declarative languages, we present an approach to
combine static and dynamic contract checking for the functional
logic language Curry.  Based on a formal model of contract
checking for functional logic programming, we propose an
automatic method to verify contracts at compile time.  If a
contract is successfully verified, it can be omitted from dynamic
checking.  This method decreases execution time without degrading
reliable program execution.  In the best case, when all contracts
are statically verified, it provides trust in the software since
crashes due to contract violations cannot occur during program
execution.
}
}
