This course provides an introduction to logic programming and to functional programming. This is a programming course designed to get you to think declaratively and non-procedurally. If you think that changing the value of a variable is a weird thing to do both from a human's perspective (just what does a variable's value mean if it keeps changing?) and from a computer's perspective (if the value was used for something else, does that value also have to change? If something is already computer can't the old value just be retrieved? We can optimize code better if we know what it means. "Undo" becomes trivial.) then this course is for you.


MWF 12:00pm to 12:50pm, room DMP 310.


Instructor: David Poole, Office hours: Wednesdays 3:00-4:00 + I will have time immediately after class or by appointment (room ICCS 109).

Teaching Assistants:

See Canvas for rooms and any changes.

Structure of the Course

There will be 3 hours of in-class interaction per week.

We will use iclickers for this course. Every day there will be clicker questions the previous and current classes.

We will use Canvas for discussions, clicker registration and to view grades. All other content will be on this web site; in particular keep checking the Schedule tab for lectures, assignments, etc.

The first part of the course will be on functional programming (mainly using Haskell) and the second part will be on logic programming (mainly using Prolog, but also about semantic web languages). You will need to download and use the Haskell Platform and SWI-Prolog (get the stable release) (both are free).



The course assessment will be based on assignments, in-class participation, and exams. Assignments will be a mix of short (one week) assignments, and two group "projects" which will be longer assignments, where you will choose what you work on.

The breakdown of marks is tentatively:

Academic integrity is essential for a university to function. Plagiarism and cheating will be treated seriously. The work you hand in must be your own, except where you have explicitly cited the source. If in doubt, put others' words in quotations and cite the source. See UBC Regulation on Plagiarism.


There will be approximately weekly assignments (except for the times when you should be working on your project). These are not meant to be time consuming, but are essential to getting you to think about programming in new ways. See the Schedule tab for upcoming assignments.

Late assignments will not be accepted after a solution is posted (which will not be until after the due time). Assignments will be lightly marked (mainly for participation, but also for common errors). If you want detailed feedback, ask general questions in the class after the assignment is due or ask a TA in their office hours.


There will be two group projects; one for functional programming and one for logic programming. You will need to do this in groups of 2 or 3. You cannot do it alone, and cannot do it in larger groups (if you have 4 or 5 people they should form 2 groups). You will have a TA mentor that you will submit a brief proposal to. The group will give a demo to a TA at a prearranged time. Each group will need to submit their code and a brief report. The project can be about anything, but we will provide a number of options.

Last updated: 2018-09-21, David Poole