在 Coq 中构建卡恩网络的构造性指称语义
1 引言
编程语言的语义学和交互式环境用于开发证明和程序是计算机科学的两个重要方面。吉尔斯·卡恩在其论文《一个简单的并行编程语言的语义》中,提出了将(确定性的)并行程序(现在称为卡恩网络)解释为基于完全偏序集(cpo)理论的流转换器。这种语言对同步程序的限制是数据流 Lustre 语言的基础,该语言用于开发关键的嵌入式系统。卡恩网络因其优雅和通用性,也成为将数据流同步范式扩展到高阶构造或更宽容的同步模型的灵感来源。
本文将在 Coq 证明助手中形式化这篇开创性论文,通过开发一个通用的 cpo 库来定义卡恩网络及其语义。我们将展示如何通过明确的函数定义 cpo,计算单调序列元素的最小上界(lub),并通过具体的例子来说明这个库的应用。
2 cpo 库的开发
2.1 完全偏序集(cpo)的定义
在 Coq 中,我们开发了一个通用的 cpo 库,用于定义可能无限流类型的 cpo 结构。cpo 是通过一个明确的函数来定义的,该函数计算递增元素序列的最小上界(lub)。这与标准 Coq 库不同,后者只需求出 lubs(对于任意有向集)的存在性,而不提供明确计算不动点的方法。
2.1.1 cpo 的定义
以下是 cpo 的定义:
Inductive cpo (A : Type) : Type :=
| CPO_bot : cpo A
| CPO_sup : (nat -> A) -> cpo A.