一个没有才华没有灵感的人也没有放弃的资格

# 集合论基础内容

  • 幂集:

    Pow(X)={YYX}Pow(X)= \{ Y|Y \subseteq X \}

  • X=i=1nxi,xiX\bigcup X=\bigcup_{i=1}^n x_i,x_i\in X

  • 乘积:

    X×Y={(x,y)xX,yY}X\times Y= \{ (x,y)|x\in X,y\in Y \}

  • 不相交并集:XY=({0}×X)({1}×Y)X\uplus Y=(\{0\}\times X)\cup (\{1\}\times Y)

  • 差集:XY=XYX\setminus Y=X-Y

  • ω\omega 常表示自然数集。

  • 基本公理:对于任意一个集合b0b_0,属于关系链:bnbn1...b0b_n\in b_{n-1}\in...\in b_0 一定是有限的

  • 部分函数:XYX\rightharpoonup Y 表示并不是 X 中所有元素都有定义,相对应有完全函数XYX\rightarrow Y

  • λ\lambda 函数记号:λxX.e={(x,e)xX}\lambda x\in X.e=\{(x,e)|x\in X\}。例:λxω.(x+1)\lambda x\in\omega.(x+1) 就同时描述了定义域和函数内容,即为一个后继函数


  • 康托对角线方法:证明 X 与其幂集不可能一一对应

    假设θ:XPow(X)\theta:X\rightarrow Pow(X) 是一一对应的。则构造集合:Y={xXxθ(x)}Y=\{x\in X|x\notin\theta(x)\},显然 Y 是 X 的一个子集。那么肯定存在一个 y 使得θ(y)=Y\theta(y)=Y。那 y 属于 Y 嘛?此时就矛盾了。

    为啥这叫对角线方法呢?其实如果存在一个XPow(X)X\rightarrow Pow(X) 的一一对应,我们可以画一张表,表中aij={0xiθ(xj)1xiθ(xj)a_{ij}=\begin{cases}0& x_i\notin \theta(x_j)\\1&x_i\in \theta(x_j)\end{cases},然后 Y 的构造其实就是对角线上为 1 对应的元素,即xiθ(xi)x_i\in \theta(x_i)


  • 对一个关系R:X×YR:X\times Y,对 X 的子集 A,定义其正象

    RA={yYxA,(x,y)R}RA=\{y\in Y|\exists x\in A,(x,y)\in R\}

    也可以对 Y 的子集 B 定义其逆象

    R1B={xXyB,(x,y)R}R^{-1}B=\{x\in X|\exists y\in B,(x,y)\in R\}

  • 等价类:

    {x}R={yXxRy}\{x\}_R=\{y\in X|xRy\}

  • 关系的幂:R0=IdXR^0=Id_XIdXId_X 是集合 X 上的恒等关系),Rn+1=RnRR^{n+1}=R^n\circ R

  • 传递闭包:将关系 R 中添加尽量少的有序对使其成为具有传递性的关系R+R^+,则有

    R+=nωRn+1R^+=\bigcup_{n\in \omega}R^{n+1}

    传递、自反闭包:将关系 R 中添加尽量少的有序对使其成为具有传递、自反性的关系R=IdXR+R^*=Id_X\cup R^+

# 操作语义

  • IMP 是一种带 while 的小型程序设计语言,其程序在运行时要依靠一连串的显式命令进行状态转换,因此 IMP 被称为是一种命令式语言。形式上 IMP 由一组规则来描述,规定了表达式如何计算和命令如何执行。规则也是证明命令间等价的基本工具。

# IMP—— 简单的命令式语言

  • IMP 的语法集合有:

    • 数集 (numbers)NN,它是整数集合。
    • 真值集 (truth values)T={true,false}T=\{true,false\}
    • 存储单元集 (locations)LocLoc
    • 算术表达式集 (arithmetic expressions)AexpAexp
    • 布尔表达式集 (boolean expressions)BexpBexp
    • 命令集 (commands)ComCom

    其中,数集 N 和存储单元集的语法结构是假设已知的,譬如LocLoc 为非空字母或后跟数字的非空字符串的集合,而NN 为带符号位的正负十进制数的集合。但对于其他语法集合,我们必须说明其元素的构造方式。我们使用BNFBNF(Backus-Naur form)的一种变形形式。构造规则形如:

    如果a0a1是算术表达式,则a0+a1也是算术表达式。如果a_0和a_1是算术表达式,则a_0+a_1也是算术表达式。

    显然a0a_0a1a_1 被用于代表任意算术表达式,称a0a_0a1a_1 为元变量。我们用元变量来表示语法集合的元素。

  • n,mn,m 表示数集NN 中的元素

    X,YX,Y 表示存储单元集LocLoc 中的元素

    aa 表示算术表达式集AexpAexp 中的元素

    bb 表示布尔表达式集BexpBexp 中的元素

    cc 表示命令集ComCom 中的元素

    这些元变量都可以添加下标或上标。


  • 算术表达式集AexpAexp 的构造规则可描述如下:

    a::=nX(a0+a1)(a0a1)(a0×a1)a::=n|X|(a_0+a_1)|(a_0-a_1)|(a_0\times a_1)

    其中::=::= 表示 "可以为",| 表示 “或”(运算优先级最低,书上都不加括号的)。

    这句构造规则的意思是:算术表达式 a 可以为一个数 n,或一个存储单元 X,或表达式a0+a1a_0+a_1a0a1a_0-a_1a0×a1a_0\times a_1

    然而,对于一个运算式2×3+52\times 3+5,它到底是2×(3+5)2\times(3+5) 构造得来,还是(2×3)+5(2\times 3)+5 构造得来并不知道。其实构造规则只给出了构造新算术表达式的抽象语法,而要保证算术表达式是无歧义的话,就必须加上括号。

  • 抽象语法给出的是语言的分析树,而具体语法正是通过括号和运算符的优先级来保证进行唯一正确的语法分析。然而我们关注的是程序设计语言的含义而不是如何描述它们,所以抽象语法已经足够。

  • IMP 的完整构造规则如下:

    Aexp:a::=nXa0+a1a0a0a0×a1Bexp:b::=truefalsea0=a1a0a1¬bb0b1b0b1Com:c::=skipX:=ac0;c1if  b  then  c0  else  c1while  b  do  cAexp:a::=n|X|a_0+a_1|a_0-a_0|a_0\times a_1\\ Bexp:b::=true|false|a_0=a_1|a_0\leq a_1|\neg b|b_0\wedge b_1|b_0\vee b_1\\ Com:c::=skip|X:=a|c_0;c_1|if\; b\;then\;c_0\;else\;c_1|while\;b\;do\;c

    (其实我觉得这里蛮好理解的,都揭示了不同集合的元变量和元变量组合起来的基本形式)

    上述规则是对 IMP 语法规则的归纳定义,由此得到的集合是对构造规则封闭的最小集合,

  • 当相同集合的两个元素e0,e1e_0,e_1 是由抽象语法用完全相同的方法构造出来时,它们具有相同的分析树结构,此时表达为e0e1e_0\equiv e_1。注意3+5≢5+33+5\not \equiv 5+3 因为分析树左右子树换了不相同。


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

# 算术表达式的求值

  • 状态集合Σ\Sigma 由存储单元到数集的函数σ:LocN\sigma:Loc\rightarrow N 组成。于是σ(X)\sigma(X) 是状态σ\sigma 下存储单元 X 的值或内容。下面讨论在状态σΣ\sigma\in\Sigma 下算术表达式aa 的求值过程。

  • 用序偶(有序对)a,σ\lang a,\sigma\rang 来表示在状态σ\sigma 下表达式aa 等待求值。并把这个序偶与数集间的求值关系定义为:

    a,σn\lang a,\sigma\rang\rightarrow n

    它表示在状态σ\sigma 下表达式aa 的求值结果为nn。而序偶a,σ\lang a,\sigma\rang 为算术表达式的格局

  • 考察算术表达式a0+a1a_0+a_1 的求值过程,其顺序为:

    • 求值a0a_0 得到结果n0n_0
    • 求值a1a_1 得到结果n1n_1
    • n0n_0n1n_1 相加得到a0+a1a_0+a_1 的求值结果。

    整个过程通过分别求值加式和被加式然后相加得到求值结果,这种规范被称为语法制导下的规范。


语法制导下算术表达式的求值关系按以下规则指定:

# 整数求值

n,σn\lang n,\sigma\rang\rightarrow n

# 存储单元求值

X,σσ(X)\lang X,\sigma\rang\rightarrow\sigma(X)

  • 对存储单元求值就是取其内容

# 加法求值

a0,σn0a1,σn1a0+a1,σn,n=n0+n1\frac{\lang a_0,\sigma\rang\rightarrow n_0\quad\lang a_1,\sigma\rang\rightarrow n_1}{\lang a_0+a_1,\sigma\rang\rightarrow n},n=n_0+n_1

  • 读作 “如果a0,σn0\lang a_0,\sigma\rang\rightarrow n_0 并且a1,σn1\lang a_1,\sigma\rang\rightarrow n_1,那么a0+a1,σn\lang a_0+a_1,\sigma\rang\rightarrow n,其中n=n0+n1n=n_0+n_1”。
  • 每条规则包含一个前提和一个结论,前提通常写在上方,结论写在下方。由前提推出结论称为规则的一个应用。有时规则没有前提时也有可能在上面加个横线:n,σn\overline{\lang n,\sigma\rang\rightarrow n}

