您的公理不是真正的公理,它缺少假设。Hoare逻辑的简单表示形式为形式的公式,其中和是逻辑公式,是命令。您确实需要确保的格式正确。在简单的语言(例如经常用于首次介绍Hoare逻辑的语言)中,格式良好是语法上的问题:通常是检查{P}C{P′}PP′CCC符合上下文无关文法,并且可能自由变量在允许的集合内。如果该语言包含具有语义正确性的构造,例如对数组元素的访问,则需要添加假设以表达这种语义正确性。
形式上,您可以添加判断来表达表达式和命令的更正。如果表达式没有副作用,则它们不需要后置条件,只需要前置条件。例如,您可以编写格式正确的规则,例如
并且只允许在命令中使用格式正确的表达式:
{P}E wf{P∧0≤E<length(A)}A[E] wf{P}E1 wf{P}E2 wf{P}E1+E2 wf
{P[x←E]}E wf{P[x←E]}x:=E{P}
另一种方法是将所有表达式视为格式正确,但使任何包含格式计算的表达式都具有特殊值。在具有运行时边界检查的语言中,表示“此程序引发了致命异常”。然后,您将通过逻辑谓词跟踪程序是否;仅当您可以证明其后置条件暗示,该程序才有效。
errorerrorError¬Error
{P[x←E]}x:=E{P∨Error}P[x←E]⟹E↛error{P[x←E]}x:=E{P}
另一种方法是仅在程序正确终止时考虑保留Hoare三元组。这是非终止程序的常用方法:命令终止时,后置条件成立,这可能并不总是发生。如果您将运行时错误视为非终止错误,那么您将彻底清除所有正确性问题。您仍将需要以某种方式证明程序的正确性,但是如果您更喜欢其他形式化的方法来完成该任务,则不必遵循Hoare逻辑。
顺便说一句,请注意,表达修改复合变量(例如数组)时发生的事情比编写的要复杂得多。假设是:替换不会更改,但是赋值可能会使无效。即使将谓词的语法限制为仅谈论原子,也要在条件下考虑赋值:您无法简单地替换以获得正确的后置条件,则需要求值PIsSorted(A)A[i]←EPA[i]←PPA[A[0]−1]:=A[0]A[0]=2∧A[1]=3A[0]=1∧A[1]=1A[0](这通常很难,因为前提条件可能没有为指定单个可能的值)。您需要对数组本身执行替换:。Mike Gordon的讲义很好地介绍了带有数组的Hoare逻辑(但没有错误检查)。A[0]A←A[i←E]
length
到A
?