Certified programming with dependent types : a pragmatic introduction to the Coq proof assistant
Saved in:
| Main Author | |
|---|---|
| Format | Electronic eBook |
| Language | English |
| Published |
Cambridge, MA :
The MIT Press,
[2013]
|
| Subjects | |
| Online Access | Full text |
| ISBN | 9780262317870 |
| Physical Description | 1 online zdroj (xii, 424 pages) |
Cover
Table of Contents:
- Machine generated contents note: 1.Introduction
- 1.1.Whence This Book?
- 1.2.Why Coq?
- 1.2.1.Based on a Higher-Order Functional Programming Language
- 1.2.2.Dependent Types
- 1.2.3.An Easy-to-Check Kernel Proof Language
- 1.2.4.Convenient Programmable Proof Automation
- 1.2.5.Proof by Reflection
- 1.3.Why Not a Different Dependently Typed Language?
- 1.4.Engineering with a Proof Assistant
- 1.5.Prerequisites
- 1.6.Using This Book
- 1.6.1.Reading This Book
- 1.6.2.The Tactic Library
- 1.6.3.Installation and Emacs Setup
- 2.Some Quick Examples
- 2.1.Arithmetic Expressions over Natural Numbers
- 2.1.1.Source Language
- 2.1.2.Target Language
- 2.1.3.Translation
- 2.1.4.Translation Correctness
- 2.2.Typed Expressions
- 2.2.1.Source Language
- 2.2.2.Target Language
- 2.2.3.Translation
- 2.2.4.Translation Correctness
- I.Basic Programming and Proving
- 3.Introducing Inductive Types
- 3.1.Proof Terms
- 3.2.Enumerations
- 3.3.Simple Recursive Types
- -3.4.Parameterized Types
- 3.5.Mutually Inductive Types
- 3.6.Reflexive Types
- 3.7.An Interlude on Induction Principles
- 3.8.Nested Inductive Types
- 3.9.Manual Proofs about Constructors
- 4.Inductive Predicates
- 4.1.Propositional Logic
- 4.2.What Does It Mean to Be Constructive?
- 4.3.First-Order Logic
- 4.4.Predicates with Implicit Equality
- 4.5.Recursive Predicates
- 5.Infinite Data and Proofs
- 5.1.Computing with Infinite Data
- 5.2.Infinite Proofs
- 5.3.Simple Modeling of Nonterminating Programs
- II.Programming with Dependent Types
- 6.Subset Types and Variations
- 6.1.Introducing Subset Types
- 6.2.Decidable Proposition Types
- 6.3.Partial Subset Types
- 6.4.Monadic Notations
- 6.5.A Type-Checking Example
- 7.General Recursion
- 7.1.Well-Founded Recursion
- 7.2.A Nontermination Monad Inspired by Domain Theory
- 7.3.Co-inductive Nontermination Monads
- 7.4.Comparing the Alternatives
- 8.More Dependent Types
- 8.1.Length-Indexed Lists
- -8.2.The One Rule of Dependent Pattern Matching in Coq
- 8.3.A Tagless Interpreter
- 8.4.Dependently Typed Red-Black Trees
- 8.5.A Certified Regular Expression Matcher
- 9.Dependent Data Structures
- 9.1.More Length-Indexed Lists
- 9.2.Heterogeneous Lists
- 9.2.1.A Lambda Calculus Interpreter
- 9.3.Recursive Type Definitions
- 9.4.Data Structures as Index Functions
- 9.4.1.Another Interpreter Example
- 9.5.Choosing between Representations
- 10.Reasoning about Equality Proofs
- 10.1.The Definitional Equality
- 10.2.Heterogeneous Lists Revisited
- 10.3.Type Casts in Theorem Statements
- 10.4.Heterogeneous Equality
- 10.5.Equivalence of Equality Axioms
- 10.6.Equality of Functions
- 11.Generic Programming
- 11.1.Reifying Datatype Definitions
- 11.2.Recursive Definitions
- 11.2.1.Pretty-Printing
- 11.2.2.Mapping
- 11.3.Proving Theorems about Recursive Definitions
- 12.Universes and Axioms
- 12.1.The Type Hierarchy
- 12.1.1.Inductive Definitions
- -12.1.2.Deciphering Baffling Messages about Inability to Unify
- 12.2.The Prop Universe
- 12.3.Axioms
- 12.3.1.The Basics
- 12.3.2.Axioms of Choice
- 12.3.3.Axioms and Computation
- 12.3.4.Methods for Avoiding Axioms
- III.Proof Engineering
- 13.Proof Search by Logic Programming
- 13.1.Introducing Logic Programming
- 13.2.Searching for Underconstrained Values
- 13.3.Synthesizing Programs
- 13.4.More on auto Hints
- 13.5.Rewrite Hints
- 14.Proof Search in Ltac
- 14.1.Some Built-in Automation Tactics
- 14.2.Ltac Programming Basics
- 14.3.Functional Programming in Ltac
- 14.4.Recursive Proof Search
- 14.5.Creating Unification Variables
- 15.Proof by Reflection
- 15.1.Proving Evenness
- 15.2.Reifying the Syntax of a Trivial Tautology Language
- 15.3.A Monoid Expression Simplifier
- 15.4.A Smarter Tautology Solver
- 15.4.1.Manual Reification of Terms with Variables
- 15.5.Building a Reification Tactic That Recurses under Binders
- IV.The Big Picture
- -16.Proving in the Large
- 16.1.Ltac Antipatterns
- 16.2.Debugging and Maintaining Automation
- 16.3.Modules
- 16.4.Build Processes
- 17.Reasoning about Programming Language Syntax
- 17.1.Dependent de Bruijn Indices
- 17.2.Parametric Higher-Order Abstract Syntax
- 17.2.1.Functional Programming with PHOAS
- 17.2.2.Verifying Program Transformations
- 17.2.3.Establishing Term Well-Formedness
- 17.2.4.A Few Additional Remarks.