Logic {true}x:=y{x=y}是有效的霍尔三元组吗?

Logic {true}x:=y{x=y}是有效的霍尔三元组吗?,logic,hoare-logic,Logic,Hoare Logic,我不确定 { true } x := y { x = y } 是有效的 我不确定是否允许引用变量(在本例中为y),而不首先在三重程序体或前置条件中明确定义它 { y=1 } x := y { x = y } //valid {true} y := 1; x := y { x = y } //valid 它是怎样的?*如果x:=y,那么Q.Q.E.D.{true}x:=y{x=y}是一个有效的霍尔三元组。原因如下: x:=y是赋值,因此,替换前提条件中的赋值。 前提条件为{y=y},这意味着

我不确定

{ true } x := y { x = y }
是有效的

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

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

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

它是怎样的?

*如果x:=y,那么Q.Q.E.D.

{true}x:=y{x=y}
是一个有效的霍尔三元组。原因如下:

x:=y
是赋值,因此,替换前提条件中的赋值。
前提条件为
{y=y}
,这意味着
{true}

换句话说,
{y=y}=>{true}

我不确定

{ true } x := y { 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:=0;y:=0
    不再满足post条件。

    c理论旨在研究级讨论。这是一个基本的CS问题。好吧,看起来基本的CS很失败:-)(我以前从未听说过霍尔逻辑)不幸的是,所有关于霍尔逻辑的解释(包括维基百科上的解释)都是由语法有问题的外国人写的。主要是在形式逻辑中。我还在等一篇为英语流利的人写的文章,这和问知道x=x有什么意义一样;在C中是有效的或不确定的。苹果就是苹果。梨就是梨。绿海龟就是绿海龟。如果(x:=y),那么x=y。所以,如果你有两只绿海龟,那么它们都是绿海龟。和两只大绿海龟一样,等等。换一种说法:如果A:=A,那么A=A。也许你需要对你的问题进行解释。您是在特定语言实现的上下文中提问,还是在特定的具体实现上下文中提问?依我看,这会使问题变得与陈述的内容不同。一般来说,陈述本身就是一个结论。这被称为霍尔逻辑。这不是某种“特定的实现”或任何编程语言。它对OP中的问题都没有任何回答。你得到的暗示是错误的。将其更改为
    {true}=>{y=y}
    { y=1 } x := y { x = y } //valid
    
    {true} y := 1; x := y { x = y } //valid