Skip to content

抽象解释中的 Galois 连接

Galois connection for abstract interpretation · Abstraction-concretization adjunction

以 abstraction 与 concretization 的伴随关系刻画可靠表示、闭包以及具体变换的最佳抽象。

伴随条件

(C,C) 是具体性质格,(A,A)抽象域。两个单调映射

α:CA,γ:AC

构成 Galois connection,若对所有 cC,aA

α(c)AacCγ(a).

α 是左伴随,选择能够覆盖具体性质 c 的最精确抽象值;γ 是右伴随,解释抽象值代表哪些具体行为。静态分析常取 C=P(Σ)C=⊆

这个双条件比“α,γ 大致互逆”精确得多。抽象会遗忘信息,一般不可能有 γα(c)=c;真正需要的是有方向的可靠外包络。

两条 unit/counit 不等式

a=α(c) 代入伴随条件,可得

cCγ(α(c)).

具体性质先抽象再具体化不会漏掉原元素。令 c=γ(a) 则得

α(γ(a))Aa.

抽象值先解释再取最佳抽象,不会比原值更粗。两条不等式配合单调性推出 γα 是具体格上的 closure operator:单调、extensive 且 idempotent。

若还满足 αγ=idA,称为 Galois insertion;这表示抽象域没有两个不同元素拥有同一个 concrete meaning。它是更强性质,不是一般连接的定义。

符号域的最佳抽象

具体域取整数幂集。抽象域含

,neg,zero,pos,nonpos,nonneg,,

并按 concretization 的集合包含排序。γ(nonneg)={n:n0},其他元素类似。

X={3,1},覆盖它的最精确元素是 neg;对 X={1,0}nonpos;对 X={1,1},若域没有 nonzero 元素,只能取

于是 α(X) 不是给样本贴一个任意标签,而是在所有满足 Xγ(a)a 中取最小者。若某个域对某些 X 没有最小覆盖值,就不能由这份 concretization 自动得到左伴随。

最佳抽象变换

给定具体单调变换 f:CC,其最佳抽象变换是

f=αfγ.

对抽象输入 a,先解释所有可能具体状态,执行精确变换,再取域内最精确覆盖。任何可靠抽象变换 f#:AA 都应满足

f(a)Af#(a).

“最佳”只相对于选定抽象域。若域不能表达变量关系,最佳区间或符号变换仍可能产生假警报;换更强域才会改变表达上限。

直接计算 αfγ 也可能与原具体语义一样昂贵。工程分析器常实现一个较粗但可计算的 f#,然后单独证明它位于最佳抽象之上。

join 保存与边界

左伴随 α 保存所有存在的 join,右伴随 γ 保存所有 meet。这使分支合流可先在具体域取并再抽象,等于对各分支抽象后取 join。

反方向的运算一般不保存。若擅自假设 γ(ab)=γ(a)γ(b),可能忽略抽象 join 为获得可表示性而加入的额外状态。

这里的 Galois connection 是序理论伴随,与域扩张、群作用和多项式可解性的 Galois 理论无关。名称共享历史来源,数学对象和证明责任完全不同。

参考资料
  • Patrick Cousot and Radhia Cousot, “Abstract Interpretation: A Unified Lattice Model for Static Analysis,” POPL, 1977, pp. 238–252。
  • Patrick Cousot and Radhia Cousot, “Systematic Design of Program Analysis Frameworks,” POPL, 1979, pp. 269–282。
  • Flemming Nielson, Hanne Riis Nielson, and Chris Hankin, Principles of Program Analysis, Springer, 1999, Chs. 4–5。