Language agnostic 霍尔逻辑环路不变量

Language agnostic 霍尔逻辑环路不变量,language-agnostic,logic,verification,invariants,loop-invariant,Language Agnostic,Logic,Verification,Invariants,Loop Invariant,我正在研究霍尔逻辑,在理解寻找循环不变量的方法时遇到了问题 有人能解释一下计算循环不变量的方法吗 循环不变量应该包含什么才能成为“有用”的 我只处理简单的例子,寻找不变量,并证明例子中的部分和完全更正,如: { i ≥ 0 } while i > 0 do i := i−1 { i = 0 } (对你的推理)有用是不变量的要点。所以,看看你想证明的后置条件,试着构造一个不变量,它将帮助你一步一步地得到后置条件,并且可以从循环的代码中派生出来。我不确定这是否能回答你的问题,但以防万一:

我正在研究霍尔逻辑,在理解寻找循环不变量的方法时遇到了问题

有人能解释一下计算循环不变量的方法吗

循环不变量应该包含什么才能成为“有用”的

我只处理简单的例子,寻找不变量,并证明例子中的部分和完全更正,如:

{ i ≥ 0 } while i > 0 do i := i−1 { i = 0 }

(对你的推理)有用是不变量的要点。所以,看看你想证明的后置条件,试着构造一个不变量,它将帮助你一步一步地得到后置条件,并且可以从循环的代码中派生出来。

我不确定这是否能回答你的问题,但以防万一:

  • 非正式的“循环不变量”是在循环迭代前后保持为真的事实陈述。它本质上定义了程序相对于该循环的一致性约束
  • 我对霍尔逻辑了解不够,无法精确地告诉您如何“计算”循环不变量,但我怀疑这种情况更多地取决于所分析代码的语言,而不是形式证明语言本身。你有一个正式的算法描述吗?我也许可以更深入地了解一些背景知识
  • 一个有用的循环不变量将描述应用程序状态的某些特定内容。例如,如果您正在编写插入排序,那么主元素运动循环的一个有用的循环不变量基本上会声明(子)列表在执行循环之前和之后包含相同的对象集合,并且以前按排序顺序排列的元素可能仍按排序顺序排列

如果我们讨论的是霍尔证明程序(部分)正确性的逻辑,那么您可以使用前置条件和后置条件,分解程序,并使用霍尔逻辑推理系统的规则来创建和证明归纳公式

在您的示例中,您希望使用规则分解程序

{p} while b do S {p^not(b)} <=> {p^b} S {p}
{p}而b做S{p^not(b)}{p^b}S{p}
就你而言

  • p:我≥ 0
  • b:i>0
  • S:i:=i−1.
所以在下一步中,我们推断
{i≥ 0^i>0}i:=i−1{i≥ 0}
。这可以很容易地进一步推断和证明。
我希望这能有所帮助。

对正式事物的非正式解释:)。不变量在开始和结束时不成立,但只要输入满足前提条件,它们就应该在程序的每个语句之后成立。霍尔的逻辑是基于一个简单的程序模式,具体的实现语言并不重要。嘿,谢谢你的评论:)在我的教育中,“不变量”一词被反复使用,没有对它是什么进行正式的解释——我显然有一些错误的想法。我想当涉及霍尔逻辑时,不变量是一种没有任何好的解释就被抛来抛去的东西。。。