我在RPN-Format中有一些布尔表达式,如下所示:
{0} {1} {2} AND OR // equals: {0} or {1} and {2}
计算布尔变量{x}
非常昂贵。显然,如果{1}
已经为真,则无需计算{2}
和{0}
,因为在这种情况下,表达式总是会被评估为真。
我怎样才能预先检测出哪些布尔变量我必须先评估中止表达式的评估,尽可能少评估变量?
我想知道哪些具有确定值的变量会将整个表达式评估为真或假。
答案 0 :(得分:1)
您应该更倾向于评估预期的子表达式评估数量较低的表达式。
a 和( b 或 c 或 d )
您应首先评估 a - 因为如果错误 - 您已完成
a 或( b 和 c 和 d )
同样,您应首先评估 a - 因为如果它是真的 - 您已完成
( a 或 b )和( c 或 d 或 e < / em>的)
首先,评估( a 或 b ) - 因为如果它是假的 - 你已经完成了
等
实施:
如果表达式的格式为&#34; expr 或 expr ,则构建一个树,其中根是或 expr 或......&#34;。或者,如果您的表达式具有&#34; expr 和 expr 以及 expr 和...&#34; - 根应该是和。
递归构建子树。水平或树木是和/或替代的。儿童或每个节点的数量各不相同(叶子除外2个或更多)。
通过选择子项数量最少的子树进行递归评估并首先对其进行评估。
答案 1 :(得分:0)
一种方法是先扩展布尔表达式,然后进行分解。
常见因素会告诉您哪些变量可以强制表达式为假。
然后你可以反转表达式并重复以找到将强制表达式为真的变量。
这应该通过一个例子变得更清楚,我会为OR和写+。对于AND:
0 + 1.2
这已经扩大了。没有共同因素,因此单一变量无法强制实现这一点。
接下来,我们使用De Morgan's laws反转和展开:
!(0 + 1.2)
= !0.!(1.2)
= !0.(!1 + !2)
这个因子为!0,即如果0为假,我们可以断定整个表达式都是假的。
1.2 + 1.3
= 1.(2 + 3)
因此,如果1为假,则整个表达式为假。
!(1.2 + 1.3)
=!(1.2).!(1.3)
=(!1 + !2).(!1 + !3)
=!1 + !2.!1 + !2.!3
这没有共同因素,因此没有一个变量可以强制表达式为真。
答案 2 :(得分:0)
将表达式转换为最小化的产品总和形式。 这可以通过对小表达式使用Karnaugh-Veitch map来完成。描述了更多涉及的方法here。
在您的示例中,您会得到一个词 a (您的{0}),其中包含一个文字和第二个词 cb ({1} {2}符号)有两个文字。对于每个输入变量,计算受此变量影响的术语 简单的计数不会考虑术语可能很大(许多文字)或小(少数文字)。因此,您可以使用相应单元格所涵盖的卡诺细胞数来对术语进行加权 计数结果(a:1x4,b:1x2,c:1x2)告诉您应首先评估哪个变量。一旦单个术语变为真或所有术语被评估为假,评估结束。