我不确定
{ true } x := y { x = y }
是一个有效的Hoare 三元组。
我不确定是否允许引用变量(在本例中为y
),而无需先在三重程序主体或前置条件中明确定义它。
{ y=1 } x := y { x = y } //valid
{true} y := 1; x := y { x = y } //valid
如何?
我不确定
{ true } x := y { x = y }
是一个有效的Hoare 三元组。
我不确定是否允许引用变量(在本例中为y
),而无需先在三重程序主体或前置条件中明确定义它。
{ y=1 } x := y { x = y } //valid
{true} y := 1; x := y { x = y } //valid
如何?
我不确定
{ true } x := y { x = y }
是一个有效的 Hoare 三元组。
三元组应如下解读:
“无论起始状态如何,执行后x:=y
x 等于 y。”
它确实成立。为什么它成立的正式论据是
x := y
给定后置条件的最弱前置条件{ x = y }
是{ y = y }
, 和{ true }
暗示{ y = y }
。但是,我完全理解你为什么对这个三重奏感到不安,你的担心是有道理的!
三元组的表述很糟糕,因为前置和后置条件没有提供有用的规范。为什么?因为(正如您所发现的)x := 0; y := 0
也满足规范,因为x = y
执行后保持。
显然,x := 0; y := 0
这不是一个非常有用的实现,它仍然满足规范的原因是(根据我)是由于规范错误。
如何解决这个问题:
表达规范的“正确”方式是通过使用程序无法访问的一些元变量来确保规范是自包含x₀
的(y₀
在这种情况下):
{ x=x₀ ∧ y=y₀ } x := y { x=y₀ ∧ y=y₀ }
这里x := 0; y := 0
不再满足后置条件。
{ true } x := y { x = y }
是一个有效的 Hoare 三元组。原因如下:
x := y
是一个赋值,因此,在前置条件中替换它。
前提是{y=y}
,这意味着{true}
。
换句话说,{y=y} => {true}
.
*如果 x:=y,则 QQED _ *