CS 360
Winter 2017
Programming Language Concepts
CS 360-001 Tuesday/Thursday 15:30-16:50 (Rush 9)
CS 360-002 Tuesday/Thursday 14:00-15:20 (Rush 9)
CS 360-003 Tuesday 18:30-21:20 (Science Center 326, 3401 Market)

Geoffrey Mainland
Office: University Crossings 106
Office hours: Mondays 4pm–7pm; Thursdays 5pm–6pm.
Teaching Assistant:
Xiao Han
CLC office hours: Monday 2pm–4pm; Friday 3pm–5pm
Warning! This material is for an old version of the course.

The final will cover material from the entire course. However, the midterm covered material up to but not including Prolog (the second lecture of week 5), so you can expect that the final exam will focus on material not covered by the midterm.

You may be asked to write some small functions in Scheme and/or Haskell. You will not lose points for minor syntactic errors.

You may bring a single, hand-written, two-sided, 8.5” x 11” sheet of notes to the exam. This sheet must have your name on it, and it will be collected with your exam.

No electronic devices may be used during the exam. Please ensure that all electronic devices are out of sight during the exam. You may not listen to music on your phone or any other device during the exam.

  1. Lambda calculus. Know the syntactic structure of the lambda calculus and understand how to evaluate lambda calculus terms. Understand the different ways in which one could define an operational semantics for the lambda calculus.

  2. Prolog. Understand Prolog’s execution model.

  3. Nondeterministic Finite Automata. Understand how to simulate an NFA and know how to convert a regular expression into an NFA.

  4. Know what it means for a value to be a fixed point of a function.

  5. Denotational semantics. Understand how to construct and use a denotational semantics for a simple language.

  6. Operational semantics. Understand how to construct and use an operational semantics for a simple language.

  7. Axiomatic semantics. Understand how to define soundness and completeness of a logical system. These are properties of a logical system relative to a semantics.

  8. Functors. Understand how to define a Functor instance for a data type.

  9. Monads. Understand the monad abstraction and how return and bind (>>=) work.

  10. Understand the difference between lexing and parsing. Understand why regular expressions are used for lexing and context-free grammars are used for parsing.

  11. Understand why CFGs are more powerful than regular expressions.

  12. Understand how to eliminate left recursion in a grammar and how to left factor a grammar.

  13. Understand First, Follow, and Nullable.

  14. Be able to write a simple recursive-descent parser.