Course at https://plfa.github.io
- Naturals: Natural numbers
 - Induction: Proof by Induction
 - Relations: Inductive definition of relations
 - Equality: Equality and equational reasoning
 - Isomorphism: Isomorphism and Embedding
 - Connectives: Conjunction, disjunction, and implication
 - Negation: Negation, with intuitionistic and classical logic
 - Quantifiers: Universals and existentials
 - Decidable: Booleans and decision procedures
 - Lists: Lists and higher-order functions
 
- Lambda: Introduction to Lambda Calculus
 - Properties: Progress and Preservation
 - DeBruijn: Intrinsically-typed de Bruijn representation
 - More: Additional constructs of simply-typed lambda calculus
 - Bisimulation: Relating reduction systems
 - Inference: Bidirectional type inference
 - Untyped: Untyped lambda calculus with full normalisation
 - Confluence: Confluence of untyped lambda calculus
 - BigStep: Big-step semantics of untyped lambda calculus
 
- Denotational: Denotational semantics of untyped lambda calculus
 - Compositional: The denotational semantics is compositional
 - Soundness: Soundness of reduction with respect to denotational semantics
 - Adequacy: Adequacy of denotational semantics with respect to operational semantics
 - ContextualEquivalence: Denotational equality implies contextual equivalence
 
All credit to P. Wadler et al. for such an amazing work.