当我将 NOT 与 AND 和 OR 一起使用时,我无法真正理解布尔逻辑

问题描述 投票:0回答:5

我试图理解当我使用 NOT 时布尔逻辑是如何工作的。举一个使用 awk 的例子

我有一个文本文件包含

CORE
PORT
CORE 
PORT
COREPORT
CORE
COREPORT

我想删除所有 COREPORT 线。我认为我会这样做的方式是(不是核心)和(不是端口)例如

awk '/!CORE/&&/!PORT/{print}'

但是当我尝试时,我实际上应该使用 OR 而不是 AND

awk '/!CORE/||/!PORT/{print}'

如果有人能解释我的想法哪里错了,我会非常高兴,如果可以用维恩图或类似布尔机之类的东西将其可视化,我会非常高兴kathyschrock

awk boolean boolean-logic boolean-expression
5个回答
1
投票

我会尝试给出一种直觉或你的布尔表达式,对于数学,其他海报做得很好。

对于您想要保留的行,您的布尔表达式必须为真。

  • !PORT 表示该行不包含 PORT
  • !CORE 表示该行不包含 CORE

因此,您的布尔表达式意味着保留同时不包含 PORT 和不包含 CORE 的行。显然你的文件中没有这样的行...

你必须使用

or
,因为你真正想要表达的是保留不包含PORT和CORE的行,但正如你所看到的,上面的语句中只有一个否定。你试图说这样的话:线是否包含 PORT,它是否也包含 CORE 那么我不想要它。这就是
!(/CORE/ && /PORT/)
,使用布尔数学你也可以写出
/!CORE/||/!PORT/
,就像你自己看到的那样。

一般而言,负面断言很难理解。我不是唯一这么说的人。例如,Damian Conway 在 Perl Best Practice 中指出了这一点,并建议尽可能使用肯定语句(当您想要否定某个条件时,请使用

unless
Perl 运算符而不是
if
)。


1
投票

你为什么不这样做

awk '/COREPORT/{next}1' file

0
投票

真相表即将推出...

CORE   PORT   !CORE   !PORT   AND(!CORE,!PORT)  OR(!CORE,!PORT)
 T       T      F       F            F                F
 T       F      F       T            F                T
 F       T      T       F            F                T
 F       F      T       T            T                T

0
投票

可视化逻辑的一个好方法是卡诺图

或者,如果您想处理数学表达式,请记住:

  • not (a and b)(not a) or (not b)
  • 相同
  • not (a or b)(not a) and (not b)
  • 相同

实际上,你想要的不是:(不是CORE)和(不是PORT)而是:不是(CORE和PORT),这与:(不是CORE)或(不是PORT)

相同

0
投票

关于 NOR 和 NAND 的快速说明,从 NOR 开始:

not (A or B)

假设如果两个

A
都是
B
代表布尔表达式 OUTCOMES,即
A
/
B
已经在
1 (true) / 0 (false)
中,那么可以用更简短的方法来合并 NOR 表达式会是
A is less than not-B

A < not B

类似地,NAND 表达式如

not (A and B)

可以做成

(not-A)-to-the-power-of-B

(not A)^B

如果您更喜欢算术变体

NAND := A + B < 2

NOR  := A + B < 1

© www.soinside.com 2019 - 2024. All rights reserved.