Я не могу по-настоящему обернуться вокруг логической логики, когда использую NOT вместе с AND и OR - PullRequest
2 голосов
/ 29 апреля 2010

Я пытаюсь понять, как работает логическая логика, когда я использую НЕ. Чтобы привести пример, используя awk

У меня есть текстовый файл, содержащий

CORE
PORT
CORE 
PORT
COREPORT
CORE
COREPORT

И я хотел бы удалить все строки COREPORT. Я думал, что сделаю это с (НЕ ЯДРОМ) И (НЕ ПОРТОМ), например

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

Но когда я попробую, я действительно должен использовать ИЛИ вместо AND

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

Я был бы очень рад, если бы кто-то мог объяснить, где мое мышление неверно, и очень рад, если бы его можно было визуализировать с помощью диаграммы Венна или чего-то вроде булевой машины в kathyschrock

Ответы [ 4 ]

1 голос
/ 30 апреля 2010

почему бы тебе не сделать это так

awk '/COREPORT/{next}1' file
1 голос
/ 29 апреля 2010

Я постараюсь дать интуитивное чувство или ваше логическое выражение, потому что по математике другие авторы делали это очень хорошо.

Ваше логическое выражение должно быть истинным для строк, которые вы хотите сохранить .

  • ! PORT означает, что строка не содержит PORT
  • ! CORE означает, что строка не содержит CORE

Следовательно, ваше логическое выражение означает сохранить строки, которые в то же время не содержат PORT и не содержат CORE. Очевидно, в вашем файле нет таких строк ...

Вы должны использовать or, потому что то, что вы действительно хотите выразить, это сохранить строки, которые не содержат как PORT, так и CORE, но, как вы можете видеть, в приведенном выше утверждении есть только одно отрицание. Вы пытаетесь сказать что-то вроде: содержит ли строка PORT, содержит ли она также CORE, тогда я этого не хочу. И это !(/CORE/ && /PORT/), и, используя логическую математику, вы также можете написать это /!CORE/||/!PORT/, как вы видели сами.

Вообще говоря, негативные утверждения трудно понять. Я не единственный, кто это говорит. Например, Дамиан Конвей из Perl Best Practice указал на это и рекомендовал использовать положительные выражения всякий раз, когда это возможно (и использовать unless оператор Perl вместо if, если вы хотите отменить условие).

0 голосов
/ 29 апреля 2010

Хороший способ визуализации логики - Карта Карно .

Или, если вы хотите обрабатывать математические выражения, просто запомните:

  • не (а и б) совпадает с (не а) или (не б)
  • не (а или б) совпадает с (не а) и (не б)

На самом деле вы хотите не: (не CORE) и (не PORT) , но: not (CORE и PORT) , что аналогично: ( не CORE) или (не PORT)

0 голосов
/ 29 апреля 2010

Таблица Правды подходит ...

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
...