15814 Types and Programming Languages
Fall 2019 
Frank Pfenning 
TuTh 10:3011:50 
GHC 4215 
12 units 
First lecture will be Tue Sep 3 
This graduate course provides an introduction to programming languages
viewed through the lens of their type structure.
Prerequisites: This is an introductory graduate
course with no formal prerequisites, but an exposure to various forms
of mathematical induction will be helpful. Enterprising undergraduates
and masters students are welcome to attend this course.
Prior Versions of This Course
Class Material
Course Information
Lectures 
Tu Th 10:3011:50, GHC 4215 
Instructor 
Frank Pfenning, fp@cs
Office Hours Fri 1:00pm2:00pm, GHC 6017

Teaching Assistant 
Farzaneh Derakhshan, fderakhs@andrew
Office Hours Mon 2:30pm3:30pm, WeH 5302

Course Communication 
piazza.com/cmu/fall2019/15814 
Textbook and Notes 
Robert Harper,
Practical Foundations for Programming Languages (Second Edition),
Cambridge University Press, April 2016.
Additional notes will be posted on the schedule page.

Credit 
12 units 
Grading 
60% Homework, 15% Midterm, 25% Final 
Homework 
Homework assignments are posted on the assignments page.

Midterm 
Thu Oct 17, in class.
Closed book.

Final 
Fri Dec 13, 5:30pm8:30pm, location TBA
Closed book.

Home 
http://www.cs.cmu.edu/~fp/courses/15814f19/ 
Learning objectives:
After taking this course, students will be able to

define programming languages via their type system and operational
semantics

draw from a rich set of type constructors to capture essential
properties of computational phenomena

state and prove the preservation and progress theorems or exhibit
counterexamples

recognize and avoid common fallacies in proofs and language design

write small programs to illustrate the expressive power
and limitations of a variety of type constructors

state and prove properties of individual programs based on their
semantics or exhibit counterexamples

critique programming languages and language constructs
based on the mathematical properties they may or may not
satisfy

appreciate the deep philosophical and mathematical underpinnings
of programming language design
Core topics:
 Static and dynamic semantics
 Preservation and progress
 Hypothetical judgments and substitution
 Propositions as types, natural deduction, sequent calculus
 The untyped lambdacalculus
 Functions, eager and lazy products, sums
 Recursive types
 Parametric polymorphism, data abstraction, existential types
 K machine, S machine, substructural operational semantics
 Messagepassing concurrency, session types
[ Home
 Schedule
 Assignments
 Resources
]
fp@cs
Frank Pfenning
