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