Jesse A. Tov
1 Mathematical Preliminaries
1.1 Defining Sets
1.2 Proving Properties by Induction
1.3 Defining Relations to Identify Desired Subsets
1.4 Proving Properties by Induction using Relations
1.5 Contexts and Relations that Capture Computation
1.6 Contexts and Proofs
1.7 A Preservation Proof
2 The let-zl language
2.1 Syntax
2.2 Dynamic semantics
2.2.1 Errors
2.3 Static semantics
2.3.1 Type safety
2.3.1.1 Preservation
2.3.1.2 Progress
2.4 Termination
3 The simply-typed lambda calculus λ-st
3.1 Syntax
3.2 Dynamic semantics
3.3 Static semantics
3.3.1 Type safety
3.4 An extension
3.5 Normalization
3.6 Adding nontermination
4 λ-sub: subtyping with records
4.1 Syntax
4.2 Dynamic semantics
4.3 Static semantics
4.3.1 Subtyping
4.3.2 Type safety
4.4 Compiling with coercions
5 The polymorphic lambda calculus λ-2
5.1 Syntax
5.2 Dynamic semantics
5.3 Static semantics
5.4 Church data
5.4.1 Natural numbers
5.4.2 Booleans
5.4.3 Products
5.4.4 Sums
5.4.5 Lists
5.4.6 Existentials
6 The higher-order lambda calculus λ-ω
6.1 Syntax
6.2 Dynamic semantics
6.3 Static semantics
7 ML type inference
7.1 STLC revisited
7.1.1 Dynamic semantics
7.1.2 Static semantics
7.1.3 Adding a base type
7.1.4 Introducing let polymorphism
7.2 Type schemes in λ-ml
7.3 Statics
7.3.1 The logical type system
7.3.2 The syntax-directed type system
7.4 Type inference algorithm
7.4.1 Unification
7.4.2 Algorithm W
7.5 Constraint-based type inference
8 Qualified types
8.1 Syntax
8.2 Dynamic semantics
8.3 Static semantics
8.3.1 Syntax of types
8.3.2 The types of constants
8.3.3 Instantiation and entailment
8.3.4 Syntax-directed typing
8.4 Type inference algorithm
8.5 Evidence translation