1. Programming Languages

What you should know!
- What, exactly, is a programming language?
- How do compilers and interpreters differ?
- Why was FORTRAN developed?
- What were the main achievements of ALGOL 60?
- Why do we call Pascal a Third Generation Language?
- What is a Fourth Generation Language?

Can you answer these questions?
- Why are there so many programming languages?
- Why are FORTRAN and COBOL still important programming languages?
- Which language should you use to implement a spelling checker?
- A filter to translate upper-to-lower case? 
- A theorem prover? 
- An address database?
- An expert system? 
- A game server for initiating chess games on the internet? 
- A user interface for a network chess client?

2. Systems Programming

What you should know!
- What is a header file for?
- What are declarations and definitions?
- What is the difference between a char* and a char[]?
- How do you allocates objects on the heap?
- Why should every C project have a makefile?
- What is sizeof(abcd)?
- How do you handle errors in C?
- How can you write functions with side-effects?
- What happens when you increment a pointer?

Can you answer these questions?
- Where can you find the system header files?
- Whats the difference between c++ and ++c?
- How do malloc and free manage memory?
- How does malloc get more memory?
- What happens if you run: free(hello)?
- How do you write portable makefiles?
- What is sizeof(&main)?
- What trouble can you get into with typecasts?
- What trouble can you get into with pointers?

3. Multiparadigm Programming

What you should know!
- What new features does C++ add to C?
- What does Java remove from C++?
- How should you use C and C++ commenting styles?
- How does a reference differ from a pointer?
- When should you use pointers in C++?
- Where do C++ objects live in memory?
- What is a member initialization list?
- Why does C++ need destructors?
- What is OCF and why is it important?
- Whats the difference between delete and delete[]?
- What is operator overloading?
- Why are templates like macros?

Can you answer these questions?
- Why doesnt C++ support garbage collection?
- Why doesnt Java support multiple inheritance?
- What trouble can you get into with references?
- Why doesnt C++ just make deep copies by default?
- How can you declare a class without a default constructor?
- Why can objects of the same class access each others private members?
- Why are templates only defined in header files?
- How are templates compiled?
- What is the type of a template?

4. Stack-based Programming

What you should know!
- What kinds of stacks does PostScript manage?
- When does PostScript push values on the operand stack?
- What is a path, and how can it be displayed?
- How do you manipulate the coordinate system?
- Why would you define your own dictionaries?
- How do you compute a bounding box for your PostScript graphic?

Can you answer these questions?
- How would you program this graphic? 
- When should you use translate instead of moveto?
- How could you use dictionaries to simulate object-oriented programming?

5. Functional Programming

What you should know!
- What is referential transparency? Why is it important?
- When is a function tail recursive? Why is this useful?
- What is a higher-order function? An anonymous function?
- What are curried functions? Why are they useful?
- How can you avoid recalculating values in a multiply recursive function?
- What is lazy evaluation?
- What are lazy lists?

Can you answer these questions?
- Why dont pure functional languages provide loop constructs?
- When would you use patterns rather than guards to specify functions?
- Can you build a list that contains both numbers and functions?
- How would you simplify fibs so that (a+b) is only called once?
- What kinds of applications are well-suited to functional programming?

6. Type Systems

What you should know!
- How are the types of functions, lists and tuples specified?
- How can the type of an expression be inferred without evaluating it?
- What is a polymorphic function?
- How can the type of a polymorphic function be inferred?
- How does overloading differ from parametric polymorphism?
- How would you define == for tuples of length 3?
- How can you define your own data types?
- Why isnt == pre-defined for all types?

Can you answer these questions?
- Can any set of values be considered a type?
- Why does Haskell sometimes fail to infer the type of an expression?
- What is the type of the predefined function all? How would you implement it?

7. Introduction to the Lambda Calculus

What you should know!
- Is it possible to write a Pascal compiler that will generate code just for programs that terminate?
- What are the alpha, beta and eta conversion rules?
- What is name capture? How does the lambda calculus avoid it?
- What is a normal form? How does one reach it?
- What are normal and applicative order evaluation? 
- Why is normal order evaluation called lazy?
- How can Booleans, tuples and numbers be represented in the lambda calculus?

Can you answer these questions?
- How can name capture occur in a programming language?
- What happens if you try to program W in Haskell? Why?
- What do you get when you try to evaluate (pred 0)? What does this mean?
- How would you model negative integers in the lambda calculus? Fractions? 
- Is it possible to model real numbers? Why, or why not?

8. Fixed Points

What you should know!
- Why isnt it possible to express recursion directly in the lambda calculus?
- What is a fixed point? Why is it important?
- How does the typed lambda calculus keep track of the types of terms?
- How does a polymorphic function differ from an ordinary one?

Can you answer these questions?
- Are there more fixed-point operators other than Y?
- How can you be sure that unfolding a recursive expression will terminate?
- Would a process calculus be Church-Rosser?

9. Introduction to Denotational Semantics

What you should know!
- What is the difference between syntax and semantics?
- What is the difference between abstract and concrete syntax?
- What is a semantic domain?
- How can you specify semantics as mappings from syntax to behaviour?
- How can assignments and updates be modelled with (pure) functions?

Can you answer these questions?
- Why are semantic functions typically higher-order?
- Does the calculator semantics specify strict or lazy evaluation?
- Does the implementation of the calculator semantics use strict or lazy evaluation?
- Why do commands and expressions have different semantic domains?

10. Logic Programming

What you should know!
- What are Horn clauses? 
- What are resolution and unification?
- How does Prolog attempt to answer a query using facts and rules?
- When does Prolog assume that the answer to a query is false?
- When does Prolog backtrack? How does backtracking work?
- How are conjunction and disjunction represented?
- What is meant by negation as failure?
- How can you dynamically change the database?

Can you answer these questions?
- How can we view functions as relations?
- Is it possible to implement negation without either cut or fail?
- What happens if you use a predicate with the wrong number of arguments?
- What does Prolog reply when you ask not(male(X)). ? What does this mean?

11. Applications of Logic Programming

Can you answer these questions?
- What happens when we ask digits([A,B,A])?
- How many times will soln2 backtrack before finding a solution?
- How would you check if the solution to the puzzle is unique?
- How would you generalize the puzzle solution to solve arbitrary additions?
- Can you use subset/2 to find all subsets of a set?
- Will all the recursive predicates terminate?
- What would happen if we didnt cut in minkey/4?
- How could we generate the set of all min keys?
- Would it be just as easy to implement these solutions with a functional language?

12. Symbolic Interpretation

What you should know!
- What are definite clause grammars?
- How are DCG specifications translated to Prolog?
- Why are abstract grammars inappropriate for parsing?
- Why are left-associative grammar rules problematic?
- How can we represent syntax trees in Prolog?
- Why dont we need to implement alpha conversion?
- How can abstraction and application be used to model scopes?

Can you answer these questions?
- Why must DCG side conditions be put in { curly brackets }?
- What exactly does the C predicate do?
- Why do we need a separate lexer?
- How would you implement an interpreter for the assignment language we defined earlier?
- Can you explain each usage of cut (!) in the lambda interpreter?
- Can you think of other ways to implement newname/3?
- How would you modify the lambda interpreter to use strict evaluation?
- 