Чи || і! операторів, достатніх для здійснення всіх можливих логічних виразів?


294

Логічний вираз ( a && b ) (як aі bє логічні значення) може бути записано , як !(!a || !b), наприклад. Чи це не означає, що &&це "нецікаво"? Чи означає це, що всі логічні вирази можна зробити лише за допомогою ||та !?


83
Це скоріше основне символічне логічне питання, ніж питання Java, але так. АБО і НЕ в поєднанні можна використовувати для побудови всього іншого. Те саме з AND і NOT. Наприклад, коли я був у школі, нас вчили будувати все, використовуючи лише ворота NAND, оскільки вони брали менше транзисторів.
azurefrog

79
Не плутайте можливість писати заяву таким чином із бажаністю цього зробити. Синтаксичний цукор - це добра річ.
azurefrog

20
Багато мікросхем логічних воріт забезпечують лише ворота NAND або NOR, оскільки з ними можливо реалізувати всі операції, і це робить їх дешевими для виробництва A and B == !A nor !B == !(!A or !B). Так само A or B == !A nand !B == !(!A and !B). Очевидно передача одного і того ж значення обом входам NAND або NOR дасть такий же результат, як і простий NOT. XOR і XNOR також можливі, але більш складні. Дивіться теорему Де Моргана
Основні

16
Це не питання інформатики? Я не бачу тут коду. Зокрема, чи правильно це на практиці буде залежати від реалізації, наприклад , в C ++ з операційної перевантаження це НЕ в цілому.
Гонки легкості по орбіті

6
@SnakeDoc Я не думаю, що тут хтось виступає за таке. Я вважаю, що це питання було скоріше теоретичним логічним питанням, ніж програмним.
ryuu9187

Відповіді:


425

Так, як вказували інші відповіді, набір операторів, що складається з ||та !є функціонально повним . Ось конструктивний доказ цього, показуючи, як використовувати їх для вираження всіх шістнадцяти можливих логічних сполучників між булевими змінними Aта B:

Зауважте, що і NAND, і NOR самі по собі функціонально завершені (що можна довести, використовуючи той самий метод вище), тому, якщо ви хочете перевірити, що набір операторів функціонально повний, достатньо показати, що ви можете виразити або NAND, або NOR з цим.

Ось графік, що показує діаграми Венна для кожного з перелічених вище сполучників:

введіть тут опис зображення

[ джерело ]


20
Важко сказати, чи має намір питання це, але ця відповідь не стосується поведінки короткого замикання (актуально, оскільки питання задається, ||а не |) або побічних ефектів (актуально, оскільки розширення істинних, хибних, XOR і XNOR оцінюють їх аргументи більше разів, ніж це робив оригінальний константа чи оператор).
Девід Річербі

5
Кола, що містять кола та переходи, утворюють діаграму Hasse ( en.wikipedia.org/wiki/Hasse_diagram ). (Так, сьогодні я дізнався щось нове!)
Каспер ван ден Берг

5
@DavidRicherby Це правда. На відміну від XOR, XNOR, true та false, наскільки я можу сказати, побічні ефекти та кількість оцінок повинні бути такими ж, як і вбудовані еквіваленти (наприклад !(!A || !B), такий же короткий замикання та кількість оцінок, як і A && B). Я не думаю, що ви можете зробити це для XOR і XNOR без додаткових конструкцій (наприклад a ? !b : b), і true або false не є проблемою, якщо ви можете зберегти значення, оскільки ви можете запустити свою програму, визначивши trueі falseвикористовуючи якусь манекенну булеву змінну.
Пітер Олсон

Цікаво зазначити, що перелік вище включає 16 операцій. Це відповідає тому, що існує 16 можливих таблиць істинності для випадку, коли у вас є 2 входи та 1 вихід.
Пол Р

1
Просто хотів додати ще одну візуалізацію як таблицю для довідок людей. Те саме джерело, що і вище.
серпня

125

Те, що ви описуєте, - це функціональна повнота .

Тут описаний набір логічних операторів, достатній для "вираження всіх можливих таблиць істинності". Ваш набір операторів Java, { ||, !}, достатньо; він відповідає набору {∨, ¬}, який перелічено у розділі "Мінімально функціонально завершені набори операторів".

Набір усіх таблиць істинності означає всі можливі набори з 4 булевих значень, які можуть бути результатом операції між двома булевими значеннями. Оскільки для булевих значень є 2 можливі значення, є 2 4 або 16 можливих таблиць істинності.

