2011-01-21 179 views
10

我遇到了一些OBJ-C代码,我不知道是否有一种方法来简化它:逻辑:是(A &&!(B || C))|| (B || C)与(A || B || 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) 
+0

为什么不直接实现与结果有点道理表和测试它自己?只有8个不同的输入| A = true,B = true,C = true | A =真,B =真。 C = false |等等等等。比较真值表。如果输出是相同的,那么你的逻辑是相同的。 – AndyPerfect 2011-01-21 20:58:18

+3

问题标题中的圆括号与问题本身略有不同。如果标题是正确的,那么部分“!(B || C)||(B || C)”,可以用“真实”所取代,让你有“A &&真”,这仅相当于A.另一方面,问题版本似乎缺少一对括号,否则你有一个语法错误。除此之外,我同意其他海报,创建真相表。 – cobaltduck 2011-01-21 21:03:06

+0

@PeterPerháč - 感谢编辑! – jpwco 2011-01-21 22:09:27

回答

12

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

不过,我认为最好的办法是使用Karnaugh Map。学习需要几分钟的时间,但卡诺图允许您始终找到布尔逻辑的最小表达式。真理表可以验证最小化,但他们不能给你。

这里就是我得到了它:

一,表布局:

  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)的计算结果为真。因此,声明是真实的。填写:

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

现在,我们只需要“掩盖”所有的事实。 “C”将覆盖最后一行。 “B”将覆盖中间方块(四个值)。因此,“B || C”涵盖除右上方以外的所有区域。现在,“A”将覆盖正确的四格广场。这是多余的。因此,“A || B || C”涵盖了所有的真正方格,并且省略了唯一的方格。

7

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

+0

当然,我先试过。我声称代码的源代码超出了这个看似不起眼的表述:OSX的Foundation.h。所以我怀疑我的涂鸦。但是,是的,+1为你的出色的第一本能。 – jpwco 2011-01-21 21:51:25

+0

我是一名实验物理学家 - 考虑做数学或做测量的选择我去做哑巴解决方案 – 2011-01-22 01:07:44

+2

我也是,但哪一个是愚蠢的,哪一个不依赖于实验。 ;) – John 2011-01-24 23:43:32

2

是的,它是一样的。使用德摩根规则:

(!一个& &(B || C))|| (B || C)=(A & &!乙& &!C)|| (B || C)。 因此,当A = 1和B,C = 0。如果不是的第二部分(B || C)为真时,B中的情况下,第二将为真|| C.所以它等于第一个。

0

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

7
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 

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

7

他们是相同的。您可以使用Truth Table Generator进行测试。这两种表述只有在一种情况下,当ABCfalsefalse

1

你也可以说:

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

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

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

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

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

相关问题