我有一个复杂的条件,例如: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)
。
这是一个好方法吗?
答案 0 :(得分:2)
查看Disjunctive normal form(或Conjunctive one)。但它们不仅使用AND
和OR
,还使用NOT
。
注意:如果我们仅限OR
s和AND
s(并且不能使用任何其他布尔函数),那么我们甚至无法表达任何布尔值因Post's functional completeness theorem而导致的功能(AND
和OR
都是真实保留的,不构成基础。因此可能有一个公式,无法转换。
答案 1 :(得分:0)
(a or b) and c
在逻辑上等同于(a and c) or (b and c)
。但是,在支持短路布尔表达式的语言中,我可能最终将其写为c and (a or b)
,理由是如果(a or b)
为假,则无需评估c
。
如果a
或b
是昂贵的函数调用而不仅仅是变量引用,则尤其如此。