Wrapping up

Congratulations! You’ve reached the end of an introduction to basic F*.

You should have learned the following main concepts:

  • Basic functional programming

  • Using types to write precise specifications

  • Writing proofs as total functions

  • Defining and working with new inductive types

  • Lemmas and proofs by induction

Throughout, we saw how F*’s use of an SMT solver can reduce the overhead of producing proofs, and you should know enough now to be productive in small but non-trivial F* developments.

However, it would be wrong to conclude that SMT-backed proofs in F* are all plain sailing. And there’s a lot more to F* than SMT proofs—so read on through the rest of this book.

But, if you do plan to forge ahead with mainly SMT-backed proofs, you should keep the following in mind before attempting more challenging projects.

It’ll serve you well to learn a bit more about how an SMT solver works and how F* interfaces with it—this is covered in a few upcoming sections, including a section on classical proofs and in understanding how F* uses Z3. Additionally, if you’re interested in doing proofs about arithmetic, particularly nonlinear arithmetic, before diving in, you would do well to read more about the F* library FStar.Math.Lemmas and F* arithmetic settings.