Bisimulation Equivalence: the transition systems have the same behavior, and make choice at same time.
我猜你的大概意思是在几条对y的赋值语句后计算一个抽象状态。这是可以的。程序分析的抽象状态一般和控制流位置(location)进行组合,所以在什么位置计算抽象状态(即抽象后继)可以任意定义。最细粒度可以每条语句后都计算一次,粗粒度一点也可以仅在控制流分叉位置计算,或者可以每隔固定数目语句进行计算。参考文献adjustable-block encoding就是研究的这个问题。
对于给定的谓词集合P,那么抽象状态的数量为2^|P|,是有限的。
复杂度和谓词个数和规则个数相关,(规则个数)^ ((谓词枚举情况)^(谓词个数))
10^125 能解决4条TAP规则,30个谓词
即时生效
再做糟糕的情况下是|P|的指数级
a small set of predicates
PBS persue bool solver
https://zhuanlan.zhihu.com/p/599826694
https://zhuanlan.zhihu.com/p/367355665
那这个算法是干啥的呢?他是用来解决布尔可满足性问题的。
也就是说给一个合取范式,看看这个式子是不是可满足,也就是到底有没有解。
比如(A∨B)∧(C∨D),这个式子是有解的,举个例子A = true, B = true, C= true, D = true整个式子的结果就是true。
所以当至少有一个答案让这个式子的结果是true时,他就是可满足的。
有人可能要问了,为啥整这么麻烦,我们一种一种可能性试的话,找几只猴子也能做出来了,干啥整这洋码子?
对这些朋友我就得讲讲了,要是100个字母,每个都有可能是true或false,一共有2的100次方种可能,每个可能还要带进式子里一个大猛算,恐怕地球的猴子不太够用了。
所以咱就得整点省力气的方法。
我们先不把100个字母都赋值,而是一个一个来,先试试第一个是true,第二个true,如果发现不行就再回来改我们的假设, 这样一直试到第100个,是不是感觉挺省猴子的?
回溯法(英语:backtracking)是暴力搜索法中的一种。
对于某些计算问题而言,回溯法是一种可以找出所有(或一部分)解的一般性算法,尤其适用于约束满足问题(在解决约束满足问题时,我们逐步构造更多的候选解,并且在确定某一部分候选解不可能补全成正确解之后放弃继续搜索这个部分候选解本身及其可以拓展出的子候选解,转而测试其他的部分候选解)。
在经典的教科书中,八皇后问题展示了回溯法的用例。(八皇后问题是在标准国际象棋棋盘中寻找八个皇后的所有分布,使得没有一个皇后能攻击到另外一个。)
回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
称整个范式为“公式”,称每个括号里的部分为该公式的子句(clause),每个子句中的每个变量或其否定为文字(literal)。
可以看出,要使整条公式结果为 T r u e \mathrm{True}True ,其所有子句都必须为 T r u e \mathrm{True}True ,也就是说,每个子句中都至少有一个文字为 T r u e \mathrm{True}True ,这个结论下面会用到。
算法中的化简步骤实际上就是移除所有在赋值后值为True 的子句,以及所有在赋值后值为False 的文字。