In the programming languages you are used with (such as Java and C++) you instruct the computer to cary on a certain computation by specifying a sequence of basic computation steps. This falls into the ``imperative'' programming paradigm. We talk in this course about two other ways of accomplishing the same task (writing a program that solves a certain problem) in a ``declarative'' way, i.e., by describing the problem in a certain formalism and then letting the computer to do the rest. Specifically, we talk about two ways of accomplishing this: the functional and logic programming paradigms.

We thus base the course on the following *rough* (i.e., subject
to change) outline:

- Introduction, rules of the game, etc (1 week)
- Functional programming using Haskell (7 weeks)
Introduction to Haskell 1 week Techniques and methods 2 weeks Types 2 weeks Lazy evaluation 1 week Correctness 1 week - Logic programming using Prolog (5 weeks)
Predicates and terms, proof search 1 week Unification and backtracking 2 weeks Typical applications 2 weeks