Перейти к содержанию

Лекция 3–4. Логические основы алгоритмизации (Boolean Logic)

В тексте лекции для обозначения логических операций используются не математические символы, а символы из языков программирования.

Логика — наука о формах и способах мышления (первые учения — Древний Восток).

Начало исследований в области формальной логики было положено Аристотелем в IV в. до н. э. Однако математические подходы к этим вопросам были впервые указаны Джорджем Булем, который положил в основу математической логики алгебру логики (булеву; логические значения называют булевыми). Алгебра логики используется при построении основных узлов ЭВМ (шифратор, сумматор и др.).

Основными формами мышления являются понятие, высказывание и умозаключение.

  • Понятие — форма мышления, фиксирующая основные, существенные признаки объекта (например, прямоугольник, компьютер).
  • Умозаключение — форма мышления, с помощью которой из одного или нескольких суждений может быть получено новое суждение — заключение (например, все углы равнобедренного треугольника равны → треугольник равносторонний).

Составляющей алгоритмов являются логические условия, вычисление значений которых происходит в соответствии с аксиомами алгебры логики.

Высказывания

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

Высказыванием называется утверждение, о котором можно определённо сказать, истинно оно или ложно. Высказываний одновременно истинных и ложных не бывает.

Примеры высказываний:

  1. Москва — столица России.
  2. Число 27 является простым.
  3. Волга впадает в Каспийское море.

Высказывания 1 и 3 истинные. Высказывание 2 — ложное (27 = 3·3·3 — составное).

Следующие предложения высказываниями не являются:

  1. Давай пойдём гулять.
  2. 2·x > 8.
  3. a·x² + b·x + c = 0.
  4. Который час?

Отличительный признак высказывания — свойство быть истинным или ложным. Невозможно отнести неравенство (2) или уравнение (3) к высказываниям, пока не определено значение x. При x = 3 высказывание 2·3 > 8 ложно, при x = 52·5 > 8 — истинно.

Условимся обозначать высказывания большими буквами и, следуя Джорджу Булю, истинное (true) высказывание A обозначим A = 1. В случае, когда A ложное (false), будем писать A = 0.

Функция f(x₁, x₂, …, xₙ) называется логической или булевой, если она, так же как и её аргументы xᵢ, может принимать только два значения: «истина» или «ложь». По числу переменных различают логические функции одной, двух и многих переменных.

Логические функции могут быть описаны различными способами:

  • в виде таблицы истинности;
  • совершенными нормальными формами;
  • в виде формулы.

Чаще всего используются табличная форма представления (таблица истинности) и аналитическое представление (например, в виде дизъюнктивных или конъюнктивных форм).

Из простых высказываний можно строить составные, соединяя простые логическими операциями. Над простыми высказываниями определены:

  1. логическое отрицание (NOT);
  2. логическое умножение (AND);
  3. логическое сложение (OR);
  4. логическое следование (импликация);
  5. эквивалентность.

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

1. Инверсия (логическое отрицание, НЕ)

Обозначение: ~A (в коде — not A в Python, !A в Go).

Логическое отрицание — унарная операция: применяется лишь к одному высказыванию. Остальные (умножение, сложение, следование, эквивалентность) — бинарные.

Результат истинен, если исходное высказывание ложно, и наоборот.

A ~A
0 1
1 0

2. Конъюнкция (логическое умножение, И)

Обозначение: A & B (в коде — A and B в Python, A && B в Go).

Результат истинен тогда и только тогда, когда оба исходных высказывания истинны.

A B A & B
0 0 0
1 0 0
0 1 0
1 1 1

Правило для запоминания: функция конъюнкции ложна, если ложен хотя бы один из её операндов. Если обозначить «истина» как 1, а «ложь» как 0, эта функция похожа на математическое умножение — поэтому её часто называют логическим умножением.

Для конъюнкции (как и для дизъюнкции) действуют ассоциативный и коммутативный законы.

3. Дизъюнкция (логическое сложение, ИЛИ)

Обозначение: A | B (в коде — A or B в Python, A || B в Go).

Результат истинен тогда, когда истинно хотя бы одно из высказываний.

A B A | B
0 0 0
1 0 1
0 1 1
1 1 1

Правило: функция дизъюнкции истинна, если истинен хотя бы один из её операндов. Похожа на математическое поразрядное сложение — отсюда название «логическое сложение». Важно: при логическом сложении сигнал переноса в более старший разряд не вырабатывается.

4. Сложение по модулю 2 (исключающее ИЛИ, XOR)

Обозначение: A ^ B (в коде — A ^ B и в Python, и в Go).

A B A ^ B
0 0 0
0 1 1
1 0 1
1 1 0

XOR — основа для реализации устройств контроля и защиты информации.

Пример: контроль целостности

Пусть передаётся код 11001100. Перед передачей он дополняется контрольным разрядом:

Бит данных Действие Сумма по модулю 2
1 1
1 1^1 0
0 0^0 0
0 0^0 0
1 1^0 1
1 1^1 0
0 0^0 0
0 0^0 0

Контрольный разряд = 0 (сложили 4 единицы по модулю 2). Передаётся 11001100 + 0.

Если в процессе передачи произошло искажение одного разряда (например, последний бит стал 1), приёмное устройство получит 11001101 и контрольный разряд 0. Приёмник пересчитает контрольный разряд от принятого кода:

Бит данных Действие Сумма по модулю 2
1 1
1 1^1 0
0 0^0 0
0 0^0 0
1 1^0 1
1 1^1 0
0 0^0 0
1 1^0 1

