A study of non-imperative programming paradigms such as functional, object-oriented, logic, and constraint programming. Programming language semantics and type theory.