Skip to content

分离合取

Separating conjunction · Separating conjunction operator

以资源的部分可组合运算解释星号合取,使两个断言分别占有兼容且可重新拼合的资源片段。

条目类型
定义

形式陈述

设资源集合 M 带有部分定义、交换且结合的组合运算 ,单位元为 ϵ。当 m1m2 有定义时,称两份资源兼容。分离合取的语义为

mPQm1,m2.m1m2=mm1Pm2Q.

在经典堆模型中,资源是有限部分映射 h:AddrVal,组合是定义域不交时的并 h1h2。于是 PQ 不只说两个命题同时为真,还给出一个堆拆分见证。emp 只由空资源满足,是星号的单位:

PempP.

由于资源组合交换且结合, 也在逻辑等价意义下交换、结合。然而它通常不幂等;完整拥有一格资源并不能复制成两份完整所有权。这一非复制性是 分离逻辑 表达内存占有和局部推理的核心。

逻辑蕴含仍必须尊重拆分见证。若 PP,则单调性给出 PQPQ;见证的两份资源无需改变。但从 PRQR 一般不能随意“约掉” R,除非底层资源和断言满足相应消去或精确性条件。把星号当普通代数乘法做形式消元,会越过部分组合运算的语义。

直觉

普通合取 PQ 像把两句话写在同一张状态照片上,二者可以谈论完全相同的对象。分离合取则要求在照片背后附一张资源清单:哪一片供 P 使用,哪一片供 Q 使用,而且两片能无冲突地拼回总资源。

“分离”描述的是逻辑资源,而不是对象图的几何断开。一个拥有节点 x 的堆片段可以在字段里保存指向另一片段节点 y 的地址;只要两边实际拥有的内存单元不重叠,星号仍可成立。地址值可以复制,解引用权限却由资源归属决定。

链表段正利用这一点递归定义:头节点单元与尾段通过星号分开,头节点保存的 next 值却正是尾段首地址。于是资源边界沿“谁拥有哪个单元”划分,而不是沿“值之间有没有引用”划分;这让局部改写头指针时可以框住整个尾段。

例子与边界

采用 exact points-to:x7 表示恰好拥有地址 x 的一个单元,值为 7。断言

(x7)(y9)

要求总堆可拆成两个单元堆,因此强制 xy。相反,

(x7)(x7)

不可满足,因为同一地址不能同时出现在两个定义域不交的子堆中。断言 (x7)true 则表示总资源中可以分出这一个单元,剩余不相交部分无需进一步约束;它是“小脚印加任意 frame”的具体形状。

不能把 exact points-to 下的普通合取机械当作“至少同时含两格”:x7y9 要求同一个完整堆同时恰好是两个单元堆,只有地址和值相容时才可能成立。某些 intuitionistic 语义把 points-to 解释为向上封闭,读法会不同,文章或工具必须先声明约定。

分数权限进一步改变兼容关系:同一地址的两个只读份额可以组合,只要份额总量不超限且值一致。此时星号的抽象定义不变,变化的是资源代数;把“星号永远意味着地址域不交”推广到所有分离逻辑会错误拒绝合法共享。

推论与应用

分离合取使 frame 推理成立:若命令只消费并恢复 P 描述的资源,额外兼容资源 R 可以在前后同时附加,而不重新分析命令内部。递归谓词用星号把链表头单元与尾段、树根与子树拼合;证明展开时每个子结构都带着明确占有范围。

星号还区分纯事实与空间事实。等式 x=y 不消费资源,通常可在拆分两侧共享;points-to、token 和权限则必须归入某个片段。工具若把所有断言都当可复制纯条件,会允许所有权重复;若把所有等式也当线性资源,又会无谓阻断普通逻辑推理。

在并发场景中,PQ 可把资源初始分给两个线程;资源不变量和消息规则随后有控制地移动这些片段。自动化工具可以做 frame inference 或 bi-abduction,但找到一个语法拆分不等于语义上资源真的兼容,地址等式、纯约束与权限份额仍须联合检查。

参考资料
  • Samin S. Ishtiaq and Peter W. O’Hearn, “BI as an Assertion Language for Mutable Data Structures,” POPL, 2001, pp. 14–26。
  • John C. Reynolds, “Separation Logic: A Logic for Shared Mutable Data Structures,” LICS, 2002, pp. 55–74。
  • Cristiano Calcagno, Peter W. O’Hearn, and Hongseok Yang, “Local Action and Abstract Separation Logic,” LICS, 2007, pp. 366–378。
  • Peter W. O’Hearn, “Separation Logic,” Communications of the ACM 62(2), 2019, pp. 86–95。
关系图谱11 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组