A B | 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
----+------------------------------------------------
T T | T  T  T  T  T  T  T  T  F  F  F  F  F  F  F  F
T F | T  T  T  T  F  F  F  F  T  T  T  T  F  F  F  F
F T | T  T  F  F  T  T  F  F  T  T  F  F  T  T  F  F 
F F | T  F  T  F  T  F  T  F  T  F  T  F  T  F  T  F

Нижче наведена таблиця з чисел таблиці істинності (0-15), то ||і !комбінацій , які дають його, і опис.

Table  |  Operation(s)                    | Description
-------+----------------------------------+-------------
  0    | A || !A                          | TRUE
  1    | A || B                           | OR
  2    | A || !B                          | B IMPLIES A
  3    | A                                | A
  4    | !A || B                          | A IMPLIES B
  5    | B                                | B
  6    | !(!A || !B) || !(A || B)         | XNOR (equals)
  7    | !(!A || !B)                      | AND
  8    | !A || !B                         | NAND
  9    | !(A || !B) || !(!A || B)         | XOR
 10    | !B                               | NOT B
 11    | !(!A || B)                       | NOT A IMPLIES B
 12    | !A                               | NOT A
 13    | !(A || !B)                       | NOT B IMPLIES A
 14    | !(A || B)                        | NOR
 15    | !(A || !A)                       | FALSE

Існує безліч інших таких функціонально повних наборів, включаючи набори одного елемента {NAND} і {NOR}, які не мають відповідних одиночних операторів на Java.


4
+1 для редагування Незважаючи на різницю підрахунків голосів, я думаю, що ваша відповідь насправді більш детальна, ніж моя зараз.
Пітер Олсон

Таблиці правди, я думав, що залишив їх після першого курсу в університеті
Barkermn01,

80

Так.

Всі логічні ворота можуть бути зроблені з воріт NOR.

Оскільки ворота NOR можуть бути зроблені з NOT та OR, результат випливає наступним чином.


64
Ворота @PaulDraper або NAND
slebetman

25
Щоб висадити двох людей на Місяць, знадобилося 4100 воріт NOR.
Ганс Пасант

4
@HansPassant І рядок. Багато рядків. (Основна пам'ять мотузки, а не олово може сортувати.)
CVn

3
@HansPassant Іноді я хочу, щоб обмін стеками був Вікіпедією, тоді я би вставив [citation-needed]позначку прямо там.
Саймон Форсберг


64

Знайдіть час, щоб прочитати закони DeMorgan, якщо можете.

Відповідь ви знайдете в прочитаному там же, а також посилання на логічні докази.

Але по суті, відповідь - так.

EDIT : Щодо ясності, я можу сказати, що з логічного виразу можна вивести ІЛИ вираз І, і навпаки. Існує і більше законів для логічної еквівалентності та умовиводу, але я вважаю, що це найбільше підходить.


EDIT 2 : Ось доказ через таблицю істинності, що показує логічну еквівалентність наступного виразу.

Закон ДеМоргана: !(!A || !B) -> A && B

 _____________________________________________________
| А | Б | ! A | ! Б | ! A || ! Б | ! (! A ||! B) | A&& B |
-------------------------------------------------- -----
| 0 | 0 | 1 | 1 | 1 | 0 | 0 |
-------------------------------------------------- -----
| 0 | 1 | 1 | 0 | 1 | 0 | 0 |
-------------------------------------------------- -----
| 1 | 0 | 0 | 1 | 1 | 0 | 0 |
-------------------------------------------------- -----
| 1 | 1 | 0 | 0 | 0 | 1 | 1 |
_______________________________________________________

19
Деяким людям доведеться відмовитися від голосування як частину їх "функціональної повноти"
Джессі

3
При + 27 / -2 я б не хвилювався з приводу бродячого потоку.
CVn

2
@ MichaelKjörling Мені просто цікаво, чому деякі люди вважали, що моя відповідь не корисна / шкідлива.
ryuu9187

3
Як правило, відповіді, які покладаються на посилання, не надто подобаються (оскільки посилання вмирають), але в цьому випадку існує стільки альтернативних пояснень Законів DeMorgan, що я не бачу проблеми - все-таки, це я здогадуюсь щодо DV
користувач2813274

@ user2813274 Дякую за пояснення. Сподіваюся, мої зміни допоможуть усунути розрив між особистими дослідженнями та отриманням відповіді.
ryuu9187

11

NAND і NOR є універсальними, їх можна використовувати для створення будь-якої логічної операції, яку ви хочете в будь-якому місці; Інші оператори доступні на мовах програмування для полегшення запису та створення читабельних кодів.

Крім того, всі логічні операції, які необхідні для з'єднання в ланцюзі, також розроблені, використовуючи або ІС NAND, або NOR тільки.


10

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

https://en.wikipedia.org/wiki/Canonical_normal_form

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