前言
第二部分 逻辑表示方式以及处理算法
Boolean Representation via BDDs and SAT
BDD Binary Decision Diagrams
BDD是什么。Binary Decision Diagrams 二进制决策图
二进制决策图是表示和操作布尔逻辑的最通用和有用的数据结构之一。
那么二进制决策图长什么样呢。
如图所示,就是树状图,每一个分支对应一个输入的确定,从而确定输出,这也表示了所有状态下输入和输出的对应关系。但是呢,这样的表示方法在输入增加时,树状图成指数增长,所以我们显然需要一些方法来简化。
忽略节点:当某一情况下的某一输入对结果不发生影响时,我们忽略这一输入对应的两个分支。如图所示
共用节点:共用节点存在两种类型。第一种是由于输出一定是0或者1,我们只需要将所有分支的最终输出指向0或者1,就可以减少输出的分支。第二种是对于多个输入输出对应关系,在经过一些0/1简化后,可能存在相同状况,即从某一分支开始,之后的部分逻辑关系完全一致,我们将这一部分逻辑关系用同一个树状图表示,仅仅是前置的输入指向不同。又或者是不同对应关系在最初的部分逻辑关系中存在相同情况,我们同样可以将这一部分逻辑关系用同一个树状图表示,仅仅是输出指向不同节点。
接下来的图片分别对应第一种类型和第二种类型的两种情况
除此之外,输入判断的先后会对整个树状图的大小有极其重要的影响。
如图所示,当我们先判断a_1,a_2,a_3……,然后判断b_1,b_2,b_3….我们会发现,一直判断到b_1才会出现第一个可能的输出,然而在n次判断后,这一次判断的分支会存在2^(n+1),毫无疑问,这是一个巨大的工程量。而当我们先判断a_1b_1时,无疑会减少一个巨大的分支。
SAT satisfiability
对于一个逻辑关系,我们往往需要的是该逻辑关系成立,比如network repair中z = ! (F xor G),我们特意在最后结尾添加非运算,使得真才是我们期待的结果。这既符合现实逻辑上的关系,又符合电子逻辑关系。
所以,对一个系统来说,有时候我们并不期望得到所有的结果,只需要知道这件事情在某种条件下能够成立,我们去尽力满足这个条件即可。因此,SAT被提了出来。
在一个概念被提出之后,我们需要做的就是找到一个方法实现这个概念。首先我们提出一个表达方式CNF Conjunctive Normal Form,连接的一般方式。其形式是XXX+XXXX+XXXX,语言描述就是多个命题的和。
为什么选择和的形式呢。
因为or逻辑中有一出一,我们只需要判断或者找到其中一个命题成立,这整个逻辑就成立。除此之外,每个命题都可以转化成和的形式。AB可以转化成(A+B)这是基于双重否定消除(非非为本身)以及德摩根定律((AB) = A+B),(A+B)C 可以转化成AC+BC 这是根据分配率得到。
我们用和的形式表示所有逻辑门(为了简化表示,所以都转化成AB的形式)
z=(x) [^x +