Чи є ключове слово чи оператор для "ні"?


56

Чи є еквівалент оператора ні ? Наприклад, мій улюблений колір - ні зелений, ні синій.

І код був би еквівалентний:

// example one
if (color!="green" && color!="blue") { 

}

// example two
if (x nor y) {
    // x is false and y is false
}

12
Ні, тому що у нас вже є orі через те !, що подвійні негативи рідко використовуються - більшість людей вважають їх особливо важкими для читання.
Кіліан Фот

70
@KilianFoth має рацію. Тим не менш, голоси повинні бути для поганих питань, а не для питань, які нам не подобаються. Крім того, є вже три голоси, щоб закрити питання, оскільки це було б "на основі думки", незважаючи на те, що це абсолютно нейтрально і не суперечливо (або такі оператори є якоюсь екзотичною мовою, або їх немає).
Крістоф

3
Чи є для нього назва? Так: ні. Це оператор? Якою мовою? І з урахуванням мови ви можете це переглянути в специфікаціях / документах.
jonrsharpe

9
@Troyer Ваш коментар демонструє проблему: ви помилилися з логікою. ;) Це не еквівалентно нормі.
jpmc26

3
У мовах з більшою кількістю операторів це буде (наприклад, у python)color not in ['green', 'blue']
Ізката

Відповіді:


72

Хоча основні мови не мають спеціальних операторів NOR та NAND, деякі менш відомі мови (наприклад, деякі мови для гольфу). Наприклад, APL має і для NOR, і для NAND відповідно.

Ще один клас прикладів можна знайти в мовах дизайну апаратних засобів, таких як VHDL , Verilog і т.д. ворота, що є однією з причин того, що мови дизайну апаратних засобів, як правило, включають їх; Ще одна причина полягає в тому, що вони можуть бути корисними для певних хитрощів.


40
APL не є мовою для гольфу , а швидше орієнтованою на масив мовою, яка дозволяє інтерактивно розвивати повнотекстові багатопарадигмічні програми з промисловою силою.
Adám


6
@EricDuminil :-) Це все правда.
Адам

20
@EricDuminil Ні, справді. APL не є мовою для гольфу, це практична мова, яка, здається, є хорошою в гольфі. Perl подібний у цьому плані, ні?
Павло

13
ОП насправді не сказала, що APL - мова для гольфу, btw.
Буде Кроуфорд

46

Ні, немає жодного norоператора жодної мови програмування на високому рівні.

Чому?

Головним чином тому, що важко читати:

  • воно вимагає розумового поєднання декількох операторів (" і не ", або в більш літературному стилі: " подальший негатив ", " кожна неправда " )
  • це передбачає неявне notна перший операнд, але читач розуміє це лише згодом
  • він відрізняється від людських мов, які використовують явний заперечення на першому операнді, такі як " ні х, ні у ", " ні х ні у ". Таким чином, читач може сплутати (x nor y)з (x and not y)замість((not x) and (not y))
  • деякі читачі плутають із очевидною orсемантикою, яка не застосовується

Але це так часто в апараті ...

norце елементарний апаратний ворота, який можна використовувати для створення всіх інших логічних воріт. Отже, можна стверджувати, що всі інші логічні оператори - це комбінації і norє найпростішим елементарним логічним оператором.

Однак те, що стосується обладнання, не обов'язково стосується людей. І незважаючи на свою популярність на апаратному рівні, деякі основні процесори навіть не пропонують NORу своєму наборі інструкцій асемблера (наприклад, x86 ).

Альтернативи

Читання має значення. А іноді це можна вдосконалити іншими засобами.

Використання існуючих операторів

Наприклад:

if x not in [1,2]    // use of 'in' or 'not in' operator instead of x!=1 and x!=2

Впорядкування умов

if x==1 or x==2 
     action A
else 
     action B  

замість

if x!=1 and x!=2 
    action B
else 
    action A

Використання до циклу

Деякі мови також пропонують вказівки щодо циклу, які дозволяють виражати умови з whileабо за допомогою until, дозволяючи вибирати більш "позитивний" спосіб. Ці інструкції, наприклад , until c do ...в рубін , do until c ...в VB , або repeat ... until cв паскале і його нащадків.

Наприклад:

Until (x==1 or x==2) do
     ...

еквівалентно:

While (x!=1 and x!=2)
    ...

Зробіть функцію

Тепер, якщо ви все ще віддаєте перевагу norсинтаксису, ви можете визначити функцію, але лише якщо ви не очікуєте, що це станеться ярликом:

If ( nor(x,y) )   // attention, x and y will always be evaluated
    ...  

Є перевага функції читабельності над оператором, оскільки читач одразу розуміє, що заперечення стосується всіх аргументів. У деяких мовах можна визначити функцію зі змінною кількістю аргументів.


5
Смішно, я зазвичай пишу, що оскільки while (not (x == 1 or x == 2))мені здається, що x != 1 and x != 2версію важко читати, і вважаю, що "x не є ні 1, ні 2" набагато простіше обробляти, ніж "x не 1, а x не 2".
Mael

1
@Baldrickk ти можеш детальніше розібратися?
СподіваюсьДопомога

4
@HopefullyHelpful Repeat... Untilзавжди виконує тіло циклу хоча б один раз. Якщо x дорівнює 1, тіло циклу все ще виконується, але не повторюється. WhileЦикл не виконуватиметься тіло в цьому випадку.
сина

