Search papers, labs, and topics across Lattice.
This paper introduces a novel approach to constructing extensible program logics using effect handlers, which simplifies the development and integration of specialized reasoning rules for various program effects. By starting with an expressive logic for a pure, sequential language, the authors demonstrate how to model complex behaviors such as concurrency and crash recovery through operational handlers. The resulting framework not only allows for stronger reasoning rules than existing logics but also facilitates the development of a relational logic for contextual refinements involving effects.
Effect handlers can revolutionize the way we build and extend program logics, enabling stronger reasoning capabilities and easier integration of complex behaviors.
One strategy for reasoning about programs that have certain kinds of effects is to use program logics that provide specialized rules for reasoning about these effects. However, developing program logics requires skills that are distinct from those needed for using program logics, making the development of new logics challenging and less accessible. Moreover, when developing new logics, it can be difficult to reuse components from prior logics or combine support for different effects. In this paper, we propose an approach for operationally building extensible program logics based on effect handlers. Our starting point is an expressive program logic for reasoning about programs written in a pure, sequential language with support for effect handlers. Within this language, we implement handlers that model concurrency, distributed execution, and crash-recovery behavior. Then, by proving properties about these handlers, we extend the program logic and derive expressive rules for reasoning about these effects. In some cases, this approach leads to stronger reasoning rules than those found in prior program logics targeting these features. In addition, we develop a relational logic for proving contextual refinements between programs using effects. As with unary reasoning, handlers enable this relational logic to be developed in an extensible way.