如何用布尔代数简化多个 if-else 条件?

How to simplify multiple if-else conditions with boolean algebra?

问题是下面代码中哪个if-else分支是多余的?

if (x<3 && y>3)
    printf("Test OK!\n");
else if (x>=3 && y>=3)
    printf("Test OK!\n");
else if (z>3 && x>=3)
    printf("Test OK!\n");
else if (z<=3 && y>=3)
    printf("Test OK!\n");
else
    printf("Test failed!\n");

我的想法是将条件视为事件:

x<3 -> p
y>3 -> q
y>=3 -> m
z>3 -> n

这个问题等同于从中选择一个多余的问题:

p*q
^p*q
n*^p
^n*m

然而,由于 p q n m 不是独立事件,我真的被困住了。感谢您的帮助!

如果您希望简单地删除一个 if 条件并使其正常工作,那么我认为您无法使用此集合来做到这一点。也就是说,我试了一下布尔值归约,它确实简化了 if-else 个案例。

首先,让我们将 y>3 视为 y>=3 && y!=3。这使您的第一个 if 案例

if (x<3 && y>=3 && y!=3)

由于我的大脑更适合面向相同方向的大于符号,因此我将您的条件重新定义为:

X: x>=3
Y: y>=3
A: y!=3
Z: z>3

现在,您的 if-then 个案例可以用布尔代数写成:

^XYA + XY + ZX + ^ZY

这是我的真相 table 其中 Q 是上述布尔方程的结果 here

还有我的Karnaugh Map: here

将等式简化为:

YA + ZX + ^ZY

然后回到代码

if (y>3)
    printf("Test OK!\n");
else if (z>3 && x>=3)
    printf("Test OK!\n");
else if (z<=3 && y>=3)
    printf("Test OK!\n");
else
    printf("Test failed!\n");