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