  There is a sharp disconnect between the programming and mathematical portions
of the standard undergraduate computer science curriculum, leading to student
misunderstanding about how the two are related. We propose connecting the
subjects early in the curriculum---specifically, in CS1 and the introductory
discrete mathematics course---by using formal reasoning about programs as a
bridge between them.
  This article reports on Haverford and Grinnell College's experience in
constructing the end points of this bridge between CS1 and discrete
mathematics. Haverford's long-standing "3-2-1" curriculum introduces code
reasoning in conjunction with introductory programming concepts, and Grinnell's
discrete mathematics introduces code reasoning as a motivation for logic and
formal deduction. Both courses present code reasoning in a style based on
symbolic code execution techniques from the programming language community, but
tuned to address the particulars of each course.
  These courses rely primarily on traditional means of proof authoring with
pen-and-paper. This is unsatisfactory for students who receive no feedback
until grading on their work and instructors who must shoulder the burden of
interpreting students' proofs and giving useful feedback. To this end, we also
describe the current state of Orca, an in-development proof assistant for
undergraduate education that we are developing to address these issues in our
courses.
  Finally, in teaching our courses, we have discovered a number of educational
research questions about the effectiveness of code reasoning in bridging the
gap between programming and mathematics, and the ability of tools like \orca to
support this pedagogy. We pose these research questions as next steps to
formalize our initial experiences in our courses with the hope of eventually
generalizing our approaches for wider adoption.
