逻辑:是(A&&!(B || C))|| (B || C)与(A || B || C)相同?

时间:2011-01-21 20:56:10

标签: logic

我遇到了一些obj-c代码,我想知道是否有办法简化它:

#if ( A && !(B || C)) || ( B || C )

这与?

相同
#if ( A || B || C )

如果没有,是否有其他方法可以更容易阅读?

[编辑] 在问这个问题之前我尝试了真值表,但我认为我不得不遗漏一些东西因为我怀疑Foundation.framework / Foundation.h会采用这种更复杂的形式。它有充分的理由吗?

这是原始代码(来自Foundation.h):

#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)

7 个答案:

答案 0 :(得分:13)

是。像其他人说的那样,你可以把它真相表。德摩根的规则也可以提供帮助。

但是,我认为最好的选择是使用Karnaugh Map。学习需要几分钟,但Karnaugh Maps允许您始终找到布尔逻辑的最小表达式。真值表可以验证最小化,但它们无法提供给您。

以下是我如何得到它:

首先,表格布局:

         AB
     00   01   11   10
  0|    |    |    |    |
C 1|    |    |    |    |

现在,考虑你的等式,B || C总会引发真相:

         AB
     00   01   11   10
  0|    |  T |  T |    |
C 1|  T |  T |  T |  T |

这只留下两个案例。在任何一种情况下,右侧评估为假。对于000,左侧也评估为假(0&&!(无论如何)为假)。适用于100,1和& !(0 ||| 0)计算结果为true。因此,声明是正确的。填写:

         AB
     00   01   11   10
  0|  F |  T |  T |  T |
C 1|  T |  T |  T |  T |

现在,我们只需要“掩盖”所有真相。 “C”将覆盖底行。 “B”将覆盖中间正方形(四个值)。因此,“B || C”涵盖除右上方之外的所有方块。现在,“A”将覆盖正确的四空格。这是多余的,这是可以的。因此,“A || B || C”涵盖了所有真正的正方形,并省略了唯一的假正方形。

答案 1 :(得分:8)

A | B | C | (B || C) | (!(B || C)) | (A && !(B || C)) | (A && (!(B || C)) || (B || C) | (A || B || C)
------------------------------------------------------------------------------------------------------
T | T | T |     T    |       F     |         F        |                 T             |         T      
T | T | F |     T    |       F     |         F        |                 T             |         T 
T | F | T |     T    |       F     |         F        |                 T             |         T 
T | F | F |     F    |       T     |         T        |                 T             |         T 
F | T | T |     T    |       F     |         F        |                 T             |         T 
F | T | F |     T    |       F     |         F        |                 T             |         T 
F | F | T |     T    |       F     |         F        |                 T             |         T 
F | F | F |     F    |       T     |         F        |                 F             |         F 

根据最后两列,我会说是。

答案 2 :(得分:7)

获取笔+纸+尝试它,只有8种可能的输入

答案 3 :(得分:7)

他们是一样的。您可以使用Truth Table Generator对其进行测试。当falseABC时,这两个表达式仅在一种情况下提供false

答案 4 :(得分:2)

是的,它是一样的。使用De Morgan规则:

(A&&!(B || C))|| (B || C)=(A&& B&& C)|| (B || C)。 所以当A = 1且B,C = 0时,第二个将成立。如果不是这样的话,当B ||时,第二部分(B || C)将为真。 C.所以它等于第一个。

答案 5 :(得分:1)

你也可以说:

(A&&!(B || C))|| (B || C)重写为(A&&!W)|| W(1)

(1)重写为(A&&!W)|| (A ||!A || W)(2)

(2)重写(A&&!W)|| (A || W)|| (!A || W)(3)

(3)重写(A&&!W)|| !(A&&!W)|| (A || W)(4)

(4)导致A || W然后 A || B || ç

答案 6 :(得分:0)

是的,这两个表达式是等价的。 (我刚刚编写了几个函数来测试所有八种可能性。)