Midterm Exam
============

The format of the exam is:

* 5 questions long

  - 4 questions are required
  
  - 1 is extra credit

* Each question includes

  - Multiple choice

  - "Show your work" to solve/explain the multiple choice answer, in some
    appropriate way for that question

* Questions are similar to homework assignments 1-3

* Don't have to write real code (like Ruby, etc)

Topics follow the structure of the lectures from first ~1/3 of the semester.
Questions follow homework exercises, including:

1. Syntax & Grammars

  - Which string is in a grammar?
  
  - Write a *parse derivation* and an *abstract syntax tree*
  
  - Like assignment 1, exercises 4, 6 and 7

2. Big-step Operational Semantics

  - Predict answer of evaluating an expression
	
  - Write a *derivation tree* following the rules of a big-step operational
    semantics
  
  - like assignment 2, exercises 1 and 3

3. Small-step Operational Semantics

  - Determine valid evaluation contexts by writing a parse derivation (the same
    as the Syntax & Grammars topic 1)

  - Use evaluation context to apply small-step reduction rules to take 1 step in
    an expression
	
  - like assignment 2, exercises 5 and 6

4. Lambda Calculus

  - Draw the syntax tree of a lambda calculus expression, like assignment 3,
    exercise 2

  - Identify bound versus free variables in a syntax tree, by connecting the
    places where variables are used to the places where they are bound, like
    assignment 3, exercise 3

  - Select the correct alpha renaming of one bound variable to another name,
    like assignment 3, exercise 4

  - Perform beta reduction of an expression step-by-step to calculate its
    answer, like assignment 3, exercises 5 and 6
