Какой смысл в программировании, помимо И / ИЛИ / НЕ, от других логических операторов?

Я программировал почти всю свою жизнь (около 20 с лишним лет), и я не думаю, что могу вспомнить хотя бы один раз, когда я смотрел на if-выражение и думал: «Хммм, это было бы хорошее время, чтобы используйте XOR ". Вся вселенная логического программирования, кажется, вращается только вокруг этих трех.

Конечно, с логическими элементами И / ИЛИ / НЕ вы можете сделать любое другое логическое утверждение. Однако может быть время, когда вам может сэкономить немного кода, чтобы объединить два или три оператора в один логический оператор. Давайте рассмотрим 16 возможных комбинаций логических связок:

  1. ЛОЖЬ = противоречие = 0, ноль, НЕ ИСТИНА
  2. ИСТИНА = тавтология = 1, НЕ ЛОЖЬ
  3. X = Предложение X = X
  4. НЕ X = отрицание X =! X
  5. Y = Предложение Y = Y
  6. НЕ Y = отрицание Y =! Y
  7. X AND Y = соединение = NOT (X NAND Y)
  8. X NAND Y = Альтернативный отказ = NOT (X AND Y),! X OR! Y
  9. X ИЛИ Y = Дизъюнкция = НЕ (! X И! Y)
  10. X ИЛИ Y = Совместное отрицание = НЕ (X ИЛИ Y),! X И! Y
  11. X ⊅ Y = Материальное отсутствие импликации = X AND! Y, НЕ (! X OR Y), (X XOR Y) AND X, ???
  12. X ⊃ Y = Материальное значение =! X OR Y, НЕ (X AND! Y), (X XNOR Y) OR X, ???
  13. X ⊄ Y = Обратное Неимпликация =! X AND Y, НЕ (X OR! Y), (X XOR Y) AND Y, ???
  14. X ⊂ Y = обратное следствие = X OR! Y, NOT (! X AND Y), (X XNOR Y) OR Y, ???
  15. X XOR Y = Исключительная дизъюнкция = NOT (X IFF Y), NOT (X XNOR Y), X! = Y
  16. X XNOR Y = Двуусловное = X IFF Y, NOT (X XOR Y),! X AND! Y

Итак, пункты 1-2 включают нулевые переменные, пункты 3-6 включают одну, а пункты 7-10 - это термины, с которыми мы знакомы. (Хотя обычно у нас нет оператора NAND, но, по крайней мере, в Perl есть «если» для универсального НЕ.)

Пункты 11-14 кажутся интересными, но я никогда не видел их в программировании. Пункты 15-16 - это XOR / XNOR.

Можно ли использовать что-либо из этого для упрощения И / ИЛИ / НЕ? Если да, то вы ими пользовались?

ОБНОВЛЕНИЕ: «Не равно» или! = действительно XOR, который используется постоянно. Итак, XOR все-таки используется.


person SineSwiper    schedule 28.09.2011    source источник
comment
Можно ли использовать что-либо из этого для упрощения И / ИЛИ / НЕ? Ты смеешься? Посмотрите на правую часть вашего списка. Теперь посмотрите налево. Сделанный.   -  person RBarryYoung    schedule 28.09.2011
comment
И как бы то ни было, эти операторы чаще всего используются для функций побитового маскирования, а не для логического / условного упрощения.   -  person RBarryYoung    schedule 28.09.2011
comment
Ты шутишь? Посмотрите на правую часть вашего списка. Теперь посмотрите налево. Готово. Да, но я говорю практически. XOR - это единственная другая функция, доступная в программировании, и, опять же, я никогда не видел места, где ее можно было бы использовать. Большинство моих сложных логических утверждений включают несколько разных переменных, которые здесь не применимы.   -  person SineSwiper    schedule 28.09.2011
comment
Ты смеешься? Посмотрите на правую часть вашего списка. Теперь посмотрите налево. Сделанный. - это тоже была моя первая реакция. Интересно, не понимаем ли мы, что он имеет в виду на практике.   -  person Patrick87    schedule 28.09.2011
comment
Практично, как в реальных примерах. Просто кажется странным, что у нас есть все эти разные логические вентили, а на самом деле мы используем только три.   -  person SineSwiper    schedule 29.09.2011
comment
На этот аналогичный вопрос есть действительно интересный ответ. : XOR совпадает с! =. Логично, что это подходит. Мы действительно использовали это, но никогда не знали об этом.   -  person SineSwiper    schedule 29.09.2011


Ответы (5)


Собираюсь закрыть этот вопрос после того, как Not Equals / XOR. Из 16 возможных операторов программисты используют 9 из них:

FALSE, TRUE, X, Y, !X, !Y, AND (or ==), OR, XOR (or !=)

Все остальные операторы обычно не существуют в языках программирования:

