霍尔证明系统¶
霍尔三元组¶
霍尔三元组
形如 \(\{\varphi\}\ st\ \{\psi\}\) ,其中 \(\varphi, \psi\) 是逻辑公式,\(st\) 是程序。
从任何满足 \(\varphi\) 的前状态出发执行 \(st\),如果 \(st\) 终止,那么后状态必定满足 \(\psi\)。
Note
- \(\varphi\):前置条件
- \(\psi\): 后置条件
- 不包括不终止的程序行为
断言:\(\varphi, \psi\) 都是某个一阶理论的 \(\Sigma_T\) 公式,称为断言。
断言中的变元分为三类:
- 程序变元
- 通过量词引入的约束变元
- 其他逻辑变元;\(LVar\) 为断言中出现的其他逻辑变元的集合。
状态集合:
其中 \(\mathcal M\) 由一阶理论决定,常常可以忽略。
有效的霍尔三元组¶
成立:
- 则称程序 \(st\) 满足规约 \((\varphi, \psi)\) ,记作 \(st \models (\varphi, \psi)\) ;
- 也称霍尔三元组 \(\{\varphi\}\ st\ \{\psi\}\) 是有效式,记作 \(\models \{\varphi\}\ st\ \{\psi\}\)
霍尔证明系统¶
空语句规则可靠性
\(\hoare{\varphi}{\skip}{\varphi}\) 是有效式。
显然成立。
Note
这里的顺序比较迷惑。为什么赋值不在三元组的后置条件呢?
因为只有在前面确认赋值操作(或者可以说,替换操作?)之后 \(\varphi\) 成立,赋值语句执行后 \(\varphi\) 成立。
赋值规则的可靠性
\(\forall s \in \{\varph[x\mapsto e]\}\), 设 \((s,s') \in \meaning{x:=e}\) (\(s\) 得到 \(s'\)). 根据赋值语句的语义:\(s' = s[x \mapsto \meaning{e}_s]\),则 \(\meaning{\varphi}_s' = true\), 即 \(s' \in \{\varphi\}\)
引理
若 \(\rho_2 = \rho_1[x \mapsto \meaning{e}_{\rho_1}]\), 则 \(\meaning{\varphi[x \mapsto e]_{\rho_1}} = \meaning{\varphi}_{\rho_2}\)
分支规则的可靠性
任取 \(s \in \{\varphi\}\), 设 \((s,s') \in \meaning{\if{p}{st_1}\ \else{st_2}}\),需要证明 \(s' \in \{\psi\}\).
此时根据分支语句的语义,分两种情况讨论:
- \(\meaning{p}_s = true, (s,s') \in \meaning{st_1}\): 根据 \(\hoare{\varphi \wedge p}{st_1}{\psi}\) 有效,\(s' \in \{\psi\}\)
- \(\meaning{p}_s = false, (s,s') \in \meaning{st_2}\): 根据 \(\hoare{\varphi \wedge \lnot p}{st_2}{\psi}\) 有效,\(s' \in \{\psi\}\)
顺序规则的可靠性
Note
上面 \(\varphi\) 就是循环不变式,循环会在满足 \(p\) 是不断运行,并且在不满足 \(p\) 时退出
循环规则的可靠性
推导树¶
定义:推导树
推导树(derivation tree) 满足:
- 每个节点对应一个霍尔三元组,树叶代表空
- 每个中间节点是某条规则的结论,子节点是该规则的前提
定理:可推导
存在一颗 \(\hoare{\varphi}{st}{\psi}\) 为根节点的推导树,则称该三元组可推导
Note
记作:\(\vdash\hoare{\varphi}{st}{\psi}\)
霍尔证明系统¶
定理:霍尔证明系统的可靠性
定理:霍尔证明系统的完备性
相对完备的(relatively complete):如果存在一个一阶逻辑判定工具,则通过该系统可以推导出 IMP 语言中所有有效的霍尔三元组。