图书目录

1 概述

................................................................ 1

1.1 表达式、类型和函数.............................................. 1

1.2 命题和证明...................................................... 2

1.3 命题和类型...................................................... 3

1.4 规范说明和已验证的程序.......................................... 4

1.5 一个排序的例子.................................................. 4

1.5.1 归纳定义.................................................. 4

1.5.2 “包含相同元素”的关系..................................... 5

1.5.3 排序程序的规范说明........................................ 5

1.5.4 一个辅助函数.............................................. 6

1.5.5 排序函数主程序............................................ 6

1.6 学习Coq ........................................................ 7

1.7 本书内容........................................................ 8

1.8 词法约定........................................................ 9

2 类型和表达式

....................................................... 11

2.1 第一步.......................................................... 11

2.1.1 项、表达式和类型.......................................... 11

2.1.2 解释辖域.................................................. 12

2.1.3 类型检查.................................................. 13

2.2 游戏规则........................................................ 15

2.2.1 简单类型.................................................. 15

2.2.2 标识符、环境、上下文....................................... 16

2.2.3 表达式及其类型............................................ 17

2.2.4 自由和约束变元;α-变换.................................... 24

2.3 声明和定义...................................................... 25

2.3.1 全局声明和定义............................................ 25

2.3.2 Section 和局部变量......................................... 26

2.4 计算............................................................ 29

2.4.1 替换...................................................... 30

2.4.2 归约规则.................................................. 30

2.4.3 归约序列.................................................. 32

2.4.4 可转换性.................................................. 32

2.5 类型、大类和类型空间............................................ 32

2.5.1 Set 大类.................................................. 33

2.5.2 类型空间.................................................. 34

2.5.3 规范说明的定义和声明...................................... 35

2.6 实现规范说明.................................................... 36

3 命题和证明

......................................................... 39

3.1 最小命题逻辑.................................................... 41

3.1.1 命题和证明................................................ 41

3.1.2 目标和证明策略............................................ 42

3.1.3 第一个目标制导的证明...................................... 42

3.2 类型规则和证明策略的联系........................................ 46

3.2.1 命题构造规则.............................................. 46

3.2.2 推理规则和证明策略........................................ 47

3.3 一个交互式证明的结构............................................ 51

3.3.1 激活目标处理系统.......................................... 51

3.3.2 一个交互式证明的当前阶段.................................. 52

3.3.3 取消操作.................................................. 52

3.3.4 证明的正常结束............................................ 52

3.4 证明无关性...................................................... 53

3.4.1 Theorem 和De.nition 的分析比较............................ 53

3.4.2 证明策略有助于构造程序吗.................................. 54

3.5 Sections 和证明.................................................. 55

3.6 证明策略的结合.................................................. 56

3.6.1 泛证明策略................................................ 56

3.6.2 证明维护问题.............................................. 59

3.7 命题逻辑的完备性................................................ 61

3.7.1 一个完备的证明策略集...................................... 61

3.7.2 不可证命题................................................ 62

3.8 其他证明策略.................................................... 62

3.8.1 cut 和assert 策略........................................... 62

3.8.2 自动证明策略.............................................. 64

3.9 一种新的抽象方式................................................ 65

4 依赖积

.............................................................. 67

4.1 依赖类型的优点.................................................. 67

4.1.1 对A→B 类型的扩展........................................ 68

4.1.2 关于绑定.................................................. 71

目录XIII 

4.1.3 一种新的构造.............................................. 72

4.2 类型规则和依赖积................................................ 74

4.2.1 函数应用的类型规则........................................ 74

4.2.2 关于抽象的类型规则........................................ 77

4.2.3 类型推导.................................................. 80

4.2.4 转换规则.................................................. 83

4.2.5 依赖积和可转换性次序...................................... 83

4.3 * 依赖积的表达能力.............................................. 83

4.3.1 积的构造规则.............................................. 84

4.3.2 依赖类型.................................................. 84

4.3.3 多态...................................................... 86

4.3.4 Coq 系统中的相等性........................................ 90

4.3.5 高阶类型.................................................. 91

5 常用逻辑

............................................................ 95

5.1 依赖积的实用方面................................................ 95

