University of Minnesota
CSci 2041: Advanced Programming Principles (afternoon)

CSci 2041: Advanced Programming Principles

Afternoon Section, Fall 2017
4 Credits
Lecture: MWF 1:25-2:15, Anderson 370
    Section 14: T 1:25-2:15, Keller 1-250
    Section 15: T 2:30-3:20, Keller 1-250
    Section 11: T 3:35-4:25, Keller 1-250
    Section 12: T 4:40-5:30, Keller 1-250

Nick Hopper
Keller 4-211
hoppernj AT umn edu

TAs:  Course Staff are listed in Moodle.

Office Hours:
Office hours are shown on the course google calendar - note that there may be some changes from week to week, so check that you are looking at the current week:

If you want to speak with one of us about the course and can't make one of the scheduled times, please send an email and we'll schedule a different meeting. 


There is no required textbook for the course; however, the course schedule will include links to required online readings and notes.  Many of the readings come from the unpublished manuscript "Introduction to Objective Caml," by Jason Hickey, which is available at no cost online; another free online reference that students might find helpful is "Developing Applications with Objective Caml" by Chailloux, Manoury and Pagano.

Course Overview:

The course is roughly divided into three units:
  1. Functional Programming in OCaml: We'll learn the basics of structuring a program as a series of (possibly) recursive expressions to be evaluated, examine the relationship between general recursion, tail recursion, and iteration; discuss using OCaml's strong static type system to build types that match the data while abstracting away the representation of these data; examine parametric polymorphism and higher-order types, and learn about higher-order functions and their applications in programming.

  2. Analysis and Manipulation of Programs We'll discuss the role of induction in reasoning about recursion and iteration, both to analyze correctness and efficiency of programs; further examine computation as expression evaluation; explore the use of lazy evaluation to compute with cyclic and infinite data objects; and explore programmatic representation and manipulation of programs.

  3. Advanced Program Structures We'll learn about  modularity in programming and OCaml's rich module system; techniques to express programs as units to be evaluated concurrently and in parallel; Side effects, type-safe references and iterative computation structures; and automated memory management in OCaml - how objects are laid out, created and collected when no longer needed.
Goals and Objectives:
Students who complete this course should be able to:
  • Write OCaml expressions for common programming tasks involving iteration and recursion
  • Understand common OCaml type errors and explain what they mean
  • Develop simple abstract data types in OCaml
  • Apply common higher-order functions to solve tasks involving iteration
  • Prove the correctness of simple recursive OCaml programs using inductive data types
  • Reason about and write programs that evaluate and transform program expressions
  • Explain and use OCaml modules
  • Explain side effects, references, and simple memory management concepts
A word about proofs. You may have noticed that the word "prove" plays a prominent role in this syllabus; you might guess this means proofs will play a prominent role in this course.  Many students in computer science believe they are "bad at proofs."   If you have done well in CSci 11X3 and 19X3 proofs should not scare you.

You may not have realized this before, but proofs are programs.  This is true in many senses: metaphorically, in that a proof is just a list of steps to convert an input (a set of assumptions) into an output, i.e., the conclusion; literally, in that many of the proofs in this class involve reasoning about programs; and in a very technical sense, a branch of logic known as constructive type theory actually establishes a one-to-one mapping between each program and the proof of some theorem. So if you learned to write good programs, you can learn to write proofs well. Ask yourself this: were you always good at writing programs?  Probably not.  How did you get better? By practicing, and seeing lots of examples of good programming.  In this class, you will practice writing proofs; the textbook and lecture notes for the class will feature many examples of proofs.

The prerequisites for this course are CSci 1913/1933 and CSci 2011.  From CSci 11X3 and 19X3 you will need to understand programming concepts like procedural abstraction, iteration and data abstraction.  From CSci 2011 you will need to understand concepts like sets, relations, functions, and mathematical induction. 

Lecture Schedule:
The course website includes a schedule of lectures for this course. The schedule includes the readings related to each class. Students are responsible for reading the appropriate materials for each lecture; we may not cover all of the reading material in the lecture but it may still be required for exams or homework. Lecture slides will usually be linked from the homepage before class, but always within one day following the corresponding lecture.