# 减法求值

a0,σn0a1,σn1a0a1,σn,n=n0n1\frac{\lang a_0,\sigma\rang\rightarrow n_0\quad\lang a_1,\sigma\rang\rightarrow n_1}{\lang a_0-a_1,\sigma\rang\rightarrow n},n=n_0-n_1

# 乘积求值

a0,σn0a1,σn1a0×a1,σn,n=n0×n1\frac{\lang a_0,\sigma\rang\rightarrow n_0\quad\lang a_1,\sigma\rang\rightarrow n_1}{\lang a_0\times a_1,\sigma\rang\rightarrow n},n=n_0\times n_1


  • 特别地,前提为空的规则称为公理。给定任何一个算术表达式aa,状态σ\sigma 和整数nn,如果从公理开始,根据一组规则可以推出a,σn\lang a,\sigma\rang\rightarrow n 则称aa 在状态σ\sigma 下求值得到nn。而基本运算符号加减乘的运算规则不做详细讨论。

  • 将求值规则中的元变量用特定的元素代替,就得到了一个规则实例。例如一个乘法的规则实例

    2,σ023,σ032×3,σ06\frac{\lang 2,\sigma_0\rang\rightarrow 2\quad\lang 3,\sigma_0\rang\rightarrow 3}{\lang 2\times 3,\sigma_0\rang\rightarrow 6}

  • 考虑状态σ0\sigma_0 下的表达式a(Iint+5)+(7+9)a\equiv(Iint+5)+(7+9)InitInit 表示状态σ0\sigma_0σ0(Init)=0\sigma_0(Init)=0 的存储单元。则有:

    Init,σ005,σ05(Init+5),σ057,σ079,σ09(7+9),σ016(Iinit+5)+(7+9),σ021\frac{\frac{\overline{\lang Init,\sigma_0\rang\rightarrow 0}\quad\overline{\lang 5,\sigma_0\rang\rightarrow 5}}{\lang(Init+5),\sigma_0\rang\rightarrow 5}\quad\frac{\overline{\lang 7,\sigma_0\rang\rightarrow 7}\quad\overline{\lang 9,\sigma_0\rang\rightarrow 9}}{\lang(7+9),\sigma_0\rang\rightarrow 16}}{\lang(Iinit+5)+(7+9),\sigma_0\rang\rightarrow 21}

    这就是一棵求值树,也称推导树(简称推导)。推导树由规则的实例构成,每个规则实例的前提正好是上一层实例的结论,公理位于最顶层。最底层的实例的结论为整个推导的结论。如果某个推导存在结论,则说该结论是从规则可精确推导的。

  • 在这种情况下,规则提供了基于查找推导树来计算算术表达式求值的一个算法。此时我们说这组规则(整数求值、存储单元求值、加法求值、减法求值、乘积求值)给出了表达式的操作语义。因为规则是以语法制导的方式给出的,所以称为结构化操作语义;同时,因为它的推导方式类似于自然推理,所以又称为自然语义。(现在我理解无能,书上说后续会给一些具体的例子说明)

  • 定义

    a0a1iffnN,σΣ,a0,σna1,σna_0\sim a_1\quad iff\quad \forall n\in N,\sigma\in \Sigma, \lang a_0,\sigma\rang\rightarrow n\Leftrightarrow \lang a_1,\sigma\rang\rightarrow n

    是一个自然的算术表达式求值相等的等价关系。

# 布尔表达式求值