5.1.1 exact 和assumption......................................... 95

5.1.2 intro 策略................................................. 96

5.1.3 apply 策略................................................. 98

5.1.4 unfold 策略................................................ 104

5.2 逻辑联结词...................................................... 105

5.2.1 引入和消去规则............................................ 106

5.2.2 反证法.................................................... 107

5.2.3 否定...................................................... 108

5.2.4 合取和析取................................................ 110

5.2.5 关于repeat 高阶策略........................................ 112

5.2.6 存在量词.................................................. 112

5.3 等价性与重写.................................................... 113

5.3.1 证明等式.................................................. 113

5.3.2 使用等式:重写证明策略.................................... 114

5.3.3 * pattern 策略............................................. 116

5.3.4 * 条件重写................................................ 117

5.3.5 搜索用于重写的定理........................................ 118

5.3.6 用于等式的其他证明策略.................................... 118

5.4 策略总结表...................................................... 119

5.5 *** 非直谓定义.................................................. 119

5.5.1 警告...................................................... 119

5.5.2 True 和False............................................... 119

5.5.3 莱布尼兹等价.............................................. 120

5.5.4 其他一些联结词和量词...................................... 122

5.5.5 书写非直谓定义的指导原则.................................. 123

6 归纳数据类型

....................................................... 125

6.1 非递归类型...................................................... 125

6.1.1 枚举类型.................................................. 125

6.1.2 简单的推理与计算.......................................... 127

6.1.3 elim 策略.................................................. 128

6.1.4 模式匹配.................................................. 129

6.1.5 记录类型.................................................. 132

6.1.6 带变体的记录.............................................. 134

6.2 分情形推理...................................................... 135

6.2.1 case 证明策略.............................................. 135

6.2.2 矛盾等式.................................................. 137

6.2.3 单射的构造子.............................................. 140

6.2.4 归纳类型和等式............................................ 142

6.2.5 * case 的使用准则........................................... 143

6.3 递归类型........................................................ 147

6.3.1 一个归纳类型—–自然数..................................... 147

6.3.2 在自然数上做归纳证明...................................... 148

6.3.3 递归编程.................................................. 150

6.3.4 构造子的形态变化.......................................... 152

6.3.5 ** 具有函数域的类型....................................... 155

6.3.6 在递归函数上完成证明...................................... 157

6.3.7 匿名递归函数(.x)......................................... 159

6.4 多态类型........................................................ 159

6.4.1 多态列表.................................................. 160

6.4.2 option 类型................................................ 162

6.4.3 二元组类型................................................ 163

6.4.4 不相交和的类型............................................ 164

6.5 * 依赖归纳类型.................................................. 165

6.5.1 一阶数据做参数............................................ 165

6.5.2 可变依赖归纳类型.......................................... 165

6.6 * 空类型........................................................ 167

6.6.1 非依赖空类型.............................................. 167

6.6.2 依赖空类型................................................ 169

7 证明策略和自动化证明

............................................... 171

7.1 用于归纳类型的证明策略.......................................... 171

7.1.1 分情况讨论和递归.......................................... 171

目录XV 

7.1.2 变换...................................................... 172

7.2 auto 和eauto 证明策略............................................ 174

7.2.1 证明策略库管理命令:Hint................................... 174

7.2.2 * eauto 证明策略........................................... 177

7.3 针对重写的自动证明策略.......................................... 177

7.3.1 autorewrite 证明策略........................................ 177

7.3.2 subst 证明策略............................................. 178

7.4 和数相关的证明策略.............................................. 179

7.4.1 ring 证明策略.............................................. 179

7.4.2 omega 证明策略............................................ 181

7.4.3 .eld 证明策略.............................................. 182

7.4.4 fourier 证明策略............................................ 182

7.5 其他决策过程.................................................... 183

7.6 ** 策略定义语言................................................. 184

7.6.1 策略中的变元.............................................. 184

7.6.2 模式匹配.................................................. 185

7.6.3 在已经定义过的策略中使用归约.............................. 191

8 归纳谓词

............................................................ 193

8.1 归纳属性........................................................ 193

8.1.1 几个例子.................................................. 193

8.1.2 归纳谓词和逻辑程序设计.................................... 195