Контрольный разряд получится 1 — не совпадает с принятым 0. Приёмник сообщает об ошибке и инициирует повторную передачу.

В современных системах побайтное вычисление контрольных сумм не используется — контроль осуществляется на уровне пакета через циклический код целостности (CRC16, CRC32).

Пример: элементарная защита данных

Интересное свойство XOR: A ^ B = C, C ^ B = A. Если к результату повторно применить ту же операцию с тем же вторым операндом — получим исходные данные.

Это свойство позволяет использовать XOR для элементарной защиты передаваемой информации. Если у передающей и принимающей сторон есть общий ключ защиты, скажем 01101101:

Данные Ключ Зашифрованные данные
1 0 1
1 1 0
0 1 1
0 0 0
1 1 0
1 1 0
0 0 0
0 1 1

Зашифрованный код 10100001 ничего не даст злоумышленнику. Принимающая сторона, имея тот же ключ, восстановит исходную информацию повторным XOR. Если длина данных больше длины ключа, ключ используется повторно для следующего блока.

Свойства XOR

  1. Коммутативность: A ^ B = B ^ A.
  2. Ассоциативность: A ^ (B ^ C) = (A ^ B) ^ C.
  3. Дистрибутивность относительно конъюнкции: A & (B ^ C) = (A & B) ^ (A & C).
  4. Идемпотентность: A ^ 0 = A.
  5. Отрицание через 1: A ^ 1 = ~A.

Также справедливо:

  • A ^ A = 0;
  • A ^ ~A = 1.

В теории логики известны и другие операции: стрелка Пирса (ИЛИ-НЕ), штрих Шеффера (И-НЕ), импликация (если…то), эквивалентность. В прикладном программировании они используются редко, поэтому здесь не рассматриваются.

Приоритет логических операций

В порядке убывания приоритета:

  1. Инверсия (~, not, !)
  2. Конъюнкция (&, and, &&)
  3. Сложение по модулю 2 (^)
  4. Дизъюнкция (|, or, ||)

Законы алгебры логики

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

  1. Закон противоречия: никакое предложение не может быть истинно одновременно со своим отрицанием. A & ~A = 0
  2. Закон исключённого третьего: для каждого высказывания имеются лишь две возможности — оно либо истинно, либо ложно. Третьего не дано. A | ~A = 1
  3. Закон двойного отрицания: отрицать отрицание — то же, что утверждать. ~~A = A
  4. Закон идемпотентности: в алгебре логики нет показателей степеней и коэффициентов. A & A = A, A | A = A
  5. Законы коммутативности и ассоциативности: конъюнкция и дизъюнкция аналогичны умножению и сложению чисел. Коммутативность: A & B = B & A, A | B = B | A. Ассоциативность: A | (B | C) = (A | B) | C, A & (B & C) = (A & B) & C.
  6. Законы дистрибутивности: логическое сложение и умножение равноправны. A & (B | C) = (A & B) | (A & C) A | (B & C) = (A | B) & (A | C)
  7. Законы поглощения констант: A & 1 = A A | 0 = A
  8. Законы поглощения: A | (A & B) = A A & (A | B) = A
  9. Законы де Моргана: связывают пары логических операций при помощи отрицания. Отрицание конъюнкции — дизъюнкция отрицаний: ~(A & B) = ~A | ~B. Отрицание дизъюнкции — конъюнкция отрицаний: ~(A | B) = ~A & ~B.

Решение логических выражений (таблицы истинности)

Решение логических выражений записывают в виде таблиц истинности — таблиц, в которых по действиям показано, какие значения принимает логическое выражение при всех возможных наборах его переменных.

Для составления таблиц истинности необходимо:

  • определить количество строк: 2ⁿ, где n — количество переменных;
  • определить количество столбцов: количество переменных + количество логических операций;
  • установить последовательность выполнения логических операций;
  • построить таблицу, указывая названия столбцов и возможные наборы значений переменных;
  • заполнить таблицу по столбцам.

Пример: построим таблицу истинности для ассоциативности дизъюнкции A | (B | C).

  • количество строк: 2³ = 8;
  • количество столбцов: 3 + 2 = 5.
A B C B | C A | (B | C)
0 0 0 0 0
0 0 1 1 1
0 1 0 1 1
0 1 1 1 1
1 0 0 0 1
1 0 1 1 1
1 1 0 1 1
1 1 1 1 1

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

# Логические (булевы) операторы возвращают True/False
a, b = True, False
print(not a)        # False
print(a and b)      # False
print(a or b)       # True
print(a ^ b)        # True (XOR работает и для bool, и для int)

# Побитовые операторы — для целых чисел
x, y = 0b11001100, 0b01101101
print(bin(x ^ y))   # 0b10100001 — XOR-шифр из примера выше
var a, b = true, false
fmt.Println(!a)         // false
fmt.Println(a && b)     // false
fmt.Println(a || b)     // true
fmt.Println(a != b)     // true — XOR для bool в Go через !=

// Побитовые операторы
x, y := 0b11001100, 0b01101101
fmt.Printf("%b\n", x^y) // 10100001

В Go нет оператора ^ для bool — для XOR двух булевых значений используют a != b.


Контрольные вопросы

  1. Основные формы мышления.
  2. Что такое логическое высказывание?
  3. Способы описания логических функций.
  4. Основные логические операции.
  5. Приоритет логических операций.
  6. Законы логических операций.
  7. Проверка законов построением таблиц истинности.
  8. Задачи контроля целостности и защиты данных.

Просто и с примерами (ido.tsu.ru)