{true} x:= y {x = y}是有效的Hoare三联?

时间:2011-10-02 20:14:13

标签: logic hoare-logic

我不确定

{ true } x := y { x = y }

是有效的Hoare triple

我不确定是否允许引用变量(在本例中为y),而不是先在三重程序体中或在前置条件中明确定义它。

{ y=1 } x := y { x = y } //valid

{true} y := 1; x := y { x = y } //valid

怎么回事?

3 个答案:

答案 0 :(得分:5)

  

我不确定

{ true } x := y { x = y }
     

是有效的Hoare三重奏。

三元组应如下所示:

“无论启动状态如何,执行x:=y x等于y后。”

并且 保持。它为何成立的正式论据是

  1. x := y给出后置条件{ x = y }的最弱前提条件是{ y = y }
  2. { true }隐含{ y = y }
  3. 但是,我完全理解为什么你对这个三重奏感到不安,你有充分的理由担心!

    由于前后条件不能提供有用的规格,因此三重配方制定得很糟糕。为什么?因为(正如您所发现的)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. _ *