tariel.ge › Полезное: бесплатные книги › Логические элементы: от электроники до…Бесплатно · автор Тариел Бежанидзе
← Учебник по логическим элементам ЛИСТ 19БЛОК 4 — ЛОГИКА В ПРОГРАММИРОВАНИИРЕВ. 1
Глава 19 · Логика в программировании

Законы Де Моргана — упрощение сложных условий

Тот же закон, что ещё в главе 10 позволил построить ИЛИ из одних только NAND-элементов, — здесь применяется к запутанному условию в коде, а не к схеме из микросхем.

Recap формулировки из главы 03

НЕ(A И B) = (НЕ A) ИЛИ (НЕ B), и симметрично: НЕ(A ИЛИ B) = (НЕ A) И (НЕ B). Отрицание составного условия распределяется на каждую часть по отдельности, с обязательной сменой И на ИЛИ (и наоборот).

Практический пример: неудобное для чтения условие

# исходное, менее читаемое
if not (is_admin and is_active):
  deny_access()
# эквивалентно, по закону Де Моргана, часто читается яснее
if not is_admin or not is_active:
  deny_access()

Оба варианта строго эквивалентны по результату — какой из них яснее, зависит от конкретного контекста и личного стиля чтения кода, но знание закона Де Моргана даёт возможность выбрать более понятную форму осознанно, а не случайно.

Практический паттерн: ранний выход (guard clause)

Частый реальный шаблон — досрочно завершить функцию, если условие для продолжения работы не выполнено. Если исходное условие для продолжения — "пользователь вошёл в систему И имеет разрешение", условие для раннего выхода — инверсия этого составного условия, и здесь закон Де Моргана нужен, чтобы инвертировать его правильно:

# хотим выйти, если НЕ (вошёл И есть разрешение)
# по Де Моргану: НЕ вошёл ИЛИ НЕ разрешение
if not user_logged_in or not has_permission:
  return

Частая ошибка: инверсия без правильного применения закона

Наивная, но неверная инверсия

Инвертируя условие "A ИЛИ B" наивно, легко ошибочно написать "НЕ A И НЕ B" — что на самом деле верно! Но обратная ошибка встречается чаще: инвертируя "A И B", легко по инерции написать "НЕ A И НЕ B" (сохранив И вместо смены на ИЛИ) — это уже неверно. Правильная инверсия "A И B" — именно "НЕ A ИЛИ НЕ B", со сменой оператора, а не механическим добавлением НЕ к каждой части при сохранении исходного И/ИЛИ между ними.

Прямая связь со схемотехникой из главы 10

Тот же самый закон, применённый здесь к строке кода, буквально позволил вывести элемент ИЛИ из одних только элементов NAND в главе 10 — не похожий, а буквально тот же математический инструмент, применённый в двух совершенно разных областях: физической схеме и тексте программы.

Практическое упражнение

Инвертируй правильно

Дано условие: "продолжить, если файл существует ИЛИ у пользователя есть права на создание". Запиши условие для раннего выхода (когда продолжать не следует), правильно применив закон Де Моргана.

Ответ: исходное — "существует ИЛИ есть права", инверсия по Де Моргану — "НЕ существует И НЕТ прав" — выйти нужно, только если оба условия одновременно ложны.

Что дальше

Финальная глава этого блока — логика в базах данных: как те же И/ИЛИ/НЕ работают в условиях WHERE и логике JOIN при работе с данными.

Глава19 — Законы Де Моргана в коде
Блок4 — Логика в программировании
Далее20 — Логика в базах данных
СтатусГотово · рев. 1
Предыдущая глава ← 18 · Условные конструкции if/else Следующая глава 20 · Логика в базах данных →

Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.