Teaching (After 2018)

Below are materials of recent courses that I taught, for which I created materal that might be interesting to someone.

Programming Languages

I have been teach programming languages every fall since 2018. The course covers Java, Python and Prolog. I have slides on Prolog and Python. Java is usually taught by a colleague. I learned modern Java from him. I would have no problem teaching Java. Teaching Python requires rechecking your slides every year, as well as rechecking your examples, because the language sometimes changes in ways that invalidate old code.

In addition to the slides, there were exercises and assignments which I am not publishing. If you wish to see those, send me mail. These are slides on the basics of Prolog. Since the course does not only teach concrete programming languages, but also principles of programming languages, there also is a discussion on programming paradigms.

Compiler Construction

I taught compiler construction at Nazarbayev University. This is the latest course syllabus .

Theory of Computation

The latest version (2023) of this course consisted of three parts:
  1. First part covered the polynomial complexity classes P and NP, the notion of NP-completeness, NP-completeness of the SAT problem, polynomial reductions and some more examples of NP-complete problems. All of this is standard theory. Slides are based on the Garey and Johnson book.
  2. In the second part, I covered lambda calculus. I explained untyped lambda calculus, the fact that lambdas are invisibly all around us, for example in integrals or differentials. Next I explained how to define recursive datatypes in lambda calculus, like natural numbers, lists, partial objects, and pairs. After that, I introduced typed lambda calculus and demonstrate the Hindley/Milner type algorithm. I believe most descriptions of the HM type checking algorithm on the internet are incomplete, but my description is correct.
  3. Third part covered some data structures not covered in our regular courses on complexity theory: Priority queues and red-black trees. I explain that red-black trees are a clever way of implementing 234 trees, when nodes of variable length are implemented as linked lists.