The course covers basic concepts and principles underlying modern programming languages. We focus on understanding from the point of view of a programmer, although due attention is paid also to the theoretical principles that enable design of programming languages.

- Introduction and arithmetical expressions
- A commmand-based programming language
- Proving correctness of programs
- Lambda calculus
- Declarative programming and algebraic datatypes
- Recursive types and recursion
- Polymorphism and type inference
- Abstraction: signatures, modules, and functors
- Logic programming & logic constraint programming
- Records and objects

- nosilec: Andrej Bauer
- nosilec: Matija Pretnar