Korman Center 104C
The final will be released on BlackBoard on Friday, June 5.
When it is released, you will find a new “test” under the Tests menu on BlackBoard. This test is called “Are You Ready to Take the Final?” It consist of a single yes/no question. When you choose “yes” and submit the test, the real final will then become available to you. The real final is named “Final”, it will be under the “Tests” menu in BlackBoard, and it consists of a single PDF file.
Once the final is released to you, you have three hours to complete your answers. Your answers must be checked in to your git repository just as with the homeworks. Note that your submission window starts when you answer “yes” to the yes/no question, not when you download the PDF file.
Please be sure you can dedicate three full hours to the final before accessing it. You may choose any three hour window in which to take the final, but you must complete the final by 11:59pm EDT on Friday, June 12.
All questions regarding the final must be sent to Prof. Mainland; you may not ask Mark, or any other TA, faculty member, student, etc. any questions regarding the final. Violation of this rule will result in a score of 0.
If you have any questions about the final, please post a private note on Piazza. I will only answer questions that seek to resolve a genuine ambiguity in the final. I will not provide hints.
I always strive to answer Piazza questions promptly, but I guarantee availability during the usual class time, 18:30–21:30 EDT, on Thursday, June 11.
The final will be worth 100 points, but there will be 120 possible points. However, scores will be capped at 100.
We have provided you with a shell for your solution
here. Please extract this tarball in your
directory and immediately commit the resulting
final directory. You can do
this as follows:
$ cd ~/cs550/git $ wget 'https://www.cs.drexel.edu/~mainland/courses/cs550-201435/exams/final.tar.gz' $ tar xf final.tar.gz $ git add final $ git commit -m "Initial check-in for final."
All your changes should be made to the files
final-answers.txt. Be sure to commit your work to the repository.
We suggest you download the shell before you start the final.
The final will cover material from the entire course. However, the midterm covered material through week 5, so you can expect that the final exam will focus on material not covered by the midterm. You can also expect a particular emphasis on material that was not covered by a homework assignment.
You may be asked to write some small functions in Scheme and/or Haskell. Your code must compile for credit.
You may be asked to perform one or more proofs.
The midterm study guide accurately describes what you need to know from the first half of the course for the final exam. Additionally, I suggest you focus on the following aspects of the second half of the course.
There will not be a question regarding monads on the final exam.
Lambda calculus and its variants. 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. Understand the variants we saw in class—the simply-typed lambda calculus (including fix), the polymorphic lambda calculus, and the simply-typed and polymorphic variants without annotations (for which we can perform type inference).
Denotational semantics. Understand how to construct and use a denotational semantics for a simple language.
Operational semantics. Understand how to construct and use an operational semantics for a simple language.
Operational semantics based on reductions and contexts. Understand this flavor of operational semantics, which we implemented in Racket in lectures 9 and 10.
Axiomatic semantics. Understand how to define soundness and completeness of a logical system. These are properties of a logical system relative to a semantics.
Soundness and completness of type systems. Understand what soundness and completeness mean, and understand their proofs for a simple language.
Testing. Understand unit testing, property-based testing, and their
relative advantages. Be able to write unit tests using
property-based tests using
Type inference. Understand unification, non-polymorphic type inference, and Hindley-Milner (polymorphic) type inference.