使用AND和OR转换逻辑条件

时间:2013-02-19 11:58:56

标签: algorithm conditional-statements

我有一个复杂的条件,例如:ANDs和ORs: (c1 OR c2) AND (c3 OR c4 OR c5)

这相当于:

(c1 AND c3) OR (c1 AND c4) OR (c1 AND c5) OR (c2 AND c3) OR (c2 AND c4) OR (c2 AND c5)

然后可以在仅包含AND:

的条件列表中展开此条件
c1 AND c3
c1 AND c4
c1 AND c5
c2 AND c3
c2 AND c4
c2 AND c5

这种转变总是可行的吗?什么算法可以做到?

条件作为树存储在内存中,例如:

    OR
   /  \
  AND c1
 / ! \
c2 c3 c4

我认为我们应该尝试通过使用分配来“移动”OR向上的树:

(a OR b) AND c = (a AND c) OR (b AND c)

这是一个好方法吗?

2 个答案:

答案 0 :(得分:2)

查看Disjunctive normal form(或Conjunctive one)。但它们不仅使用ANDOR,还使用NOT

注意:如果我们仅限OR s和AND s(并且不能使用任何其他布尔函数),那么我们甚至无法表达任何布尔值因Post's functional completeness theorem而导致的功能(ANDOR都是真实保留的,不构成基础。因此可能有一个公式,无法转换。

答案 1 :(得分:0)

(a or b) and c在逻辑上等同于(a and c) or (b and c)。但是,在支持短路布尔表达式的语言中,我可能最终将其写为c and (a or b),理由是如果(a or b)为假,则无需评估c

如果ab是昂贵的函数调用而不仅仅是变量引用,则尤其如此。