This course will cover functional and logic programming, concepts of programming language design, and formal reasoning about programs and programming languages. The topics included are: Functional Programming (ML/OCaml); Small-step and large-step operational semantics; Denotational semantics; Fixpoints, fixpoint induction; Axiomatic semantics; Type theory, Untyped and simply typed lambda calculus; Partial evaluation, non-determinism, Logic programming