基于反射策略的可扩展高效自动化及数值程序归纳不变式推断算法
1. 引言
在程序的形式验证中,不变式是一个关键概念,它指的是程序所有执行过程中都为真的属性。例如,程序变量保持在预期范围内等安全属性就是不变性属性,而像终止性等更复杂的属性通常也依赖于不变式。因此,程序验证研究的很大一部分都围绕着检查或推断合适的不变式的方法。
不变式对于循环尤为重要,循环的不变式能提供一个在每次循环迭代时都成立的单一属性,从而避免了为每个循环迭代单独证明安全性(对于无限状态系统,当循环迭代次数无界时,这可能是不可能的;当迭代次数有限但很大时,也不切实际)。证明一个属性是循环不变式的主要原则是找到一个更强的归纳不变式,即该属性在首次进入循环时成立,并且在单循环迭代中保持稳定。
然而,与感兴趣的安全属性相关的不变式可能相对简单,但不一定是归纳不变式。一般来说,找到归纳不变式是一项更复杂的任务,因为归纳不变式可能具有更复杂的形状。
2. 示例说明
考虑一个有两个变量 (x) 和 (y) 的程序,其循环体对点 ((x, y)) 绕原点进行 45 度旋转,并伴有轻微的向内缩放。给定前置条件:进入循环时,(x \in [-1, 1]) 且 (y \in [-1, 1])。直观上,无论循环执行多少次,点 ((x, y)) 都不会远离原点。我们选择一个与坐标轴对齐的边界框 (I = [-2, 2] \times [-2, 2]),可以观察到每次执行到达循环头部时,程序状态(视为点 ((x, y)))都保证位于 (I) 内,因此 (I) 是循环头部的一个不变式。
但 (I) 不是归纳不变式,因为 (I) 中的某些点(如角落点)在 45 度旋转后不会留在 (
超级会员免费看
订阅专栏 解锁全文
1万+

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



