- 
    IntroductionWhence This Book? We would all like to have programs check that our programs are correct. Due in no small part to
- 
    Some Quick ExamplesI will start off by jumping right in to a fully worked set of examples, building certified compilers from increasingly c
- 
    Introducing Inductive TypesThe logical foundation of Coq is the Calculus of Inductive Constructions, or CIC. In a sense, CIC is built from just tw
- 
    Inductive PredicatesThe so-called "Curry-Howard correspondence" states a formal connection between functional programs and mathematical proo
- 
    Infinite Data and ProofsIn lazy functional programming languages like Haskell, infinite data structures are everywhere. Infinite lists and more
- 
    Subset Types and VariationsSo far, we have seen many examples of what we might call "classical program verification." We write programs, write the
- 
    General RecursionTermination of all programs is a crucial property of Gallina. Non-terminating programs introduce logical inconsistency,
- 
    More Dependent TypesSubset types and their relatives help us integrate verification with programming. Though they reorganize the certified
- 
    Dependent Data StructuresOur red-black tree example from the last chapter illustrated how dependent types enable static enforcement of data struc
- 
    Reasoning About Equality ProofsIn traditional mathematics, the concept of equality is usually taken as a given. On the other hand, in type theory, equ
- 
    Generic ProgrammingGeneric programming makes it possible to write functions that operate over different types of data. Parametric polymorp
- 
    Universes and AxiomsMany traditional theorems can be proved in Coq without special knowledge of CIC, the logic behind the prover. A develop
- 
    Proof Search by Logic ProgrammingThe Curry-Howard correspondence tells us that proving is "just" programming, but the pragmatics of the two activities ar
- 
    Proof Search in LtacWe have seen many examples of proof automation so far, some with tantalizing code snippets from Ltac, Coq's domain-speci
- 
    Proof by ReflectionThe last chapter highlighted a very heuristic approach to proving. In this chapter, we will study an alternative techni
- 
    Proving in the LargeIt is somewhat unfortunate that the term "theorem proving" looks so much like the word "theory." Most researchers and p
- 
    A Taste of Reasoning About Programming Language SyntaxReasoning about the syntax and semantics of programming languages is a popular application of proof assistants. Before
- 
    ConclusionI have designed this book to present the key ideas needed to get started with productive use of Coq. Many people have l
