【问题标题】:Logic: is ( A && !(B || C)) || ( B || C ) the same as ( A || B || C )?逻辑:是 ( A && !(B || C)) || ( B || C ) 与 ( A || B || C ) 一样吗?
【发布时间】:2011-06-13 10:03:05
【问题描述】:

我遇到了一些 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)

【问题讨论】:

  • 为什么不直接实现一个带有结果的小真值表并自己测试呢?只有 8 种不同的输入 |A=true, B=true, C=true | A=真,B=真。 C=假 |等等等等。比较真值表。如果输出相同,那么您的逻辑是等效的。
  • 问题标题中的括号与问题本身略有不同。如果标题正确,则“!(B || C)||(B || C)”部分可以替换为“true”,留下“A && true”,相当于A。另一方面,问题版本似乎缺少一对括号,否则您会遇到语法错误。除此之外,我同意其他海报,创建真值表。
  • @Peter Perháč - 感谢您的编辑!

标签: logic


【解决方案1】:

是的。就像其他人说的那样,您可以对其进行真值表。德摩根规则也有帮助。

但是,我认为最好的选择是使用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,左侧的计算结果也为 false(0 && !(whatever) 为 false)。对于 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”覆盖了所有真正的方格并省略了唯一的假方格。

【讨论】:

  • 这是一个比应得的问题更好的答案,并且具有教育意义。
【解决方案2】:

拿笔+纸+试试,只有8种可能的输入

【讨论】:

  • 我当然先尝试过。我认为代码的来源高于这个看似晦涩的表述:OSX 的 Foundation.h。因此,我怀疑我的涂鸦。但是,是的,为您出色的第一直觉 +1。
  • 我是一名实验物理学家 - 考虑到做数学或进行测量的选择,我选择了愚蠢的解决方案
  • 我也是,但哪个傻哪个不傻,就看实验了。 ;)
  • @john - 明智的选择是先以最愚蠢的方式去做!
【解决方案3】:

它们是一样的。您可以使用Truth Table Generator 进行测试。这两个表达式只在一种情况下给出false,当ABCfalse

【讨论】:

  • 这是一个聪明的链接。我会和我的数学老师朋友分享。 +1
【解决方案4】:
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 

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

【讨论】:

  • @detunized,是的,我 &&'ed 最后两个而不是 ||'ed。他们是平等的
【解决方案5】:

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

(A && !(B || C)) || (B || C) = (A && !B && !C) || (B || C)。 因此,当 A = 1 且 B,C = 0 时,第二部分为真。如果不是这种情况,则第二部分 (B || C) 在 B || 时为真C. 所以等于第一个。

【讨论】:

    【解决方案6】:

    你也可以说:

    (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 ||乙 || C

    【讨论】:

    • 你也可以说A ^ (B || C)不?
    【解决方案7】:

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

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 2015-11-28
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多