true,σtruefalse,σfalsea0,σna1,σma0=a1,σtrue,if  n=ma0,σna1,σma0=a1,σfalse,if  nma0,σna1,σma0a1,σtrue,if  nma0,σna1,σma0a1,σfalse,if  n>mb,σtrue¬b,σfalseb,σfalse¬b,σtrueb0,σt0b1,σt1b0b1,σt,t{truet0true&t1truefalseelseb0,σt0b1,σt1b0b1,σt,t{truet0truet1truefalseelse\lang true,\sigma\rang\rightarrow true\\ \lang false,\sigma\rang\rightarrow false\\ \frac{\lang a_0,\sigma\rang\rightarrow n\quad\lang a_1,\sigma\rang\rightarrow m}{\lang a_0=a_1,\sigma\rang\rightarrow true},if\;n=m\\ \frac{\lang a_0,\sigma\rang\rightarrow n\quad\lang a_1,\sigma\rang\rightarrow m}{\lang a_0=a_1,\sigma\rang\rightarrow false},if\;n\neq m\\ \frac{\lang a_0,\sigma\rang\rightarrow n\quad\lang a_1,\sigma\rang\rightarrow m}{\lang a_0\leq a_1,\sigma\rang\rightarrow true},if\;n\leq m\\ \frac{\lang a_0,\sigma\rang\rightarrow n\quad\lang a_1,\sigma\rang\rightarrow m}{\lang a_0\leq a_1,\sigma\rang\rightarrow false},if\;n>m\\ \frac{\lang b,\sigma\rang\rightarrow true}{\lang\neg b,\sigma\rang\rightarrow false}\\ \frac{\lang b,\sigma\rang\rightarrow false}{\lang\neg b,\sigma\rang\rightarrow true}\\ \frac{\lang b_0,\sigma\rang\rightarrow t_0\quad\lang b_1,\sigma\rang\rightarrow t_1}{\lang b_0\vee b_1,\sigma\rang\rightarrow t},t\equiv\begin{cases}true & t_0\equiv true\& t_1\equiv true\\false&else\end{cases}\\ \frac{\lang b_0,\sigma\rang\rightarrow t_0\quad\lang b_1,\sigma\rang\rightarrow t_1}{\lang b_0\wedge b_1,\sigma\rang\rightarrow t},t\equiv\begin{cases}true & t_0\equiv true| t_1\equiv true\\false&else\end{cases}

b0b1ifftT,σΣ,b0,σtb1,σtb_0\sim b_1\quad iff\quad \forall t\in T,\sigma\in \Sigma,\lang b_0,\sigma\rang\rightarrow t\Leftrightarrow \lang b_1,\sigma\rang\rightarrow t

  • 然而上述规则确定的布尔表达式求值方法效率并不高。更好的策略为最左顺序计算,即:

    b0,σfalseb0b1,σfalseb0,σtrueb1,σfalseb0b1,σfalseb0,σtrueb1,σtrueb0b1,σtrue\frac{\lang b_0,\sigma\rang\rightarrow false}{\lang b_0\wedge b_1,\sigma\rang\rightarrow false}\\ \frac{\lang b_0,\sigma\rang\rightarrow true\quad\lang b_1,\sigma\rang\rightarrow false}{\lang b_0\wedge b_1,\sigma\rang\rightarrow false}\\ \frac{\lang b_0,\sigma\rang\rightarrow true\quad\lang b_1,\sigma\rang\rightarrow true}{\lang b_0\wedge b_1,\sigma\rang\rightarrow true}\\

    同样,或的时候就是有一个为 true 就已经可以得出 true 了。

# 命令的执行

  • 表达式的作用是求得某一状态下的值,而程序和命令的作用则是通过执行,来改变状态。

    当我们运行一个 IMP 程序时,假定初始状态下所有的存储单元都已置 0,即初状态σ0\sigma_0 满足X,σ0(X)=0\forall X,\sigma_0(X)=0

    程序在运行过程中可能终止于某一状态,也可能会发散而达不到任何状态,譬如cwhile  true  do  skipc\equiv while\;true\;do\;skip 就不存在终止状态。

  • 用序偶c,σ\lang c,\sigma\rang 表示命令的格局,关系:c,σσ\lang c,\sigma\rang\rightarrow \sigma' 表示状态σ\sigma 下执行命令 c 后终止于终态σ\sigma'

  • σ\sigma 为某状态,σ[m/X]\sigma[m/X] 表示状态σ\sigma 下用 m 替换 X 中的内容后得到的新状态。这个新状态的含义是:

    σ[m/X](Y)={mY=Xσ(Y)YX\sigma[m/X](Y)=\begin{cases}m&Y=X\\\sigma(Y)&Y\neq X\end{cases}

    例如X:=5,σσ=σ[5/X]\lang X:=5,\sigma\rang\rightarrow \sigma'=\sigma[5/X]


原子命令

skip,σσa,σmX:=a,σσ[m/X]\lang skip,\sigma\rang\rightarrow\sigma\\ \frac{\lang a,\sigma\rang\rightarrow m}{\lang X:=a,\sigma\rang\rightarrow\sigma[m/X]}

顺序命令

c0,σσc1,σσc0;c1,σσ\frac{\lang c_0,\sigma\rang\rightarrow \sigma''\quad\lang c_1,\sigma''\rang\rightarrow\sigma'}{\lang c_0;c_1,\sigma\rang\rightarrow \sigma'}

条件命令

b,σtruec0,σσif  b  then  c0  else  c1,σσb,σfalsec1,σσif  b  then  c0  else  c1,σσ\frac{\lang b,\sigma\rang\rightarrow true\quad\lang c_0,\sigma\rang\rightarrow\sigma'}{\lang if\;b\;then\;c_0\;else\;c_1,\sigma\rang\rightarrow \sigma'}\\ \frac{\lang b,\sigma\rang\rightarrow false\quad\lang c_1,\sigma\rang\rightarrow\sigma'}{\lang if\;b\;then\;c_0\;else\;c_1,\sigma\rang\rightarrow \sigma'}\\

while 循环命令:

b,σfalsewhile  b  do  c,σσb,σtruec,σσwhile  b  do  c,σσwhile  b  do  c,σσ\frac{\lang b,\sigma\rang\rightarrow false}{\lang while\;b\;do\;c,\sigma\rang\rightarrow\sigma}\\ \frac{\lang b,\sigma\rang\rightarrow true\quad\lang c,\sigma\rang\rightarrow\sigma''\quad\lang while\;b\;do\;c,\sigma''\rang\rightarrow\sigma'}{\lang while\;b\;do\;c,\sigma\rang\rightarrow\sigma'}

  • 其实是个递归定义规则。

命令间的等价关系:

c0c1iffσ,σΣ,c0,σσc1,σσc_0\sim c_1\quad iff\quad\forall \sigma,\sigma'\in\Sigma,\lang c_0,\sigma\rang\rightarrow\sigma'\Leftrightarrow\lang c_1,\sigma\rang\rightarrow\sigma'

# 一个简单的证明

  • 表达式的求值,命令的执行,其实都是一种关系,被称为转换关系(转换系统)。

命题:令wwhile  b  do  cw\equiv while\;b\;do\;c,则wif  b  do  c;w  else  skipw\sim if\;b\;do\;c;w\;else\;skip

  • 证明:需要证明对所有的状态σ,σ\sigma,\sigma',都有w,σσiffif  b  then  c;w  else  skip,σσ\lang w,\sigma\rang\rightarrow\sigma'\quad iff\quad\lang if\;b\;then\;c;w\;else\;skip,\sigma\rang\rightarrow\sigma'

    \Rightarrow”:因为有w,σσ\lang w,\sigma\rang\rightarrow\sigma',根据 while 循环命令的规则,必有:

    b,σfalsew,σσb,σtruec,σσw,σσw,σσ\frac{\lang b,\sigma\rang\rightarrow false}{\lang w,\sigma\rang\rightarrow\sigma}或 \frac{\lang b,\sigma\rang\rightarrow true\quad\lang c,\sigma\rang\rightarrow \sigma''\quad\lang w,\sigma''\rang\rightarrow\sigma'}{\lang w,\sigma\rang\rightarrow\sigma'}

    ​ 若是左侧情况,则一定有一个推导树结论为b,σfalse\lang b,\sigma\rang\rightarrow false,即有:

    ...b,σfalsew,σσ\frac{...}{\frac{\lang b,\sigma\rang\rightarrow false}{\lang w,\sigma\rang\rightarrow\sigma}}

    ​ 既然有了这样一个推导树,则可以依照 while 循环规则构造出推导树:

    ...b,σfalseskip,σσif  b  then  c;w  else  skip,σσ\frac{\frac{...}{\lang b,\sigma\rang\rightarrow false}\quad\frac{}{\lang skip,\sigma\rang\rightarrow\sigma}}{\lang if\;b\;then\;c;w\;else\;skip,\sigma\rang\rightarrow\sigma}

    ​ 即得到了想要的结论。如果是右侧情况,则一定分别有推导树:

    ...b,σtrue,...c,σσ,...w,σσ\frac{...}{\lang b,\sigma\rang\rightarrow true},\frac{...}{\lang c,\sigma\rang\rightarrow\sigma''},\frac{...}{\lang w,\sigma''\rang\rightarrow \sigma'}

    ​ 则可以依照 while 循环规则,顺序命令规则,条件命令规则构造出推导树:

    ...b,σtrue...c,σσ...w,σσc;w,σσif  b  then  c:w  else  skip,σσ\frac{\frac{...}{\lang b,\sigma\rang\rightarrow true}\quad\frac{\frac{...}{\lang c,\sigma\rang\rightarrow\sigma''}\quad\frac{...}{\lang w,\sigma''\rang\rightarrow\sigma'}}{\lang c;w,\sigma\rang\rightarrow\sigma'}}{\lang if\;b\;then\;c:w\;else\;skip,\sigma\rang\rightarrow\sigma'}

    \Leftarrow“:因为有if  b  then  c;w  else  skip,σσ\lang if\;b\;then\;c;w\;else\;skip,\sigma\rang\rightarrow\sigma',所以根据条件命令规则,必有推导:

    ...b,σfalseskip,σσif  b  then  c;w  else  skip,σσ...b,σtrue...c,σσ...w,σσc;w,σσif  b  then  c;w  else  skip,σσ\frac{\frac{...}{\lang b,\sigma\rang\rightarrow false}\quad\frac{}{\lang skip,\sigma\rang\rightarrow\sigma}}{\lang if\;b\;then\;c;w\;else\;skip,\sigma\rang\rightarrow\sigma}或 \frac{\frac{...}{\lang b,\sigma\rang\rightarrow true}\quad\frac{\frac{...}{\lang c,\sigma\rang\rightarrow\sigma''}\quad\frac{...}{\lang w,\sigma''\rang\rightarrow\sigma'}}{\lang c;w,\sigma\rang\rightarrow\sigma'}}{\lang if\;b\;then\;c;w\;else\;skip,\sigma\rang\rightarrow\sigma'}

    ​ 先考虑右侧情况,根据 while 循环命令规则,我们可以构造推导:

    ...b,σtrue...c,σσ...w,σσw,σσ\frac{\frac{...}{\lang b,\sigma\rang\rightarrow true}\quad\frac{...}{\lang c,\sigma\rang\rightarrow\sigma''}\quad\frac{...}{\lang w,\sigma''\rang\rightarrow\sigma'}}{\lang w,\sigma\rang\rightarrow\sigma'}

    ​ 如果是左侧情况,根据 while 循环命令规则,则直接可以构造推导:

    b,σfalsew,σσ\frac{\lang b,\sigma\rang\rightarrow false}{\lang w,\sigma\rang\rightarrow\sigma}

    因此,得证wif  b  then  c;w  else  skipw\sim if\;b\;then\;c;w\;else\;skip

  • 其实这个简单的证明表示了:在规则未被实例化的情况下,要证明操作语义的等价,需要考虑所有不同形式可能的推导树。

# 另一种语义

  • 其实我们也可以定义格局之间的求值关系:

    a,σ1a,σ\lang a,\sigma\rang\rightarrow_1\lang a',\sigma'\rang

    表示状态σ\sigma 下,表达式aa 经过了 1 个步骤即得到了状态σ\sigma' 状态下的aa'

  • 对应规则:

    a0,σ1a0,σa0+a1,σ1a0+a1,σa1,σ1a1,σn+a1,σ1n+a1,σn+m,σ1p,σ,p=n+m\frac{\lang a_0,\sigma\rang\rightarrow_1\lang a_0',\sigma\rang}{\lang a_0+a_1,\sigma\rang\rightarrow_1\lang a_0'+a_1,\sigma\rang}\\ \frac{\lang a_1,\sigma\rang\rightarrow_1\lang a_1',\sigma\rang}{\lang n+a_1,\sigma\rang\rightarrow_1\lang n+a_1',\sigma\rang}\\ \lang n+m,\sigma\rang\rightarrow_1\lang p,\sigma\rang,p=n+m

    根据书上说,这实际上表示了把之前求值规则拆开成一步一步了 (a0+a1a0+a1a0+a1a_0+a_1\rightarrow a_0'+a_1\rightarrow a_0'+a_1') 但我也不知道为啥要这么干。

  • 命令格局间的关系:

    实际上,c,σσ\lang c,\sigma\rang\rightarrow\sigma' 定义了在特定状态下,命令的完全执行。同样我们可以给出执行命令的每一个步骤,譬如

    c0;c1,σ1c1,σc1,σ1σc0;c1,σσ\frac{\lang c_0;c_1,\sigma\rang\rightarrow_1\lang c_1,\sigma''\rang\quad\lang c_1,\sigma''\rang\rightarrow_1\sigma'}{\lang c_0;c_1,\sigma\rang\rightarrow\sigma'}

    X:=5;Y:=1,σ1Y:=1,σ[5/X]1σ[5/X][1/Y]\lang X:=5;Y:=1,\sigma\rang\rightarrow_1\lang Y:=1,\sigma[5/X]\rang\rightarrow_1\sigma[5/X][1/Y]


  • 有些”1 步 “是显然的,而有些又是不确定的。譬如,b,σ1true,σ\lang b,\sigma\rang\rightarrow_1\lang true,\sigma\rang 是显然的,但是

    if  b  then  c0  else  c1,σ1c0,σif  b  then  c0  else  c1,σ1if  true  then  c0  else  c1,σ\lang if\;b\;then\;c_0\;else\;c_1,\sigma\rang\rightarrow_1\lang c_0,\sigma\rang\\ \lang if\;b\;then\;c_0\;else\;c_1,\sigma\rang\rightarrow_1\lang if\;true\;then\;c_0\;else\;c_1,\sigma\rang

    选择哪一个当作”1 步 “呢?其实对于 IMP 语言来说这不是非常重要,但是对于并行语言,选择不同的步骤可能会影响执行的终态。

# 归纳原理

# 数学归纳法

  • 数学归纳法:(P(0)&(mω,P(m)P(m+1)))nω,P(n)(P(0)\&(\forall m\in\omega,P(m)\Rightarrow P(m+1)))\Rightarrow\forall n\in\omega,P(n)

  • 串值归纳法:(mω,(k<m,Q(k))Q(m))nω,P(n)(\forall m\in\omega,(\forall k<m,Q(k))\Rightarrow Q(m))\Rightarrow\forall n\in\omega,P(n)

# 结构归纳法

  • 证明:

    a,σm&a,σmm=m\lang a,\sigma\rang\rightarrow m\&\lang a,\sigma\rang\rightarrow m'\Rightarrow m=m'

    也就是这个求值是一个函数,而不只是关系。这看起来很明显。


    结构归纳法:令P(a)P(a) 是算术表达式aa 的一个性质,要证明对所有算术表达式均有此性质,只需证明:

    • 对所有整数 m,P(m)P(m) 为真。
    • 对所有存储单元 X,P(σ(X))P(\sigma(X)) 为真。(如果有状态作用的话)
    • 对所有的算术表达式a0,a1a_0,a_1,有P(a0)&P(a1)P(a0+a1)P(a_0)\&P(a_1)\Rightarrow P(a_0+a_1)
    • 对所有的算术表达式a0,a1a_0,a_1,有P(a0)&P(a1)P(a0a1)P(a_0)\&P(a_1)\Rightarrow P(a_0-a_1)
    • 对所有的算术表达式a0,a1a_0,a_1,有P(a0)&P(a1)P(a0×a1)P(a_0)\&P(a_1)\Rightarrow P(a_0\times a_1)

    如果写作逻辑符号:

    (mN,P(m))&(XLoc,P(X))&(a0,a1Aexp,P(a0)&P(a1)P(a0+a1))&(a0,a1Aexp,P(a0)&P(a1)P(a0a1))&(a0,a1Aexp,P(a0)&P(a1)P(a0×a1))&aAexp,P(a)(\forall m\in N,P(m))\&\\ (\forall X\in Loc,P(X))\&\\ (\forall a_0,a_1\in Aexp,P(a_0)\&P(a_1)\Rightarrow P(a_0+a_1))\&\\ (\forall a_0,a_1\in Aexp,P(a_0)\&P(a_1)\Rightarrow P(a_0-a_1))\&\\ (\forall a_0,a_1\in Aexp,P(a_0)\&P(a_1)\Rightarrow P(a_0\times a_1))\&\\ \Rightarrow \forall a\in Aexp,P(a)


    利用结构归纳法证明该命题。

    P(a)=σ,m,m,(a,σm&a,σmm=m)P(a)=\forall\sigma,m,m',(\lang a,\sigma\rang\rightarrow m\&\lang a,\sigma\rang\rightarrow m'\Rightarrow m=m')

    • ana\equiv n,因为整数求值规则,实际上有a,σm=a,a,σm=a\lang a,\sigma\rang\rightarrow m=a,\lang a,\sigma\rang\rightarrow m'=a 所以m=mm=m'

    • aXa\equiv X,因为存储单元求值规则,实际上有a,σm=σ(a),a,σm=σ(a)\lang a,\sigma\rang\rightarrow m=\sigma(a),\lang a,\sigma\rang\rightarrow m'=\sigma(a),而同一个存储单元存储的内容是相同的,所以有m=mm=m'

    • aa0+a1a\equiv a_0+a_1a0+a1,σm&a0+a1,σm\lang a_0+a_1,\sigma\rang\rightarrow m\&\lang a_0+a_1,\sigma\rang\rightarrow m',由加法求值规则,必存在

      a0,σm0,a1,σm1,m0+m1=ma0,σm0,a1,σm1,m0+m1=m\lang a_0,\sigma\rang\rightarrow m_0,\lang a_1,\sigma\rang\rightarrow m_1,m_0+m_1=m\\ \lang a_0,\sigma\rang\rightarrow m_0',\lang a_1,\sigma\rang\rightarrow m_1',m_0'+m_1'=m'\\

      然后根据归纳假设P(a0)&P(a1)P(a_0)\& P(a_1),有m0=m0,m1=m1m_0=m_0',m_1=m_1',因此有m=mm=m'

    • aa0a1,aa0×a1a\equiv a_0-a_1,a\equiv a_0\times a_1 和加法情况类似。因此可以得出命题。

# 良基归纳法

  • 定义:设\prec 是集合 A 上的二元关系,如果不存在由 A 中元素构成的无穷下降链...ai...aa0...\prec a_i\prec ...\prec a\prec a_0 则称\prec良基关系

    aba\prec b,则称 a 为 b 的前趋。显然,良基关系必是非自反的。记\preceq\prec 的自反闭包。

  • 命题:设\prec 是集合 A 上的二元关系,则\prec 是良基关系的充要条件是,对 A 的所有非空子集 Q 都含有一个极小元 m:

    mQ&bm,bQm\in Q\&\forall b\prec m,b\notin Q

  • 良基归纳法:

    aA,P(a)aA,([ba,P(b)]P(a))\forall a\in A,P(a)\Leftrightarrow \forall a\in A,([\forall b\prec a,P(b)]\Rightarrow P(a))

    如果aba=b1a\prec b\Leftrightarrow a=b-1,则就是数学归纳法,若aba<ba\prec b\Leftrightarrow a<b 则为串值归纳法。


  • 以欧几里得算法为例,我们证明它的终止性。

    Euclid 算法:(IMP 语言)

    Euclidwhile  ¬(M=N)  doif  MNthen  N:=NMelse  M:=MNEuclid\equiv while\;\neg(M=N)\;do\\ if\;M\leq N\\ then\;N:=N-M\\ else\;M:=M-N

    其中,N,M 都是存储单元,赋值表示内容的赋值。我们需要证明:

    σ,σ(M)1&σ(N)1σ,Euclid,σσ\forall\sigma,\sigma(M)\geq 1\&\sigma(N)\geq 1\Rightarrow\exists\sigma',\lang Euclid,\sigma\rang\rightarrow\sigma'

    设性质 P 为P(σ)σ,Euclid,σσP(\sigma)\Leftrightarrow \exist\sigma',\lang Euclid,\sigma\rang\rightarrow\sigma'

    S={σΣσ(M)1&σ(N)1}S=\{\sigma\in\Sigma|\sigma(M)\geq 1\&\sigma(N)\geq 1\} 是良基集。

    我们证明:σS,P(σ)\forall\sigma\in S,P(\sigma)

    首先定义良基关系:

    σσ(σ(M)σ(M)&σ(N)σ(N))&(σ(M)σ(M)σ(N)σ(N))\sigma'\prec\sigma\Leftrightarrow(\sigma'(M)\leq\sigma(M)\&\sigma'(N)\leq\sigma(N))\&(\sigma(M)\neq\sigma'(M)\vee\sigma(N)\neq\sigma'(N))

    因为 M,N 的内容始终为正且不会一直减少,所以其为良基关系。

    归纳假设:对σS\sigma\in S,设σσ,P(σ)\forall\sigma'\prec\sigma,P(\sigma')。记σ(M)=m,σ(N)=n\sigma(M)=m,\sigma(N)=n

    • m=nm=n,有¬(M=N),σfalse\lang\neg(M=N),\sigma\rang\rightarrow false,根据 while 规则,可以构造一个推导:

      ...¬(M=N),σfalseEuclid,σσ\frac{\frac{...}{\lang\neg(M=N),\sigma\rang\rightarrow false}}{\lang Euclid,\sigma\rang\rightarrow\sigma}

      即得到P(σ)P(\sigma)。注:其实从M,σm,N,σn\lang M,\sigma\rang\rightarrow m,\lang N,\sigma\rang\rightarrow n 可以构造一个推导树推出¬(M=N),σfalse\lang\neg(M=N),\sigma\rang\rightarrow false。也就是省略的…。

    • mnm\neq n,则有¬(M=N),σtrue\lang\neg(M=N),\sigma\rang\rightarrow true,根据条件命令规则,有:(单条条件命令一定可终止)

      if  MN  then  N:=NM  else  M:=MN,σσ={σ[(nm)/N]m<nσ[(mn)/M]n<m\lang if\;M\leq N\;then\;N:=N-M\;else\;M:=M-N,\sigma\rang\rightarrow\sigma''=\begin{cases}\sigma[(n-m)/N]&m<n\\\sigma[(m-n)/M]&n<m\end{cases}

      显然,σ[(nm)/N]σ,σ[(mn)/M]σ\sigma[(n-m)/N]\prec \sigma,\sigma[(m-n)/M]\prec\sigma,即σσ\sigma''\prec\sigma,由归纳假设,有P(σ)P(\sigma''),即

      σ,Euclid,σσ\exists\sigma',\lang Euclid,\sigma''\rang\rightarrow \sigma'

      根据 while 命令规则,可以构造推导:

      ...¬(M=N),σtrue...if  MN  then  N:=NM  else  M:=MN,σσ...Euclid,σσEuclid,σσ\frac{\frac{...}{\lang\neg(M=N),\sigma\rang\rightarrow true}\quad\frac{...}{\lang if\;M\leq N\;then\;N:=N-M\;else\;M:=M-N,\sigma\rang\rightarrow\sigma''}\quad\frac{...}{\lang Euclid,\sigma''\rang\rightarrow\sigma'}}{\lang Euclid,\sigma\rang\rightarrow\sigma'}

    根据良基归纳假设,有σS,P(σ)\forall\sigma\in S,P(\sigma)


  • 良基归纳法是证明含有循环和递归的程序终止性的最重要的方法。如果能证明执行过程状态沿着良基关系链下降,则必然终止。

# 对推导树的归纳

  • 一个规则实例的集合 R 由一组序偶 (X/yX/y) 所组成,其中 X 是一个有限集合,y 是一个元素。它表示:

    y,X=...x1,...,...xny,X={x1,...,xn}\overline{y},X=\emptyset\quad\frac{\frac{...}{x_1},...,\frac{...}{x_n}}{y},X=\{x_1,...,x_n\}

    dRyd\Vdash_R y 表示 d 是结论为 y 的一个推导树,R 是一组规则实例的集合,于是有:

    (/y)Ryif  (/y)R({d1,...,dn}/y)Ryif({x1,...,xn}/y)R&d1Rx1&...&dnxn(\emptyset/y)\Vdash_R y\quad if\;(\emptyset/y)\in R\\ (\{d_1,...,d_n\}/y)\Vdash_R y\quad if(\{x_1,...,x_n\}/y)\in R\& d_1\Vdash_R x_1\&...\& d_n\Vdash x_n

    这里其实根据我的理解,d 表示的是推导树,x,y 表示的都是单条结论。而规则实例一定是形如xy\frac{x}{y} 的,而不会出现层数大于 2 的树形结构。因此注意区分规则实例推导树的区别。

    如果存在 y 的 R 推导,即对于某个推导树dd,有dRyd\Vdash_R y,则称 y 是由 R 推导出来的(y 由一组规则实例推导出来)。在了解了规则后也可以简写为dyd\Vdash yy\Vdash y

  • d,dd,d' 都是推导树,称dd'dd 的直接子推导(记为d1dd'\prec_1 d)当且仅当 d 形为D/yD/y,且dDd'\in D。用\prec 表示1\prec_1 的传递闭包,则称dd'dd 的真子推导当且仅当ddd'\prec d

    注意这里,实际上直接子推导就是推导树 d 的结论上一层的某个前提的推导树。而真子推导的话就不限于上一层了,可以是上几层的子树。

    T=EFDGHAT=\frac{\frac{\frac{E}{F}}{D}\quad\frac{G}{H}}{A}

    譬如GH,EFD\frac{G}{H},\frac{\frac{E}{F}}{D} 都是 T 的直接子推导,EF\frac{E}{F}EFD\frac{\frac{E}{F}}{D} 的直接子推导,是 T 的真子推导。


  • 定理σ,σ1,(c,σ0σ&c,σ0σ1)σ=σ1\forall\sigma,\sigma_1,(\lang c,\sigma_0\rang\rightarrow\sigma\&\lang c,\sigma_0\rang\rightarrow\sigma_1)\Rightarrow\sigma=\sigma_1

    证明:先定义对推导树 d 的性质 P:

    P(d)cCom,σ0,σ,σ1Σ,(dc,σ0σ&c,σ0σ1)σ=σ1P(d)\Leftrightarrow\forall c\in Com,\sigma_0,\sigma,\sigma_1\in\Sigma,(d\Vdash\lang c,\sigma_0\rang\rightarrow\sigma\&\lang c,\sigma_0\rang\rightarrow\sigma_1)\Rightarrow\sigma=\sigma_1

    我们需要证明(推导出c,σ0σ&c,σ0σ1\lang c,\sigma_0\rang\rightarrow\sigma\&\lang c,\sigma_0\rang\rightarrow\sigma_1 的)推导树 d 满足P(d)P(d)

    根据良基归纳法,只需要证明 d 的所有真子推导dd' 都满足P(d)P(d') 能推出 d 也满足P(d)P(d),即:

    (dd,P(d))P(d)(\forall d'\prec d,P(d'))\Rightarrow P(d)

    因为 d 推导出了c,σ0σ&c,σ0σ1\lang c,\sigma_0\rang\rightarrow\sigma\&\lang c,\sigma_0\rang\rightarrow\sigma_1,所以一定存在两个推导树d1,d2d_1,d_2 满足d1c,σ0σd_1\Vdash\lang c,\sigma_0\rang\rightarrow\sigmad2c,σ0σ1d_2\Vdash\lang c,\sigma_0\rang\rightarrow\sigma_1

    • cskipc\equiv skip,则d1=d2=skip,σ0σ0d_1=d_2=\overline{\lang skip,\sigma_0\rang\rightarrow\sigma_0}

    • cX:=ac\equiv X:=a,此时两个推导树形如:

      d1=...a,σ0mX:=a,σ0σ0[m/X]d2=...a,σ0m1X:=a,σ0σ0[m1/X]d_1=\frac{\frac{...}{\lang a,\sigma_0\rang\rightarrow m}}{\lang X:=a,\sigma_0\rang\rightarrow\sigma_0[m/X]}\quad d_2=\frac{\frac{...}{\lang a,\sigma_0\rang\rightarrow m_1}}{\lang X:=a,\sigma_0\rang\rightarrow\sigma_0[m_1/X]}

      σ=σ0[m/X],σ1=σ0[m1/X]\sigma=\sigma_0[m/X],\sigma_1=\sigma_0[m_1/X],而根据算术表达式求值的唯一性,有m=m1m=m_1,然后就可以得到

      X,σ(X)=σ1(X)\forall X,\sigma(X)=\sigma_1(X),即σ=σ1\sigma=\sigma_1

    • cc0;c1c\equiv c_0;c_1,此时有

      d1=...c0,σ0σ...c1,σσc0;c1,σ0σd2=...c0σ0σ1...c1,σ1σ1c0;c1,σ0σ1d=d1d2d_1=\frac{\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma'}\quad\frac{...}{\lang c_1,\sigma'\rang\rightarrow\sigma}}{\lang c_0;c_1,\sigma_0\rang\rightarrow\sigma}\quad d_2=\frac{\frac{...}{\lang c_0\sigma_0\rang\rightarrow\sigma_1'}\quad\frac{...}{\lang c_1,\sigma_1'\rang\rightarrow\sigma_1}}{\lang c_0;c_1,\sigma_0\rang\rightarrow\sigma_1}\\ d=d_1\quad d_2

      注意到,实际上,我们已经有了推导树

      ...c0,σ0σ...c1,σσ...c0σ0σ1...c1,σ1σ1\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma'}\quad\frac{...}{\lang c_1,\sigma'\rang\rightarrow\sigma}\quad\frac{...}{\lang c_0\sigma_0\rang\rightarrow\sigma_1'}\quad\frac{...}{\lang c_1,\sigma_1'\rang\rightarrow\sigma_1}

      因此,我们可以构造推导树(这里我理解为两棵树即森林)

      d1=...c0,σ0σ...c0σ0σ1d2=...c1,σσ...c1,σ1σ1d_1'=\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma'}\quad\frac{...}{\lang c_0\sigma_0\rang\rightarrow\sigma_1'}\\ d_2'=\frac{...}{\lang c_1,\sigma'\rang\rightarrow\sigma}\quad\frac{...}{\lang c_1,\sigma_1'\rang\rightarrow\sigma_1}

      显然有d1d,d2dd_1'\prec d,d_2'\prec dd1(c0σ0σ&c0σ0σ1)d_1'\Vdash(\lang c_0\sigma_0\rang\rightarrow\sigma'\&\lang c_0\sigma_0\rang\rightarrow\sigma_1')d2(c0σ0σ&c0σ0σ1)d_2'\Vdash(\lang c_0\sigma_0\rang\rightarrow\sigma\&\lang c_0\sigma_0\rang\rightarrow\sigma_1)

      结合P(d1),P(d2)P(d_1'),P(d_2')σ=σ1,σ=σ1\sigma'=\sigma_1',\sigma=\sigma_1

    • cif  b  then  c0  else  c1c\equiv if\;b\;then\;c_0\;else\;c_1,此时有推导树

      d=...b,σ0true...c0,σ0σc,σ0σ...b,σ0true...c0,σ0σ1c,σ0σ1d=\frac{\frac{...}{\lang b,\sigma_0\rang\rightarrow true}\quad\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma}}{\lang c,\sigma_0\rang\rightarrow\sigma}\quad \frac{\frac{...}{\lang b,\sigma_0\rang\rightarrow true}\quad\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma_1}}{\lang c,\sigma_0\rang\rightarrow\sigma_1}

      则存在子推导树

      d=...c0,σ0σ...c0,σ0σ1dd'=\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma}\quad\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma_1}\prec d

      结合P(d)P(d') 得到σ=σ1\sigma=\sigma_1,而若 b 求值是 false 完全类似,只是把c0c_0 换成c1c_1

    • cwhile  b  do  c0c\equiv while\;b\;do\;c_0,此时有推导树:

      d=...b,σ0true...c0,σ0σ...c,σσc,σ0σ...b,σ0true...c0,σ0σ1...c,σ1σ1c,σ0σ1d=\frac{\frac{...}{\lang b,\sigma_0\rang\rightarrow true}\quad\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma'}\quad\frac{...}{\lang c,\sigma'\rang\rightarrow\sigma}}{\lang c,\sigma_0\rang\rightarrow\sigma}\quad \frac{\frac{...}{\lang b,\sigma_0\rang\rightarrow true}\quad\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma_1'}\quad\frac{...}{\lang c,\sigma_1'\rang\rightarrow\sigma_1}}{\lang c,\sigma_0\rang\rightarrow\sigma_1}

      显然有子推导

      d1=...c0,σ0σ...c0,σ0σ1dd2=...c0,σσ...c0,σ1σ1dd_1=\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma'}\quad\frac{...}{\lang c_0,\sigma_0\rang\rightarrow\sigma_1'}\prec d\\ d_2=\frac{...}{\lang c_0,\sigma'\rang\rightarrow\sigma}\quad\frac{...}{\lang c_0,\sigma_1'\rang\rightarrow\sigma_1}\prec d

      结合P(d1),P(d2)P(d_1),P(d_2)σ=σ1,σ=σ1\sigma'=\sigma_1',\sigma=\sigma_1

      如果 b 求值是 false 更简单

    证明到这里结束证毕了。


  • 写一点我的理解。++ 其实我认为 “真子推导” 本身就是一个良基关系。++ 所以事实上,对推导树的归纳也就是在做:
    • 1、存在推导树 d 推导出了要证命题的前提
    • 2、证明存在 d 的子推导 d‘推导出了类似要证命题前提的不同情况
    • 3、根据归纳假设,得到不同情况下的命题结论
    • 4、通过上一步的结论,再推导出要证命题的结论。

  • 命题:对所有状态σ,σ\sigma,\sigma',有while  true  do  skip,σ↛σ\lang while\;true\;do\;skip,\sigma\rang\not\rightarrow \sigma'

    证明:反设存在一个推导 d,推出while  true  do  skip,σσ\lang while\;true\;do\;skip,\sigma\rang\rightarrow \sigma'。d 只有一种形态:

    d=true,σtrueskip,σσ...while  true  do  skip,σσwhile  true  do  skip,σσd=\frac{\overline{\lang true,\sigma\rang\rightarrow true}\quad\overline{\lang skip,\sigma\rang\rightarrow\sigma}\quad\frac{...}{\lang while\;true\;do\;skip,\sigma\rang\rightarrow\sigma'}}{\lang while\;true\;do\;skip,\sigma\rang\rightarrow\sigma'}

    然后会发现子推导可以无限嵌套下去,这与子推导是良基关系矛盾。

# 归纳定义

# 规则归纳法

  • 给定一组规则实例 R,把 R 定义的集合记为IRI_R,表示由 R 可以推导出的结论:

    IR={xRx}I_R=\{x|\Vdash_R x\}

  • 规则归纳法:

    IRI_R 是规则实例集合RR 定义的集合,P 是某个性质,则xIR,P(x)\forall x\in I_R,P(x) 当且仅当对 R 中所有的规则实例X/yX/y,有

    (xX,P(x))P(y)(\forall x\in X,P(x))\Rightarrow P(y)

    其中XIRX\subseteq I_R


    换句话描述下,对规则实例集合RRyIR,P(y)\forall y\in I_R,P(y) 当且仅当对所有公理实例x\overline{x} 满足P(x)P(x) 且对所有规则实例x1,..,xnx\frac{x_1,..,x_n}{x} 满足

    [i,xiIR&P(xi)]P(x)[\forall i,x_i\in I_R\&P(x_i)]\Rightarrow P(x)

  • 我们称集合 Q 对规则实例集合 R 是封闭的当且仅当

    X/yR,XQyQ\forall X/y\in R,X\subseteq Q\Rightarrow y\in Q

    显然IRI_R 对 R 是封闭的,而且有对于任意对 R 封闭的集合 Q,都有IRQI_R\subseteq Q

    于是,如果我们想证明IRI_R 中所有的元素都满足性质PP,我们可以构造集合:

    Q={xIRP(x)}Q=\{x\in I_R|P(x)\}

    然后证明 Q 对 R 封闭,即对所有规则实例(X/yX/y)有:

    (xX,xQ)P(y)(xX,xIR&P(x))P(y)(\forall x\in X,x\in Q)\Rightarrow P(y)\\ (\forall x\in X,x\in I_R\& P(x))\Rightarrow P(y)

    实际上这就是规则归纳法。

  • 以此,我们可以对之前的操作语义求值规则进行重写定义:

    a::=...a0+a1...a0:Aexpa1:Aexpa0+a1:Aexpa::=...|a_0+a_1|...\\ \frac{a_0:Aexp\quad a_1:Aexp}{a_0+a_1:Aexp}

    c::=...X:=a...if  b  then  c0  else  c1...X:Loca:AexpX:=a:Com,b:Bexpc0:Comc1:Comif  b  then  c0  else  c1:Comc::=...|X:=a|...|if\;b\;then\;c_0\;else\;c_1|...\\ \frac{X:Loc\quad a:Aexp}{X:=a:Com},\frac{b:Bexp\quad c_0:Com\quad c_1:Com}{if\;b\;then\;c_0\;else\;c_1:Com}

# 特殊的规则归纳法

  • 规则归纳法的特殊原理:

    IRI_R 是规则实例集 R 定义的集合,AIRA\subseteq I_R,Q 是某个性质。则aA,Q(a)\forall a\in A,Q(a) 当且仅当对于 R 中所有规则实例X/yX/y,其中XIR,yAX\subseteq I_R,y\in A,有:

    (xXA,Q(x))Q(y)(\forall x\in X\cap A,Q(x))\Rightarrow Q(y)

    下面我们说明为什么这个特殊原理和一般原理并没什么本质不同。特殊原理想证明对 A 中所有元素都满足性质 Q,我们可以对IRI_R 中元素定义性质 P:

    P(x)(xAQ(x))P(x)\Leftrightarrow(x\in A\Rightarrow Q(x))

    因此证明 A 中所有元素满足 Q 就等价于证明IRI_R 中所有元素满足 P。按照规则归纳法一般原理,即要证:

    (X/y)R,[XIR&(xX,P(x))P(y)](X/y)R,[XIR&(xX,xAQ(x))](yAQ(y))\forall(X/y)\in R,[X\subseteq I_R\&(\forall x\in X,P(x))\Rightarrow P(y)]\\ \Leftrightarrow\\ \forall(X/y)\in R,[X\subseteq I_R\&(\forall x\in X,x\in A\Rightarrow Q(x))]\Rightarrow(y\in A\Rightarrow Q(y))

    然后考虑蕴涵条件引入,原式逻辑等价于:

    (X/y)R,[XIR&yA&(xX,xAQ(x))]Q(y)(X/y)R,[XIR&yA&(xXA,Q(x))]Q(y)\forall(X/y)\in R,[X\subseteq I_R\& y\in A\&(\forall x\in X,x\in A\Rightarrow Q(x))]\Rightarrow Q(y)\\ \Leftrightarrow\\ \forall(X/y)\in R,[X\subseteq I_R\&y\in A\&(\forall x\in X\cap A,Q(x))]\Rightarrow Q(y)

    也就是规则归纳法特殊原理。

# 操作语义的证明规则

# 算术表达式的规则归纳法

  • 对所有的求值关系a,σn\lang a,\sigma\rang\rightarrow n,性质P(a,σ,n)P(a,\sigma,n) 为真当且仅当构造该算术表达式的规则都保持了性质P。逻辑化地:

    aAexp,σΣ,nN,a,σnP(a,σ,n)iff[nN,σΣ,P(n,σ,n)&XLoc,σΣ,P(X,σ,σ(X))&a0,a1Aexp,σΣ,n0,n1N,a0,σn0&P(a0,σ,n0)&a1,σn1&P(a1,σ,n1)P(a0+a1,σ,n0+n1)&a0,a1Aexp,σΣ,n0,n1N,a0,σn0&P(a0,σ,n0)&a1,σn1&P(a1,σ,n1)P(a0a1,σ,n0n1)&a0,a1Aexp,σΣ,n0,n1N,a0,σn0&P(a0,σ,n0)&a1,σn1&P(a1,σ,n1)P(a0×a1,σ,n0×n1)]\forall a\in Aexp,\sigma\in\Sigma,n\in N,\lang a,\sigma\rang\rightarrow n\Rightarrow P(a,\sigma,n)\\ iff\\ [\forall n\in N,\sigma\in\Sigma,P(n,\sigma,n)\\ \&\\ \forall X\in Loc,\sigma\in\Sigma,P(X,\sigma,\sigma(X))\\ \&\\ \forall a_0,a_1\in Aexp,\sigma\in\Sigma,n_0,n_1\in N,\lang a_0,\sigma\rang\rightarrow n_0\&P(a_0,\sigma,n_0)\&\lang a_1,\sigma\rang\rightarrow n_1\& P(a_1,\sigma,n_1)\Rightarrow P(a_0+a_1,\sigma,n_0+n_1)\\ \&\\ \forall a_0,a_1\in Aexp,\sigma\in\Sigma,n_0,n_1\in N,\lang a_0,\sigma\rang\rightarrow n_0\&P(a_0,\sigma,n_0)\&\lang a_1,\sigma\rang\rightarrow n_1\& P(a_1,\sigma,n_1)\Rightarrow P(a_0-a_1,\sigma,n_0-n_1)\\ \&\\ \forall a_0,a_1\in Aexp,\sigma\in\Sigma,n_0,n_1\in N,\lang a_0,\sigma\rang\rightarrow n_0\&P(a_0,\sigma,n_0)\&\lang a_1,\sigma\rang\rightarrow n_1\& P(a_1,\sigma,n_1)\Rightarrow P(a_0\times a_1,\sigma,n_0\times n_1)]\\

    因为所有的表达式都是从规则实例退出来的嘛。注意考虑 “保持性质” 的含义。

# 布尔表达式的规则归纳法

  • 不同于算术表达式规则,布尔表达式的规则需要依赖于算术表达式的求值规则(譬如计算a0=a1a_0=a_1 需要先分别对表达式a0,a1a_0,a_1 求值)。所以实际上,它的规则实例集合 R 应该包含了算术表达式求值规则实例集合。

    举个不完全的例子,例如有个算术表达式求值的规则实例集合:R={3,σ03}R=\{\overline{\lang 3,\sigma_0\rang\rightarrow 3}\},那么为了推导3=3,σ0true\lang 3=3,\sigma_0\rang\rightarrow true,其对应的规则实例集合为:R={3,σ03,3,σ033,σ033=3σ0true}R'=\{\overline{\lang 3,\sigma_0\rang\rightarrow 3},\frac{\lang 3,\sigma_0\rang\rightarrow 3\quad\lang 3,\sigma_0\rang\rightarrow 3}{\lang 3=3\,\sigma_0\rang\rightarrow true}\},即RRR\subseteq R'

  • 因此,我们如果想证明所有求值关系b,σt\lang b,\sigma\rang\rightarrow t 满足某性质P(b,σ,t)P(b,\sigma,t),实际上需要使用一手特殊规则归纳法,在考虑布尔表达式规则是否保持性质时,若前提中出现了算术表达式求值规则,可以不去管他是否保持性质。

    bBexp,σΣ,tT,b,σP(b,σ,t)iff[σΣ,P(false,σ,false)&σΣ,P(true,σ,true)&a0,a1Aexp,σΣ,m,nN,a0σm&a1,σn&m=nP(a0=a1,σ,true)&a0,a1Aexp,σΣ,m,nN,a0σm&a1,σn&mnP(a0=a1,σ,false)&a0,a1Aexp,σΣ,m,nN,a0σm&a1,σn&mnP(a0a1,σ,true)&a0,a1Aexp,σΣ,m,nN,a0σm&a1,σn&m>nP(a0a1,σ,false)&bBexp,σΣ,tT,b,σt&P(b,σ,t)P(¬b,σ,¬t)&b0,b1Bexp,σΣ,t0,t1T,b0,σt0&P(b0,σ,t0)&b1,σt1&P(b1,σ,t1)P(b0b1,σ,t0t1)&b0,b1Bexp,σΣ,t0,t1T,b0,σt0&P(b0,σ,t0)&b1,σt1&P(b1,σ,t1)P(b0b1,σ,t0t1)\forall b\in Bexp,\sigma\in\Sigma,t\in T,\lang b,\sigma\rang\Rightarrow P(b,\sigma,t)\\ iff\\ [\forall\sigma\in \Sigma,P(false,\sigma,false)\&\forall\sigma\in\Sigma,P(true,\sigma,true)\\ \&\\ \forall a_0,a_1\in Aexp,\sigma\in\Sigma,m,n\in N,\lang a_0\sigma\rang\rightarrow m\&\lang a_1,\sigma\rang\rightarrow n\& m=n\Rightarrow P(a_0=a_1,\sigma,true)\\ \&\\ \forall a_0,a_1\in Aexp,\sigma\in\Sigma,m,n\in N,\lang a_0\sigma\rang\rightarrow m\&\lang a_1,\sigma\rang\rightarrow n\& m\neq n\Rightarrow P(a_0=a_1,\sigma,false)\\ \&\\ \forall a_0,a_1\in Aexp,\sigma\in\Sigma,m,n\in N,\lang a_0\sigma\rang\rightarrow m\&\lang a_1,\sigma\rang\rightarrow n\& m\leq n\Rightarrow P(a_0\leq a_1,\sigma,true)\\ \&\\ \forall a_0,a_1\in Aexp,\sigma\in\Sigma,m,n\in N,\lang a_0\sigma\rang\rightarrow m\&\lang a_1,\sigma\rang\rightarrow n\& m> n\Rightarrow P(a_0\leq a_1,\sigma,false)\\ \&\\ \forall b\in Bexp,\sigma\in \Sigma,t\in T,\lang b,\sigma\rang\rightarrow t\&P(b,\sigma,t)\Rightarrow P(\neg b,\sigma,\neg t)\\ \&\\ \forall b_0,b_1\in Bexp,\sigma\in\Sigma,t_0,t_1\in T,\lang b_0,\sigma\rang\rightarrow t_0\&P(b_0,\sigma,t_0)\&\lang b_1,\sigma\rang\rightarrow t_1\&P(b_1,\sigma,t_1)\Rightarrow P(b_0\wedge b_1,\sigma,t_0\wedge t_1)\\ \&\\ \forall b_0,b_1\in Bexp,\sigma\in\Sigma,t_0,t_1\in T,\lang b_0,\sigma\rang\rightarrow t_0\&P(b_0,\sigma,t_0)\&\lang b_1,\sigma\rang\rightarrow t_1\&P(b_1,\sigma,t_1)\Rightarrow P(b_0\vee b_1,\sigma,t_0\vee t_1)\\

# 命令的规则归纳法

  • 命令的规则实例前提中可能出现布尔表达式求值和算术表达式求值。但是因为特殊规则归纳法原理,我们只需要考虑对应命令的保持性质。

cCom,σ,σΣ,c,σσP(c,σ,σ)iffσΣ,P(skip,σ,σ)&σΣ,XLoc,aAexp,mN,a,σmP(X:=a,σ,σ[m/X])&c0,c1Com,σ,σ,σΣ,c0,σσ&P(c0,σ,σ)&c1,σσ&P(c1,σ,σ)P(c0;c1,σ,σ)&c0,c1Com,σ,σΣ,bBexp,b,σtrue&c0,σσ&P(c0,σ,σ)P(if  b  then  c0  else  c1,σ,σ)&c0,c1Com,σ,σΣ,bBexp,b,σfalse&c1,σσ&P(c1,σ,σ)P(if  b  then  c0  else  c1,σ,σ)&cCom,bBexp,σΣ,b,σfalseP(while  b  do  c,σ,σ)cCom,bBexp,σ,σ,σΣ,b,σtrue&c,σσ&P(c,σ,σ)&while  b  do  c,σσ&P(while  b  do  c,σ,σ)P(while  b  do  c,σ,σ)\forall c\in Com,\sigma,\sigma'\in\Sigma,\lang c,\sigma\rang\rightarrow \sigma'\Rightarrow P(c,\sigma,\sigma')\\ iff\\ \forall \sigma\in\Sigma,P(skip,\sigma,\sigma)\\ \&\\ \forall\sigma\in\Sigma,X\in Loc,a\in Aexp,m\in N,\lang a,\sigma\rang\rightarrow m\Rightarrow P(X:=a,\sigma,\sigma[m/X])\\ \&\\ \forall c_0,c_1\in Com,\sigma,\sigma',\sigma''\in\Sigma,\lang c_0,\sigma\rang\rightarrow\sigma'\&P(c_0,\sigma,\sigma')\&\lang c_1,\sigma'\rang\rightarrow \sigma''\& P(c_1,\sigma',\sigma'')\Rightarrow P(c_0;c_1,\sigma,\sigma'')\\ \&\\ \forall c_0,c_1\in Com,\sigma,\sigma'\in \Sigma,b\in Bexp,\lang b,\sigma\rang\Rightarrow true\&\lang c_0,\sigma\rang\rightarrow \sigma'\& P(c_0,\sigma,\sigma')\Rightarrow P(if\;b\;then\;c_0\;else\;c_1,\sigma,\sigma')\\ \&\\ \forall c_0,c_1\in Com,\sigma,\sigma'\in \Sigma,b\in Bexp,\lang b,\sigma\rang\Rightarrow false\&\lang c_1,\sigma\rang\rightarrow \sigma'\& P(c_1,\sigma,\sigma')\Rightarrow P(if\;b\;then\;c_0\;else\;c_1,\sigma,\sigma')\\ \&\\ \forall c\in Com,b\in Bexp,\sigma\in\Sigma,\lang b,\sigma\rang\rightarrow false\Rightarrow P(while\;b\;do\;c,\sigma,\sigma)\\ \forall c\in Com,b\in Bexp,\sigma,\sigma',\sigma''\in\Sigma,\lang b,\sigma\rang\rightarrow true\&\lang c,\sigma\rang\rightarrow\sigma'\& P(c,\sigma,\sigma')\& \lang while\;b\;do\;c,\sigma'\rang\rightarrow\sigma''\& P(while\;b\;do\;c,\sigma',\sigma'')\\ \Rightarrow P(while\;b\;do\;c,\sigma,\sigma'')

# 规则归纳法的一个示例证明

  • 命题:设YLocY\in Loc,对所有的命令cc 和状态σ,σ\sigma,\sigma',有:

    YlocL(c)&c,σσσ(Y)=σ(Y)Y\notin loc_L(c)\&\lang c,\sigma\rang\rightarrow\sigma'\Rightarrow\sigma(Y)=\sigma'(Y)

    其中,locL(c)loc_L(c) 表示出现在命令 c 中赋值命令的存储单元的集合。


    证明:设性质 P:

    P(c,σ,σ)(YlocL(c)σ(Y)=σ(Y))P(c,\sigma,\sigma')\Leftrightarrow (Y\notin loc_L(c)\Rightarrow \sigma(Y)=\sigma'(Y))

    使用命令的规则归纳法:

    • cskipc\equiv skip,则locL(c)=loc_L(c)=\emptyset,显然P(skip,σ,σ)P(skip,\sigma,\sigma) 满足性质

    • cX:=ac\equiv X:=a,设a,σmN\lang a,\sigma\rang\rightarrow m\in N,则YlocL(c)YXσ(Y)=σ[m/X](Y)=σ(Y)Y\notin loc_L(c)\Rightarrow Y\neq X\Rightarrow\sigma(Y)=\sigma[m/X](Y)=\sigma'(Y),故P(X:=a,σ,σ)P(X:=a,\sigma,\sigma') 成立

      (其实上面两种情况对应了奠基步骤)

    • cc0;c1c\equiv c_0;c_1,引入条件(包含了归纳假设):

      c0,σσ&P(c0,σ,σ)&c1,σσ&P(c1,σ,σ)\lang c_0,\sigma\rang\rightarrow\sigma'\&P(c_0,\sigma,\sigma')\&\lang c_1,\sigma'\rang\rightarrow\sigma''\& P(c_1,\sigma',\sigma'')

      又因为YlocL(c)=locL(c0)logL(c1)Y\notin loc_L(c)=loc_L(c_0)\cup log_L(c_1),因此根据条件有

      P(c0,σ,σ)&YlocL(c0)σ(Y)=σ(Y)P(c1,σ,σ)&YlocL(c1)σ(Y)=σ(Y)σ(Y)=σ(Y)P(c_0,\sigma,\sigma')\&Y\notin loc_L(c_0)\Rightarrow \sigma(Y)=\sigma'(Y)\\ P(c_1,\sigma',\sigma'')\& Y\notin loc_L(c_1)\Rightarrow\sigma'(Y)=\sigma''(Y)\\ \Rightarrow \sigma(Y)=\sigma''(Y)

      从而P(c0;c1,σ,σ)P(c_0;c_1,\sigma,\sigma'') 成立

    • cif  b  then  c0  else  c1c\equiv if\;b\;then\;c_0\;else\;c_1

      • 情况 1,引入条件:

        b,σtrue&c0,σσ&P(c0,σ,σ)\lang b,\sigma\rang\rightarrow true\&\lang c_0,\sigma\rang\rightarrow\sigma'\& P(c_0,\sigma,\sigma')

        此时,YlocL(c)=locL(c0)logL(c1)Y\notin loc_L(c)=loc_L(c_0)\cup log_L(c_1),可以推得:

        P(c0,σ,σ)&YlocL(c0)σ(Y)=σ(Y)P(c_0,\sigma,\sigma')\&Y\notin loc_L(c_0)\Rightarrow \sigma(Y)=\sigma'(Y)

      • 情况 2,引入条件:

        b,σfalse&c1,σσ&P(c1,σ,σ)\lang b,\sigma\rang\rightarrow false\&\lang c_1,\sigma\rang\rightarrow\sigma'\&P(c_1,\sigma,\sigma')\\

        推得:

        P(c1,σ,σ)&YlocL(c1)σ(Y)=σ(Y)P(c_1,\sigma,\sigma')\&Y\notin loc_L(c_1)\Rightarrow\sigma(Y)=\sigma'(Y)

        P(c,σ,σ)P(c,\sigma,\sigma') 成立。

    • cwhile  b  do  c0c\equiv while\;b\;do\;c_0

      • 情况 1,引入条件:

        b,σfalse&P(c,σ,σ)\lang b,\sigma\rang\rightarrow false\&P(c,\sigma,\sigma)

        此时P(c,σ,σ)P(c,\sigma,\sigma) 显然成立的。

      • 情况 2,引入条件:

        b,σtrue&c0,σσ&P(c0,σ,σ)&c,σσ&P(c,σ,σ)\lang b,\sigma\rang\rightarrow true\&\lang c_0,\sigma\rang\rightarrow\sigma'\& P(c_0,\sigma,\sigma')\&\lang c,\sigma'\rang\rightarrow\sigma''\&P(c,\sigma',\sigma'')

        YlocL(c)=locL(c0)Y\notin loc_L(c)=loc_L(c_0),因此可以推得:

        P(c0,σ,σ)&YlocL(c0)σ(Y)=σ(Y)P(c,σ,σ)&YlocL(c)σ(Y)=σ(Y)σ(Y)=σ(Y)P(c_0,\sigma,\sigma')\& Y\notin loc_L(c_0)\Rightarrow\sigma(Y)=\sigma'(Y)\\ P(c,\sigma',\sigma'')\&Y\notin loc_L(c)\Rightarrow\sigma'(Y)=\sigma''(Y)\\ \Rightarrow\sigma(Y)=\sigma''(Y)

        P(c,σ,σ)P(c,\sigma,\sigma'') 成立,保持了性质。

    到此整完了所有规则保持性质,即证毕。

# 算子其最小不动点

  • 一组规则示例 R 确定了集合上得算子R^\hat{R},当其作用于某集合 B 时:

    R^(B)={yXB,(X/y)R}\hat{R}(B)=\{y|\exists X\subseteq B,(X/y)\in R\}

    显然,得到的集合R^(B)\hat{R}(B) 对 R 是封闭的。

  • 命题:一个集合 B 是 R 封闭的,当且仅当R^(B)B\hat{R}(B)\subseteq B

    证明:yR^(B)\forall y\in \hat{R}(B) 都存在X/yR,XBX/y\in R,X\subseteq B。又因为 B 对 R 封闭,所以有yBy\in B,所以有R^(B)B\hat{R}(B)\subseteq B

    ​ 充分性更好证。

  • 我们可以记An=R^n()=R^(R^(...R^()))A_n=\hat{R}^n(\emptyset)=\hat{R}(\hat{R}(...\hat{R}(\emptyset)))。然后显然有一条有限的链:

    A0A1A2...An...A_0\subseteq A_1\subseteq A_2...\subseteq A_n\subseteq...

    因为实际上A1A_1 就是 R 中所有公理得结论,A2A_2 就是所有一级结论和二级结论…

    A=nωAnA=\bigcup_{n\in\omega}A_n,有如下命题:

    • A 是对 R 封闭的。

      证明:显然,X/yR,XA\forall X/y\in R,X\subseteq A,必定存在nn,使得XAnX\subseteq A_n。再根据算子定义,有yR^(An)=An+1y\in \hat{R}(A_n)=A_{n+1},因此yAy\in A

    • R^(A)=A\hat{R}(A)=A。可以证明R^(A)A,AR^(A)\hat{R}(A)\subseteq A,A\subseteq\hat{R}(A)

    • A 是对 R 封闭的最小集合。

      证明:设 B 是另一个对 R 封闭的集合,我们证明ABA\subseteq B

      因为 B 对 R 封闭,所以R^(B)B\hat{R}(B)\subseteq B。用数学归纳法,=A0B\emptyset=A_0\subseteq B,然后

      AnBR^(An)R^(B)An+1R^(B)Bnω,AnBAB\because A_n\subseteq B\Rightarrow \hat{R}(A_n)\subseteq\hat{R}(B)\\ \therefore A_{n+1}\subseteq \hat{R}(B)\subseteq B\\ \therefore \forall n\in\omega,A_n\subseteq B\\ \therefore A\subseteq B

  • 其实这里我已经意识到了A=IRA=I_R

  • 关于上面的链为什么是有限的,实际上是因为IRI_RR^\hat{R} 的一个不动点:

    R^(B)=BIRB\hat{R}(B)=B\Rightarrow I_R\subseteq B

    显然,IR=nωR^n()I_R=\bigcup_{n\in\omega}\hat{R}^n(\emptyset)R^\hat{R} 的最小不动点。