抽象解释的细化认证技术解析
1. 高阶编程与正确性图
在抽象计算编程中,我们使用GCL †K作为编程语言,GCL K作为规范语言。每个程序 †K都与一个从其代码语法派生的规范K相关联,即每个 †K运算符在语法上都与上文中提升它的K运算符相关联。
线性化过程会调用 †K的另外两个运算符:
- 类型转换运算符 :将 †K转换为给定规范K′,要求K′ ⊑K以生成新的有效 †K图,这有助于实现经过认证的开发的模块化设计,允许对 †K图进行逐步细化。
- 绑定运算符 :对于R(♯D, A)的计算π,将π的结果绑定到函数 †g(A →†K)。该运算符需要一个具体的后置条件Q(A →P(D)),在条件 ∀♯d, ∀x ∈A, ♯d π →x ⇒γ(♯d) ⊆Q x下,定义图 π†≫=Q†g为抽象计算 {(♯d1, ♯d2) | ∃x, ♯d1 π →x ∧♯d1 ♯g x →♯d2},由 x ⊢Q x ;g x指定。
为了提高精度,线性化过程会对抽象状态进行分区。延续传递风格(CPS)是一种高阶模式,为编程和认证简单的分区策略提供了轻量级和模块化的方式。通常,给定抽象状态 ♯d,线性化过程调用子过程 ♯f将 ♯d拆分为分区 (♯di)i∈I,并为每个单元 ♯di计算值ri。然后,线性化过程从每个单元 (ri, ♯di)继续计算,最终返回所有单元的并集。为避免显式处理分区,将 ♯g作为 ♯f的参数,在 ♯f内部执行并集操作。此时, ♯f的类型为 (A →R(♯D, ♯D)) →R(♯D, ♯D), ♯g被称为其延续。
然而,由于高阶参数的存在,直接指定使用CPS的计算的正确性并不容
超级会员免费看
订阅专栏 解锁全文
3万+

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



