处理部分项的逻辑语义分析与证明义务处理方法
1. 引言
在程序规范中,经常会涉及到未在其所有(语法)定义域上定义的运算符和函数。由于经典逻辑仅处理已定义的值,因此在证明规范和处理设计步骤中的证明义务时,需要额外考虑这些可能无法表示值的项。本文将对三种处理此类部分项的逻辑方法进行语义比较,并介绍一种将Atelier B的证明义务转换到Why3证明工具链的方法。
1.1 部分项的问题
像空序列的头部(hd [ ])、在映射实际定义域之外应用映射({1 → 1}(2))或简单的 7/0 等项,都可被视为无法表示值的项。这些所谓的“未定义项”在实际程序规范和设计的推理中普遍存在。虽然有些表达式可以通过添加保护条件来避免未定义项与逻辑运算符冲突,但仍有一些表达式无法进行这样的重写。
1.2 处理部分项的三种方法
- 方法一 :坚持所有项都必须表示某个值,例如规定 0/0 = 42。
- 方法二 :接受某些项(如 i/i)可能无法表示值,但使任何谓词(如关系运算符)即使在其参数无法表示值时也能表示值。
- 方法三 :使用非经典(三值)逻辑,如“部分函数逻辑”(LPF)。
2. 语义基础
2.1 抽象语法
使用 VDM 符号表示的抽象语法如下:
Expr = Value | Id | Arith | Equality
处理部分项的逻辑方法分析
超级会员免费看
订阅专栏 解锁全文
12

被折叠的 条评论
为什么被折叠?



