将终止降低到部分正确性有多难?


14

如果您熟悉程序验证,则可能更喜欢在“ 背景知识”之前阅读“ 问题 ” 。如果您不熟悉程序验证,那么您仍然可以回答这个问题,但是您可能更喜欢先阅读背景知识

背景

人们经常说检查部分正确性是不确定的。为了便于讨论,让我们选择一种非常特殊的方式,使之以Floyd-Hoare的风格准确地表述。甲流图是带有区分的有向图的初始节点从所有的节点可达。甲程序是一个流图的节点是命令。有三种命令类型:(1)假设假设 q,(2)断言声明 q,以及(3)分配v:= e。这里q是fol(一阶逻辑)公式,e是fol项,v是变量。

我们说一个程序是部分正确时,有一种方法来注释每个节点X与前提A(X)和一个后置条件B(X) ,使得(1)的初始节点的先决条件是有效的,(2){ a(x) } x { b(x) }对所有命令x都成立,并且(3)(b(x)暗示a(y))对从xy的所有边均有效。这里的Hoare三元组定义如下:

  • { p } 断言 q { r }表示(p暗示(qr))有效
  • { p } 假设 q { r }表示((pq)暗示r)有效
  • { p } v:= e { r }表示((用e代替v的p表示r)有效

这就是为什么检查手工波浪参数部分正确性是不可判定:当你在一些填写A(X)和部分B(X) ,你需要检查,如果一些阶逻辑公式是有效的,而且是不可判定。

在部分正确的情况下对终止进行编码的一种典型方法是添加一些特殊的断言,这些断言本质上说“自从我上次执行以来,就朝终止迈进了一步。” 必须放置这些进度断言,以使流程图上的所有无限遍历(从初始节点开始)都包含无限多个进度断言。更具体地说,假设进度断言的形式始终为assert u < v,其中uv是正整数,在赋值u:= f之前,然后是赋值v:= u。这里f是一个变体函数u是其当前值,v是其先前值。现在,由于我们谈论“正整数”并进行比较,因此我们需要确保比fol可用的位数更多:假设Peano算术可用。(对于这种选择,我并不感到强烈。如果方便,请随时忽略。)当然,f可以使用程序中提到的任何其他函数和常量。(请注意,在程序开始时添加假设等同于引入非逻辑公理。)

现在,如果具有进度断言的程序仍然部分正确,那么我们知道原始程序将终止。

给定一个终止程序,感觉很难为进度断言提供变种函数。但是有多难?(我知道,即使有上述巨大的背景,我仍然会根据您想如何看待这个问题,这种问题是开放式的或不确定的。)

换句话说:我正在寻找一种参考,该参考将减少端接至部分正确性的问题形式化,然后说明其复杂性。做所有这些事情的答案当然是受欢迎的。


让我检查我是否理解这一点。您的要求除其他外,将为我们提供一种算法,该算法采用一个程序来计算总递归函数并输出证明该函数是合计的证明(以变体函数的形式以及它们合适的证明) )?对我来说,这听起来简直不可思议。
安德烈·鲍尔

安德烈(Andrej),对我来说也听起来无可争议。我要的是证明它无可辩驳。
Radu GRIGore 2010年

Answers:


7

回答此问题的一种方法是考虑已知可确定的部分正确性和终止查询类别的决策问题的计算复杂性。使用多面体域的抽象解释可以推断出您所提到的部分正确性注释,其中所需的注释是线性不等式的结合。计算抽象后置条件的变量数是指数的。然后是找到固定点的开销。有关此内容的更多信息,请参见Cousot的早期论文;如果您想直接使用它,请参见Apron库。

当变量函数是线性的时,确定变量函数是决定性的。我无法完全了解其复杂性,但是Tiwari的“线性程序的终止”中有一节讨论了复杂性。另请参阅Podelski和Rybalchenko的“线性排名函数合成的完整方法”。此外,拜伦·库克(Byron Cook)还利用抽象解释来帮助构造终止参数。参见,例如,“排名抽象”和“不变性分析中的方差分析”。这些可以进一步了解部分正确性与终止之间的关系。

链接:


1
希望您不要介意我编辑您的答案并使链接处于活动状态。
Andrej Bauer

4

必要的非终止到部分正确性有明显的减少,即:

P在满足初始状态启动时永远不会终止φ当且仅当{ φ } P {FALSE}是有效的。

我知道这是另一个无法解决的问题。它的优点是比上面的那些短。


3

有一种标准技术-当然通常是不确定的-使用其前置条件和后置条件填充图,即最弱的自由先决条件语义,这是谓词转换器语义的一种形式,为满足规范或非规范提供了最弱的前提条件-终止。这本质上是此类语言的部分正确性的完整理论,实际上是完全正确性

用粉笔和奶酪来决定艰苦工作的根源在于终止和部分正确性,因为两者都非常不确定。但是部分正确性与程序设计语言和规范语言的语言设计问题缠结在一起,而终止的难度却是干净的:对于用于证明终止的任何理论,都会有终止的算法,但没有证明终止是相对的。那个理论。例如,纯多态Lambda演算中的计算必须终止,但是Peano算法无法证明这一点。

我的印象是,帕特里克·库索特(Patrick Cousot)率先开展的抽象解释工作在该领域最具活力,但是我不假装自己是专家。


我想问一下推断变体函数的复杂性。抱歉,不清楚!出于好奇,Rustan Leino昨晚(在一家酒吧中)提出了一个示例,强烈向我暗示wlp不适用于wp&sp,因为我在此描述的程序类型不如wp&sp。当我到达一个更适合工作的地方时,我将不得不仔细检查:)
Radu GRIGore

@Radu:在自动终止证明方面已经完成了工作,而Prolog也做了一些不错的工作。找时间的时候我可以挖一些参考。
查尔斯·斯图尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.