X NAND Y = Alternative Denial = NOT (X AND Y), !X OR !Y
X NOR Y = Joint Denial = NOT (X OR Y), !X AND !Y
X ⊅ Y = Material Nonimplication = X AND !Y, NOT(!X OR Y), (X XOR Y) AND X, ???
X ⊃ Y = Material Implication = !X OR Y, NOT(X AND !Y), (X XNOR Y) OR X, ???
X ⊄ Y = Converse Nonimplication = !X AND Y, NOT(X OR !Y), (X XOR Y) AND Y, ???
X ⊂ Y = Converse Implication = X OR !Y, NOT(!X AND Y), (X XNOR Y) OR Y, ???
X XNOR Y = Biconditional = X IFF Y, NOT (X XOR Y), !X AND !Y

Возможно, позже для них найдется место, потому что NAND / NOR кажется довольно удобным и более чистым, чем ввод NOT (X xxx Y).

person SineSwiper    schedule 29.09.2011

Учти это:

  if(an odd number of conditions are true) then return 1 else return 0

Используя и / или / нет, вы можете попробовать

  if(one is true || three are true || ... 2n+1 are true) then return 1 else return 0

Это довольно уродливо, потому что вам приходится указывать каждый из наборов 1, 3, 5, ..., 2n + 1, которые являются подмножествами набора ваших условий. Хотя версия XOR довольно элегантна ...

  if(C1 XOR C2 XOR ... XOR CN) then return 1 else return 0

Для большого или переменного N это, вероятно, лучше обрабатывать с помощью системы цикла и счетчика, но когда N не слишком велико (~ 10), и вы еще не сохраняете условия в виде массива, это не очень плохо. Аналогично работает для проверки четного числа условий.

Вы можете придумать аналогичные примеры и для других. Интересным упражнением было бы попробовать запрограммировать что-нибудь вроде

  if((A && !B) || (!A && B)) then return 1 else return 0

И посмотрите, испускает ли компилятор язык ассемблера для операторов AND, OR и NOT, или он достаточно умен, чтобы распознать, что это XOR, и на основе этого выдает (возможно, более дешевую) инструкцию XOR.

person Patrick87    schedule 28.09.2011

При программировании на java я обычно использую следующие логические функции:

  • не !
  • и &&
  • or ||
  • xnor ==
  • xor !=,

распространяя это на другие основные функции:

  • материальное значение A || !B
  • обратное значение !A || B
  • материальное неприкрытие !A && B
  • обратное неимпликация A && !B

Знание того, когда использовать xor и xnor, сводится к упрощению логики. В общем, когда у вас сложная функция:

1) упростить до CNF («конъюнктивная нормальная форма», также известная как «сумма над произведением») или DNF («дизъюнктивная нормальная форма», также известная как «произведение над суммой»). *

2) удалить лишние термины _10 _, _ 11_ -> A

2) упростить _13 _, _ 14_ -> A == B

3) упростить _16 _, _ 17_ -> A != B

Использование этих трех упрощений может привести к гораздо более чистому коду с использованием функций xor и xnor.

* Следует отметить, что логическая функция может быть намного проще в DNF, чем CNF, или наоборот.

person Brett Yarberry    schedule 03.11.2015

«Пункты 11–14 кажутся интересными, но я никогда не видел их в программировании».
Я не согласен. пункт 12, «Влияние материала» - это, по сути, оператор «ЕСЛИ», он присутствует везде в программировании. Я вижу материальное значение так же, как:

 if(A) {
    return B
 }
person tao chen    schedule 14.01.2019

Существенный вариант использования без импликации / абъюнкции

Теперь у меня есть пример, в котором я хотел бы выполнить материальное непереполнение / отречение.

Таблица правды

╔═══╦═══╦══════════╗
║ P ║ Q ║ P -/-> Q ║
╠═══╬═══╬══════════╣
║ T ║ T ║ F        ║
║ T ║ F ║ T        ║ <-- all I care about. True followed by false.
║ F ║ T ║ F        ║
║ F ║ F ║ F        ║
╚═══╩═══╩══════════╝

Я имею дело с несколькими разрешениями (все, к счастью, _2 _ / _ 3_) для нескольких сущностей одновременно, и у меня есть ситуация с ролями и правами, когда я хочу увидеть, может ли системный пользователь изменить разрешения другого пользователя. Та же операция выполняется сразу для всех сущностей.

Во-первых, мне нужна разница между старым состоянием разрешений объекта и новым общепринятым состоянием разрешений для всех объектов.

Затем я хочу сравнить эту дельту с правами на изменение текущего пользователя для этой конкретной сущности.

  • Меня не волнуют разрешения, в которых дельта не требует изменения.
  • Мне нужен только true флаг, когда действие должно быть заблокировано.

Пример

before:          10001
proposed after:  11001
delta:           01000 <<< I want a material nonimplication...
user rights      10101 <<< ... between these two...
blocked actions: 01000 <<< ... to produce this flag set

Прямо сейчас я просто делаю XOR, а затем AND, что одно и то же.

Какой-то код пахнет тем, что есть более простой способ провести сравнение, но, по крайней мере, в этой невероятно скучной пошаговой логике было бы неплохо иметь этот оператор.

person ruffin    schedule 09.02.2021