什么!a &&(a || b)简化为?

And*_*ndy 24 language-agnostic boolean-logic

我有点困惑!a&&(a||b).如果我直接看它并简单地解释它,它看起来好像是一样的

!a&&a or !a&&b
Run Code Online (Sandbox Code Playgroud)

但这似乎有点奇怪,因为既然a不可能是真实的,那么只有后者是真的才会成真.我也像这样解释它

!a || a&&b
Run Code Online (Sandbox Code Playgroud)

我真的不知道我是如何想出这个,但它看起来更合乎逻辑,因为没有矛盾.有人可以帮我吗?

Luk*_*sko 43

重言式表

 | a | b | !a | a || b |  !a && (a || b)  | !a && b | [ !a && (a || b) ] <=> [!a && b]    |
 |---|---|----|--------|------------------|---------|-------------------------------------|
 | 0 | 0 |  1 |   0    |      0           |    0    |                   1                 |
 | 0 | 1 |  1 |   1    |      1           |    1    |                   1                 |
 | 1 | 0 |  0 |   1    |      0           |    0    |                   1                 |
 | 1 | 1 |  0 |   1    |      0           |    0    |                   1                 |
Run Code Online (Sandbox Code Playgroud)

"证明"

  1. 根据分配原则声明!a && (a || b)相当于(!a && a) || (!a && b).
  2. 按照"非矛盾法" (!a && a)相当于false
  3. 把它们放在一起:

    !a && (a || b) <=> (!a && a) || (!a && b) <=> false || (!a && b) <=> !a && b

  • 是的,<=>代表等价(换句话说就是双向含义) (6认同)

sol*_*4me 12

您可以像这样简化它,(!a && b)因为在表达式(!a && a || !a && b)中条件!a && a始终为false


Syl*_*oux 11

在Java中,与大多数 1种语言一样,一元的!优先级高于&&.

所以,!a&&(a||b) (!a)&&(a||b)

您可以使用卡诺图来表示该表达式的真值表:

      | a = 0 | a = 1 |
------+-------+-------+
b = 0 |   0   |   0   |
------+-------+-------+
b = 1 |   1   |   0   |
------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

现在,可以很容易地看出,唯一真实的情况是何时(!a) && b.

所以,!a&&(a||b) !a && b


1 见下面的评论.

  • @Bergi是的,有一种语言,类似于:APL(在IBM系统上实现的时候).实际上根本没有优先权 - 一切都是从右到左.所以`!A && B`实际上会被解释为`!(A && B)`,而不是`(!A)&& B`.(APL并没有将这些符号用于运算符;我不记得实际的符号是什么,但可能是某些普通键盘上没有的符号.) (3认同)
  • 我*从未*看过一种语言,其中`NOT`的优先级低于`AND`或`OR`.你呢? (2认同)

imt*_*man 6

它只是意味着!a && b,必须是假的,而b必须是真的,因为它是真的