EDBT 2026 Demo / reviewers in the wild / expert
Wouter Swierstra
dblp:96/3469
· DBLP profile ↗
26ranked-venue papers
11as first author
11since 2021 · last 2026
0000-0002-0295-7944ORCID · verified
Domains — the database's venue-derived domains; a paper can count in several
Software engineering, systems software and programming languages · 22 · 11 first-author · 10 since 2021Theory of computation · 4 · 1 since 2021
| Year | Publication | Venue | Position |
|---|---|---|---|
| 2026 | Hole Refinements for Polymorphic Type-and-Example Driven SynthesisabstractMany synthesizers implicitly benefit from using polymorphic types, since parametric polymorphism reduces the search space. Additional synthesis constraints may interfere with parametricity. In particular, a polymorphic type may cause otherwise feasible input-output examples to contradict each other. We present Taxi (type-and-example based inferencer), a tool for efficiently reasoning about the feasibility of polymorphic programs specified by input-output examples, and Driver, a tactic language for top-down program synthesis that uses feasibility reasoning to prune the search space. Taxi guarantees that every search state corresponds to a correct (albeit possibly partial) implementation. In addition, it allows for shortcutting the synthesis when a subspecification covers all cases. We show that these techniques have the potential to speed up top-down enumerative type-and-example driven synthesizers. Niek Mulleners, Johan Jeuring, Wouter Swierstra |
PEPM | 3 |
| 2026 | PLEX: Normalization for Refinement TypesabstractRefinement types often use SMT solvers to automate program verification. However, since SMT solvers are first-order, verification of properties that requires higher-order reasoning is not possible. Proof by Logical Evaluation (PLE) is an algorithm that provides a layer between refinement types and SMT solvers that permits symbolic evaluation of functions, but it lacks support for higher-order reasoning. We introduce PLEX, an extension to PLE, that supports η -expansions, β -reductions, and dependent pattern matching. We prove that PLEX is sound and terminating, describe its implementation in Liquid Haskell, and evaluate it on examples that make essential use of higher-order data, and as such they cannot be handled by PLE. The new PLEX algorithm bridges the gap between higher-order languages and first-order SMT solvers via refinement types. Alessio Ferrarini, Niki Vazou, Wouter Swierstra |
Proc. ACM Program. Lang. | 3 |
| 2025 | Towards type-directed compiler calculationabstractAbstract This paper explores a principled approach to calculating abstract machines and associated compilers, starting from an intrinsically typed interpreter. After deriving a compiler for a simple expression language in some detail, the first steps of this calculation are repeated to derive an optimizing evaluator for the simply typed lambda calculus. Wouter Swierstra |
J. Funct. Program. | 1 |
| 2025 | First-Order LazinessabstractIn strict languages, laziness is typically modeled with explicit thunks that defer a computation until needed and memoize the result. Such thunks are implemented using a closure. Implementing lazy data structures using thunks thus has several disadvantages: closures cannot be printed or inspected during debugging; allocating closures requires additional memory, sometimes leading to poor performance; reasoning about the performance of such lazy data structures is notoriously subtle. These complications prevent wider adoption of lazy data structures, even in settings where they should shine. In this paper, we introduce lazy constructors as a simple first-order alternative to lazy thunks. Lazy constructors enable the thunks of a lazy data structure to be defunctionalized, yielding implementations of lazy data structures that are not only significantly faster but can easily be inspected for debugging. Anton Lorenzen, Daan Leijen, Wouter Swierstra, Sam Lindley |
Proc. ACM Program. Lang. | 3 |
| 2024 | The Functional Essence of Imperative Binary Search TreesabstractAlgorithms on restructuring binary search trees are typically presented in imperative pseudocode. Understandably so, as their performance relies on in-place execution, rather than the repeated allocation of fresh nodes in memory. Unfortunately, these imperative algorithms are notoriously difficult to verify as their loop invariants must relate the unfinished tree fragments being rebalanced. This paper presents several novel functional algorithms for accessing and inserting elements in a restructuring binary search tree that are as fast as their imperative counterparts; yet the correctness of these functional algorithms is established using a simple inductive argument. For each data structure, move-to-root, splay, and zip trees, this paper describes both a bottom-up algorithm using zippers and a top-down algorithm using a novel first-class constructor context primitive. The functional and imperative algorithms are equivalent: we mechanise the proofs establishing this in the Coq proof assistant using the Iris framework. This yields a first fully verified implementation of well known algorithms on binary search trees with performance on par with the fastest implementations in C. Anton Lorenzen, Daan Leijen, Wouter Swierstra, Sam Lindley |
Proc. ACM Program. Lang. | 3 |
| 2024 | Translation certification for smart contractsabstractCompiler correctness is an old problem, but with the emergence of smart contracts on blockchains that problem presents itself in a new light. Smart contracts are self-contained pieces of software that control (valuable) assets in an adversarial environment; once committed to the blockchain, these smart contracts cannot be modified. Smart contracts are typically developed in a high-level contract language and compiled to low-level virtual machine code before being committed to the blockchain. For a smart contract user to trust a given piece of low-level code on the blockchain, they must convince themselves that (a) they are in possession of the matching source code and (b) that the compiler has correctly translated the source code to the given low-level code. Classic approaches to compiler correctness tackle the second point. We argue that translation certification also squarely addresses the first. We describe the proof architecture of a translation certification framework and demonstrate how we can model the compilation pipeline as a sequence of translation relations. We give a detailed account of such relations for most passes of the Plutus Tx compiler, which we formalised in Coq. This approach facilitates a modular verification methodology and is robust in the face of an evolving compiler implementation. Jacco Krijnen, Manuel M. T. Chakravarty, Gabriele Keller, Wouter Swierstra |
Sci. Comput. Program. | 4 |
| 2023 | A correct-by-construction conversion from lambda calculus to combinatory logicabstractAbstract This pearl defines a translation from well-typed lambda terms to combinatory logic, where both the preservation of types and the correctness of the translation are enforced statically. Wouter Swierstra |
J. Funct. Program. | 1 |
| 2023 | FP²: Fully in-Place Functional ProgrammingabstractAs functional programmers we always face a dilemma: should we write purely functional code, or sacrifice purity for efficiency and resort to in-place updates? This paper identifies precisely when we can have the best of both worlds: a wide class of purely functional programs can be executed safely using in-place updates without requiring allocation, provided their arguments are not shared elsewhere. We describe a linear _fully in-place_ (FIP) calculus where we prove that we can always execute such functions in a way that requires no (de)allocation and uses constant stack space. Of course, such a calculus is only relevant if we can express interesting algorithms; we provide numerous examples of in-place functions on datastructures such as splay trees or finger trees, together with in-place versions of merge sort and quick sort. We also show how we can generically derive a map function over _any_ polynomial data type that is fully in-place. Finally, we have implemented the rules of the FIP calculus in the Koka language. Using the Perceus reference counting garbage collection, this implementation dynamically executes FIP functions in-place whenever possible. Anton Lorenzen, Daan Leijen, Wouter Swierstra |
Proc. ACM Program. Lang. | 3 |
| 2022 | Calculating DatastructuresabstractAbstract Where do datastructures come from? This paper explores how to systematically derive implementations ofone-sided flexible arraysfrom a simple reference implementation. Using the dependently typed programming language Agda, each calculation constructs an isomorphic—yet more efficient—datastructure using only a handful of laws relating types and arithmetic. Although these calculations do not generally produce novel datastructures they do give insight into how certain datastructures arise and how different implementations are related. Ralf Hinze, Wouter Swierstra |
MPC | 2 |
| 2022 | A well-known representation of monoids and its application to the function 'vector reverse'abstractAbstract Vectors—or length-indexed lists—are classic example of a dependent type. Yet, most tutorials stay clear of any function on vectors whose definition requires non-trivial equalities between natural numbers to type check. This pearl shows how to write functions, such as vector reverse, that rely on monoidal equalities to be type correct without having to write any additional proofs. These techniques can be applied to many other functions over types indexed by a monoid, written using an accumulating parameter, and even be used to decide arbitrary equalities over monoids ‘for free.’ Wouter Swierstra |
J. Funct. Program. | 1 |
| 2022 | A completely unique account of enumerationabstractHow can we enumerate the inhabitants of an algebraic datatype? This paper explores a datatype generic solution that works for all regular types and indexed families . The enumerators presented here are provably both complete and unique —they will eventually produce every value exactly once—and fair —they avoid bias when composing enumerators. Finally, these enumerators memoise previously enumerated values whenever possible, thereby avoiding repeatedly recomputing recursive results. Cas van der Rest, Wouter Swierstra |
Proc. ACM Program. Lang. | 2 |
| 2020 | Heterogeneous binary random-access lists
Wouter Swierstra |
J. Funct. Program. | 1 |
| 2019 | An efficient algorithm for type-safe structural diffingabstractEffectively computing the difference between two version of a source file has become an indispensable part of software development. The de facto standard tool used by most version control systems is the UNIX diff utility, that compares two files on a line-by-line basis without any regard for the structure of the data stored in these files. This paper presents an alternative datatype generic algorithm for computing the difference between two values of any algebraic datatype. This algorithm maximizes sharing between the source and target trees, while still running in linear time. Finally, this paper demonstrates that by instantiating this algorithm to the Lua abstract syntax tree and mining the commit history of repositories found on GitHub, the resulting patches can often be merged automatically, even when existing technology has failed. Victor Cacciari Miraldo, Wouter Swierstra |
Proc. ACM Program. Lang. | 2 |
| 2019 | A predicate transformer semantics for effects (functional pearl)abstractReasoning about programs that use effects can be much harder than reasoning about their pure counterparts. This paper presents a predicate transformer semantics for a variety of effects, including exceptions, state, non-determinism, and general recursion. The predicate transformer semantics gives rise to a refinement relation that can be used to relate a program to its specification, or even calculate effectful programs that are correct by construction. Wouter Swierstra, Tim Baanen |
Proc. ACM Program. Lang. | 1 |
| 2018 | Verified Timing Transformations in Synchronous Circuits with \lambda \pi -WareabstractWe define a DSL for hardware description, called $$\lambda \pi $$ -Ware, embedded in the dependently-typed language Agda, which makes the DSL well-scoped and well-typed by construction. Other advantages of dependent types are that circuit models can be simulated and verified in the same language, and properties can be proven not only of specific circuits, but of circuit generators describing (infinite) families of circuits. This paper focuses on the relations between circuits computing the same values, but with different levels of statefulness. We define common recursion schemes, in combinational and sequential versions, and express known circuits using these recursion patterns. Finally, we define a notion of convertibility between circuits with different levels of statefulness, and prove the core convertibility property between the combinational and sequential versions of our vector iteration primitive. Circuits defined using the recursion schemes can thus have different architectures with a guarantee of functional equivalence up to timing. João Paulo Pizani Flor, Wouter Swierstra |
ITP | 2 |
| 2018 | Embedding the refinement calculus in Coq
João Alpuim, Wouter Swierstra |
Sci. Comput. Program. | 2 |
| 2017 | Special issue on Programming with Dependent Types EditorialabstractThere has been sustained interest in functional programming languages with dependent types in recent years. The foundations of dependently typed programming can be traced back to Martin–Löf's work in the 1970s. In the past decades, this vision has given rise to the development of proof assistants and functional programming languages based on dependent types. The increased popularity of systems such as Agda, Coq, Idris, and many others, reflects the growing momentum in this research area. After sending out our first call for papers in October 2015, we are happy to accept six articles in this special issue covering a wide spectrum of topics. Wouter Swierstra, Peter Dybjer |
J. Funct. Program. | 1 |
| 2015 | Auto in Agda - Programming Proof Search Using Reflection
Pepijn Kokke, Wouter Swierstra |
MPC | 2 |
| 2013 | A library for polymorphic dynamic typingabstractAbstract This paper presents a library for programming with polymorphic dynamic types in the dependently typed programming language Agda. The resulting library allows dynamically typed values with a polymorphic type to be instantiated to a less general (possibly monomorphic) type without compromising type soundness. Wouter Swierstra, Thomas van Noort |
J. Funct. Program. | 1 |
| 2012 | xmonad in Coq (experience report): programming a window manager in a proof assistantabstractThis report documents the insights gained from implementing the core functionality of xmonad, a popular window manager written in Haskell, in the Coq proof assistant. Rather than focus on verification, this report outlines the technical challenges involved with incorporating Coq code in a Haskell project. Wouter Swierstra |
Haskell | 1 |
| 2011 | Sorted - Verifying the Problem of the Dutch National Flag in AgdaabstractThe problem of the Dutch national flag was formulated by Dijkstra (1976) as follows: There is a row of buckets numbered from 1 to n. It is given that : P1 : each bucket contains one pebble P2 : each pebble is either red, white, or blue . A minicomputer is placed in front of this row of buckets and has to be programmed in such a way that it will rearrange (if necessary) the pebbles in the order of the Dutch national flag . The minicomputer in question should perform this rearrangement using two commands: • swap i j for 1≤ i ≤ n and 1≤ j ≤ n exchanges the pebbles stored in the buckets numbered i and j ; • read ( i ) for 1≤ i ≤ n returns the colour of the pebble currently lying in bucket number i . Dijkstra originally named this operation buck . Wouter Swierstra |
J. Funct. Program. | 1 |
| 2010 | A Tutorial Implementation of a Dependently Typed Lambda CalculusabstractWe present the type rules for a dependently typed core calculus together with a straight-forward implementation in Haskell. We explicitly highlight the changes necessary to shift from a simply-typed lambda calculus to the dependently typed lambda calculus. We also describe how to extend our core language with data types and write several small example programs. The article is accompanied by an executable interpreter and example code that allows immediate experimentation with the system we describe. Andres Löh, Conor McBride, Wouter Swierstra |
Fundam. Informaticae | 3 |
| 2009 | Attribute grammars fly first-class: how to do aspect oriented programming in HaskellabstractAttribute Grammars (AGs), a general-purpose formalism for describing recursive computations over data types, avoid the trade-off which arises when building software incrementally: should it be easy to add new data types and data type alternatives or to add new operations on existing data types? However, AGs are usually implemented as a pre-processor, leaving e.g. type checking to later processing phases and making interactive development, proper error reporting and debugging difficult. Embedding AG into Haskell as a combinator library solves these problems. Marcos Viera, S. Doaitse Swierstra, Wouter Swierstra |
ICFP | 3 |
| 2008 | The power of PiabstractThis paper exhibits the power of programming with dependent types by dint of embedding three domain-specific languages: Cryptol, a language for cryptographic protocols; a small data description language; and relational algebra. Each example demonstrates particular design patterns inherent to dependently-typed programming. Documenting these techniques paves the way for further research in domain-specific embedded type systems. Nicolas Oury, Wouter Swierstra |
ICFP | 2 |
| 2008 | Data types à la carteabstractAbstract This paper describes a technique for assembling both data types and functions from isolated individual components. We also explore how the same technology can be used to combine free monads and, as a result, structure Haskell's monolithic IO monad. Wouter Swierstra |
J. Funct. Program. | 1 |
| 2007 | Beauty in the beastabstractIt can be very difficult to debug impure code, let alone prove its correctness. To address these problems, we provide a functional specification of three central components of Peyton Jones's awkward squad: teletype IO, mutable state, and concurrency. By constructing an internal model of such concepts within our programming language, we can test, debug, and reason about programs that perform IO as if they were pure. In particular, we demonstrate how our specifications may be used in tandem with QuickCheck to automatically test complex pointer algorithms and concurrent programs. Wouter Swierstra, Thorsten Altenkirch |
Haskell | 1 |