Skip to content

分离逻辑

Separation logic

以分离合取表达互不重叠资源并局部推理堆内存的程序逻辑。

条目类型
模型

形式陈述

分离逻辑把程序状态中的堆视为有限部分映射,并加入分离合取 PQ。对堆 h

hPQ

当且仅当存在定义域不交的 h1,h2,使 h=h1h2h1Ph2Q。断言 v 表示当前堆恰含位置 映射到 v 的单元,emp 表示空堆。分离蕴含(magic wand)PQ 描述加入任意满足 P 的不相交堆后得到 Q

Hoare 三元组在这种资源语义下解释。经典框架规则为

{P} C {Q}{PR} C {QR},Mod(C)FV(R)=,

侧条件保证 C 不会修改被框住断言 R 依赖的自由变量;精确形式依程序状态模型而定。它让一份只描述命令局部足迹的规格在添加不相干资源后仍然成立。

更一般的分离逻辑不必把资源限于堆的不交并:它可建立在 partial commutative monoid 或 separation algebra 上。在精确 heap semantics 中,v 通常表示恰好一个单元堆;在 intuitionistic、upward-closed 变体中,同一符号可能表示至少拥有该单元。权限、ghost state 与并发 invariant 是并发分离逻辑添加的结构,不是经典堆分割语义自动提供的。

直觉

普通逻辑的 PQ 只说两件事同时成立,可能都谈论同一个内存单元;PQ 额外承诺它们拥有的堆片段互不重叠。这个所有权分割让函数规格只描述自己会触及的“小脚印”,调用者的其余堆可自动框住。别名不再靠全局猜测,而由能否把堆拆成不交部分显式控制。类比物理资源很有用,但现代分离逻辑也能用分数权限等方式表达共享,不必把所有权理解成永远独占。

分离逻辑示意图
例子与边界

断言 (x1)(y2) 表示 x,y 是不同位置,堆可拆为两个单元。命令 [x]:=[x]+1 可由局部规格

{xn} [x]:=[x]+1 {xn+1}

验证;若另有 ym,框架规则自动保留它。

边界是 (x1)(x2):普通合取可能只显得两个断言冲突,而分离合取明确要求两个不交单元,却又使用同一地址,因此不可满足。另一方面,链表节点可能通过指针连接,但拥有的堆单元仍可不交;“数据有引用关系”不等于“堆域重叠”。

推论与应用

分离逻辑扩展可变状态语义Hoare 三元组框架规则是其局部性原则的集中表达。递归谓词可描述链表、树和图的堆布局。

它广泛用于内存安全、指针程序、并发算法与程序验证工具;分离逻辑自动化把 symbolic heap entailment、frame inference 与 bi-abduction 组织成可执行过程,尝试补出缺失的前置资源或调用后剩余的堆。逻辑给出资源语义和可靠规则,自动化只负责在受支持片段内搜索证明,不能把工具可解片段当成分离逻辑的全部表达力。

并发分离逻辑以资源不变量和权限控制线程间共享,支撑对数据竞争自由和线性化点的模块化证明。这里的“所有权”是断言对资源份额的语义解释;语言所有权系统则以 move、loan 与生命周期静态限制程序,两者可以互相验证,却不是同一套规则或术语替换。

参考资料
  • John C. Reynolds, Separation Logic: A Logic for Shared Mutable Data Structures, LICS 2002,pp. 55–74。
  • Peter W. O'Hearn, Separation Logic, Communications of the ACM 62(2), 2019,pp. 86–95。
关系图谱19 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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