建议的程序
代替专用库,我建议的解决问题的过程如下:
- 为未简化的布尔表达式生成真值表。
- 识别单变量比较表达式暗示同一变量的其他比较表达式的情况。如果您的用例具有完全代表性,这应该很简单。
- 对于输入值违反含义的条目,将真值表输出标记为“不关心”(DNC)。
- 使用真值表作为支持真值表和 DNC 的布尔表达式简化器的输入。正如 Mahmoud Al-Qudsi 建议的那样,Logic Friday 是一个很好的候选者,这就是我在下面的示例中使用的。
解释
假设您给定的用例完全代表问题空间,那么您可以使用任何支持真值表输入和“不关心”(DNC)函数输出规范的布尔表达式简化器。DNC 之所以重要,是因为您的一些单变量比较表达式可以暗示同一变量的其他比较表达式。考虑以下单变量比较表达式到布尔变量映射:
A = (a < 0); B = (b > 0); C = (c > 0); D = (c > 1);
D 暗示 C 或等价(不是 D 或 C)总是正确的。因此,在考虑示例表达式的输入时(替换我们新定义的布尔变量)
Output = (A && B) || (A && C) || (A && D)
当(不是 D 或 C)为假时,我们不关心这个表达式的输入或这个表达式的输出,因为它永远不会发生。我们可以通过为上述表达式生成真值表来利用这一事实,并在(不是 D 或 C)为假的情况下将所需的输出标记为 DNC。从该真值表中,您可以使用布尔表达式简化器来生成简化的表达式。
例子
假设单变量比较表达式到上面给出的布尔变量映射,让我们将该过程应用于您的示例。特别是,我们有
Output = (A && B) || (A && C) || (A && D)
映射到下面的真值表 I。但是,从您的示例中,我们知道(不是 D 或 C)总是正确的;因此,我们可以将(D 而不是 C)的所有输出标记为 DNC,从而得出下面的真值表 II。
Truth Table I Truth Table II
============= ==============
A B C D Output A B C D Output
0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 1 DNC
0 0 1 0 0 0 0 1 0 0
0 0 1 1 0 0 0 1 1 0
0 1 0 0 0 0 1 0 0 0
0 1 0 1 0 0 1 0 1 DNC
0 1 1 0 0 0 1 1 0 0
0 1 1 1 0 0 1 1 1 0
1 0 0 0 0 1 0 0 0 0
1 0 0 1 1 1 0 0 1 DNC
1 0 1 0 1 1 0 1 0 1
1 0 1 1 1 1 0 1 1 1
1 1 0 0 1 1 1 0 0 1
1 1 0 1 1 1 1 0 1 DNC
1 1 1 0 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1 1
将真值表 II 插入 Logic Friday 并使用其求解器产生最小化 (CNF) 表达式:
A && (B || C)
或者等效地,从布尔变量映射回来,
a < 0 && (b > 0 || c > 0).