框架规则作为变更保存者?


18

帧的规则,像下面给出的一个,捕获的想法,给定一个计划c与前提p保存在运行前和后置条件q保存后,一些不相交的条件r应之前和之后都保持c运行。(连接词*要求其参数不相交。)通常,前置条件和后置条件是堆的状态,并且c是一种有效的程序,可以某种方式修改堆。

    {p} c {q}
----------------- (where no free variable in r is modified by c)
{p * r} c {q * r}

我所看到的关于框架规则的讨论似乎总是集中在如何r保留堆的不相交部分上。这将启用“局部推理”:在对具有影响的效果进行推理时c,我们可以忽略r堆的一部分,而只关心实际更改的部分。但是另一种看待它的方法是,即使从那里pqr现在都保留了更改。换句话说,重要的是我们要以后置条件结束{q * r},而不是{q' * r}其他条件q'

所以,我的问题是,是否有框架规则,讨论或利用保存-的变化-从-的任何治疗p至- q事情。


在本文中,我对自己的问题的一个答案是:software.imdea.org/~gotsman/papers/interproc-sas06.pdf,在句子中(强调我)“如果P确保分配了C的占用空间,则根据Frame执行C在存在附加内存R的情况下具有相同的行为,并且C不会触及该附加内存。” 我一直在寻找有人要指出的“结果相同的行为”,而不仅仅是“ C不会占用额外的内存”。(感谢@kaosjester提供的链接。)
Lindsey Kuper

1
如果您仔细阅读帧规则和其他分离逻辑规则的合理性证明,您会发现它们正在按照您的要求做,即他们在谈论如何保留从到的变化。请注意此处提到的局部性和框架属性。qpq
Uday Reddy 2012年

Answers:


11

但这对q财产的不变实际上不成立!

考虑一下{emp} x := alloc(0) {x |-> 0}。现在,如果我加入y |-> 3

{y |-> 3} x := alloc(0) {x |-> 0 * y |-> 3}

但是,根据结果规则,我可以将后置条件更改为

{y |-> 3} x := alloc(0) {(x |-> 0 /\ x != y) * y |-> 3}

为了更具体一点,假设y是数字37。当我在一个完全空堆运行分配命令,这是可能的,我会在最后分配地址37,这样x = 37。但是,如果我改为从在address处包含单个单元格的堆开始y = 37,则此结果不再可能!在先决条件中添加框架已修剪了后置条件中的某些不确定性。

论文“局部动作和抽象分离逻辑”(Calcagno,O'Hearn和Yang)都是关于从更深层的语义角度理解框架规则的。本文的关键定义是“动作”的局部性,其中动作是程序的(语义表示)。局部性说,当您添加一些帧堆时,可以更改原始后置条件的唯一方法是通过修剪一些上述不确定性。而且,实际上,修剪仅是由于分配而产生的。


感谢您的示例和参考!您的示例很有道理。可以公平地说,那q只能更改为“ q,并且也可以...”吗?而且,如果分配是唯一可以修剪后置条件中不确定性的东西(本身就是很酷的结果),那么,如果后置条件的某些部分与位置无关,那么后置条件的那一部分保证保持不变?我们可以说后置条件在位置进行Alpha重命名之前保持不变吗?(我有一个例子,但是也许可以通过电子邮件更好地解释。)
Lindsey Kuper,2012年

1
是的,q只能更改为“ q,也可以...”,换句话说,后置条件只能变:这将暗示原始后置条件。这是行动地点定义的一部分。但是,对后置条件的更改仅与重命名相关联是不正确的。在我给出的示例中,xy完全不同的事实是正确的,而不考虑为选择的特定地址y。该示例捕获了分配的新鲜度,该新鲜度在重命名下是不变的。
亚伦·图

11

首先,您的问题陈述中存在一个小的误解,这就是亚伦在回答中也遇到的问题。在分离逻辑谓词是套的堆(或等同地,在堆谓词),和分离结合被定义为:PQ

PR{h1h2|h1Ph2Rdom(h1)dom(h2)=}

所以在框架规则中

{P}c{Q}{PR}c{QR}

P QR(以及和)不是在谈论特定的堆---它们是堆的属性(因为子集和谓词是等效的)。理解发生状况的最好方法是查看Hoare三元组持有的含义的定义:PQ

{P}c{Q}h1P.hHeaps.t.h#h1.h2Q.h1h;ch2h;skip

这个定义基本上说:(1)如果您 在有任何运行,那么您将在处于某些最终状态;并且(2)如果您添加任何额外的内存,则该内存将保持不变在运行结束时。但是请注意,对于不同选择,您获得的特定可能会有所不同---可以保证的是,属性和将在扩展下继续保持不变,而不是得到完全相同的结果堆。ħ 1ch1ħ 2 Q ħ ' ħ 2 ħ ' P QPh2Qh h2h PQ

看看这个对Hoare三元组的定义如何暗示框架规则成立并不难,但仍然值得解决。正如您所注意到的,这是一种“变化保留”属性,在并发分离逻辑中的并行组合规则的语句中它具有特别生动的表达:

{P1}c1{Q1}{P2}c2{Q2}{P1P2}c1||c2{Q1Q2}

如果和作用于不相交的内存区域,则当它们并行运行时,它们将不会干扰对方执行的属性。c 2c1c2

Hoare等人在“关于本地性和并发过程的交换法”一文中对此进行了讨论,他们展示了如何给出程序和断言的合并代数。


Hoare三元组的定义看起来是错误的:应该说执行没有错,应该允许非终止,它可能不应该排除不具有安全单调性的模型。(但是,是的,我同意出于您解释的原因而谈论“变化的保存”是完全合理的。)
Radu GRIGore 2012年

3
(1)我给出了总正确性三元组的语义,因此它断言该命令已安全完成-我发现总正确性使解释先决条件和后置条件的永久/存在特征更容易理解。(2)实际上,三元组的这种语义是由Birkedal和Yang发明的(IIRC),通过将其构建为三元组的含义来处理在语言语义上不具有安全单调性的语言。结果,您可以在语言中具有非单调构造(例如,查询堆的大小),同时仍具有Hoare逻辑的框架规则。
Neel Krishnaswami 2012年

c

1
谢谢,尼尔!没错,我将属性P和Q与特定的堆混合在一起。因此,总结一下:Q是保留的,但是最后获得的特定堆可能是之前获得的Q满足的堆不同的堆。是?
林赛·库珀

1
@RaduGRIGore:是的,我假设语言是确定性的,当我们添加并发性时,这种假设将失败。好赶上!
Neel Krishnaswami 2012年

2

虽然不是100%相关,但具有合同幂等的味道。

如果我们认为{p}是c的前提,而{q}是c的前提,那么框架规则的思想将确保前提和前提在所有计算环境中均有效,而不是一个简单的例子,什么都不存在。

就是说,我不能说我已经阅读了数十份合同文件中的任何内容,都看到了这样的框架规则。但是,这当然是一个好主意,并且要求进行此类更改可能对发展对幂等合同的合理,切实的理解有很大帮助。


感谢您的评论。嗯,很有趣-我想知道是否还有其他人读过说明框架属性的合同文件。
林赛·库珀
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.