8.1.3 对归纳定义的建议.......................................... 195

8.1.4 排序列表.................................................. 196

8.2 归纳属性和逻辑连接词............................................ 198

8.2.1 表示真值.................................................. 199

8.2.2 表示矛盾式................................................ 199

8.2.3 表示合取.................................................. 199

8.2.4 表示析取.................................................. 200

8.2.5 表示存在量词.............................................. 200

8.2.6 表示等价.................................................. 200

8.2.7 *** 异构等式............................................... 201

8.2.8 一个奇特的归纳原理? ....................................... 205

8.3 归纳特性的推理.................................................. 206

8.3.1 结构化intros ............................................... 206

8.3.2 constructor 策略............................................ 207

8.3.3 * 在归纳谓词上做归纳....................................... 207

8.3.4 * 对le 进行归纳............................................ 209

8.4 * 归纳关系和函数................................................ 213

8.4.1 表示阶乘函数.............................................. 213

8.4.2 ** 表示一个语言的语义...................................... 218

8.4.3 ** 语义属性证明............................................ 220

8.5 * elim 行为的详细阐述............................................ 223

8.5.1 实例化变元................................................ 223

8.5.2 转置...................................................... 225

9* 函数及其规范

..................................................... 231

9.1 用于规范的归纳类型.............................................. 231

9.1.1 “子集”类型.............................................. 231

9.1.2 嵌套的子集类型............................................ 233

9.1.3 有认证的不相交和.......................................... 234

9.1.4 混合不相交和.............................................. 235

9.2 强规范.......................................................... 235

9.2.1 良规函数.................................................. 236

9.2.2 将函数构造为证明.......................................... 236

9.2.3 偏函数的前置条件.......................................... 237

9.2.4 ** 对前置条件的证明....................................... 238

9.2.5 ** 增强规范............................................... 239

9.2.6 *** 最小规范增强.......................................... 240

9.2.7 re.ne 策略................................................. 243

9.3 结构递归的变种形式.............................................. 245

9.3.1 多步结构递归.............................................. 245

9.3.2 简化步骤.................................................. 249

9.3.3 多参数递归函数............................................ 250

9.4 ** 二进制除法................................................... 254

9.4.1 弱规范的除法.............................................. 254

9.4.2 良规的二进制除法.......................................... 259

10 * 程序抽取和命令式程序设计

......................................... 263

10.1 抽取到函数式语言程序............................................ 263

10.1.1 Extraction 命令............................................ 263

10.1.2 抽取机制.................................................. 264

10.1.3 Prop、Set 和抽取........................................... 272

10.2 描述命令式程序.................................................. 274

10.2.1 工具Why ................................................. 274

10.2.2 *** Why 的内部工作原理.................................... 277

目录XVII 

11 * 实例分析

......................................................... 285

11.1 二叉搜索树...................................................... 285

11.1.1 数据结构.................................................. 286

11.1.2 一个直接的存在判定方法.................................... 286

11.1.3 搜索树的描述.............................................. 287

11.2 描述程序........................................................ 289

11.2.1 查找...................................................... 289

11.2.2 插入一个数................................................ 289

11.2.3 ** 删除一个数............................................. 290

11.3 辅助引理........................................................ 290

11.4 规范说明的实现.................................................. 291

11.4.1 查找判定的实现............................................ 291

11.4.2 插入...................................................... 294

11.4.3 删除元素.................................................. 298

11.5 可能的改进...................................................... 299

11.6 另一个实例...................................................... 300

12 * 模块系统

.......................................................... 301

12.1 签名............................................................ 301

12.2 模块............................................................ 303

12.2.1 构造一个模块.............................................. 304

12.2.2 一个例子:Keys ............................................ 304

12.2.3 参数化模块(函子)......................................... 307

12.3 可判定序关系理论................................................ 310

12.3.1 用函子丰富理论............................................ 311

12.3.2 字典序函子................................................ 313

12.4 一个字典模块.................................................... 315

12.4.1 丰富了的实现.............................................. 315

12.4.2 用函子构造字典............................................ 316

12.4.3 一个简单的实现............................................ 316

12.4.4 一个高效的实现............................................ 318

