函数式大步语义:原理、优势与实践
1. 引言
在对编程语言进行机械化证明时,选择合适的操作语义并非易事。常见的小步语义和大步语义各有优劣。小步语义适用于语言特性复杂、定理语义微妙的情况,它能让我们细致观察程序执行过程,从而支持强大的证明技术;而大步语义则遵循编程语言的语法结构,能与编译器、类型系统等良好配合,降低机械化证明的开销。
对于大型项目,可采用混合方法。不过,本文着重介绍函数式大步语义,它能支持许多通常依赖小步语义的证明和语言,同时保持与语言语法一致的结构。函数式大步语义本质上是一个纯函数式的解释器,并配备时钟以确保函数的全功能性,即使在处理发散程序时也能正常运行。
函数式大步语义具有以下优势:
- 易于阅读,对函数式程序员来说很熟悉,避免了归纳关系定义的大步语义中的大量重复,尤其适用于有异常和非局部控制流的语言。
- 便于在基于重写的机械化证明中使用,因为它以等式形式表述。
- 能产生更好的归纳定理,避免了关系型大步语义中不必要的情况拆分。
- 时钟方便证明编译器对程序发散行为的保留,也便于定义和使用步长索引逻辑关系。
- 可在状态中使用预言机来支持具有 I/O 和非确定性的语言。
然而,函数式大步语义也有局限性,如定义时需引入时钟,在某些递归调用时时钟必须递减;对于非确定性语言,需要预言机状态组件来消除非确定性;目前尚未研究具有无结构非确定性(如并发)的语言。
2. 示例语义
为了说明函数式大步语义,我们定义一个名为 FOR 的玩具语言的操作语义,该语言包含类似 C 语言的 for 循环和 break 语句。
超级会员免费看
订阅专栏 解锁全文
2858

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



