Types for Programs and Proofs

DAT350 (Chalmers) / DIT235 (GU)

Fall Term 2026 (LP1)

Sources on GitHub

Agda logo

Most course information is on Canvas.

Further course links:
Schedule on TimeEdit / Chalmers studieportal / GU ad (sv) / GU kursplan / GU course description / Course page 2025

Schedule

This schedule is preliminary!

Date Time Teacher Title Reading / Remark
Thu 03/09 10-12 AA 01 Introduction to Agda LN 1 - 3; VFP 1, 3; DTW 1, 2.1 - 2.5
Mon 07/09 13-15 TC 02 Dependent types
Mon 07/09 15-17 AA Getting started with Agda
Thu 10/09 10-12 AA 03 Martin-Löf Type Theory (part 1)
Mon 14/09 13-15 AA 04 Martin-Löf Type Theory (part 2) TPL 1-3
Mon 14/09 15-17 AA More on Agda Homework 1 due
Thu 17/09 10-12 TC 05 The identity type and indexed inductive types TPL 3-4
Mon 21/09 13-15 TC 06 Introduction to operational semantics and type systems TPL 5-10
Mon 21/09 15-17 TC More on Agda Homework 2 due
Thu 24/09 10-12 TC 07 Introduction to operational semantics and type systems
Mon 28/09 13-15 AA 08 Simply typed lambda calculus and normalization by evaluation
Mon 28/09 15-17 AA More on Agda Homework 3 due
Thu 01/10 10-12 AA 09 Confluence and Standardization
Mon 05/10 13-15 AA 10 Weak and Strong Normalization
Mon 05/10 15-17 AA Exercises on operational semantics and type systems in Agda Homework 4 due
Thu 08/10 10-12 AA 11 Machines: Krivine and CEK Danielsson: MSc topics
Mon 12/10 13-15 TC Student presentations
Mon 12/10 15-17 TC Student presentations
Thu 15/10 10-12 TC Student presentations
Mon 19/10 13-15 TC Student presentations
Mon 19/10 15-17 TC Student presentations
Tue 20/10 08- Take home exam Deadline: Fri 23/10 18:00

Teachers: TC = Thierry Coquand, AA = Andreas Abel.
Room: Lecture hall MC.

Literature

Further literature and online access to books via the library can be found on Canvas.

Lectures

Lecture 1

Agda code: live code start, solution, rendered

Lecture 2

Agda code: bb2.agda (rendered) (Turing machines, the Busy Beaver champions, a proof that a machine never stops),
euclidean.agda (rendered) (de Bruijn’s example, the Poincaré principle),
Gentzen.agda (rendered) (natural deduction as programming),
exercises3.agda (rendered) (simple exercises on propositions as types)

Exercise 1

Getting started with Agda.
Help-session where Andreas will help you get started with Agda programming.
Before this session you need to install Agda and try to write your first Agda programs.
We’ll do some simple exercises in Agda.

Lecture 3

Slides: lecture3.pdf

Lecture 4

Slides: lecture4.pdf

2025 Lecture 3

2025 Lecture 4

Lecture 5

Slides: lecture5.pdf

Agda code: Id5.agda (rendered) (the identity type: elimination rules and their motive, J, subst, cong),
deduction.agda (rendered) (indexed inductive types, derivations as an inductive family, the deduction theorem),
checksize.agda (rendered) (the size of the derivations built by the deduction theorem)

Lecture 6

Slides: lecture6.pdf

Agda code: peirce.agda (rendered) (the truth tables, and forcing over two stages of knowledge: Peirce’s law is not derivable),
typetype.agda (rendered) (the rules of the slides, constructor for constructor, as an indexed inductive family),
minimalrules.agda (rendered) (the same theory with the redundant premises dropped, the translations both ways, and the presupposition, weakening and substitution lemmas; it imports selfcontained.agda (rendered)),
xirule.agda (rendered) (the ξ rule derived from β and function extensionality; this file postulates the two weakening lemmas, which are theorems in minimalrules.agda)

