为什么状态在while循环的小步操作语义中保持不变?


9

通常,我看到在while循环的结构化操作语义表示中,程序状态没有改变:

(whileBdoS,σ)(ifBthenS;(whileBdoS)elseSKIP,σ)

对我来说,这不直观,如果状态没有改变(即内存状态保持不变),则将继续保持为真,并且程序将永远不会终止。

谁能解释为什么州在这条规则上没有改变?


请注意,只有在我们可以假设没有副作用的情况下,这才是正确的。在大多数编程语言中,情况并非如此。B
拉斐尔

Answers:


10

在编程语言语义中,程序状态的概念不是模糊的哲学概念,而是一种非常精确的数学概念。甲状态 在这个小步操作语义是一个局部函数s

s:VarZ

记录变量的值。所以,如果,则变量 x的值为 v。状态必须是部分函数,​​因为只有记录实际发生的变量的值才有意义。sx=vxv

展开的公理

whilebdoS,sifbthenS;whilebdoSelse skip,s

只是简单地告诉我们,我们将while循环展开为条件语句,条件语句的其中一个分支包含该循环。因此,任何变量都不会更改其值,因此状态不会更改。


10

状态可以在后续的还原步骤中更改,因为在

while B do S,σif B then (S; while B do S) else skip,σ

-loop由把守(preceeded)小号。的计算小号可以改变状态,使得条件可以评估到˚F 一个小号ëwhileSSBfalse


那么,这意味着状态变化应该用其他规则表示,在具体程序中可以将S减少到其他规则吗?
El Marce

@ElMarce是的。我建议举一个简单的例子,例如和看到这是如何工作的。x:=2; while x>0 do x:=x1
Martin Berger

9

状态当我们考虑不改变来决定是否执行循环的一次迭代,但它可以在以后更改,当我们跑尸体小号。因此,下次我们考虑B时σ可能会发生变化。σBSBσ


这种解释虽然本质上是正确的,但并未涉及什么是状态(即一个告诉我们变量值的函数)和一个状态改变表示什么(即至少一个变量的值改变了)。
汉斯·胡特尔16-10-17

的确,对于我的回答而言,状态是什么或状态如何实现是无关紧要的。解释成立。而且,说“状态实际上是函数”实际上是错误的,因为剧院只是数学上建模它们的一种方法。还有其他可能的模型。而且,我们不要混淆数学模型和硬件的工作原理。
Andrej Bauer

但是问题在于特定的小步操作语义,状态的概念已得到明确定义。
HansHüttel16年

我从未说过不是。我只是说你的话是多余的,因为我的解释没有明确提及如何建立状态。也许您检测到OP不知道状态是从变量到值的映射。对您有好处,您的答案被接受了,但我没有。恭喜你 为什么您现在对我强制采用您的回答方式,这超出了我的理解范围。您为什么精确地感到有必要让我的答案像您一样?没有您认为必要的评论,我的回答就很有意义。也许某天某人会来找我的答案。
安德烈·鲍尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.