程序的形式语义与验证

445 阅读5分钟

相关数学基础/集合论基础

看离散数学及其应用
面向计算机科学的数理逻辑(陆万钟)
面向计算机科学的数理逻辑(机械工业出版社)

CH3:操作语义

通常是一组规则

结构化操作语义(SOS):Small-step SOS、Big-step SOS、Modular SOS、Reduction semantics with evaluation context

以IMP语言为例介绍


IMP语法

带while的命令式语言;靠一连串的命令进行状态转换;IMP的行为由一组规则(规定表达式如何计算、命令如何执行)描述。

IMP语法集合:

  • 数集N,正整数、负整数、0
  • 真值集T = {true,false}
  • 存储单元集合Loc
  • 算术表达式Aexp
  • 布尔表达式Bexp
  • 命令集Com

对于以上集合,有以下约定:

  • n,m是表示N中的元素
  • X,Y表示Loc中的元素
  • a,b,c分别表示Aexp、Bexp、Com中的元素
  • 用来表示语法范畴的变量,可以加下标或加撇,如X、X'、X0(0是下标)、Y''均表示存储单元

构造规则如下:

  • 算术表达式Aexp:("::="读作可以为可以为)

    • a ::= n|X|a0 + a1|a0 - a1|a0 * a1
  • 布尔表达式Bexp:

    • b ::= true|false|a0 = a1|a0 <= a1|┐b|b0 ∧ b1|b0 ∨ b1
  • Com:

    • c ::= skip | X := a | c0;c1 | if b then c0 else c1 | while b do c

IMP语义

存储单元的内容决定了状态

image-20220917210902751

首先定义程序的状态,然后定义算术表达式和布尔表达式的求值,最后定义命令的执行。

关于程序的状态定义如下:

  • 状态集合∑是由函数σ:Loc→N 组成;所以σ(X)表示σ状态下存储单元X的值或内容。
  • 序偶<a,σ>为算术表达式的格局,表示σ状态下a表达式等待求值,所以:<a,σ>→n表示σ状态下表达式a的值为n。

算术表达式求值

语法规则下算术表达式的求值关系:(前提在横线上方,规则在下方,由前提推出结论称为规则的一个应用)

image-20220928154438346

树形结构:推导(P13下)

image-20220928154952870

算术表达式的等价性:任何状态下两个算术表达式的求值结果是相同的

a0 ~ a1 iff ∀n∈N∀σ ∈ Σ. <a0, σ> → n ⇔ <a1, σ> → n


布尔表达式求值

image.png 前两条是公理(不需要任何前提)

关系表达式3、4、5、6:规则

逻辑表达式7、8、9:规则

两个布尔表达式等价:在任何相同状态下的求值结果相同

b0 ~ b1 iff ∀t∈T∀σ ∈ Σ. <b0, σ> → t ⇔ <b1, σ> → t

由于在计算b0∧b1时,如果b0为false,便不用计算b1,此算法为最左顺序计算(短路计算),求值规则为:

image-20220921165235212

b0∨b1:同理,如果有一个为真就直接true,否则两个都要检查。


命令的执行

  • 对于所有的存储单元X,在初始状态为σ0(0为下标)都有σ0(X)= 0
  • 用序偶<c,σ>表示命令的格局,表示要在σ状态下执行命令c。
  • 关系:<c,σ>→ σ',表示状态σ下执行完命令c终止于σ'。

E.g. : → σ'

表示在σ状态下,执行完X := 5的终止态为σ'

记号

σ是某个状态,m∈N,X∈Loc。符号*σ[m/X]*表示在σ状态下用m替换X存储单元的内容后得到的状态

image-20220921170804006

表示:当这个存储单元Y取得是X,结果为Y;否则为σ(Y)(一开始不理解是因为不知道σ[m/X]状态也是一个函数)


命令的规则

image-20220921170837410

  • 原子命令:

    • skip:什么都不做;无前提,因此也是公理
    • 第2条:执行赋值语句前,先要计算表达式a在σ下的值
  • 顺序命令:σ——>σ''——>σ'

  • 条件命令:σ——>σ'

    • 1.b为true:执行c0;2.b为false:执行c1
  • while循环:

    • b是false:while结束。(所以从σ——>σ)
    • b为true:执行c;while b do c

推导的结论形式:

  • 算术表达式:<算术表达式,状态>→整数
  • 布尔表达式:<布尔表达式,状态>→真值

2.5“简单的证明”需要多看(P16)


CH4:归纳原理

数学归纳法

数学归纳法的方法:

image-20220921195415881

问题:为什么这两步就能证明?

(???上节课:蕴含与全称量词)

  • 数学归纳法实质上就是自然数域上的归纳法(自然数域的特点:可数无穷集)

以上是数学归纳法第一原理


第二原理(串值归纳法)

image-20220928162835189

更强的归纳假设:对于所有的m性质Q(m)为真,归纳步骤Q(m+1)不仅依赖其前去Q(m),还可能与Q(m)的前驱有关。

此时采用更强的归纳假设P(m): ∀ k<m. Q(k) (Q(k) ≡ Q(0) ∧ Q(1) ... ∧Q(m-1))

因此:

  • 归纳奠基:P(0)为真,即:∀ k < 0. Q(k)(由于k是大于0的,此逻辑公式的前件为假,所以整体必为真)

  • 归纳步骤:P(m)为真,P(m+1)为真,即:

    • ∀ m ∈ ω. ( (∀ k < m. Q(k)) ⇒ (∀ k < m + 1. Q(k)) )
    • 上述归纳步骤等价于:∀ m ∈ ω. (∀ k < m. Q(k)) ⇒ Q(m) (因为前件已经保证了k<m时的Q(k), 只需k = m时成立即可,因此可化简为此式子)
  • 所以串值归纳法:

image-20220928162337410

可以看出:串值归纳法就是把Q转变为P,配和数学归纳法第一原理进行证明。

所以,一般地,能用第一原理证明的都能用第二原理证明。


结构归纳法

要证明对所有的表达式或命令性质P(a)为真:

  • 对所有的原子表达式或原子命令,性质P(a)为真。
  • 对表达式或命令的各种构成方法,该性质也能保持为真。

image-20220928163224917


良基归纳法

结构表达式的子表达式关系和数学归纳法的自然数前驱关系都有着本质特征:避免无穷下降链

良基关系(≺) :≺是集合A上的二元关系,且不存在由A中的元素构成的无穷下降链 ···≺ai≺···≺a1≺a0。

  • 若a≺b,称a是b的前趋。
  • ≼表示良基关系≺的自反闭包

良基关系(极小元定义) :≺是良基关系 iff A上的任意子集Q都含有一个极小元(即,m∈Q & ∀ b ≺ m. b∉Q)

这一节书上的例子好好消化