数据流分析共性问题及理论基础

数据流分析共性问题

之前分别介绍了可用表达式分析和活跃变量分析两类经典的数据流分析实例,不难发现,它们的分析过程间存在相似性,都是基于图的表示,并通过建立数据流方程组求解的分析框架,这样统一的分析框架,为求解数据流方程组提供高效的通用算法提供了可能。

不同分析实例的相似性

我们可以比较可用表达式分析与活跃变量分析的数据流方程组形式化定义:

AEl={∅if l=init(c)⋂{φl′(AEl′)∣(l′,l)∈flow(c)}otherwise\text{AE}_l = \begin{cases} \emptyset & \text{if } \textcolor{red}{l = \text{init}(c)} \\ \textcolor{red}{\bigcap} \{ \varphi_{l'}(\text{AE}_{l'}) \mid (l', l) \in \text{flow}(c) \} & \text{otherwise} \end{cases} LVl={Varcif l∈final(c)⋃{φl′(LVl′)∣(l,l′)∈flow(c)}otherwise\text{LV}_l = \begin{cases} \text{Var}_c & \text{if } \textcolor{red}{l \in \text{final}(c)} \\ \textcolor{red}{\bigcup} \{ \varphi_{l'}(\text{LV}_{l'}) \mid (l, l') \in \text{flow}(c) \} & \text{otherwise} \end{cases}

它们在表示上存在相似性,实际上我们可以定义一个统一的形式表达来定义这样的分析过程: 对于 c∈Cmd c \in \text{Cmd} 且 l∈Labcl \in \text{Lab}_c,分析信息(AI\mathrm{AI})由下面形式的方程描述:

AIl={ιif l∈E⨆{φl′(AIl′)∣(l′,l)∈F}otherwise\text{AI}_l = \begin{cases} \iota & \text{if } l \in E \\ \bigsqcup \{ \varphi_{l'}(\text{AI}_{l'}) \mid (l', l) \in F \} & \text{otherwise} \end{cases}

其中:

  • 组合操作子 ⨆\bigsqcup :对应公式中的组合操作,有路径量化方式确定;
  • 块B′B'的迁移函数φl′\varphi_{l'}:用于处理分析信息的迁移;
  • 流关系:flow(c)\text{flow}(c) 或 flowR(c)\text{flow}^\text{R}(c)(即 flow\mathrm{flow} 关系的逆),对应公式中的 (l′,l)∈F(l', l) \in F;
  • 端结点的标签集合EE:{init(c)}\{ \text{init}(c) \} 或 final(c)\text{final}(c),用于界定公式中 l∈El \in E 的情况。

当 F=flow(c)F = \mathrm{flow(c)} 时属于前向分析的信息流;当 F=flowR(c)F = \mathrm{flow^R(c)} 时属于后向分析的信息流。而组合操作子 ⊔\sqcup 则根据路径上的量化方式,如可用表达式分析的 Must\mathrm{Must} 类型使用 ⨆=⋂\bigsqcup = \bigcap,而如活跃变量分析的 May\mathrm{May} 类型则使用 ⨆=⋃\bigsqcup = \bigcup。

分析框架

不同的数据流分析实例在相同的形式化表达下构建数据流方程组,在相同的分析框架下,通过不动点迭代来求解数据流方程组。

  1. 把方程组的解刻画为一个转换子的不动点;
  2. 引入偏序关系来比较分析结果;
  3. 建立最小上界或最大下界作为组合操作子;
  4. 保证迁移函数的单调性;
  5. 确保不动点迭代的终止性(满足递增链条件);
  6. 通过 worklist\mathrm{worklist} 算法来对不动点迭代进行优化。

理论基础

序理论(Order Theory\mathrm{Order\ Theory})

偏序(Partial Order\mathrm{Partial\ Order})

IMPORTANT

偏序关系是定义在集合 DD 上的一种二元关系 ⊑\sqsubseteq,需要满足下面三个条件:

  • 自反性:∀a∈D\forall a \in D 有 a⊑aa \sqsubseteq a;
  • 传递性:若 a⊑ba \sqsubseteq b 且 b⊑cb \sqsubseteq c,则 a⊑ca \sqsubseteq c;
  • 反对称性:若 a⊑ba \sqsubseteq b 且 b⊑ab \sqsubseteq a,则 a=ba = b.

若 ⊑\sqsubseteq 构成集合 DD 上的偏序关系,则称 (D,⊑)(D, \sqsubseteq) 为偏序集(Poset\mathrm{Poset})。

TIP

设 SS 是一个非空集合,二元关系 RR 是 AA 中元素的有序对(二元序偶)集合,即 R⊆S×SR \subseteq S\times S(S×SS \times S 表示 SS 中所有的有序对 <a,b><a, b> 的集合);若 <a,b>∈R<a, b> \in R,则称“aa 与 bb 具有关系 RR”,记作 aRbaRb。

不要混淆偏序关系与偏序集。两者都是集合,但偏序关系是“元素间的关系集合”,而偏序集则是“带关系的元素集合载体”,即前者描述一种关系,后者描述一个带有某种关系的集合。

WARNING

需要注意,偏序集中并非所有元素都能够比较关系,但是只要能够比较,就满足自反、传递以及反对称的规则。

示例

  1. (Z,≤)(\mathbb{Z}, \le)
  2. (P(x),⊆)(\mathscr{P}(x), \subseteq),其中 P\mathscr{P} 表示幂集
  3. (Z2,⊑)(\mathbb{Z}^2, \sqsubseteq),其中,(a,b)⊑(a′,b′)⇔a≥a′∧b≥b′(a, b) \sqsubseteq (a', b') \Leftrightarrow a \ge a' \land b \ge b'

前面提到,偏序集中并非所有元素都能够比较关系,如 (P({1,2}),⊆)(\mathscr{P}(\{1, 2\}), \subseteq) 中的元素 {1}\{1\} 和 {2}\{2\} 之间就不能进行比较。示例3表示了区间包含关系。

格(lattice\mathrm{lattice})

IMPORTANT

设偏序集 (D,⊑)(D, \sqsubseteq),若集合 DD 中任意两个元素 a,ba, b 都有最小上界(即上确界,LUB\mathrm{LUB})和最大下界(即下确界,GLB\mathrm{GLB}),则称之为格,该格记作 (D,⊑,⊔,⊓)(D, \sqsubseteq, \sqcup, \sqcap)。其中:

最小上界:记为 a⊔ba\sqcup b

∀a,b∈D\forall a, b \in D,存在唯一元素 c∈Dc \in D,满足:

  1. a⊑ca\sqsubseteq c 且 b⊑cb \sqsubseteq c(即 cc 是 aa 和 bb 的上界);
  2. 若存在 d∈Dd \in D 使得 a⊑da\sqsubseteq d 且 b⊑db \sqsubseteq d,则 c⊑dc \sqsubseteq d(即 cc 是所有上界中最“小”的那个).

最大下界:记为 a⊓ba\sqcap b

∀a,b∈D\forall a, b \in D,存在唯一元素 c∈Dc \in D,满足:

  1. c⊑ac\sqsubseteq a 且 c⊑bc \sqsubseteq b(即 cc 是 aa 和 bb 的下界);
  2. 若存在 d∈Dd \in D 使得 d⊑ad\sqsubseteq a 且 d⊑bd \sqsubseteq b,则 d⊑cd \sqsubseteq c(即 cc 是所有上界中最“大”的那个).

示例

  1. 整数 (Z,≤,max,min)(\mathbb{Z}, \le, max, min)

  2. 整数区间 ({[a,b]∣a,b∈Z,a≤b}∪0,⊆,⊔,⊓)(\{[a, b] | a, b \in \mathbb{Z}, a \le b\} \cup {0}, \subseteq, \sqcup, \sqcap),其中:

    [a,b]⊔[a′,b′]=def[min⁡(a,a′),max⁡(b,b′)][a, b] \sqcup [a', b'] \stackrel{\text{def}}{=} [\min(a, a'), \max(b, b')] [a,b]⊓[a′,b′]=def[max⁡(a,a′),min⁡(b,b′)], or ∅ if max⁡(a,a′)>min⁡(b,b′)[a, b] \sqcap [a', b'] \stackrel{\text{def}}{=} [\max(a, a'), \min(b, b')], \text{ or } \emptyset \text{ if } \max(a, a') > \min(b, b')

如,整数区间 ({[a,b]∣a,b∈{0,1,2},a≤b}∪0,⊆,⊔,⊓)(\{[a, b] | a, b \in \{0, 1, 2\}, a \le b\} \cup {0}, \subseteq, \sqcup, \sqcap),其中每条边表示偏序关系。 示例

完全格(Complete Lattice\mathrm{Complete\ Lattice})

IMPORTANT

设偏序集 (D,⊑)(D, \sqsubseteq),若集合 DD 的任意子集 XX(无论有限还是无限)都存在最小上界 ⊔X\sqcup X 和最大下界 ⊓X\sqcap X,特别地,对集合 DD 总存在最小元 ⊥=⊓∅\bot = \sqcap \empty 和最大元 ⊤=⊔D\top = \sqcup D,此时称之为完全格,记作 (D,⊑,⊔,⊓,⊥,⊤)(D, \sqsubseteq, \sqcup, \sqcap, \bot, \top)。

实际上,定义中任意子集 XX 都存在最小上界和最大上界是比格的定义中任意两个元素都存在最小上界和最大下界更严格的条件,因此完全格首先是格。此外对于集合 DD 而言,其最小元 ⊥=⊓D=⊓∅\bot = \sqcap D = \sqcap \empty,其最大元 ⊤=⊔D\top = \sqcup D。

TIP

对于 ∅\empty 而言,⊥=⊤=⊔∅=⊓∅\bot = \top = \sqcup \empty = \sqcap \empty.

示例

  1. 幂集 (P(S),⊆,∪,∩,∅,S)(\mathscr{P}(S), \subseteq, \cup, \cap, \empty, S) 如 (P{0,1,2},⊆,∪,∩,∅,{0,1,2})(\mathscr{P}\{0, 1, 2\}, \subseteq, \cup, \cap, \empty, \{0, 1, 2\}):
示例
示例

其中,对于子集 {{1},{2},{0,1}}\{\{1\}, \{2\}, \{0, 1\}\},其最小上界为 {0,1,2}\{0, 1, 2\},最大下界为 ∅\empty。

  1. 带无穷界的整数区间
(I,⊆,⊔,⊓,∅,[−∞,+∞])(\mathbb{I}, \subseteq, \sqcup, \sqcap, \emptyset, [-\infty, +\infty]) I=def{[a,b]∣a∈Z∪{−∞},b∈Z∪{+∞},a≤b}⊔i∈I[ai,bi]=def[min⁡i∈Iai,max⁡i∈Ibi]⊓i∈I[ai,bi]=def[max⁡i∈Iai,min⁡i∈Ibi], or ∅ if max⁡>min⁡\begin{aligned} &\mathbb{I} \stackrel{\text{def}}{=} \{ [a, b] \mid a \in \mathbb{Z} \cup \{-\infty\}, b \in \mathbb{Z} \cup \{+\infty\}, a \leq b \} \\ &\sqcup_{i \in I} [a_i, b_i] \stackrel{\text{def}}{=} [\min_{i \in I} a_i, \max_{i \in I} b_i] \\ &\sqcap_{i \in I} [a_i, b_i] \stackrel{\text{def}}{=} [\max_{i \in I} a_i, \min_{i \in I} b_i] \text{, or } \emptyset \text{ if } \max > \min \end{aligned}

链(Chain\mathrm{Chain})

IMPORTANT

设偏序集 (D,⊑)(D, \sqsubseteq),取集合 DD 的非空子集 SS,若 SS 中的任意两个元素关于 ⊑\sqsubseteq 皆可比,则称该子集 SS 为 (D,⊑)(D, \sqsubseteq) 的一条链。

例如,∀S⊆N\forall S \subseteq \mathbb{N} 是 (N,⊆)(\mathbb{N}, \subseteq) 上的一条链(高度可能无穷)。

递增链

IMPORTANT

设序列 (di)i∈N(d_i)_{i \in \mathbb{N}} 是链,如果对于 ∀i∈N\forall i \in \mathbb{N} 都有:di⊑di+1d_i \sqsubseteq d_{i+1},则称该链为递增链。

递增链条件(Ascending Chain Condition,ACC\mathrm{Ascending\ Chain\ Condition, ACC})

IMPORTANT

设偏序集 (D,⊑)(D, \sqsubseteq),如果对其中的任意递增链 d0⊑d1⊑...d_0 \sqsubseteq d_1 \sqsubseteq ... 最终都会稳定(即 ∃n∈N\exist n \in \mathbb{N} 使得对所有 m>nm > n,有 am=ana_m = a_n),则称 DD 满足递增链条件。

TIP

这里只要求 (D,⊑)(D, \sqsubseteq) 满足偏序集,因此该偏序集中可以没有任何递增链,甚至可以不存在任何链。

有穷高度的链肯定满足递增链条件ACCACC,但是满足递增链条件的链不一定是有穷高度(比如有可能存在不稳定的递减链)。

TIP

链 CC 的高度定义为:链 CC 中存在的最长严格递增链,则该最长严格递增链的长度称为链 CC 的高度,记作 ht(C)\mathrm{ht}(C)。

其中,严格递增链是在递增链定义的基础上要求 di⊏di+1d_i \sqsubset d_{i+1},即要求 di≠di+1d_i \not = d_{i+1}。

因此,对于递增链在趋于稳定后,后半段是稳定值 ama_m 的无限重复,并未构成严格递增链关系,此时该链的高度也并非无穷。

IMPORTANT

完全格且满足递增链条件是不动点迭代终止的充分条件!

完全偏序(Complete Partial Order,CPO\mathrm{Complete\ Partial\ Order, CPO})

IMPORTANT

设偏序集 (D,⊑)(D, \sqsubseteq),若:

  1. DD 存在最小元,记作 ⊥D\bot_D;
  2. 对 DD 中每条链 SS,其最小上界 ⊔S\sqcup S 存在。

则称 (D,⊒)(D, \sqsupseteq) 为完全偏序(CPO\mathrm{CPO}),记作 (D,⊑,⊔,⊥D)(D, \sqsubseteq, \sqcup, \bot_D)

示例

  1. (N,⊑)(\mathbb{N}, \sqsubseteq)

不是 CPO\mathrm{CPO},N\mathrm{N} 本身构成链,其最小上界为 ∞\infin,但是 ∞∉N\infin \not \in \mathrm{N};

  1. (N∪{∞},⊑)(\mathbb{N} \cup \{\infin\}, \sqsubseteq)

是 CPO\mathrm{CPO}。

不动点理论

函数

单调性

IMPORTANT

设偏序集 (D,⊑)(D, \sqsubseteq) 和 (D′,⊑′)(D', \sqsubseteq') 上的全函数 f:D→D′f: D \rightarrow D',若 ∀x,y∈D\forall x, y \in D,且只要 x⊑yx \sqsubseteq y 则有 f(x)⊑′f(y)f(x) \sqsubseteq' f(y),则该全函数 ff 是单调的。

这里的偏序集 (D,⊑)(D, \sqsubseteq) 和 (D′,⊑′)(D', \sqsubseteq') 可以理解成定义域和值域。需要注意的是,f(x)⊑′f(y)f(x) \sqsubseteq' f(y) 中 ⊑\sqsubseteq 需要映射到 ⊑′\sqsubseteq'。若 DD 中存在链 ss,单调性确保了该链经函数 ff 映射到 D′D' 后构成新链 s′s'(根据单调性定义很容易证明)。

上确界连续(⊔−\sqcup-连续)

IMPORTANT

定义一: 设 (D,⊑)(D, \sqsubseteq) 和 (D′,⊑′)(D', \sqsubseteq') 是完全偏序(CPO\mathrm{CPO}),存在全函数 f:D→D′f: D \rightarrow D',若对 DD 中的每条链 ss,⊔f(s)\sqcup f(s) 存在且有 f(⊔s)=⊔f(s)f(\sqcup s) = \sqcup f(s),则称 ff 是 ⊔−\sqcup-连续(上确界连续)的

上面的定义中其实隐含了函数单调性:∀x,y∈D\forall x, y \in D 且 x⊑yx \sqsubseteq y,则 x,yx,y 在同一条链 {x,y}\{x, y\}上,而根据定义 f(y)=f(⊔{x,y})=⊔f({x,y})=⊔{f(x),f(y)}f(y) = f(\sqcup \{x, y\}) = \sqcup f(\{x, y\}) = \sqcup \{f(x), f(y)\},而 f(x)⊑′⊔{f(x),f(y)}f(x) \sqsubseteq' \sqcup \{f(x), f(y)\},从而 f(x)⊑′f(y)f(x) \sqsubseteq' f(y),故得证函数 ff 是单调的。

函数 ff 单调性保证了 DD 中的链 ss 经函数 ff 映射到 (D′,⊑′)(D', \sqsubseteq') 后仍然构成链 s′s'。于是上面的定义可以理解为:对 DD 中的任意一条链 ss,ff 作用在链 ss 的最小上界(上确界)上的结果,等于 ff 作用在链 ss 中的每个元素构成的新链 s′=f(s)s' = f(s) 的最小上界(上确界),也即 f(⊔s)=⊔f(s)f(\sqcup s) = \sqcup f(s)。

IMPORTANT

定义二: 函数 ff 是 ⊔−\sqcup-连续的,当且仅当 ff 是单调的且对 DD 中的每条链 ss,有 f(⊔s)⊑′⊔f(s)f(\sqcup s) \sqsubseteq' \sqcup f(s)。

这里和定义一相对比,条件给出函数 ff 是单调的,并且 f(⊔s)⊑′⊔f(s)f(\sqcup s) \sqsubseteq' \sqcup f(s),因此实际上我们只需要基于函数 ff 的单调性证明 ⊔f(s)⊑′f(⊔s)\sqcup f(s) \sqsubseteq' f(\sqcup s) 即可得到定义一中的条件,也就能够证明函数 ff 是 ⊔−\sqcup-连续。

证明如下:∀x∈s\forall x \in s,有 x⊑⊔sx \sqsubseteq \sqcup s,于是 f(x)⊑′f(⊔s)f(x) \sqsubseteq' f(\sqcup s),即对链 ss 中任意元素 xx 映射到 D′D' 中都有上界 f(⊔s)f(\sqcup s),于是 ⊔f(s)=⊔{f(x1),...,f(xk)}⊑′f(⊔s)\sqcup f(s) = \sqcup \{f(x_1), ..., f(x_k)\} \sqsubseteq' f(\sqcup s)。根据条件 f(⊔s)⊑′⊔f(s)f(\sqcup s) \sqsubseteq' \sqcup f(s),于是有

f(⊔s)=⊔f(s)f(\sqcup s) = \sqcup f(s)

再根据定义一,可知函数 ff 是 ⊔−\sqcup-连续的。

TIP

若 DD 只包含有穷链,则 ff 是 ⊔−\sqcup- 连续的当且仅当 ff 是单调的。

提示一下,既然是有穷链,则 ⊔s∈s\sqcup s \in s,而根据单调性即可证明 ⊔f(s)=f(⊔s)\sqcup f(s) = f(\sqcup s)。

示例

考虑从 (N∪{∞},≤)(\mathbb{N}\cup \{\infin\}, \le) 到 ({F,T},⊑)(\{F, T\}, \sqsubseteq) 的函数 f(x)f(x),其中 F⊑TF \sqsubseteq T,判断函数 f(x)f(x) 单调性与 ⊔−\sqcup-连续性:

  1. f(x):if x≥2 then T else Ff(x): \mathrm{if\ x\ge 2\ then\ T\ else\ F} 示例
  2. f(x):if x==∞ then T else Ff(x): \mathrm{if\ x == \infin\ then\ T\ else\ F} 示例

显然,两者中的 f(x)f(x) 均单调。但是 2.中 f(x)f(x) 不是 ⊔−\sqcup-连续的,理由如下:

根据定义,N∪{∞}\mathbb{N}\cup \{\infin\} 中任意链 ss 均有,⊔f(s)\sqcup f(s) 存在且有 f(⊔s)=⊔f(s)f(\sqcup s) = \sqcup f(s) ,而对于2.中的 f(x)f(x),不妨取 s=Ns = \mathbb{N},由于 ∞∉N\infin \not \in \mathbb{N},于是 ⊔f(s)=F⊑T=f(⊔s)\sqcup f(s) = F \sqsubseteq T = f(\sqcup s),故得证。

不动点理论

基础概念

IMPORTANT

设 ff 是偏序集(D,⊑)(D, \sqsubseteq) 上的函数,则 DD 中元素 xx 称为函数 ff 的:

  1. 不动点(fixpoint\mathrm{fixpoint}):若 f(x)=x\color{red}{\mathrm{f(x) = x}};
  2. 前不动点(pre−fixpoint\mathrm{pre-fixpoint}):若 x⊑f(x)\color{red}{\mathrm{x \sqsubseteq f(x)}};
  3. 后不动点(post−fixpoint\mathrm{post-fixpoint}):若 f(x)⊑x\color{red}{\mathrm{f(x) \sqsubseteq x}}.
图示
图示

图中的 prepre 和 postpost 都是相对于不动点 x0x_0,实际上 postpost 所指部分相对于 x1x_1 也是前不动点。

IMPORTANT

不动点集合 fp f={x∈D:f(x)=x}\mathrm{fp}\ f = \{x \in D: f(x) = x\};

x∈fp fx \in \mathrm{fp}\ f,若对任意 y∈fp fy \in \mathrm{fp}\ f 皆有 x⊑yx \sqsubseteq y,则称 xx 为函数 ff 的最小不动点,记作 lfp f\mathrm{lfp}\ f;

x∈fp fx \in \mathrm{fp}\ f,若对任意 y∈fp fy \in \mathrm{fp}\ f 皆有 y⊑xy \sqsubseteq x,则称 xx 为函数 ff 的最大不动点,记作 gfp f\mathrm{gfp}\ f;

记 lfpd f\mathrm{lfp}_d\ f 为关于偏序 ⊑\sqsubseteq 比 dd 大的最小不动点;

记 gfpd f\mathrm{gfp}_d\ f 为关于偏序 ⊑\sqsubseteq 比 dd 小的最大不动点;

应用示例

以不动点理论在联立递归方程求解中的应用为例:

  1. 问题背景:联立递归方程

考虑由两个递归方程组成的方程组:

{x1=f(x1,x2)x2=g(x1,x2)\begin{cases} &x_1 = f(x_1, x_2) \\ &x_2 = g(x_1, x_2) \\ \end{cases}

其中,x1,x2x_1, x_2 是格 xx 中的元素;f,gf, g 是定义在该格上的函数。

  1. 转化为不动点问题

为求解上述方程组,我们可以将其抽象为一个函数的不动点问题:

定义函数 F:X×X→X×XF: X \times X \rightarrow X \times X,其中 X×XX \times X 表示原格的 “乘积格”,保持偏序结构,函数 FF 形式为:

F([x1x2])=[f(x1,x2)g(x1,x2)]F( \begin{bmatrix} x_1 \\ x_2 \\ \end{bmatrix} ) = \begin{bmatrix} f(x_1, x_2) \\ g(x_1, x_2) \\ \end{bmatrix}

此时,方程组的解 (x1,x2)(x_1, x_2) 满足:

F([x1x2])=[x1x2]F( \begin{bmatrix} x_1 \\ x_2 \\ \end{bmatrix} ) = \begin{bmatrix} x_1 \\ x_2 \\ \end{bmatrix}

即 (x1,x2)(x_1, x_2) 是函数 FF 的不动点,于是原方程组最小解为 lfp F\mathrm{lfp}\ F。

Tarski\mathrm{Tarski} 不动点定理

IMPORTANT

完全格(D,⊑,⊔,⊓,⊥,⊤)(D, \sqsubseteq, \sqcup, \sqcap, \bot, \top) 上的单调函数 f:D→Df: D \rightarrow D 的不动点集合 fp\mathrm{fp} 构成一个非空完全格,且:

lfp f=⊓postfp f=⊓{x∈D:f(x)⊑x}gfp f=⊔prefp f=⊔{x∈D:f(x)⊒x}\begin{align*} & \mathrm{lfp}\ f = \sqcap \mathrm{postfp}\ f = \sqcap \{x \in D: f(x) \sqsubseteq x\} \\ & \mathrm{gfp}\ f = \sqcup \mathrm{prefp}\ f = \sqcup \{x \in D: f(x) \sqsupseteq x\} \\ \end{align*}

其中,由不动点构成的非空完全格为 (fp f,⊑,λS.lfp⊔S,λS.gfp⊓S,lfp f,gfp f)(\text{fp } f, \sqsubseteq, \lambda S.\text{lfp}_{\sqcup S}, \lambda S.\text{gfp}_{\sqcap S}, \text{lfp } f, \text{gfp } f),其中 λS\lambda S 构造一个以 “集合 SS” 为输入、以 “对应的不动点” 为输出的函数,于是 λS.lfp⊔S\lambda S.\text{lfp}_{\sqcup S} 表示对应的最小不动点,λS.gfp⊓S\lambda S.\text{gfp}_{\sqcap S} 表示对应的最大不动点。

TIP

Tarski\mathrm{Tarski} 不动点定理证明了不动点存在性,但并未给出求解不动点的方法。

Kleene\mathrm{Kleene} 不动点定理

IMPORTANT

设 (D,⊑)(D, \sqsubseteq) 为完全偏序 CPOCPO,若函数 f:D→Df: D \rightarrow D 是 ⊔−\sqcup-连续的,则有:

lfp f=⊔{fi(⊥)∣i∈N}\mathrm{lfp}\ f = \sqcup \{f^i(\bot)| i \in \mathbb{N}\}

其中,i∈Ni \in \mathbb{N} 表示迭代次数。

图示
图示
TIP

Kleene\mathrm{Kleene} 不动点定理给出了实际求解不动点的方法:从 CPOCPO 的 ⊥\bot 开始,反复应用函数 ff 进行迭代来构造序列:⊥,f(⊥),f(f(⊥)),...,fn(⊥)\bot, f(\bot), f(f(\bot)), ..., f^n(\bot),该序列的“最小上确界”就是函数 ff 的最小不动点。

满足递增链条件的完全偏序 CPOCPO 上的不动点迭代

Kleene\mathrm{Kleene} 不动点定理并未要求迭代过程必须在有限步内终止,其核心实际上是通过无穷迭代的极限来定义不动点,而这种极限在多数情况下无法通过实际计算抵达。于是需要更加严格条件来保证不动点迭代的终止性。

IMPORTANT

若 CPO(D,⊑,⊔,⊥)CPO(D, \sqsubseteq, \sqcup, \bot) 上没有无穷递增链,ff 是 DD 上的单调函数,那么 Kleene\mathrm{Kleene} 迭代序列 ai+1=f(ai)a_{i+1} = f(a_i) 将会在有穷时间内收敛于 lfp⊥ f\mathrm{lfp}_\bot \ f。

TIP

有穷高度的链肯定满足递增链条件ACCACC,但是满足递增链条件的链不一定是有穷高度(比如有可能存在不稳定的递减链)。

而对 CPOCPO 而言存在最小元 ⊥\bot,于是满足递增链条件的 CPOCPO 一定没有无穷递增链。

在一些问题上,如:

  • 有穷格:即格中元素个数是有穷的,如符号格;
  • 满足递增链条件的无穷格:即格中元素个数是无穷的,但是格的高度是有穷的,如常量格.

上述定理提供了迭代方法来精确地计算最小不动点,并且保证了迭代计算的终止性。

具体应用

数据流系统

之前我们学习的可用表达式分析和活跃变量分析也属于数据流系统,这里给出其形式化定义:

一个数据流系统 S=(Lab,E,F,(D,⊑),ι,φ)\mathcal{S} = (Lab, E, F, (D, \sqsubseteq), \iota, \varphi) 由以下部分组成:

  • 有限的(程序)标签集 LabLab(此处为 LabcLab_c);
  • 极值标签集 E⊆LabE \subseteq Lab(此处为 {init(c)}\{\text{init}(c)\} 或 final(c)\text{final}(c));
  • 流关系 F⊆Lab×LabF \subseteq Lab \times Lab(此处为 flow(c)\text{flow}(c) 或 flowR(c)\text{flow}^R(c));
  • 满足递增链条件(ACCACC)的完全格 (D,⊑)(D, \sqsubseteq)(带有上确界(LUB)算子 ⨆\bigsqcup 和最小元 ⊥\bot);
  • 极值标签对应的极值值 ι∈D\iota \in D;
  • 一组单调传递函数 {φl∣l∈Lab}\{\varphi_l \mid l \in Lab\},类型为 φl:D→D\varphi_l: D \rightarrow D。

于是我们将可用表达式分析与活跃变量分析映射到上面的形式化定义中:

问题可用表达式(Available Expressions)活跃变量(Live Variables)
EE{init(c)}\{\text{init}(c)\}final(c)\text{final}(c)
FFflow(c)\text{flow}(c)flowR(c)\text{flow}^R(c)
DD2CExpc2^{CExp_c}2Varc2^{Var_c}
⊑\color{red}{\sqsubseteq}⊇\color{red}{\supseteq}⊆\color{red}{\subseteq}
⨆\bigsqcup⋂\bigcap⋃\bigcup
⊥\color{red}{\bot}CExpcCExp_c∅\emptyset
ι\iota∅\emptysetVarcVar_c
φl\varphi_lφl(d)=(d∖kill(Bl))∪gen(Bl)\varphi_l(d) = (d \setminus \text{kill}(B^l)) \cup \text{gen}(B^l)-

注意表中标红的部分。对于可用表达式分析,偏序关系 ⊑\sqsubseteq 定义为 ⊇\color{red}{\supseteq}(即集合包含关系的逆),这里可以这样理解:不动点迭代是 “沿递增链向上” 的过程(即从 ⊥\bot 出发,每一步 di⊑di+1d_i \sqsubseteq d_{i+1} 逐步逼近,直到稳定),最终达到的稳定的结果即为最小不动点,因此最终稳定的结果应该是一个精确的结果,反映到可用表达式集合中表现为:集合越小,精度越高。所以 “向上迭代” 需要对应集合从大到小收缩,即从最粗略的 ⊥\bot 逐步收缩到最精确的最小不动点。于是 “迭代向上”就必须要把偏序 ⊒\sqsupseteq 定义为集合的 ⊇\supseteq。

数据流方程组与不动点

数据流方程组(dataflow equation system\mathrm{dataflow\ equation\ system})

给定数据流系统 S=(Lab,E,F,(D,⊑),ι,φ)\mathcal{S} = (Lab, E, F, (D, \sqsubseteq), \iota, \varphi),其中 Lab={1,…,n}Lab = \{1, \dots, n\}(不失一般性)

  • S\mathcal{S} 确定方程组(其中 l∈Labl \in Lab):

    All={ιif l∈E⨆{φl′(All′)∣(l′,l)∈F}otherwise\text{Al}_l = \begin{cases} \iota & if\ l \in E \\ \bigsqcup \{\varphi_{l'}(\text{Al}_{l'}) \mid (l', l) \in F\} & otherwise \end{cases}
  • (d1,…,dn)∈Dn(d_1, \dots, d_n) \in D^n 被称为解,若:

    dl={ιif l∈E⨆{φl′(dl′)∣(l′,l)∈F}otherwised_l = \begin{cases} \iota & if\ l \in E \\ \bigsqcup \{\varphi_{l'}(d_{l'}) \mid (l', l) \in F\} & otherwise \end{cases}
  • S\mathcal{S} 确定变换:

    ΦS:Dn→Dn:(d1,…,dn)→(d1′,…,dn′)\Phi_{\mathcal{S}}: D^n \rightarrow D^n: (d_1, \dots, d_n) \rightarrow (d_1', \dots, d_n')

    其中

    dl′:={ιif l∈E⨆{φl′(dl′)∣(l′,l)∈F}otherwised_l' := \begin{cases} \iota & if\ l \in E \\ \bigsqcup \{\varphi_{l'}(d_{l'}) \mid (l', l) \in F\} & otherwise \end{cases}

(d1,…,dn)∈Dn(d_1, \dots, d_n) \in D^n求解该方程组当且仅当它是 ΦS\Phi_{\mathcal{S}} 的不动点。

通过不动点迭代来求解数据流问题

要点分析

  • (D,⊑)(D, \sqsubseteq) 是完全格,确保 ΦS\Phi_S 良定义。
  • 由于 (D,⊑)(D, \sqsubseteq) 是满足 ACCACC 的完全格,因此 (Dn,⊑n)(D^n, \sqsubseteq^n) 也是完全格(其中 (d1,…,dn)⊑n(d1′,…,dn′)(d_1, \dots, d_n) \sqsubseteq^n (d_1', \dots, d_n') 当且仅当对所有 1≤i≤n1 \leq i \leq n,有 di⊑di′d_i \sqsubseteq d_i')。
  • 传递函数 φl\varphi_l 在 (D,⊑)(D, \sqsubseteq) 中的单调性,蕴含 ΦS\Phi_S 在 (Dn,⊑n)(D^n, \sqsubseteq^n) 中的单调性(因为上确界算子 ⨆\bigsqcup 也具有单调性)。
  • 因此,(最小)不动点可通过迭代有效计算: fix(ΦS)=⨆{ΦSk(⊥Dn)∣k∈N}\text{fix}(\Phi_S) = \bigsqcup \{\Phi_S^k(\bot_{D^n}) \mid k \in \mathbb{N}\} 其中 ⊥Dn=(⊥D,…,⊥D)⏟n 次\bot_{D^n} = \underbrace{(\bot_D, \dots, \bot_D)}_{n \text{ 次}}。
  • 若 (D,⊑)(D, \sqsubseteq) 的高度为 mm   ⟹  (Dn,⊑n)\implies (D^n, \sqsubseteq^n) 的高度为 m⋅nm \cdot n   ⟹  \implies 不动点迭代最多需要 m⋅nm \cdot n 步。

Comments