【问题标题】:Deriving a Boolean function from a table describing the output d of a Boolean function从描述布尔函数的输出 d 的表中导出布尔函数
【发布时间】:2012-06-03 13:29:24
【问题描述】:

我收到了以下问题:

下表描述了具有三个输入值 a、b 和 c 的布尔 fun 的输出 d。

 a  b  c  |  d 
----------+----
 0  0  0  |  1 
 0  0  1  |  1 
 0  1  0  |  1 
 0  1  1  |  0 
 1  0  0  |  0 
 1  0  1  |  0 
 1  1  0  |  0 
 1  1  1  |  0 

使用 AND、OR、XOR、NOT、NAND、NOR 或 XNOR 的适当组合给出此布尔函数。

为什么是正确答案:

d := (((NOT a) AND (NOT b)) AND (NOT c)) OR
(((NOT a) AND (NOT b)) AND c) OR
(((NOT a) AND b) AND (NOT c))

我的答案。 (((非 a) 与 (非 b)) 与 (非 c))

a   b   c     d
===============
0   0   0     1      
.
. 
.

这是如何得出的?

【问题讨论】:

  • 请告诉我们您为什么认为这是错误的。由于这是家庭作业,我们希望看到一些努力。请记住展示您的工作:-) 但作为线索查看 D 列和答案中的 OR 数量。
  • 我找到了解决方案d := (((NOT a) AND (NOT b)) AND (NOT c)),但它不正确。
  • 好的,现在制作一个表格,在答案中显示您的函数的输出。我会开始你:
  • 请勿发布包含文字的图片。它不可搜索,并且对无法查看图像的人粗鲁。
  • @Gilles 对此感到抱歉

标签: boolean-logic truthtable


【解决方案1】:

您给出的答案称为乘积之和 (SOP) 公式。看看 OR 加入的三个大词:

  • ((NOT a) AND (NOT b)) AND (NOT c))
  • ((NOT a) AND (NOT b)) AND c)
  • ((NOT a) AND b) AND (NOT c)

现在看一下真值表,其中恰好三行在 d 列中有 1。这三行中的每一行都对应于三个术语之一。

可以组成更简短的答案,例如d := (NOT a) AND (NOT(b AND c)),但它们不是您给出的乘积总和公式。

【讨论】:

  • 顺便说一句,您应该密切关注@PreetSangha 的 cmets。他们可能会像我的回答一样或更多地帮助你。祝你好运。
【解决方案2】:
  • 检查表格的上半部分。 a 必须为假,fun 才能为真。
  • 另外,bc 不能同时是 true。所以,它必须是!(b && c)
  • 这应该将fun 归结为!a && !(b && c)
  • 您可以将 De Morgan 定理应用于第二部分并使用 !b || !c,但即便如此,a 也必须为假,因此:!a && (!b || !c) 就是您的最终结果。

【讨论】:

    【解决方案3】:

    对于 3 个变量,8 个条目 (2^3) 提供了 3 个变量 abc 之间所有可能变量的详尽组合。变量d 是(可以看出)某个函数的输出,比如f(x)

    现在,由于这 8 个条目包含了所有可能的变化,我们可以推断出,只有在特定组合出现时,输出 d 才是布尔值 1。在所有其他情况下,结果都是0

    所以我们简单地将所有输出为1 的行组合起来。你得到的结果如下。

    程序很简单:

    • 取所有输出为1的行。
    • 对于每一行,输出一个表达式,该表达式将导致变量值的1
      • AND 每个变量。如果任何变量的值是0,则NOTANDing 之前。
    • OR 上述步骤中找到的所有 8 个表达式。

    【讨论】:

      【解决方案4】:

      从(完整)真值表中导出函数的最简单方法是只读取结果为 1(或 0)的行并写下 disjunctive(或 conjunctive)范式。

      在您的表中,结果 1 比 0 少,因此析取范式会更短。从表中可以看出,d 恰好在 3 种情况下为 1:

      • a=0, b=0, c=0
      • a=0, b=0, c=1
      • a=0, b=1, c=0

      只要把这些放在一起,你就会得到:(! = not, & = and, v = or)

      d = (!a & !b & !c) v (!a & !b & c) v (!a & b & !c)
      

      此表格自动排除所有其他情况。你仍然可以简化这个公式。仔细看看真值表会告诉你c 的值如果ab 都为0 则无关紧要。因此前两部分可以折叠得到以下析取形式:(不再正常形式)

      d = (!a & !b) v (!a & b & !c)
      

      如果你应用分配性,它会变得更短:

      d = !a & (!b v (b & !c))
      

      快完成了:

      d = !a & (!b v b) & (!b v !c)   | applying (x v !x) == 1 and (1 & y) == y
        = !a & (!b v !c)              | applying De Morgan (!a v !b) == !(a & b)
        = !a & !(b & c)
      

      完成。

      【讨论】:

        【解决方案5】:

        正如之前有人提到的,您应该看看卡诺图。检查它wikipedia 乍一看可能有点复杂,但一旦掌握了它,就可以非常简单地推导出任何真值表的最佳表达式。

        下图显示了给定真值表的卡诺图。

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

        使用卡诺时你要做的第一件事就是将真值表复制到地图上。我会让你想办法做到这一点。

        下一步是对它们进行分组,维基百科文章描述了如何做到这一点。

        终于找到解决办法了

        从卡诺图可以看出,无论 C 的值如何,当 (!A & !B) 时输出为真,当 (!A & B & !C) 时输出也为真。

        因此函数可以写成: D = (!A & !B) 或 (!A & B & !C)

        另一种解决方案是: D = (!A & !C) 或 (!A & !B & C)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-06
          • 1970-01-01
          • 2015-06-16
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多