我不确定
{ true } x := y { x = y }
是有效的Hoare triple。
我不确定是否允许引用变量(在本例中为y
),而不是先在三重程序体中或在前置条件中明确定义它。
{ y=1 } x := y { x = y } //valid
{true} y := 1; x := y { x = y } //valid
怎么回事?
答案 0 :(得分:5)
我不确定
{ 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₀
和{{ 1}}在这种情况下):
y₀
此处{ x=x₀ ∧ y=y₀ } x := y { x=y₀ ∧ y=y₀ }
不再满足后期条件。
答案 1 :(得分:1)
{ true } x := y { x = y }
是有效的Hoare三重奏。原因如下:
x := y
是一项任务,因此,在前提条件中替换它
前提条件为{y=y}
,表示{true}
。
换句话说,{y=y} => {true}
。
答案 2 :(得分:-2)
* 如果x:= y,那么Q. Q.E.D. _ *