2
@Baldrickk так, ви абсолютно праві. Коли я пишу еквівалент, я говорив лише про стан циклу, оскільки булеві оператори були предметом питання. Дякую, я переформулюю це для уточнення
Крістоф

3
Ширше х і у nor(x,y)завжди оцінюється, залежить від мови та способу nor()реалізації. Є мови (D, Io, ...), де викликана функція може вирішити, чи і коли оцінювати аргументи.
BlackJack

18

@ KilianFoth коментар до цього питання знаходиться на місці.

Ви можете синтезувати norз notта or:

if (x nor y)

точно так само, як

if (not (x or y))

Представлення norв якості окремого оператора введе би надлишки до мови, яка ні потрібна, ні потрібна (або - яка не потрібна і не потрібна).

Крім того , я не знаю ні одного мови , що має nandоператор - ймовірно , тому , що він може бути синтезований з notі andоператорів.

Теоретично ви могли б створити мову лише з nandлише norоператорами. Все and, orі notможе потім synthesied з них. Єдина проблема полягає в тому, що це було б смішно громіздким. Наприклад, див. Логіку NOR та логіку NAND у Вікіпедії.


4
Звільнення може бути також не потрібним чи розшукуваним :)
Дейв

@Dave Цей каламбур був призначений, радий бачити, що ви помітили ;-)
Mael

5
Самі надмірності не пояснюють, чому norвона не включається. В іншому випадку, чому мови andі or? Вони зайві, завдяки Де Морган. Насправді, ви могли б замінити всі три звичайні логічні оператори ( and, or, not), надаючи тільки nor , як ви слушно зауважили.
Конрад Рудольф

1
@KonradRudolph Технічно все, що вам потрібно, - це лямбда-оператор . Причина, по якій ми робимо більше, - відповідати ментальній моделі більшості програмістів. Більшість програмістів думають про логіку з точки зору and, orі not- адже саме цим користується більшість людських мов. Після того, як ви співставите ментальну модель та / або / ні, то ні & нанд не стане зайвим. Їх надмірність закодована навіть у їхніх назвах: "n (ot) та" і "n (ot) або". Якби у нас були виразні, раніше існуючі англійські терміни для них, а не просто синтезовані, ви, мабуть, бачили їх частіше.
RM

1
Re надмірність в якості аргументу: Є мови з більш ніж not, and, or. Наприклад, деякі діалекти BASIC (GW-BASIC, QuickBASIC,…) мають ексклюзивний або XOR, імплікаційний IMP (→ NOT (x XOR y)) та еквівалентність EQV (→ NOT (x) OR y) як додаткові оператори.
BlackJack

11

Так, APL та деякі його діалекти не мають ніnand ). В APL, ні позначається (так як це , або і ~це НЕ ):

 resultExampleOne color
  :If (color'green')⍱(color'blue')
      result'warm'
  :Else
      result'cold'
  :EndIf


 resultExampleTwo(x y)
  :If xy
      result'x is false and y is false'
  :Else
      result'at least one of them is true'
  :EndIf

Спробуйте в Інтернеті!


10

Ця відповідь є мовою асемблера для комп’ютера, виготовленого в середині 1960-х. Це досить незрозуміло, але в деяких відношеннях воно вирішує ваше питання.

DEC (Digital Equipment Corporation) запустила комп'ютер PDP-6 в середині 1960-х. Ця машина мала загальну кількість 64 інструкцій, які були булевими операціями на двох операндах (включаючи деякі вироджені випадки). Ці 64 інструкції справді були 16 операторами з 4 варіантами в кожному операторі.

Два оператори, ANDCB і ORCB, реалізували відповідно NOR і NAND (якщо я не змішаний за логікою подвійного від'ємника). Ви можете побачити таблицю з кодом . Таблиця опкодів насправді для комп'ютера PDP-10, який є наступником PDP-6.

Якщо подивитися на числову інструкцію у двійковій формі, вона стане цікавішою. Виявляється, що для всіх опкодів у діапазоні 400-477 (восьмеричний) чотири біти в самій інструкції дають чотирибітну таблицю правдивості для 16 можливих булевих операторів. Деякі з цих операторів ігнорують один або обидва входи. Наприклад, SETZ та SETO ігнорують обидва входи.

Дизайнери PDP-6 використали цей факт, щоб реалізувати всі ці вказівки з меншою логікою, ніж знадобиться для реалізації лише деяких з них. Деякі з цих інструкцій з'являються рідко, якщо взагалі, в коді мови збірки. Але всі вони там були.

Отже ANDCB - еквівалент NOR. (знову ж таки, якщо я не повернув свою логіку, в цьому випадку ORCB - еквівалент).


3

У Perl є unlessключове слово, яке дозволяє перетворювати умови:

unless ($color eq 'green' or $color eq 'blue') {
    # code
}

Хоча це не оператор NOR, ви можете висловити свої наміри аналогічним чином.


3

norОператор , як ви описали це не буде повторювані, що неминуче призведе до великої кількості важко виявити помилки.

Ваш "Приклад 2" по суті такий:

if (false nor false) {
becomes
if (true) {

Але спробуйте це знову з трьома змінними і подивіться, що станеться:

if (false nor false nor false) {
becomes
if ((false nor false) nor false) {
becomes
if (true nor false) {
becomes
if (false) {
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.