闭包分析的约束条件是一个可以在立方时间内解决的通用类的实例。许多问题都属于这个类别,因此我们将更仔细地研究算法。
程序表示:
- T:tokens,可以认为是函数名的集合
- V:元素是x,可以认为是表示函数调用的变量,每个x的结果是T,也就是可能被调用的函数的集合
目标:
- 对一系列的形如:$t \in x \text{~or~} t\in x \Longrightarrow y \subseteq z$ 的约束进行求解,得到最小结果集合
数据结构:
- $x.sol \subseteq T$,表示x的结果。也就是变量可能是哪些函数
- $x.succ \subseteq V$,表示x的后续节点,也就是计算图里面连接关系,作用是当x更新的时候,后续节点和x相关,也需要更新
- $x.cond(t) \subseteq V \times V$,表示对于两个变量x和t的一组条件约束,作用是对于条件,如果满足了,那么就需要更新x和t的关系;所以这个条件需要被记录
- $W \subseteq T \times V$,表示一个工作列表,记录当前所有工作中的x能够表示什么t的情况,如果触发了更新操作,那么这个列表里面都需要更新
算法:
- 初始化:所有的集合都是空集合
- 算法过程:对于每一个约束,进行计算
- addToken:x有一个结果是表示函数t
- addEdge:y是x的后继,也就是说x有的结果,都需要传递到y
- propagate:从已经更新好的结果里面,把每一个(t,x)对取出来,进行传递更新
- x.cond(t)表示如果t成立的时候,有一组 $y \subseteq z$ 需要更新。当前是(t,x),也就是x.cond(t)条件成立的时候,需要有传递,那么这个时候出现了t,就需要先构建这个边。并且传递信息
- 对于x的后继y,更新结果
时间复杂度:O(n^3)