Законы де Моргана с примерами Java (DeMorgan’s Laws)

Правила де Моргана были названы в честь шотландского математика XIX века Огастеса де Моргана. Использование законов полезно для решения логических вопросов в программировании, оптимизации и упрощения логических операций.

Законы де Моргана (DeMorgan’s Laws)

Правила де Моргана помогают разобраться как оператор отрицания НЕ NOT (!) может быть использован в сложных логических операциях. Вкратце, они могут быть представлены в виде следующих определений:
— Отрицание конъюнкции есть не что иное, как дизъюнкция отрицаний (НЕ (a И b) совпадает с (НЕ a) ИЛИ (НЕ b). В Java !(A && B) == !A || !B
— Отрицание дизъюнкции есть не что иное, как конъюнкция отрицаний (НЕ (a ИЛИ b) совпадает с (НЕ a) И (НЕ b)). В Java !(A || B) == !A && !B

Диаграммы Венна. Закон де Моргана: отрицание конъюнкции есть не что иное, как дизъюнкция отрицаний

Примеры преобразования

Ниже представлены некоторые популярные интерпретации закона де Моргана, в которых A и B представляют булевые значения, C и D — числовые и E и F — любые типы данных.
1. !(A && B) равно !A || !B
2. !(A || B) равно !A && !B
3. !(C > D) равно C <= D
4. !(C < D) равно C >= D
5. !(C >= D) равно C < D
6. !(C <= D) равно C > D
7. !(E == F) равно E != F
8. !(E != F) равно E == F

Заметка: нет необходимости ограничиваться двумя операндами при работе с оператором «И» и «ИЛИ». К примеру ! (A && B && C) совпадает с !A || !B || !C.

Примеры Java

Применение закона де Моргана к выражению !(x < 7 && y > 5) означает, что согласно п.1 и приведенной выше диаграмме Венна оно будет равно !(x < 7) || !(y > 5) (п.1), или воспользовавшись п.3 выражение принимает вид (x >= 7 || y <= 5)
Для отрицания дизъюнкции !(x < 7 || y > 5) выражение примет вид !(x < 7) && !(y > 5), преобразовав его далее получим результат (x >= 7 && y <= 5).

Пересекаются ли отрезки дат во времени?

Используем закон де Моргана, чтобы определить пересекаются ли два периода дат во времени.
Представим 2 варианта, когда периоды А и B не пересекаются во времени:

  1. Период A идет перед периодом B, тогда должно исполняться условие (КонецA < НачалоB)

|——Период A ——|                                       _

_                                         |—— Период B  ——| 

  1. Период A идет после периода B, тогда должно исполняться условие  (НачалоA > КонецB)

_                                       |—— Период A ——| 

|——Период B ——|                                           _

Для того чтобы 2 даты пересекались необходимо чтобы одно из 2- предыдущих условий не выполнялось, таким образом можно составить логическое выражение
!((КонецA < НачалоB) || (НачалоA > КонецB))
что при преобразовании законом де Моргана (п.2) дает результат
!(КонецA < НачалоB) && !(НачалоA > КонецB)
В итоге согласно п.3 и п.4
(КонецA >=НачалоB) && (НачалоA < = КонецB)

One thought on “Законы де Моргана с примерами Java (DeMorgan’s Laws)”

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

два × 4 =