For the final exam the students should know (LISP chapters refer to Practical Common Lisp, PROLOG chapters refer to Prolog tutorial):

- LISP runtime mechanism architecture: the reader that translates text into LISP objects and the evaluator that implements the semantics in terms of those objects (Ch 4)

- How to define functions (Ch 5)

- What lambda-expressions are, how to define them and how to invoke them (Ch 5)

- How to define global (defvar, defparameter) and local variables (let, setq, setf), know how variables are scoped, understand the notion of a symbolic variable (Ch 6)

- The differences between LISP functions, special forms and macros (Ch 4)

- Control structure special forms and macros (the IF special operator; the COND macro; the AND, OR, NOT boolean operators; the DO, DOLIST, DOTIMES, LOOP macros; the PROGN special operator; the WHEN and UNLESS macros) (Ch 7)

- Numbers, Characters, Strings (Ch 10)

- Lists, notion of a cons cell, CAR and CDR operators, manipulation of lists; representation of a list in memory (Ch 12, An Brief Intro to LISP by James Turner on youtube)

- The notion of tail recursion, how to use it in LISP

- Be able to write a function for factorial calculation in LISP with tail recursion (An Brief Intro to LISP by James Turner on youtube)

- The material on PROLOG from the tutorial described in class: an emphasis on understanding how unification (matching) and backtracking mechanisms behave, understand the "goal" ports (CALL, FAIL, EXIT, REDO)

- The notions of a fact, a rule, how global values are managed via RETRACT and ASSERTA, ASSERTZ

- Be able to implement a factorial in PROLOG using tail recursion (Ch 8)

- The definition and manipulation of lists (Ch 11)

- The CUT predicate (Ch 13), what it does, how it can help optimize an implementation of some search algorithm

- The REPEAT predicate, its behavior; knowing how to implement a loop using repeat and the corresponding control flow in terms of "goal" box ports; knowing how to implement a loop via recursion (Ch 14)