Lecture 7

Slides: lecture7.pdf

Agda code: arith1.agda (rendered) (the language, small-step semantics, typing, preservation and progress),
arithexp.agda (rendered) (a variant where progress is an inductive family, and a well-typed normal form is a value),
operational.agda (rendered) (big-step semantics and its soundness; it imports arith1.agda),
compiler.agda (rendered) (the stack machine, the compiler and its correctness, with named intermediate steps),
compiler2.agda (rendered) (the same proof term without the named steps),
Confluence.agda (rendered) (the Church-Rosser theorem for β-reduction, following Martin-Löf’s proof by parallel reduction as given in Appendix II of Barendregt’s thesis (1971), lemma by lemma; historically, this proof was one of Plotkin’s motivations for operational semantics. It uses the syntax of the rules of Type : Type from selfcontained.agda)

Lecture 8

Slides: lecture8.pdf

Agda code:

Lecture 9

Reduction: role and definition

Confluence properties

Confluence via parallel reduction (Tait and Martin-Löf, Takahashi)

Standard reduction

Agda code: entrypoint Lecture9.agda, rendered

Lecture 10

Normalization for typed lambda-calculus

Agda code (rendered)

Lecture 11

Agda code:

2025 lectures

2025 Lecture 8

Agda code (expressions in spine form, superseded by lecture 9): live code start, full, rendered

2025 Lecture 9

Implementation of simply-typed lambda-calculus (STLC), continued.

Agda live code: start, finish, solution, rendered

2025 Lecture 10

Normalization for typed lambda-calculus

Agda live code: start, solution, rendered

Software

We recommend Agda version 2.8.0 (recent older versions are also ok).

Installing Agda from binary

  1. Download a suitable binary package from https://github.com/agda/agda/releases/tag/v2.8.0 and put it in your PATH
  2. Run agda --setup

Installing Agda from source

  1. Install latest Haskell (see below)
  2. Install Agda from Stackage nightly: stack install --resolver=nightly Agda
  3. Run agda --setup
  4. Set up the Agda mode (see below)

Installing Haskell

  1. Install GHCup
  2. Install Stack (3.11.1) and GHC (9.12.4) from within ghcup tui
  3. Ensure that the path printed by stack path --local-bin is in your system PATH

Note: if you use GHC 9.14.1 to build Agda, you need Agda 2.8.0.1 rather than 2.8.0.

Setting up the Agda mode (Emacs)

  1. Compile the Emacs lisp files: agda-mode compile
  2. Install the Agda mode: agda-mode setup

Setting up the Agda mode (VSCode)

Get the agda-mode extension (authored by Ting-Gian LUA).

Installing the Agda standard library

To install a library for Agda, it must be downloaded and the path to its .agda-lib file must be mentioned in the file $AGDA_APP_DIR/libraries, where $AGDA_APP_DIR is the directory printed by agda --print-agda-app-dir.
(In case this directory does not exist yet, please create it.)

For instance, to install the Agda standard library, you can follow these steps.

  1. Download the version of the standard library for your Agda version according to https://wiki.portal.chalmers.se/agda/Libraries/StandardLibrary .
    For Agda 2.8.0, this is version 2.4.

  2. Unpack the library into a directory of your choice, for instance (on Linux/MacOS):
    ~/.agda/libraries.d/standard-library

  3. Recommended: in this directory rename agda-stdlib-2.4 to v2.4 (or similar).

  4. Add the following line to your ~/.agda/libraries file (create it if it does not exist):

    ~/.agda/libraries.d/standard-library/v2.4/standard-library.agda-lib

    In this you need to expand ~ manually to your home folder.

On Windows, the libraries file might reside in another directory than ~/.agda.
Check the output of agda --print-agda-app-dir.