12.5 结论............................................................ 321

13 ** 无穷对象和证明

................................................. 323

13.1 余归纳类型...................................................... 323

13.1.1 CoInductive 命令........................................... 323

13.1.2 余归纳类型的特殊性质...................................... 323

13.1.3 无限列表(流)............................................. 324

13.1.4 惰性列表.................................................. 324

13.1.5 惰性二叉树................................................ 325

13.2 辅助余归纳类型的技术............................................ 325

13.2.1 构造有限对象.............................................. 325

13.2.2 模式匹配.................................................. 326

13.3 构造无穷对象.................................................... 327

13.3.1 一个失败的尝试............................................ 327

13.3.2 CoFixpoint 命令............................................ 328

13.3.3 余递归函数示例............................................ 329

13.3.4 一些错误的定义............................................ 331

13.4 展开技术........................................................ 332

13.4.1 系统性分解................................................ 333

13.4.2 分解引理的使用............................................ 334

13.4.3 化简对余归函数的调用...................................... 335

13.5 余归纳类型上的归纳谓词.......................................... 336

13.6 余归纳谓词...................................................... 338

13.6.1 无穷序列谓词.............................................. 338

13.6.2 构造无限证明.............................................. 338

13.6.3 违反Guard 约束............................................ 340

13.6.4 消去技术.................................................. 342

13.7 互模拟等价...................................................... 343

13.7.1 bisimilar 谓词.............................................. 344

13.7.2 互模拟等价的使用.......................................... 345

13.8 Park 原理....................................................... 346

13.9LTL............................................................ 347

13.10一个实例:状态迁移系统.......................................... 350

13.11结论............................................................ 351

14 ** 归纳类型基础

................................................... 353

14.1 形成规则........................................................ 353

14.1.1 归纳类型.................................................. 353

14.1.2 构造子.................................................... 355

14.1.3 归纳原理的构造............................................ 358

14.1.4 递归子的类型.............................................. 360

14.1.5 谓词的归纳原理............................................ 366

14.1.6 Scheme 命令............................................... 368

14.2 *** 模式匹配和证明上的递归...................................... 369

14.2.1 模式匹配的约束............................................ 369

14.2.2 放宽约束.................................................. 370

14.2.3 递归...................................................... 372

14.3 互引归纳类型.................................................... 374

目录XIX 

14.3.1 树和森林.................................................. 374

14.3.2 使用互引归纳证明.......................................... 376

14.3.3 *** 树和树列表............................................ 378

15 * 一般递归

.......................................................... 381

15.1 有界递归........................................................ 381

15.2 ** 良基递归函数................................................. 384

15.2.1 良基关系.................................................. 384

15.2.2 可访问性证明.............................................. 385

15.2.3 整合良基关系.............................................. 386

15.2.4 良基递归.................................................. 387

15.2.5 递归子well_founded_induction.............................. 387

15.2.6 良基欧氏除法.............................................. 388

15.2.7 嵌套递归.................................................. 391

15.3 ** 用迭代法实现通用递归......................................... 393

15.3.1 与递归函数相关的泛函...................................... 393

15.3.2 终止性证明................................................ 394

15.3.3 构造具体函数.............................................. 397

15.3.4 证明不动点方程............................................ 397

15.3.5 使用不动点方程............................................ 399

15.3.6 讨论...................................................... 399

15.4 *** 在人为谓词上递归............................................ 400

15.4.1 定义人为谓词.............................................. 400

15.4.2 逆转定理.................................................. 401

15.4.3 定义函数.................................................. 401

15.4.4 证明该函数的特性.......................................... 402

16 * 自反证明

......................................................... 405

16.1 引言............................................................ 405

16.2 直接的计算证明.................................................. 406

16.3 ** 借助代数计算的证明........................................... 409

16.3.1 基于结合律的证明.......................................... 409

16.3.2 把类型和操作符通用化...................................... 413

16.3.3 *** 交换律:变量排序....................................... 416

16.4 结论............................................................ 419

附录

................................................................... 421 插入排序............................................................ 421

参考文献

............................................................... 427

索引

................................................................... 433

Coq 及它的库........................................................ 433

书中的示例.......................................................... 437