【读书笔记】Coq学习-Formal Reasoning About Programs -Adam Chlipala

这本书可以翻译成《程序的形式推理》,近期导师推荐了这本书作为形式化验证方向的入门,在网上没看到什么关于这方面的中文资料,决定自己一边看一边写点笔记,大家一块学习讨论指教吧。

简单来说,这本书是关于一种方法,使软件工程能像其他更传统的工程学科一样,为现实计算机系统的严格分析提供数学基础。这么说可能有点抽象,举个例子,正如土木工程师会运用他们的数学准则来确定桥梁不会倒塌,软件工程师也应该运用一些准则来确定程序可以正常运行。其他工程学科都有其计算机辅助设计工具,计算机科学也有用于逻辑论证的证明助手,IDE。这本书将会介绍如何使用这些工具来证明程序的行为符合预期。

这本书主要介绍了两个主题,一个是Coq证明助手,用于自动校验数学定理证明;以及关于程序正确性的形式化逻辑推理

本书一共分为21个章节。

CHAPTER 1 Why Prove the Correctness of Program

经典的工程学科都有它们的标准数学技术,这些技术在工件被部署前用于它们的设计,使得对它们的安全性和对某些目的的适用性能够得到保障。传统工程师们或多或少都同意在审查设计时要遵循一些“规则”,因此设计是否安全不是个人意见,而是根据这些严格规定的规则。那为什么软件工程没有一个相应的公认的标准,让程序员们相信他们的系统是安全可靠且正确的呢?这些概念和工具可能还没有完全准备好被广泛采用,但它们已经发展了几十年。本书介绍了一种特殊的工具,以及如何将其应用于程序证明中的不同任务的一系列思想。

首先,用Coq证明助手证明所有的定理。【Coq证明助手】用于编写和自动校验证明的强大框架,本身基于一组比较小的核心功能,就像一个精心设计的编程语言,然后建立复杂的抽象库,这些功能就是所有数学推理的核心。

有一个专门用于程序证明的秘诀是,当遇到一个新的挑战,要证明一种新的程序的新属性时,一半会考虑几乎在所有技术中出现的四个广泛的要素。

  1. Encoding 编码

每种编程语言都有语法和语义,前者定义了程序的外观,后者定义了程序运行时的行为方式。即使这些元素直觉上看来是显而易见的,但是在严格定义的时候也要小心斟酌,因为看似微小的决定可能会对证明是否顺利进行产生巨大的影响。

  1. Invariants 不变量

几乎每个关于程序的定理都是以一个transition system的形式表述的,有一些状态集和一个从一种状态到另一种状态的关系,并且在时间上向前移动。几乎每个程序证明都是通过寻找transition system的不变量,或者一个从某个起始状态到达任意状态都会成立的属性。不变量的概念非常接近对数学归纳法(mathematical induction)的重新诠释,它是每个严肃的数学发展的粘合剂,为所有人所熟知和喜爱。

  1. Abstraction 抽象

一个太复杂的transition system无法直接分析时,我们用另一个更易操作的transition system来抽象它,证明新系统保留了原系统所有相关属性。

  1. Modularity 模块化

当一个transition system过于复杂时,我们通常将其分解成单独的模块,再用表现良好的操作将其整合。通常抽象化和模块化是一起的,因为我们会横向和纵向去分解系统。横向(模块化)将系统分割成更容易管理的模块,纵向(抽象)以保留关键属性的方式去简化模块。我们甚至可以将抽象和模块化的策略交替使用,例如把一个系统先模块化,其中一个部分先抽象在继续模块化,进一步分解成几个不分,如此反复。

后面我会一章章更新内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人间食话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值