Where and When
Dempster 301
3:30 to 5:00pm
Tuesdays and Thursdays
Instructor
Kurt Eiselt
eiselt@cs.ubc.ca
ICICS 233
Office hours
To be determined, but you can send email to set up an appointment, or just walk
through the office door if it's open. (And if it's closed, don't bother to knock...that's
my not-so-subtle way of letting people know I'm either not there or I'm really busy
and not receiving visitors.)
Teaching Assistants
Mark Crowley crowley@cs.ubc.ca
Amit Goyal goyal@cs.ubc.ca
(note: TAs have a habit of being reassigned right before the start of the term, so
these two folks may not be our TAs for long)
Official Calendar Description
Principles of symbolic computing, using languages based upon first-order logic
and the lambda calculus. Algorithms for implementing such languages.
Applications to artificial intelligence and knowledge representation.
Unofficial Instructor Description
If you're considering enrolling in this course, then you've probably done some
programming in Java, C, or C++. These programming languages, like almost
all languages, are imperative programming languages. Imperative programs
are written as sequences of instructions that change or mutate program state.
The instructions themselves correspond fairly closely to machine-level
instructions that move data from memory to registers, modify the data, and
then move the modified data back to memory. An imperative programming
language thus constrains the programmer to define a solution to a problem in
terms of the computer's low-level architecture. Adding concepts like classes
and objects to an imperative language puts some useful distance between the
programmer and the computer architecture and provides additional flexibility
when considering possible solutions, but when you get down to the task of
writing Java methods, for example, you're writing imperative programs.
Imperative programming languages are good for tackling many computational
problems but they are by no means the best tools for solving all computational
problems.
CPSC 312 introduces students to two other programming paradigms, the
functional programming paradigm and the logic programming paradigm, each
of which provides a very different perspective on computation than the imperative
paradigm. In this course, the functional languages are represented by Haskell
and the logic languages are represented by Prolog. Each of these languages
will require you to think about computation in ways you probably never have
before, and that's really the point of this course. As the noted computer
scientist Alan Perlis once said, "A language that doesn't affect the way you
think about programming is not worth knowing."
If you're looking for specific marketable skills to add to your resume, this may
not be the right course for you. To be honest, you're not likely to find many
Haskell or Prolog programming jobs waiting for you when you graduate.
However, knowledge of logic programming or functional programming can
make you a better programmer, even if you're using an imperative language.
One other thing: As the course title says, this is a "programming" course,
so if you're not fond of programming, you might look elsewhere for a course
to fill out your schedule. Learning two new programming languages while
trying to integrate two very different styles of thinking with what you already
know will, for some students, require far more practice than is provided by
the homework assignments. If you don't like programming, then you're less
likely to practice as much as you need to, which may in turn have an
unfortunate impact on your exam performance. I'm not trying to scare you
away. I just want you to understand that this course can be challenging.
Textbooks
The Art of Prolog (Second Edition), Leon Sterling and Ehud Shapiro,
MIT Press, 1994.
Haskell: The Craft of Functional Programming (Second Edition),
Simon Thompson, Addison-Wesley, 1999.
Tentative Grading Scheme
Assignments (several) 10%
Projects (2) 20%
Midterm exam 30%
Final exam* 40%
*You must earn at least 50% of the possible marks on the final
examination in order to pass the course, regardless of the marks
you have received for other evaluated components.
Very Tentative Schedule (this could change significantly)
Readings below are from Prolog text
Week 1 September 4,6
Ch.1: Basic Constructs
Week 2 September 11, 13
Ch. 2: Database Programming
Ch. 3: Recursive Programming
Week 3 September 17, 19
Ch. 4: The Computational Model of Logic Programming
Ch. 6: Pure Prolog
Week 4 September 25, 27
Ch. 7: Programming in Pure Prolog
Ch. 8: Arithmetic (only sections 8.1 and 8.2)
Ch. 14: Nondeterministic Programming (only sections 14.1 and 14.2)
Week 5 October 2, 4
Ch. 12: Extra-Logical Predicates (only section 12.2)
Ch. 16: Second-Order Programming (only section 16.1)
Midterm Exam is on October 4
Week 6 October 9, 11
Ch. 11: Cuts and Negation (only section 11.1 and 11.4)
More schedule to come...stay tuned