Перейти к основному содержимому

Логика

Архитектору Инженеру

Логика — наука о формальных правилах корректного рассуждения. В IT она не «философский факультатив», а язык, на котором описывают условия в коде, контракты API, инварианты и требования. Любой if, while или switch — это логическое выражение, записанное синтаксисом языка.

Обзор всего блока: Математическая основа IT.

Два уровня в разработке

УровеньЧто описываетПримеры в практике
Пропозициональная (булева)Целые утверждения: истина или ложьisActive and not isBlocked
ПредикатнаяСвойства объектов с параметрами и кванторамидля всех активных пользователей доступ разрешён

Пропозициональной логики достаточно для ветвлений и рефакторинга условий. Предикатная нужна для спецификаций, SQL WHERE, LINQ-фильтров и формальных методов (TLA+, Alloy).

Логические операции

Отрицание (NOT, ¬)

Инвертирует значение. Инволютивность: ¬(¬A) ≡ A. В коде !flag или not flag; двойное отрицание в JS (!!x) — приведение к boolean, а не логическая необходимость.

Конъюнкция (AND, ∧)

Истина только когда оба операнда истинны: A ∧ B. В коде: &&, and. Свойства: коммутативность, ассоциативность, дистрибутивность относительно OR, идемпотентность A ∧ A ≡ A.

Дизъюнкция (OR, ∨)

Ложь только когда оба ложны. В коде: ||, or. В большинстве языков — short-circuit: второй операнд может не вычисляться (false && f() не вызовет f). Это важно для побочных эффектов и производительности.

Исключающее ИЛИ (XOR, ⊕)

Истина, когда ровно один операнд истинен: A ⊕ B ≡ (A ∨ B) ∧ ¬(A ∧ B). Применение: чётность, сравнение битовых флагов, криптография. В C#/Java есть ^ для целых; отдельного логического XOR в JavaScript нет.

Законы булевой алгебры

  1. Исключённое третье: A ∨ ¬A ≡ истина (в классической логике).
  2. Противоречие: A ∧ ¬A ≡ ложь — нарушение в спецификации = фатальная ошибка модели.
  3. Де Морган:
    • ¬(A ∧ B) ≡ ¬A ∨ ¬B
    • ¬(A ∨ B) ≡ ¬A ∧ ¬B
  4. Поглощение: A ∨ (A ∧ B) ≡ A, A ∧ (A ∨ B) ≡ A.

Типичный рефакторинг:

# было
if not (user.is_blocked or not user.is_active):
...

# стало (де Морган)
if not user.is_blocked and user.is_active:
...

Таблицы истинности

Для n переменных — 2^n строк. Таблица задаёт функцию однозначно и позволяет:

  • проверить эквивалентность двух формул;
  • найти тавтологии (всегда истина) и противоречия;
  • построить набор тестов (каждая строка — вход для покрытия условий).
Таблица истинности

Нормальные формы

  • ДНФ — дизъюнкция конъюнкций литералов: (A ∧ ¬B) ∨ (C ∧ D).
  • КНФ — конъюнкция дизъюнкций: (A ∨ B) ∧ (¬C ∨ D).

Любое булево выражение можно привести к ДНФ или КНФ. Это основа SAT-решателей и формальной верификации.

Предикаты и кванторы

Предикат — функция из предметной области в {истина, ложь}: CanAccess(user, resource), IsEven(n).

КванторЧтениеПример
для всех∀u ∈ Users: u.isActive ⇒ u.canLogin
существует∃file: file.isLocked

Отрицание кванторов (де Морган):

  • ¬(∀x P(x)) ≡ ∃x ¬P(x) — «не все прошли проверку» ⇔ «найдётся хотя бы один непроверенный».
  • ¬(∃x P(x)) ≡ ∀x ¬P(x).

Порядок кванторов важен: ∀x ∃y R(x,y) и ∃y ∀x R(x,y) — разные утверждения.

Связь с кодом и тестами

  • Упрощайте условия алгебраически, сохраняя семантику — меньше веток, выше читаемость.
  • Таблица истинности для 3–4 флагов — честный способ не забыть комбинацию в тестах.
  • Отрицание «для всех» переводите в конструктивное «найти контрпример» — так формулируют проверки безопасности и валидации.

Дальше: Дискретная математика (множества, графы, комбинаторика).


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).