Grading for the class will be based on five components:
  • 7 Homeworks (25%): we will have seven homeworks, all of which will be due on Wednesdays.  The submission of any homework should be completed by 11:59pm on the Wednesday that it is due.

    Due dates for all assignments are strict: all homeworks must be pushed at or before the specified time in order to receive full credit. Late homeworks turned in within 24 hours of the due date will be considered for 50% credit, and after that, a homework is worth 0 points, with no exceptions.  More information about the protocol for submitting the homework and grade assignments will be included in each homework.  Note that if you have not correctly followed the submission instructions on a given homework by the time it is due, this will count as a late homework, and if you have not correctly submitted a homework by the late submission cutoff, then you will receive 0 points for the homework.

    Homework grading is performed by the TAs. If you have a question about homework grades, address it to the TAs. Only if something wholely unreasonable has occurred will the instructor intervene.  Furthermore, there is a limit of seven days from the date that an assignment is graded for grading problems to be dealt with. After that period, such will not be considered.

    Because everyone can have a bad week, each student's six highest homework scores will be used.
  • 15 Labs (15%):  Lab work will be graded on attendance and participation, and must be submitted by 11:59pm on the Thursday following each lab section.

  • 15 Weekly Exercise Sets (10%): Each week we will have a list of  "exercise" questions similar to problems in the lectures.   Solutions must be submitted by 11:59am on Monday to receive full credit for the week's exercises.

  • 12 Weekly Quizzes (25% total): We will have a 20-minute quiz at the end of lecture each Monday, with two exceptions noted on the class schedule. Each quiz can cover any material up to the end of lecture on the preceding Friday. To account for travel, illness, traffic and life's other difficulties that might occur during the semester, each student's ten highest quiz scores will be used.

  • Final exam (25%): The course will have a cumulative, 2-hour final exam on Monday, December 18 at 8am..  The exam is closed-book, closed-notes, and no electronic devices may be used. However, each student may bring a one-sided single-page "cheat sheet" for use during the exam.
 Composite scores will be assigned to grades as follows:

92 - 100
90 -  92
86 -  90
82 -  86
80 -  82
76 -  80
70 -  76
66 -  70
63 -  66
59 -  63
 0 -  59

The dates for all quizzes, homeworks and the final exam are currently marked on the class schedule.  Please be sure to make note of them, because there will be no makeup exams, except in extraordinary and documentable circumstances.

Academic Integrity Policy:

Every student is expected to turn in his or her own work for all assignments and exams in this class.  This is not meant to block general discussion of HOW to approach homework problems: you are encouraged to discuss questions that clarify what the problems on the homework are asking, ask about possible errors in the problem descriptions, clarify what is expected of your solutions, and what resources you can use (for example) on the class forum.  However, it is important that you do not proceed to discuss solutions to the problems and it is certain that sharing or copying another student's solution, (or from another source such as the Internet) whether on an exam or homework, is prohibited.  Note that while it might be tempting to think that you can take another person's code, modify it a little and turn in a solution that does not look like the original, there are several tools that can detect when this has been done and we will be using such tools in this class. If we determine that you have submitted such code, we will treat this as an instance of scholastic dishonesty.  

The University Student Conduct Code defines scholastic dishonesty as: submission of false records of academic achievement; cheating on assignments or examinations; plagiarizing; altering, forging, or misusing a University academic record; taking, acquiring, or using test materials without faculty permission; acting alone or in cooperation with another to falsify records or to obtain dishonestly grades, honors, awards, or professional endorsement. In this course, a student responsible for scholastic dishonesty will be assigned a penalty of an "F" or "N" for the course. If you have any questions regarding the expectations for a specific assignment or exam, or are unsure about posting a particular answer to the class forum, please ask us first.

The Disability Resource Center

The University of Minnesota is committed to providing all students equal access to learning opportunities. The Disability Resource Center (DRC) is the campus office that works with students who have disabilities to provide and/or arrange reasonable accommodations.
  • Students who have, or think they may have, a disability (e.g. mental health, attentional, learning, vision, hearing, physical or systemic), should contact DRC to arrange a confidential discussion at 612-626-1333 (V/TTY) or
  • Students registered with DRC and who have a letter requesting accommodations, are encouraged to talk to me early in the semester to discuss accommodations outlined in the letter.

Mental Health Resources

As a student you may experience a range of issues that can cause barriers to learning, such as strained relationships, increased anxiety, alcohol/drug problems, feeling down, difficulty concentrating and/or lack of motivation. These mental health concerns or stressful events may lead to diminished academic performance or reduce your ability to participate in daily activities. University of Minnesota services are available to assist you with addressing these and other concerns you may be experiencing. You can learn more about the broad range of confidential mental health services available on campus at