Reference. A Logical Approach to Type Soundness
Type soundness, which asserts that “well-typed programs cannot go wrong,” is widely viewed as the canonical theorem one must prove to establish that a type system is doing its job. It is commonly proved using the so-called syntactic approach (also known as progress and preservation ), which has had a huge impact on the study and teaching of programming language foundations. Unfortunately, syntactic type soundness is a rather weak theorem. It only applies to programs that are well typed in their entirety and thus tells us nothing about the many programs written in “safe” languages that make use of “unsafe” language features. Even worse, it tells us nothing about whether type systems achieve one of their main goals: enforcement of data abstraction. One can easily define a language that enjoys syntactic type soundness and yet fails to support even the most basic modular reasoning principles for abstraction mechanisms like closures, objects, and abstract data types. Given these concerns, we argue that programming languages researchers should no longer be satisfied with proving syntactic type soundness and should instead start proving semantic type soundness , a more useful theorem that captures more accurately what type systems are actually good for. Semantic type soundness is an old idea—Milner’s original account of type soundness from 1978 was semantic—but it fell out of favor in the 1990s due to limitations and complexities of denotational models. In the succeeding decades, thanks to a series of technical advances—notably, step-indexed Kripke logical relations constructed over operational semantics and higher-order concurrent separation logic as consolidated in the Iris framework in Coq—we can now build (machine-checked) semantic soundness proofs at a much higher level of abstraction than was previously possible. The resulting “logical” approach to semantic type soundness has already been employed to great effect in a number of recent papers, but those papers typically (a) concern advanced problem scenarios that complicate the presentation, (b) assume significant prior knowledge of the reader, and (c) suppress many details of the proofs. Here, we aim to provide a gentler, more pedagogically motivated introduction to logical type soundness, targeted at a broader audience that may or may not be familiar with logical relations and Iris. As a bonus, we also show how logical type soundness proofs can easily be generalized to establish an even stronger relational property— representation independence —for realistic type systems.
Cite
Cited by (9)
Revisiting Soundness for Occurrence Typing, Semantically fu-2026-revisiting
Over the past two decades, numerous systems have brought some of the benefits of dependent typing to a wide variety of new programming languages, often by restricting which terms can appear inside types. Such techniques are known as refinement types, occurrence typing, liquid types, and path dependent types, among others. However, the restrictions adopted by these systems often break the substitution property, because they explicitly disallow the ability to substitute arbitrary terms for variables inside types. This leads to significant complexity in the design and metatheory of these systems, increasing the possibility of significant errors. We consider a specific line of work on occurrence typing, namely, the calculus underlying Typed Racket due to Tobin-Hochstadt and Felleisen 2010. We show that the fundamental challenge of substitution into types resulted in multiple flaws in the formalism and the syntactic type soundness theorem of this work. These flaws are replicated in several other papers building on this work, and also surface as a soundness bug in Typed Racket itself. We identify and repair these problems, revising the core calculus of Typed Racket and giving a semantic type soundness proof using step-indexed logical relations, formalized in Lean. We argue that this approach is simpler than it may seem, and easily scales to handle the complexity of the occurrence typing in Typed Racket.
Yarrow: Reconciling Effect Handlers and Region-Based Memory Management mathiasen-2026-yarrow
We present a new ML-like programming language Yarrow with algebraic effects and region-based memory management. Reconciling these programming language features into one language is challenging: the non-local control flow of algebraic effects break the stack discipline of function calls and returns that region-based memory management relies on, and multi-shot effect handlers break the invariant that regions can be exited at most once. We present a program logic, called Yarrow Logic (YL), that supports safe and modular reasoning about regions in the presence of one-shot and multi-shot effect handlers. We prove the logic sound w.r.t. the operational semantics of Yarrow which is inspired by the runtime of OCaml but refined for regions. We use YL to prove correctness of a number of case studies with algebraic effects, including checkpointing, asynchronous computation and a LIFO data structure implementation. Since all memory locations used in these case studies are allocated in regions, these case studies avoid using the less efficient garbage collected heap memory. We have formalized Yarrow’s operational semantics, the Yarrow program logic, and all our case studies using the Iris separation logic framework on top of the Rocq Prover.
Contextual Refinement of Higher-Order Concurrent Probabilistic Programs li-2026-contextual
We present Foxtrot, the first higher-order separation logic for proving contextual refinement of higherorder concurrent probabilistic programs with higher-order local state. From a high level, Foxtrot inherits various concurrency reasoning principles from standard concurrent separation logic, e.g. invariants and ghost resources, and supports advanced probabilistic reasoning principles for reasoning about complex probability distributions induced by concurrent threads, e.g. tape presampling and induction by error amplification. The integration of these strong reasoning principles is highly non-trivial due to the combination of probability and concurrency in the language and the complexity of the Foxtrot model; the soundness of the logic relies on a version of the axiom of choice within the Iris logic, which is not used in earlier work on Iris-based logics. We demonstrate the expressiveness of Foxtrot on a wide range of examples, including the adversarial von Neumann coin and the randombytes_uniform function of the Sodium cryptography software library. All results have been mechanized in the Rocq proof assistant and the Iris separation logic framework.
Security Reasoning via Substructural Dependency Tracking gouni-2026-security
Substructural type systems provide the ability to speak about resources . By enforcing usage restrictions on inputs to computations they allow programmers to reify limited system units–such as memory–in types. We demonstrate a new form of resource reasoning founded on constraining outputs and explore its utility for practical programming. In particular, we identify a number of disparate programming features explored largely in the security literature as various fragments of our unified framework. These encompass capabilities, quantitative information leakage, sandboxing in the style of the Linux seccomp interface, authorization protocols, and more. We furthermore explore its connection to conventional input-based resource reasoning, casting it as an internal treatment of the constructive Kripke semantics of substructural logics. We verify the capability, quantity, and protocol safety of our system through a single logical relations argument. In doing so, we take the first steps towards obtaining the ultimate multitool for security reasoning.
Context-Dependent Effects and Concurrency in Guarded Interaction Trees stepanenko-2025-context
Guarded Interaction Trees are a structure and a fully formalized framework for representing higher-order computations with higher-order effects in Rocq. We present an extension of Guarded Interaction Trees to support formal reasoning about context-dependent effects. That is, effects whose behaviors depend on the evaluation context, e.g., call/cc, shift and reset. Using and reasoning about such effects is challenging since certain compositionality principles no longer hold in the presence of such effects. For example, the so-called “bind rule” in modern program logics is no longer valid. The goal of our extension is to support representation and reasoning about context-dependent effects in the most painless way possible. To that end, our extension is conservative: the reasoning principles for context-independent effects remain the same. We use it to give direct-style denotational semantics for higher-order programming languages with call/cc and with delimited continuations. We extend the program logic for Guarded Interaction Trees to account for context-dependent effects, and we use the program logic to prove that the denotational semantics is adequate with respect to the operational semantics. Additionally, we retain the ability to combine multiple effects in a modular way, which we demonstrate by showing type soundness for safe interoperability of a programming language with delimited continuations and a programming language with higher-order store. Furthermore, as another contribution, in addition to context-dependent effects, we show how to extend Guarded Interaction Trees with preemptive concurrency. To support implementation and verification of concurrent data structures and algorithms in the presence of preemptive concurrency one requires atomic state modification operations, e.g., compare-and-exchange.
Mechanizing a Proof-Relevant Logical Relation for Timed Message-Passing Protocols zhang-2025-mechanizing
Semantic typing has become a powerful tool for program verification, applying the technique of logical relations as not only a proof method, but also a device for prescribing program behavior. In recent work, Yao et al. scaled semantic typing to the verification of timed message-passing protocols, which are prevalent in, e.g., IoT and real-time systems applications. The appeal of semantic typing in this context is precisely because of its ability to support typed and untyped program components alike – including physical objects – which caters to the heterogeneity of these applications. Another demand inherent to these applications is timing: constraining the time or time window within which a message exchange must happen. Yao et al. equipped their logical relation not only with temporal predicates, but also with computable trajectories, to supply the evidence that an inhabitant can step from one time point to another one. While Yao et al. provide the formalization for such a verification tool, it lacks a mechanization. Mechanizing the system would not only provide a machine proof for it, but also facilitate scalability for future extensions and applications. This paper tackles the challenge of mechanizing the resulting proof-relevant logical relation in a proof assistant. allowing trajectories to be interleaved, partitioned, and concatenated, while the intended equality on trajectories is the equality of their graphs when seen as processes indexed by time. Unfortunately, proof assistants based on intensional type theory only have modest support for such equations, forcing a prolific use of transports. This paper reports on the process of mechanizing Yao et al.‘s results, comprising the logical relation, the algebra of computable trajectories with supporting lemmas, and the fundamental theorem of the logical relation, in the Rocq theorem prover.
A Language-Agnostic Logical Relation for Message-Passing Protocols zhang-2025-a
Today’s computing landscape has been gradually shifting to applications targeting distributed and heterogeneous systems, such as cloud computing and Internet of Things (IoT) applications. These applications are predominantly concurrent, employ message-passing, and interface with foreign objects, ranging from externally implemented code to actual physical devices such as sensors. Verifying that the resulting systems adhere to the intended protocol of interaction is challenging – the usual assumption of a common implementation language, let alone a type system, no longer applies, ruling out any verification method based on them. This paper develops a framework for certifying protocol compliance of heterogeneous message-passing systems. It contributes the first mechanization of a language-agnostic logical relation, asserting that its inhabitants comply with the protocol specified. This definition relies entirely on a labelled transition-based semantics, accommodating arbitrary inhabitants, typed and untyped alike, including foreign objects. As a case study, the paper considers two scenarios: (1) per-instance verification of a specific application or hardware device, and (2) once-and-for-all verification of well-typed applications for a given type system. The logical relation and both scenarios are mechanized in the Coq theorem prover.
Context-Dependent Effects in Guarded Interaction Trees stepanenko-2025-contextx
Guarded Interaction Trees are a structure and a fully formalized framework for representing higher-order computations with higher-order effects in Coq. We present an extension of Guarded Interaction Trees to support formal reasoning about context-dependent effects. That is, effects whose behaviors depend on the evaluation context, e.g., call/cc, shift, and reset. Using and reasoning about such effects is challenging since certain compositionality principles no longer hold in the presence of such effects. For example, the so-called “bind rule” in modern program logics (which allows one to reason modularly about a term inside a context) is no longer valid. The goal of our extension is to support representation and reasoning about context-dependent effects in the most painless way possible. To that end, our extension is conservative: the reasoning principles (and the Coq implementation) for context-independent effects remain the same. We show that our implementation of context-dependent effects is viable and powerful. We use it to give direct-style denotational semantics for higher-order programming languages with call/cc and with delimited continuations. We extend the program logic for Guarded Interaction Trees to account for context-dependent effects, and we use the program logic to prove that the denotational semantics is adequate with respect to the operational semantics. This is achieved by constructing logical relations between syntax and semantics inside the program logic. Additionally, we retain the ability to combine multiple effects in a modular way, which we demonstrate by showing type soundness for safe interoperability of a programming language with delimited continuations and a programming language with higher-order store.
The Logical Essence of Well-Bracketed Control Flow timany-2024-the
A program is said to be well-bracketed if every called function must return before its caller can resume execution. This is often the case. Well-bracketedness has been captured semantically as a condition on strategies in fully abstract games models and multiple prior works have studied well-bracketedness by showing correctness/security properties of programs where such properties depend on the well-bracketed nature of control flow. The latter category of prior works have all used involved relational models with explicit state-transition systems capturing the relevant parts of the control flow of the program. In this paper we present the first Hoare-style program logic based on separation logic for reasoning about well-bracketedness and use it to show correctness of well-bracketed programs both directly and also through defining unary and binary logical relations models based on this program logic. All results presented in this paper are formalized on top of the Iris framework and mechanized in the Coq proof assistant.
Cites 135 works (13 here)
With notes (13)
Modular Denotational Semantics for Effects with Guarded Interaction Trees frumin-2024-modular
We present guarded interaction trees — a structure and a fully formalized framework for representing higherorder computations with higher-order effects in Coq, inspired by domain theory and the recently proposed interaction trees. We also present an accompanying separation logic for reasoning about guarded interaction trees. To demonstrate that guarded interaction trees provide a convenient domain for interpreting higher-order languages with effects, we define an interpretation of a PCF-like language with effects and show that this interpretation is sound and computationally adequate; we prove the latter using a logical relation defined using the separation logic. Guarded interaction trees also allow us to combine different effects and reason about them modularly. To illustrate this point, we give a modular proof of type soundness of cross-language interactions for safe interoperability of different higher-order languages with different effects. All results in the paper are formalized in Coq using the Iris logic over guarded type theory.
The Logical Essence of Well-Bracketed Control Flow timany-2024-the
A program is said to be well-bracketed if every called function must return before its caller can resume execution. This is often the case. Well-bracketedness has been captured semantically as a condition on strategies in fully abstract games models and multiple prior works have studied well-bracketedness by showing correctness/security properties of programs where such properties depend on the well-bracketed nature of control flow. The latter category of prior works have all used involved relational models with explicit state-transition systems capturing the relevant parts of the control flow of the program. In this paper we present the first Hoare-style program logic based on separation logic for reasoning about well-bracketedness and use it to show correctness of well-bracketed programs both directly and also through defining unary and binary logical relations models based on this program logic. All results presented in this paper are formalized on top of the Iris framework and mechanized in the Coq proof assistant.
Transfinite Iris: resolving an existential dilemma of step-indexed separation logic spies-2021-transfinitex
ReLoC Reloaded: A Mechanized Relational Logic for Fine-Grained Concurrency and Logical Atomicity frumin_krebbers_birkedal_reloc_2021
We present a new version of ReLoC: a relational separation logic for proving refinements of programs with higher-order state, fine-grained concurrency, polymorphism and recursive types. The core of ReLoC is its refinement judgment , which states that a program refines a program at type . ReLoC provides type-directed structural rules and symbolic execution rules in separation-logic style for manipulating the judgment, whereas in prior work on refinements for languages with higher-order state and concurrency, such proofs were carried out by unfolding the judgment into its definition in the model. ReLoC’s abstract proof rules make it simpler to carry out refinement proofs, and enable us to generalize the notion of logically atomic specifications to the relational case, which we call logically atomic relational specifications. We build ReLoC on top of the Iris framework for separation logic in Coq, allowing us to leverage features of Iris to prove soundness of ReLoC, and to carry out refinement proofs in ReLoC. We implement tactics for interactive proofs in ReLoC, allowing us to mechanize several case studies in Coq, and thereby demonstrate the practicality of ReLoC. ReLoC Reloaded extends ReLoC (LICS’18) with various technical improvements, a new Coq mechanization, and support for Iris’s prophecy variables. The latter allows us to carry out refinement proofs that involve reasoning about the program’s future. We also expand ReLoC’s notion of logically atomic relational specifications with a new flavor based on the HOCAP pattern by Svendsen et al.
Iris from the ground up: A modular foundation for higher-order concurrent separation logic jung_etal_iris_ground_up_2018
Iris is a framework for higher-order concurrent separation logic, which has been implemented in the Coq proof assistant and deployed very effectively in a wide variety of verification projects. Iris was designed with the express goal of simplifying and consolidating the foundations of modern separation logics, but it has evolved over time, and the design and semantic foundations of Iris itself have yet to be fully written down and explained together properly in one place. Here, we attempt to fill this gap, presenting a reasonably complete picture of the latest version of Iris (version 3.1), from first principles and in one coherent narrative.
A logical relation for monadic encapsulation of state: proving contextual equivalences in the presence of runST timany-2017-a
We present a logical relations model of a higher-order functional programming language with impredicative polymorphism, recursive types, and a Haskell-style ST monad type with runST. We use our logical relations model to show that runST provides proper encapsulation of state, by showing that effectful computations encapsulated by runST are heap independent. Furthermore, we show that contextual refinements and equivalences that are expected to hold for pure computations do indeed hold in the presence of runST. This is the first time such relational results have been proven for a language with monadic encapsulation of state. We have formalized all the technical development and results in Coq.
Interactive proofs in higher-order concurrent separation logic krebbers-2017-interactive
A Higher-Order Logic for Concurrent Termination-Preserving Refinement tassarotti_jung_harper_2017
Compiler correctness proofs for higher-order concurrent languages are difficult: they involve establishing a termination-preserving refinement between a concurrent high-level source language and an implementation that uses low-level shared memory primitives. However, existing logics for proving concurrent refinement either neglect properties such as termination, or only handle first-order state. In this paper, we address these limitations by extending Iris, a recent higher-order concurrent separation logic, with support for reasoning about termination-preserving refinements. To demonstrate the power of these extensions, we prove the correctness of an efficient implementation of a higher-order, session-typed language. To our knowledge, this is the first program logic capable of giving a compiler correctness proof for such a language. The soundness of our extensions and our compiler correctness proof have been mechanized in Coq.
Higher-order ghost state jung_higher-order_2016
The development of concurrent separation logic (CSL) has sparked a long line of work on modular verification of sophisticated concurrent programs. Two of the most important features supported by several existing extensions to CSL are higher-order quantification and custom ghost state. However, none of the logics that support both of these features reap the full potential of their combination. In particular, none of them provide general support for a feature we dub “higher-order ghost state”: the ability to store arbitrary higher-order separation-logic predicates in ghost variables. In this paper, we propose higher-order ghost state as a interesting and useful extension to CSL, which we formalize in the framework of Jung et al.‘s recently developed Iris logic. To justify its soundness, we develop a novel algebraic structure called CMRAs (“cameras”), which can be thought of as “step-indexed partial commutative monoids”. Finally, we show that Iris proofs utilizing higher-order ghost state can be effectively formalized in Coq, and discuss the challenges we faced in formalizing them.
Iris: Monoids and Invariants as an Orthogonal Basis for Concurrent Reasoning jung-2015-iris
Relational separation logic yang_relational_separation_2007
Separation logic: A logic for shared mutable data structures reynolds_separation_2002
In joint work with Peter O’Hearn and others, based on early ideas of Burstall, we have developed an extension of Hoare logic that permits reasoning about low-level imperative programs that use shared mutable data structure. The simple imperative programming language is extended with commands (not expressions) for accessing and modifying shared structures, and for explicit allocation and deallocation of storage. Assertions are extended by introducing a “separating conjunction” that asserts that its subformulas hold for disjoint parts of the heap, and a closely related “separating implication”. Coupled with the inductive definition of predicates on abstract data structures, this extension permits the concise and flexible description of structures with controlled sharing. In this paper, we survey the current development of this program logic, including extensions that permit unrestricted address arithmetic, dynamically allocated arrays, and recursive procedures. We also discuss promising future directions.
BI as an assertion language for mutable data structures ishtiaq_ohearn_bi_2001
Reynolds has developed a logic for reasoning about mutable data structures in which the pre- and postconditions are written in an intuitionistic logic enriched with a spatial form of conjunction. We investigate the approach from the point of view of the logic BI of bunched implications of O’Hearn and Pym. We begin by giving a model in which the law of the excluded middle holds, thus showing that the approach is compatible with classical logic. The relationship between the intuitionistic and classical versions of the system is established by a translation, analogous to a translation from intuitionistic logic into the modal logic S4. We also consider the question of completeness of the axioms. BI’s spatial implication is used to express weakest preconditions for object-component assignments, and an axiom for allocating a cons cell is shown to be complete under an interpretation of triples that allows a command to be applied to states with dangling pointers. We make this latter a feature, by incorporating an operation, and axiom, for disposing of memory. Finally, we describe a local character enjoyed by specifications in the logic, and show how this enables a class of frame axioms, which say what parts of the heap don’t change, to be inferred automatically.
External (122)
- Deadlock-Free Separation Logic: Linearity Yields Progress for Dependent Higher-Order Message Passing (2024)
- A Type System for Effect Handlers and Dynamic Labels (2023)
- Iris-Wasm: Robust and Modular Verification of WebAssembly Programs (2023)
- Actris 2.0: Asynchronous Session-Type Based Reasoning in Separation Logic (2022)
- Later credits: resourceful reasoning for the later modality (2022)
- Semantics of type systems (Lecture notes) (2022)
- \nCompositional Non-Interference for Fine-Grained Concurrent Programs (2021)
- Efficient and provable local capability revocation using uninitialized capabilities (2021)
- Mechanized logical relations for termination-insensitive noninterference (2021)
- Machine-checked semantic session typing (2021)
- Fully abstract from static to gradual (2021)
- Safe systems programming in Rust (2021)
- RefinedC: automating the foundational verification of C code with refined ownership types (2021)
- Scala step-by-step: soundness for DOT with step-indexed logical relations in Iris (2020)
- Understanding and Evolving the Rust Programming Language (2020)
- RustBelt meets relaxed memory (2019)
- Actris: session-type based reasoning in separation logic (2019)
- The future is ours: prophecy variables in separation logic (2019)
- Higher-order linearisability (2019)
- The high-level benefits of low-level sandboxing (2019)
- Mechanized relational verification of concurrent programs with continuations (2019)
- ReLoC: A Mechanised Relational Logic for Fine-Grained Concurrency (2018)
- MoSeL: a general, extensible modal framework for interactive proofs in separation logic (2018)
- Contributions in Programming Languages Theory (2018)
- Milner Award Lecture: The type soundness theorem that you really want to prove (and now you can) (2018)
- RustBelt: securing the foundations of the Rust programming language (2017)
- Strong Logic for Weak Memory: Reasoning About Release-Acquire Consistency in Iris (2017)
- The Essence of Higher-Order Concurrent Separation Logic (2017)
- A relational model of types-and-effects in higher-order concurrent separation logic (2017)
- Robust and compositional verification of object capability patterns (2017)
- The Design and Formalization of Mezzo, a Permission-Based Programming Language (2016)
- Reasoning about Object Capabilities with Logical Relations and Effect Parametricity (2016)
- Practical Foundations for Programming Languages (2nd ed.) (2016)
- Pilsner: a compositionally verified compiler for a higher-order imperative language (2015)
- TaDA: A Logic for Time and Data Abstraction (2014)
- F-ing modules (2014)
- Impredicative Concurrent Abstract Predicates (2014)
- Step-Indexed Relational Reasoning for Countable Nondeterminism (2013)
- Views: compositional reasoning for concurrent programs (2013)
- Modular Reasoning about Separation of Concurrent Data Structures (2013)
- Unifying refinement and hoare-style reasoning in a logic for higher-order concurrency (2013)
- Logical relations for fine-grained concurrency (2013)
- A Concurrent Logical Relation (2012)
- The impact of higher-order state and control effects on local relational reasoning (2012)
- Uniqueness and reference immutability for safe parallelism (2012)
- The marriage of bisimulations and Kripke logical relations (2012)
- Superficially substructural types (2012)
- A step-indexed Kripke model of hidden state (2012)
- Step-indexed kripke models over recursive worlds (2011)
- Logical Step-Indexed Logical Relations (2011)
- A kripke logical relation between ML and assembly (2011)
- Ultrametric Semantics of Reactive Programs (2011)
- A kripke logical relation for effect-based program transformations (2011)
- Modify any Java class field using reflection (2011)
- Semantic foundations for typed assembly languages (2010)
- The category-theoretic solution of recursive metric-space equations (2010)
- Realisability semantics of parametric polymorphism, general references and recursive types (2010)
- Concurrent Abstract Predicates (2010)
- A relational modal logic for higher-order stateful ADTs (2010)
- Reasoning about Optimistic Concurrency Using a Program Logic for History (2010)
- A bisimulation-like proof method for contextual properties in untyped λ -calculus with references and deallocation (2010)
- State-dependent representation independence (2009)
- Biorthogonality, step-indexing and compiler correctness (2009)
- Compiling functional types to relational specifications for low level imperative code (2009)
- Non-parametric parametricity (2009)
- A Complete Characterization of Observational Equivalence in Polymorphic λ-Calculus with General References (2009)
- Formal Verification of a C-like Memory Model and Its Uses for Verifying Program Transformations (2008)
- A very modal model of a modern, major, general type system (2007)
- Formalizing and verifying semantic type soundness of a simple compiler (2007)
- A semantics for concurrent separation logic (2007)
- Syntactic Logical Relations for Polymorphic and Recursive Types (2007)
- Typed Normal Form Bisimulation (2007)
- Resources, concurrency, and local reasoning (2007)
- A complete, co-inductive syntactic theory of sequential control and state (2007)
- A bisimulation for type abstraction and recursion (2007)
- Step-Indexed Syntactic Logical Relations for Recursive and Quantified Types (2006)
- Abstracting Allocation (2006)
- Small bisimulations for reasoning about higher-order imperative programs (2006)
- Permission accounting in separation logic (2005)
- Typed operational reasoning (2005)
- Semantics of types for mutable state (2004)
- A stratified semantics of general references embeddable in higher-order logic (2002)
- Types and Programming Languages (2002)
- Foundational proof-carrying code (2001)
- An indexed model of recursive types for foundational proof-carrying code (2001)
- Local Reasoning about Programs that Alter Data Structures (2001)
- A semantic model of types and machine instructions for proof-carrying code (2000)
- Syntactic type abstraction (2000)
- A modality for recursion (2000)
- Relational Interpretations of Recursive Types in an Operational Setting (1999)
- Operational reasoning for functions with local state (1998)
- Relational Properties of Domains (1996)
- Abstract models of memory management (1995)
- Simple imperative polymorphism (1995)
- Classical logic, storage operators and second-order lambda-calculus (1994)
- The Type and Effect Discipline (1994)
- A Syntactic Approach to Type Soundness (1994)
- A new characterization of lambda definability (1993)
- A logic for parametric polymorphism (1993)
- PER models of subtyping, recursive types and higher-order polymorphism (1992)
- The revised report on the syntactic theories of sequential control and state (1992)
- Semantics of local variables (1992)
- Polymorphic type inference and assignment (1991)
- A PER model of polymorphism and recursive types (1990)
- Functorial polymorphism (1990)
- Linearizability: a correctness condition for concurrent objects (1990)
- Type inference for polymorphic references (1990)
- Abstract types have existential type (1988)
- A Non-type-theoretic Semantics for Type-theoretic Language (1987)
- Implementing Mathematics with the Nuprl Proof Development System (1986)
- An ideal model for recursive polymorphic types (1986)
- Representation independence and data abstraction (1986)
- The Lambda Calculus—Its Syntax and Semantics (1985)
- Modules for standard ML (1984)
- Types, abstraction and parametric polymorphism (1983)
- A theory of type polymorphism in programming (1978)
- Guarded commands, nondeterminacy and formal derivation of programs (1975)
- Towards a theory of type structure (1974)
- Lambda calculus notation with nameless dummies, a tool for automatic formula manipulation, with application to the Church-Rosser theorem (1972)
- Interpretation fonctionelle et elimination des coupures de l’arithmetique d’ordre superieur (1972)
- Strong functors and monoidal monads (1972)
- Monads on symmetric monoidal closed categories (1970)