Liam O'Connor › Curriculum vitæ [loc-0004]
Research themes [loc-0008]
I specialise in the intersection of programming languages and formal methods, with a particular emphasis on type systems, test frameworks and other connections between specification and implementation.
I enjoy applying theory to practice: developing programming languages and tools based on established theoretical models and techniques.
I also enjoy applying practice to theory, that is, developing new theoretical understanding motivated by practical needs.
Education [loc-0005]
Doctor of Philosophy (Computer Science), UNSW Sydney
- Thesis: Type Systems For Systems Types.
Winner of the CORE John Makepeace Bennett Dissertation Award.
Project received the NICTA Impact Award.
Nominated for the UNSW Sydney Malcolm Chaikin Prize. - Primary Advisor: Gabriele Keller.
Secondary Advisors: Gernot Heiser, Christine Rizkallah.
Bachelor of Science (Hons), Computer Science, UNSW Sydney
- Honours First Class. Dean's List.
Winner of the CSE Undergraduate Performance Award in 2012, 2011 and 2008.
Winner of the Macquarie Bank Performance Award, 2008 - Thesis: Formalising GHC's Type System.
- Advisor: Manuel Chakravarty.
Professional history [loc-0006]
- 2024–present: Senior Lecturer, Australian National University
Foundations Cluster
Foundations Computing Facilities Representative (2024–present) - 2020–2024: Lecturer, University of Edinburgh
Laboratory for Foundations of Computer Science (LFCS)
LFCS Postgraduate Research Coordinator (2022–2024), LFCS EDI Representative (2021–2022) - 2019–2020: Senior Research Officer, UNSW Sydney.
- 2009–2020: Casual Academic (Teaching), UNSW Sydney.
- 2013–2014: Research Engineer, NICTA.
- 2011–2013: Research Assistant, NICTA.
- 2009–2010: Software Engineer (Internship), Google Sydney.
Works of Liam O'Connor › Refereed papers [loc-000F]
Reference. The Infinite, in Finite Time [amjad-vanglabbeek-oconnor-2026]
- 2026
- Rayhana Amjad, Rob van Glabbeek, Liam O'Connor
- Information and Computation, Volume 313, Article 105510
- 10.1016/j.ic.2026.105510
An expanded version of Semantics for Linear-time Temporal Logic with Finite Observations.
Linear-time temporal properties, such as those described by Linear-time Temporal Logic, are typically modelled as sets of infinite traces. Yet, in a run-time verification context, such as when testing or monitoring a system, only a finite prefix of the system’s behaviour can be observed. For some properties, these finite prefixes may be definitive—a yes or no answer can be given without further observation. By enriching the semantics of LTL with these definitive prefixes, we give a proper inductive accounting of the semantics of LTL3, a multi-valued variant of Linear-time Temporal Logic for run-time verification applications. The semantic descriptions of LTL3 in previous work are given only in terms of their relationship to conventional LTL. We show that the semantics of LTL and of LTL3 are isomorphic. In addition, we formalise the formula progression evaluation technique, popularly used in runtime verification contexts, and show its soundness and completeness up to finite traces with respect to our semantics. Then, we turn to linear-time properties more generally: using our theory of definitive prefixes, we re-prove the well-known safety-liveness decomposition theorem, and reconstruct the topology of infinite traces. We define monitorability for properties, providing neat topological characterisations for various monitorability classes, and arrange them into a hierarchy. All of our definitions and proofs are mechanised in Isabelle/HOL.
Reference. Memory Safety: Uniqueness as Separation [linares-dajosr-2025]
Programming languages with uniqueness type systems prevent pointer aliasing, simplifying memory safety reasoning. However, code implemented in these languages often interoperates through foreign function interfaces with external components implemented in languages lacking the same level of static safety guarantees. To verify safe updates in a combined system, one must manually verify that the external components preserve the safety invariants of the uniqueness type system. In particular, recent work showed that one can manually discharge such obligations on C components from a cross-language Cogent-C system by directly reasoning about the C code in higher-order logic. However, even for simple examples, discharging the uniqueness safety obligations, known as frame conditions, within a logic not specifically designed for direct reasoning in terms of heaps and pointers was not ideal. Separation logic is an established logic that facilitates reasoning about imperative programs by localising reasoning to the parts of the heap that the program mutates. This raises a vital question. Can we use separation logic to discharge the safety obligations imposed by uniqueness types? The answer is yes. This paper demonstrates that the frame conditions can be inferred from particular separation logic triples and, hence, discharged by reasoning using separation logic. We identify and verify the soundness of specific separation logic triples that imply the frame conditions imposed by a uniqueness type system.
Reference. Semantics for Linear-time Temporal Logic with Finite Observations [amjad-vanglabbeek-oconnor-2024]
LTL3 is a multi-valued variant of Linear-time Temporal Logic for runtime verification applications. The semantic descriptions of LTL3 in previous work are given only in terms of the relationship to conventional LTL. Our approach, by contrast, gives a full model-based inductive accounting of the semantics of LTL3, in terms of families of definitive prefix sets. We show that our definitive prefix sets are isomorphic to linear-time temporal properties (sets of infinite traces), and thereby show that our semantics of LTL3 directly correspond to the semantics of conventional LTL. In addition, we formalise the formula progression evaluation technique, popularly used in runtime verification and testing contexts, and show its soundness and completeness up to finite traces with respect to our semantics. All of our definitions and proofs are mechanised in Isabelle/HOL.
Reference. Shoggoth: A Formal Foundation for Strategic Rewriting [qin-ovghks-2024]
Rewriting is a versatile and powerful technique used in many domains. Strategic rewriting allows programmers to control the application of rewrite rules by composing individual rewrite rules into complex rewrite strategies. These strategies are semantically complex, as they may be nondeterministic, they may raise errors that trigger backtracking, and they may not terminate.
Given such semantic complexity, it is necessary to establish a formal understanding of rewrite strategies and to enable reasoning about them in order to answer questions like: How do we know that a rewrite strategy terminates? How do we know that a rewrite strategy does not fail because we compose two incompatible rewrites? How do we know that a desired property holds after applying a rewrite strategy?
In this paper, we introduce Shoggoth: a formal foundation for understanding, analysing and reasoning about strategic rewriting that is capable of answering these questions. We provide a denotational semantics of System S, a core language for strategic rewriting, and prove its equivalence to our big-step operational semantics, which extends existing work by explicitly accounting for divergence. We further define a location-based weakest precondition calculus to enable formal reasoning about rewriting strategies, and we prove this calculus sound with respect to the denotational semantics. We show how this calculus can be used in practice to reason about properties of rewriting strategies, including termination, that they are well-composed, and that desired postconditions hold. The semantics and calculus are formalised in Isabelle/HOL and all proofs are mechanised.
Reference. Primrose: Selecting Container Data Types by Their Properties [qin-oconnor-steuwer-2023]
- February 15, 2023
- Xueying Qin, Liam O'Connor, Michel Steuwer
- The Art, Science, and Engineering of Programming, Volume 7, Issue 3, Article 11
- 10.22152/programming-journal.org/2023/7/11
Reference. Dargent: A Silver Bullet for Verified Data Layout Refinement [chen-lokmjr-2023]
Systems programmers need fine-grained control over the memory layout of data structures, both to produce performant code and to comply with well-defined interfaces imposed by existing code, standardised protocols or hardware. Code that manipulates these low-level representations in memory is hard to get right. Traditionally, this problem is addressed by the implementation of tedious marshalling code to convert between compiler-selected data representations and the desired compact data formats. Such marshalling code is error-prone and can lead to a significant runtime overhead due to excessive copying. While there are many languages and systems that address the correctness issue, by automating the generation and, in some cases, the verification of the marshalling code, the performance overhead introduced by the marshalling code remains. In particular for systems code, this overhead can be prohibitive. In this work, we address both the correctness and the performance problems.
We present a data layout description language and data refinement framework, called Dargent, which allows programmers to declaratively specify how algebraic data types are laid out in memory. Our solution is applied to the Cogent language, but the general ideas behind our solution are applicable to other settings. The Dargent framework generates C code that manipulates data directly with the desired memory layout, while retaining the formal proof that this generated C code is correct with respect to the functional semantics. This added expressivity removes the need for implementing and verifying marshalling code, which eliminates copying, smoothens interoperability with surrounding systems, and increases the trustworthiness of the overall system.
Reference. Property-based Testing: Climbing the Stairway to Verification [chen-roskhk-2022]
- December 1, 2022
- Zilin Chen, Christine Rizkallah, Liam O'Connor, Partha Susarla, Gerwin Klein, Gernot Heiser, Gabriele Keller
- SLE '22: 15th ACM SIGPLAN International Conference on Software Language Engineering
- Best Artifact Award
- 10.1145/3567512.3567520
Property-based testing (PBT) is a powerful tool that is widely available in modern programming languages. It has been used to reduce formal software verification effort. We demonstrate how PBT can be used in conjunction with formal verification to incrementally gain greater assurance in code correctness by integrating PBT into the verification framework of Cogent---a programming language equipped with a certifying compiler for developing high-assurance systems components. Specifically, for PBT and formal verification to work in tandem, we structure the tests to mirror the refinement proof that we used in Cogent's verification framework: The expected behaviour of the system under test is captured by a functional correctness specification, which mimics the formal specification of the system, and we test the refinement relation between the implementation and the specification. We exhibit the additional benefits that this mutualism brings to developers and demonstrate the techniques we used in this style of PBT, by studying two concrete examples.
Reference. Quickstrom: Property-based Acceptance Testing with LTL Specifications [oconnor-wickstrom-2022]
We present Quickstrom, a property-based testing system for acceptance testing of interactive applications. Using Quickstrom, programmers can specify the behaviour of web applications as properties in our testing-oriented dialect of Linear Temporal Logic (LTL) called QuickLTL, and then automatically test their application against the given specification with hundreds of automatically generated interactions. QuickLTL extends existing finite variants of LTL for the testing use-case, determining likely outcomes from partial traces whose minimum length is itself determined by the LTL formula. This temporal logic is embedded in our specification language, Specstrom, which is designed to be approachable to web programmers, expressive for writing specifications, and easy to analyse. Because Quickstrom tests only user-facing behaviour, it is agnostic to the implementation language of the system under test. We therefore formally specify and test many implementations of the popular TodoMVC benchmark, used for evaluation and comparison across various web frontend frameworks and languages. Our tests uncovered bugs in almost half of the available implementations.
Reference. Overcoming Restraint: Composing Verification of Foreign Functions with Cogent [cheung-oconnor-rizkallah-2022]
Cogent is a restricted functional language designed to reduce the cost of developing verified systems code. Because of its sometimes-onerous restrictions, such as the lack of support for recursion and its strict uniqueness type system, Cogent provides an escape hatch in the form of a foreign function interface (FFI) to C code. This poses a problem when verifying Cogent programs, as imported C components do not enjoy the same level of static guarantees that Cogent does. Previous verification of file systems implemented in Cogent merely assumed that their C components were correct and that they preserved the invariants of Cogent’s type system. In this paper, we instead prove such obligations. We demonstrate how they smoothly compose with existing Cogent theorems, and result in a correctness theorem of the overall Cogent-C system. The Cogent FFI constraints ensure that key invariants of Cogent’s type system are maintained even when calling C code. We verify reusable higher-order and polymorphic functions including a generic loop combinator and array iterators and demonstrate their application to several examples including binary search and the BilbyFs file system. We demonstrate the feasibility of verification of mixed Cogent-C systems, and provide some insight into verification of software comprised of code in multiple languages with differing levels of static guarantees.
Reference. Cogent: Uniqueness Types and Certifying Compilation [oconnor-crjakmsk-2021]
- October 27, 2021
- Liam O'Connor, Zilin Chen, Christine Rizkallah, Vincent Jackson, Sidney Amani, Gerwin Klein, Toby Murray, Thomas Sewell, Gabriele Keller
- Journal of Functional Programming, Volume 31, Issue on Secure Compilation
- 10.1017/S095679682100023X
This paper presents a framework aimed at significantly reducing the cost of proving functional correctness for low-level operating systems components. The framework is designed around a new functional programming language, Cogent. A central aspect of the language is its uniqueness type system, which eliminates the need for a trusted runtime or garbage collector while still guaranteeing memory safety, a crucial property for safety and security. Moreover, it allows us to assign two semantics to the language: The first semantics is imperative, suitable for efficient C code generation, and the second is purely functional, providing a user-friendly interface for equational reasoning and verification of higher-level correctness properties. The refinement theorem connecting the two semantics allows the compiler to produce a proof via translation validation certifying the correctness of the generated C code with respect to the semantics of the Cogent source program. We have demonstrated the effectiveness of our framework for implementation and for verification through two file system implementations.
This paper is largely based on my PhD Thesis.
Reference. Deferring the Details and Deriving Programs [oconnor-tyde-2019]
A commonly-used technique in dependently-typed programming is to encode invariants about a data structure into its type, thus ensuring that the data structure is correct by construction. Unfortunately, this often necessitates the embedding of explicit proof terms within the data structure, which are not part of the structure conceptually, but merely supplied to ensure that the data invariants are maintained. As the complexity of the specifications in the types increases, these additional terms tend to clutter definitions, reducing readability. We introduce a technique where these proof terms can be supplied later, by constructing the data structure within a proof delay applicative functor. We apply this technique to Trip, our new language for Hoare-logic verification of imperative programs embedded in Agda, where our applicative functor is used as the basis for a verification condition generator, turning the typed holes of Agda into a method for stepwise derivation of a program from its specification in the form of a Hoare triple.
Reference. The Cogent Case for Property-Based Testing [chen-okkh-2017]
Property-based testing can play an important role in reducing the cost of formal verification: It has been demonstrated to be effective at detecting bugs and finding inconsistencies in specifications, and thus can eliminate effort wasted on fruitless proof attempts. We argue that in addition, property-based testing enables an incremental approach to a fully verified system, by allowing replacement of automatically generated tests of properties stated in the specification by formal proofs. We demonstrate this approach on the verification of systems code, discuss the implications on systems design, and outline the integration of property-based testing into the Cogent framework.
Reference. Applications of Applicative Proof Search [oconnor-tyde-2016]
In this paper, we develop a library of typed proof search procedures, and demonstrate their remarkable utility as a mechanism for proof-search and automation. We describe a framework for describing proof-search procedures in Agda, with a library of tactical combinators based on applicative functors. This framework is very general, so we demonstrate the approach with two common applications from the field of software verification: a library for property-based testing in the style of SmallCheck, and the embedding of a basic model checker inside our framework, which we use to verify the correctness of common concurrency algorithms.
Reference. Refinement through Restraint: Bringing Down the Cost of Verification [oconnor-cralmnsk-2016]
- September 4, 2016
- Liam O'Connor, Zilin Chen, Christine Rizkallah, Sidney Amani, Japheth Lim, Toby Murray, Yutaka Nagashima, Thomas Sewell, Gerwin Klein
- ICFP '16: 21st ACM SIGPLAN International Conference on Functional Programming
- Available from TS
- 10.1145/2951913.2951940
- Video
We present a framework aimed at significantly reducing the cost of verifying certain classes of systems software, such as file systems. Our framework allows for equational reasoning about systems code written in our new language, Cogent. Cogent is a restricted, polymorphic, higher-order, and purely functional language with linear types and without the need for a trusted runtime or garbage collector. Linear types allow us to assign two semantics to the language: one imperative, suitable for efficient C code generation; and one functional, suitable for equational reasoning and verification. As Cogent is a restricted language, it is designed to easily interoperate with existing C functions and to connect to existing C verification frameworks. Our framework is based on certifying compilation: For a well-typed Cogent program, our compiler produces C code, a high-level shallow embedding of its semantics in Isabelle/HOL, and a proof that the C code correctly refines this embedding. Thus one can reason about the full semantics of real-world systems code productively and equationally, while retaining the interoperability and leanness of C. The compiler certificate is a series of language-level proofs and per-program translation validation phases, combined into one coherent top-level theorem in Isabelle/HOL.
Reference. A Framework for the Automatic Formal Verification of Refinement from Cogent to C [rizkallah-lnscomkk-2016]
Our language Cogent simplifies verification of systems software using a certifying compiler, which produces a proof that the generated C code is a refinement of the original Cogent program. Despite the fact that Cogent itself contains a number of refinement layers, the semantic gap between even the lowest level of Cogent semantics and the generated C code remains large. In this paper we close this gap with an automated refinement framework which validates the compiler’s code generation phase. This framework makes use of existing C verification tools and introduces a new technique to relate the type systems of Cogent and C.
Reference. Cogent: Verifying High-assurance File System Implementations [amani-hcrcobnlstkmkh-2016]
- March 25, 2016
- Sidney Amani, Alex Hixon, Zilin Chen, Christine Rizkallah, Peter Chubb, Liam O'Connor, Joel Beeren, Yutaka Nagashima, Japheth Lim, Thomas Sewell, Joseph Tuong, Gabriele Keller, Toby Murray, Gerwin Klein, Gernot Heiser
- ASPLOS '16: Twenty-First International Conference on Architectural Support for Programming Languages and Operating Systems
- Available from TS
- 10.1145/2980024.2872404
We present an approach to writing and formally verifying high-assurance file-system code in a restricted language called Cogent, supported by a certifying compiler that produces C code, high-level specification of Cogent, and translation correctness proofs. The language is strongly typed and guarantees absence of a number of common file system implementation errors. We show how verification effort is drastically reduced for proving higher-level properties of the file system implementation by reasoning about the generated formal specification rather than its low-level C code. We use the framework to write two Linux file systems, and compare their performance with their native C implementations.
Reference. File Systems Deserve Verification Too! [keller-maocrkh-2013]
- November 3, 2013
- Gabriele Keller, Toby Murray, Sidney Amani, Liam O'Connor, Zilin Chen, Leonid Ryzhyk, Gerwin Klein, Gernot Heiser
- PLOS '13: Seventh Workshop on Programming Languages and Operating Systems
- Available from TS
- 10.1145/2525528.2525530
File systems are too important, and current ones are too buggy, to remain unverified. Yet the most successful verification methods for functional correctness remain too expensive for current file system implementations --- we need verified correctness but at reasonable cost. This paper presents our vision and ongoing work to achieve this goal for a new high-performance flash file system, called BilbyFs. BilbyFs is carefully designed to be highly modular, so it can be verified against a high-level functional specification one component at a time. This modular implementation is captured in a set of domain specific languages from which we produce the design-level specification, as well as its optimised C implementation. Importantly, we also automatically generate the proof linking these two artefacts. The combination of these features dramatically reduces verification effort. Verified file systems are now within reach for the first time.
Works of Liam O'Connor › Invited papers [loc-000G]
Reference. Bringing Effortless Refinement of Data Layouts to Cogent [oconnor-csrkk-2018]
The language Cogent allows low-level operating system components to be modelled as pure mathematical functions operating on algebraic data types, which makes it highly suitable for verification in an interactive theorem prover. Furthermore, the Cogent compiler translates these models into imperative C programs, and provides a proof that this compilation is a refinement of the functional model. There remains a gap, however, between the C data structures used in the operating system, and the algebraic data types used by Cogent. This forces the programmer to write a large amount of boilerplate marshalling code to connect the two, which can lead to a significant runtime performance overhead due to excessive copying.
In this paper, we outline our design for a data description language and data refinement framework, called Dargent, which provides the programmer with a means to specify how Cogent represents its algebraic data types. From this specification, the compiler can then generate the C code which manipulates the C data structures directly. Once fully realised, this extension will enable more code to be automatically verified by Cogent, smoother interoperability with C, and substantially improved performance of the generated code.
Reference. Provably Trustworthy Systems [klein-akmmo-2017]
- September 4, 2017
- Gerwin Klein, June Andronick, Gabriele Keller, Daniel Matichuk, Toby Murray, Liam O'Connor
- Philosophical Transactions of the Royal Society A, Volume 375, Issue 2104
- 10.1098/rsta.2015.0404
We present recent work on building and scaling trustworthy systems with formal, machine-checkable proof from the ground up, including the operating system kernel, at the level of binary machine code. We first give a brief overview of the seL4 microkernel verification and how it can be used to build verified systems. We then show two complementary techniques for scaling these methods to larger systems: proof engineering, to estimate verification effort; and code/proof co-generation, for scalable development of provably trustworthy applications.
This article is part of the themed issue ‘Verified trustworthy software systems’.
Works of Liam O'Connor › Notable talks (not associated with papers) [loc-000H]
Reference. Down with Linear Mathematical Developments [oconnor-2026-wadler70]
- September 10, 2026
- Liam O'Connor
- Wadler 70 Meeting, University of Edinburgh, Scotland
This talk presents some of my recent rough work on educational proof assistants. I spent many years building Holbert — a graphical proof assistant and document preparation system — with the eventual goal of writing a PL textbook in it. But Holbert's design, like that of most proof assistants, forces exposition to follow a single linearisation of the dependency order of definitions and theorems, which is a poor fit for good mathematical writing. This talk demonstrates work in progress on the next generation of Holbert, built on top of Forester, the notes system by Jon Sterling and Kento Okura. Forester's transclusion mechanism lets self-contained notes on definitions and theorems be composed bottom-up into a document. Holbert-NG maintains its own separate graph of mathematical dependencies, independent of Forester's document graph, decoupling how a text is composed from the dependency structure of its mathematics.
Reference. Runtime monitoring via topology [oconnor-2025-wg21]
- September 10, 2025
- Liam O'Connor
- IFIP Working Group 2.1: Algorithmic Languages and Calculi Meeting, Viana do Castelo, Portugal
The literature on runtime “verification” (the activity of monitoring a running process to ensure compliance with a given specification) offers many different definitions of “monitorability” for properties. In a linear-time temporal setting, properties take the form of sets of behaviours (infinite sequences of states). In this talk, I will arrange the various monitorability classes found in the literature into a hierarchy along with well-known classes of properties such as safety and guarantee properties. I then give each of these monitorability classes neat topological characterisations within the topology induced by the "guarantee kernel" interior operator. Lastly, I show that the metric space used by Alpern and Schneider coincides with our topology.
Reference. I don't have all day: Examining linear-time temporal {Properties, Logic} within finite time [oconnor-2024-wg21-2]
- November 29, 2024
- Liam O'Connor
- IFIP Working Group 2.1: Algorithmic Languages and Calculi Meeting, Canberra, Australia
We define a proper inductive semantics for LTL which includes those finite partial traces for which a definitive answer can be given: the “definitive prefixes” of the property. Sets of definitive prefixes are called definitive sets. Defining a semantics for LTL in terms of definitive sets gives us something equivalent to LTL3, a formulation popular in runtime verification. Our theory of definitive sets is sufficient to give a neat characterisation of (co-)safety and (co-)liveness properties, allowing us to straightforwardly prove Alpern and Schneider’s result that every property is the intersection of a safety and liveness property by simpler means.
Reference. Putting the Past Behind Us (but not forgetting it) [oconnor-2024-wg21]
- April 2024
- Liam O'Connor
- IFIP Working Group 2.1: Algorithmic Languages and Calculi Meeting, Kloster Neustadt an der Weinstraße, Germany
In this talk I demonstrated how the well known Zipper structure of Huet, later generalised by McBride, can be used to equip any modal logic with inverse modalities. In particular, this allows us to equip any temporal logic, including CTL, with a notion of linear past.
Reference. Why Domain Theory Matters [oconnor-2024-compsoc]
- January 2024
- Liam O'Connor
- University of Edinburgh CompSoc Meeting
In this talk I give whirlwind tour of denotational semantics, an oft-neglected but very important branch of theoretical computer science, which truly connects computer programs to mathematics
Reference. Mutual Exclusion: Harder than you Think! [oconnor-vanglabbeek-2023-compsoc]
- January 2023
- Liam O'Connor, Rob van Glabbeek
- University of Edinburgh CompSoc Meeting
It’s well known that some problems in computer science are unsolvable — finding a recipe to tell whether an arbitrary computer program halts is a classic example. But in the world of concurrency, the most classical problem, mutual exclusion, is widely considered to be solved. In this talk we will examine the assumptions that have led concurrency theorists to this conclusion, and show that, unless either an assumption about hardware or a requirement of the problem are relaxed, this most famous problem of concurrency theory has, in fact, no satisfactory solution.
Reference. Writing Valuable Papers [oconnor-2022-plmw]
- January 2022
- Liam O'Connor
- POPL '22 Programming Languages Mentoring Workshop
- Video
Most materials aimed at teaching people how to write, even within an academic context, focus largely on giving a rules-based framework for structure and prose style. These frameworks are based on outdated and inaccurate models of knowledge and are not suitable for academic writing. In this talk I will try to challenge some of the assumptions you have about writing papers, what (and who) writing papers is for, and how to think about writing as part of a research process.
Teaching [loc-0007]
The following teaching engagements were/are all at the Australian National University:
| 2026 | Structured Programming. Lecturer Convenor. |
| 2025 | Programming as Problem Solving. Lecturer Convenor. |
The following teaching engagements were all at the University of Edinburgh:
| 2024 | Domain Theory (TypeSIG) (15 students). Invited Lecturer. |
| Modelling Concurrent Systems (30 students). Lecturer Convenor, Tutor. | |
| 2023 | Introduction to Theoretical Computer Science (40 students). Lecturer Convenor. |
| Discrete Mathematics and Probability. Tutor. | |
| 2022 | Introduction to Theoretical Computer Science (20 students). Lecturer Convenor. |
| Informatics 1A. Tutor. | |
| 2021 | Introduction to Theoretical Computer Science (35 students). Lecturer, Tutor. |
| Informatics 1A. Tutor. | |
| 2020 | Informatics 1A. Tutor Supervisor. |
The following teaching engagements were all at UNSW Sydney:
| 2020 | Concepts of Programming Languages (190 students). Lecturer. |
| Foundations of Concurrency (28 students). Lecturer Convenor. | |
| Software System Design and Implementation (308 students). Lecturer Convenor. | |
| Algorithmic Verification (18 students). Lecturer Convenor. | |
| System Modelling and Design. Course Administrator. | |
| 2019 | Concepts of Programming Languages (111 students). |
| 100% teacher satisfaction. 95.1% course satisfaction. | |
| Software System Design and Implementation (196 students). Lecturer Convenor. | |
| 97.3% teacher satisfaction. 93.9% course satisfaction. | |
| 2018 | Concepts of Programming Languages (96 students). Lecturer Convenor, Tutor. |
| 98.1% teacher satisfaction. 100% course satisfaction. | |
| System Modelling and Design. Tutor (6 tutorials), Relief Lecturer. | |
| 94.1% teacher satisfaction. | |
| Software System Design and Implementation. Course Designer and Administrator. | |
| Modelling Concurrent Systems. Tutor (1 tutorial). | |
| 2017 | Foundations of Concurrency. Tutor (3 tutorials), Relief Lecturer. |
| Software System Design and Implementation. Course Administrator. | |
| Concepts of Programming Languages. Tutor (4 tutorials), Relief Lecturer. | |
| System Modelling and Design. Tutor (5 tutorials), Relief Lecturer. | |
| 2016 | Software System Design and Implementation. Course Administrator, Relief Lecturer. |
| Concepts of Programming Languages. Tutor (3 tutorials), Relief Lecturer. | |
| System Modelling and Design. Tutor (4 tutorials), Relief Lecturer. | |
| 2015 | Software System Design and Implementation. Course Administrator, Relief Lecturer. |
| Concepts of Programming Languages. Tutor (3 tutorials), Relief Lecturer. | |
| System Modelling and Design. Tutor (3 tutorials). | |
| Program Reasoning Workshop. Tutor (3 tutorials). | |
| 2014 | Concepts of Programming Languages. Tutor (3 tutorials), Relief Lecturer. |
| Program Reasoning Workshop. Tutor (3 tutorials). | |
| Computing 2. Tutor (2 tute/labs), Relief Lecturer. | |
| 2013 | Concepts of Programming Languages. Tutor (2 tutorials), Relief Lecturer. |
| Foundations of Concurrency. Tutor (2 tutorials), Relief Lecturer. | |
| 2012 | Computing 2. Tutor (2 tute/labs), Relief Lecturer, Developing Assignments. |
| 2011 | Concepts of Programming Languages. Tutor (2 tutorials), Developing Assignments. |
| Software System Design and Implementation. Tutor (1 disabled student). | |
| Computing 2. Tutor (2 tute/labs). | |
| 2010 | Concepts of Programming Languages. Tutor (3 tutorials). |
| Engineering Design in Computing. Tutor (2 tutorials, 2 consultation hours). | |
| 2009 | Computing 2. Tutor (1 tute/lab, 3 consultation hours), Developing Assignments. |
| Computing 1. Tutor (1 tute/lab). |
Liam O'Connor › Students [loc-0002]
Doctoral students
- Rayhana Amjad: 2023–present. Linear infinite time within finite observations. Jointly supervised with Rob van Glabbeek at the University of Edinburgh.
- Xin Lu: 2025–present. Incorrectness logic with exploitation strategies. Jointly supervised with Peter Höfner.
- Kai Phan: 2026–present. Revocable semantics for run-time monitors. Co-supervised by Rob van Glabbeek at the University of Edinburgh and Dirk Pattinson at the Australian National University.
Secondary supervisions
- Ali Nosherwan Hamed: 2026-present. Verification of Concurrent Systems. Primary supervisor is Nisansala Yatapanage at the Australian National University.
- Carlo Zancanaro: 2026-present. Gradual Typing with Parametric Polymorphism. Primary supervisor is Fabian Mühlböck at the Australian National University.
- Yi Yao: 2025-present. Unifying algebraic models of automata and computation. Primary supervisor is Peter Höfner at the Australian National University.
- Tudor Ferariu: 2021–present. Formal verification of smart contracts. Primary supervisor is Philip Wadler at the University of Edinburgh.
- Mathieu Fehr: 2022–2026. DSLs for compiler passes. Primary supervisor is Tobias Grosser at the University of Cambridge.
Masters students
- Shaonan Li: 2022, University of Edinburgh. Exploring the 8-bit demoscene.
Bachelors students
- Edwin Park: 2026, Australian National University. A proof-assistant framework for program calculation.
- Mio Wu: 2025-2026, Australian National University. Pattern Unification in the Next Generation of the Holbert Proof Assistant
- Josh Brown: 2025-2026, Australian National University. String Unification in the Next Generation of the Holbert Proof Assistant
- Jack Bashford: 2025, Australian National University Semester Project. A File Format for Holbert Proofs.
- Amy Yin: 2023-2024, University of Edinburgh. Concurrent Games in Agda.
- Amy Yin: 2023, University of Edinburgh LFCS Internship Project. Branching Bisimulation Games in Agda.
- Aria Shrimpton: 2023-2024, University of Edinburgh. Candelabra: Efficient selection of ideal container implementations.
- Scott Maxwell: 2023-2024, University of Edinburgh. Metamorphosis: An automatic collection implementation selector.
- Ke Shen: 2022-2023, University of Edinburgh. Formal Verification of Partition Refinement Algorithms.
- Rayhana Amjad: 2021-2022, University of Edinburgh. Equality and Rewriting in the Holbert Proof Assistant.
- Chris Perceval-Maxwell: 2021-2022, University of Edinburgh. Elimination and Induction in the Holbert Proof Assistant.
- Yining Liu: 2021-2022, University of Edinburgh. Textbook Features in the Holbert Proof Assistant.
Academic community roles [loc-0003]
- Member, IFIP Working Group 2.1: Algorithmic Languages and Calculi, 2025–present (observer from 2024–2025).
- Organiser, ICFP '25 Programming Contest, 2025.
- Editor (Social Media), Journal of Functional Programming, 2020–present.
- Member at Large, Workshop on Type-Driven Development Steering Committee, 2022–2024.
- Publicity Chair, Scottish Programming Languages Institute, 2022–2024.
- Organiser and Designer, TypeSIG Advent of Proof, 2023.
- Problem Designer, TypeSIG Advent of Proof, 2024.
Program committees
- Haskell '25: 18th ACM SIGPLAN Haskell Symposium
- FProPer '25: 2nd ACM SIGPLAN Workshop on Functional Programming for Productivity and Performance
- APLAS '25: 23rd Asian Symposium on Programming Languages and Systems
- ICFP '25: 29th ACM SIGPLAN International Conference on Functional Programming
- PLDI '25: 46th ACM SIGPLAN International Conference on Programming Language Design and Implementation
- SBLP '24: 28th Brazilian Symposium on Programming Languages
- PEPM '24: ACM SIGPLAN International Workshop on Partial Evaluation and Program Manipulation
- APLAS '23: 21st Asian Symposium on Programming Languages and Systems
- SBLP '22: 26th Brazilian Symposium on Programming Languages
- ICFP '21 Student Research Competition
- TyDe '17: 2nd ACM SIGPLAN International Workshop on Type-Driven Development
Other reviewing
- Journal Review, Journal of Functional Programming, 2025
- External Review, TASE '23: 17th International Symposium on Theoretical Aspects of Software Engineering
- External Review, ESOP '22: 31st European Symposium on Programming
- External Review, FoSSaCS '21: 24th International Conference on Foundations of Software Science and Computation Structures
- Journal Review, Journal of Functional Programming, 2020
- External Review, CPP '18: 7th ACM SIGPLAN International Conference on Certified Programs and Proofs
- External Review, POPL '16: 43rd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages
- Artifact Evaluation, ICFP '18: 23rd ACM SIGPLAN International Conference on Functional Programming
- Subreviewer, CSF '19: 32nd IEEE Computer Security Foundations Symposium
- Subreviewer, ASPLOS '19: 24th International Conference on Architectural Support for Programming Languages and Operating Systems
- Subreviewer, ITP '17: 8th International Conference on Interactive Theorem Proving
- Subreviewer, ICFP '15: 20th ACM SIGPLAN International Conference on Functional Programming
- Subreviewer, POPL '15: 42nd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages
- Subreviewer, ICFP '14: 19th ACM SIGPLAN International Conference on Functional Programming
- Subreviewer, APLAS '13: 11th Asian Symposium on Programming Languages and Systems