如果您熟悉程序验证,则可能更喜欢在“ 背景知识”之前阅读“ 问题 ” 。如果您不熟悉程序验证,那么您仍然可以回答这个问题,但是您可能更喜欢先阅读背景知识。
背景
人们经常说检查部分正确性是不确定的。为了便于讨论,让我们选择一种非常特殊的方式,使之以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))对从x到y的所有边均有效。这里的Hoare三元组定义如下:
- { p } 断言 q { r }表示(p暗示(q和r))有效
- { p } 假设 q { r }表示((p和q)暗示r)有效
- { p } v:= e { r }表示((用e代替v的p表示r)有效
这就是为什么检查手工波浪参数这部分正确性是不可判定:当你在一些填写A(X)和部分B(X) ,你需要检查,如果一些阶逻辑公式是有效的,而且是不可判定。
在部分正确的情况下对终止进行编码的一种典型方法是添加一些特殊的断言,这些断言本质上说“自从我上次执行以来,就朝终止迈进了一步。” 必须放置这些进度断言,以使流程图上的所有无限遍历(从初始节点开始)都包含无限多个进度断言。更具体地说,假设进度断言的形式始终为assert u < v,其中u和v是正整数,在赋值u:= f之前,然后是赋值v:= u。这里f是一个变体函数,u是其当前值,v是其先前值。现在,由于我们谈论“正整数”并进行比较,因此我们需要确保比fol可用的位数更多:假设Peano算术可用。(对于这种选择,我并不感到强烈。如果方便,请随时忽略。)当然,f可以使用程序中提到的任何其他函数和常量。(请注意,在程序开始时添加假设等同于引入非逻辑公理。)
现在,如果具有进度断言的程序仍然部分正确,那么我们知道原始程序将终止。
题
给定一个终止程序,感觉很难为进度断言提供变种函数。但是有多难?(我知道,即使有上述巨大的背景,我仍然会根据您想如何看待这个问题,这种问题是开放式的或不确定的。)
换句话说:我正在寻找一种参考,该参考将减少端接至部分正确性的问题形式化,然后说明其复杂性。做所有这些事情的答案当然是受欢迎的。