БСВойтиСохранить прогресс
← Все статьи
Задание 2Алгебра логики

Основы алгебры логики

Алгебра логики

Алгебра логики изучает высказывания и действия над ними. Высказывание — это повествовательное предложение, о котором можно однозначно сказать, истинно оно или ложно. Истинному высказыванию ставится в соответствие значение 11, ложному — значение 00. Например, высказывание «5>35>3» истинно и имеет значение 11, а высказывание «10<210<2» ложно и имеет значение 00.

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

Основные логические операции

Отрицание (инверсия) высказывания AA обозначается ¬A\neg A и меняет его значение на противоположное: если A=1A=1, то ¬A=0\neg A=0; если A=0A=0, то ¬A=1\neg A=1. Читается как «не AA» или «неверно, что AA».

A¬A0110\begin{array}{c|c} A & \neg A \\ \hline 0 & 1\\ 1 & 0 \end{array}

Конъюнкция двух высказываний обозначается A∧BA\land B и читается как «AA и BB». Конъюнкция истинна только тогда, когда истинны оба высказывания одновременно.

Дизъюнкция обозначается A∨BA\lor B и читается как «AA или BB». Дизъюнкция истинна, если истинно хотя бы одно из двух высказываний.

Импликация обозначается A→BA\to B и читается как «из AA следует BB» или «если AA, то BB». Импликация ложна только в одном случае: когда условие AA истинно, а следствие BB ложно.

Эквивалентность обозначается A↔BA\leftrightarrow B или A≡BA\equiv B. Она истинна тогда, когда значения AA и BB совпадают: оба равны 00 или оба равны 11.

Исключающее ИЛИ обозначается A⊕BA\oplus B. Оно истинно тогда, когда значения AA и BB различаются.

ABA∧BA∨BA→BA↔B000011010110100100111111\begin{array}{c|c|c|c|c|c} A & B & A\land B & A\lor B & A\to B & A\leftrightarrow B \\ \hline 0 & 0 & 0 & 0 & 1 & 1\\ 0 & 1 & 0 & 1 & 1 & 0\\ 1 & 0 & 0 & 1 & 0 & 0\\ 1 & 1 & 1 & 1 & 1 & 1 \end{array}

Для исключающего ИЛИ таблица выглядит следующим образом:

ABA⊕B000011101110\begin{array}{c|c|c} A & B & A\oplus B \\ \hline 0 & 0 & 0\\ 0 & 1 & 1\\ 1 & 0 & 1\\ 1 & 1 & 0 \end{array}

Таким образом, основные операции удобно запомнить следующим образом: A∧BA\land B требует две единицы; A∨BA\lor B требует хотя бы одну единицу; A→BA\to B ложно только для пары 1→01\to0; A↔BA\leftrightarrow B истинно при одинаковых значениях; A⊕BA\oplus B — при разных.

Порядок выполнения логических операций

скобки↓отрицание↓конъюнкция↓дизъюнкция↓импликация↓эквивалентность\begin{array}{c} \text{скобки} \\ \downarrow \\ \text{отрицание} \\ \downarrow \\ \text{конъюнкция} \\ \downarrow \\ \text{дизъюнкция} \\ \downarrow \\ \text{импликация} \\ \downarrow \\ \text{эквивалентность} \end{array}

Сначала выполняются действия в скобках, затем отрицание, конъюнкция, дизъюнкция, импликация и в последнюю очередь эквивалентность. Например, выражение

¬A∨B∧C\neg A\lor B\land C

вычисляется как

(¬A)∨(B∧C).(\neg A)\lor(B\land C).

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

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

В Python значения 00 и 11 можно использовать как ложь и истину соответственно. Основные операции алгебры логики записываются следующим образом:

ОперацияМатематическая записьPythonотрицание¬Anot AконъюнкцияA∧BA and BдизъюнкцияA∨BA or BэквивалентностьA↔BA == Bисключающее ИЛИA⊕BA != B\begin{array}{c|c|c} \text{Операция} & \text{Математическая запись} & \text{Python}\\ \hline \text{отрицание} & \neg A & \text{not A}\\ \text{конъюнкция} & A\land B & \text{A and B}\\ \text{дизъюнкция} & A\lor B & \text{A or B}\\ \text{эквивалентность} & A\leftrightarrow B & \text{A == B}\\ \text{исключающее ИЛИ} & A\oplus B & \text{A != B} \end{array}

Например, логическое выражение

¬A∧(B∨C)\neg A\land(B\lor C)

в Python записывается так:

(not A) and (B or C)

Для импликации отдельного логического оператора в Python нет. Поэтому её можно преобразовать по формуле

A→B=¬A∨BA\to B=\neg A\lor B

и записать:

(not A) or B

В задачах ЕГЭ часто используется более короткая запись:

A <= B

Для значений 00 и 11 она действительно имеет ту же таблицу истинности, что и импликация:

0≤0,0≤1,1≰0,1≤1.0\le0,\qquad 0\le1,\qquad 1\not\le0,\qquad 1\le1.

Получаем соответственно значения 1,1,0,11,1,0,1, то есть таблицу истинности импликации.

Однако здесь есть важный момент. Оператор <= в Python является не логической операцией, а операцией сравнения. Поэтому Python обрабатывает его по своим правилам приоритета. Операции сравнения <=, ==, != имеют более высокий приоритет, чем логические операции not, and и or. Кроме того, несколько сравнений подряд Python может воспринимать как цепочку сравнений. Поэтому при замене импликации на <= её необходимо заключать в скобки.

Например,

(A→B)∧(C→D)(A\to B)\land(C\to D)

нужно записывать так:

(A <= B) and (C <= D)

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

(A == B)
(A != B)

Для школьных задач можно придерживаться простого правила: каждую импликацию, эквивалентность и исключающее ИЛИ при переводе в Python заключаем в скобки.

Например, выражение

(x↔(w∨y))∨((w→z)∧(y→w))(x\leftrightarrow(w\lor y))\lor((w\to z)\land(y\to w))

запишется как

(x == (w or y)) or ((w <= z) and (y <= w))

Основные законы алгебры логики

Законы алгебры логики позволяют преобразовывать выражения, упрощать их и заменять одни операции другими.

1. Закон повторения (идемпотентности):

A∨A=A,A∧A=A.A\lor A=A,\qquad A\land A=A.

2. Переместительный закон (коммутативность):

A∨B=B∨A,A∧B=B∧A.A\lor B=B\lor A,\qquad A\land B=B\land A.

3. Сочетательный закон (ассоциативность):

(A∨B)∨C=A∨(B∨C),(A\lor B)\lor C=A\lor(B\lor C),
(A∧B)∧C=A∧(B∧C).(A\land B)\land C=A\land(B\land C).

4. Распределительный закон (дистрибутивность):

A∨(B∧C)=(A∨B)∧(A∨C),A\lor(B\land C)=(A\lor B)\land(A\lor C),
A∧(B∨C)=(A∧B)∨(A∧C).A\land(B\lor C)=(A\land B)\lor(A\land C).

5. Закон двойного отрицания:

¬(¬A)=A.\neg(\neg A)=A.

6. Законы де Моргана:

¬(A∨B)=¬A∧¬B,\neg(A\lor B)=\neg A\land\neg B,
¬(A∧B)=¬A∨¬B.\neg(A\land B)=\neg A\lor\neg B.

То есть при раскрытии отрицания над скобкой операция ∨\lor заменяется на ∧\land, операция ∧\land заменяется на ∨\lor, а каждое высказывание внутри скобок получает отрицание.

7. Закон поглощения:

A∨(A∧B)=A,A\lor(A\land B)=A,
A∧(A∨B)=A.A\land(A\lor B)=A.

8. Действия с логическими константами:

A∨0=A,A∧1=A,A\lor0=A,\qquad A\land1=A,
A∨1=1,A∧0=0.A\lor1=1,\qquad A\land0=0.

9. Закон исключённого третьего:

A∨¬A=1.A\lor\neg A=1.

10. Закон противоречия:

A∧¬A=0.A\land\neg A=0.

11. Отрицание логических констант:

¬0=1,¬1=0.\neg0=1,\qquad\neg1=0.

12. Преобразование импликации:

A→B=¬A∨B.A\to B=\neg A\lor B.

Это одна из самых важных формул: импликацию всегда можно заменить сочетанием отрицания и дизъюнкции.

13. Отрицание импликации:

¬(A→B)=A∧¬B.\neg(A\to B)=A\land\neg B.

Импликация ложна только тогда, когда A=1A=1, а B=0B=0, поэтому её отрицание истинно именно при A∧¬BA\land\neg B.

14. Контрапозиция:

A→B=¬B→¬A.A\to B=\neg B\to\neg A.

15. Преобразование эквивалентности:

A↔B=(A∧B)∨(¬A∧¬B).A\leftrightarrow B=(A\land B)\lor(\neg A\land\neg B).

Эквивалентность истинна, когда оба значения одинаковы: либо оба равны 11, либо оба равны 00.

Также эквивалентность можно представить через две импликации:

A↔B=(A→B)∧(B→A).A\leftrightarrow B=(A\to B)\land(B\to A).

16. Преобразование исключающего ИЛИ:

A⊕B=(¬A∧B)∨(A∧¬B).A\oplus B=(\neg A\land B)\lor(A\land\neg B).

Также справедлива формула

A⊕B=(A∨B)∧¬(A∧B).A\oplus B=(A\lor B)\land\neg(A\land B).

17. Связь эквивалентности и исключающего ИЛИ:

¬(A↔B)=A⊕B,\neg(A\leftrightarrow B)=A\oplus B,
¬(A⊕B)=A↔B.\neg(A\oplus B)=A\leftrightarrow B.

18. Законы склеивания:

(A∧B)∨(A∧¬B)=A,(A\land B)\lor(A\land\neg B)=A,
(A∨B)∧(A∨¬B)=A.(A\lor B)\land(A\lor\neg B)=A.

Полезно не просто заучивать эти формулы, а понимать таблицы истинности основных операций. Тогда даже забытую формулу во многих случаях можно восстановить самостоятельно.

Построение таблицы истинности

Если логическая функция содержит nn переменных, каждая из которых может принимать два значения — 00 или 11, то полная таблица истинности содержит 2n наборов значений. Например, для трёх переменных получим 23=82^3=8 строк, а для четырёх — 24=162^4=16 строк.

В Python все наборы удобно получить вложенными циклами. Например, для четырёх переменных:

for w in 0,1: 
    for x in 0,1: 
        for y in 0,1: 
            for z in 0,1:

Каждый цикл перебирает два возможных значения своей переменной, поэтому в результате будут рассмотрены все 1616 комбинаций.

Шаблон решения типовых заданий

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

Сначала выписываем все переменные функции и создаём для каждой из них цикл по значениям 00 и 11. Затем внутри самого вложенного цикла записываем логическое выражение в условии if.

Если в таблице представлены строки, для которых F=0F=0, ищем именно такие наборы:

print('w x y z') 
for w in 0,1: 
    for x in 0,1: 
        for y in 0,1: 
            for z in 0,1: 
                if <логическое выражение> == 0: 
                    print(w,x,y,z)

Если нужны строки, в которых функция равна 11, условие меняется на:

if <логическое выражение> == 1:

Например, для функции

F=(x↔(w∨y))∨((w→z)∧(y→w))F=(x\leftrightarrow(w\lor y))\lor((w\to z)\land(y\to w))

и строк, в которых F=0F=0, получим:

print('w x y z') 
for w in 0,1: 
    for x in 0,1: 
        for y in 0,1: 
            for z in 0,1: 
                if ((x == (w or y)) or ((w <= z) and (y <= w))) == 0: 
                    print(w,x,y,z)

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

При сопоставлении необходимо помнить несколько важных правил. Пустая клетка таблицы не означает 0: её значение просто неизвестно. Учитываются только те нули и единицы, которые явно указаны в условии. Кроме того, если в условии сказано, что приведённые строки таблицы не повторяются, одной и той же строке полной таблицы истинности нельзя сопоставить сразу две разные строки фрагмента.

Например, если программа вывела набор

w=0,x=1,y=1,z=0,w=0,\qquad x=1,\qquad y=1,\qquad z=0,

а в одной из строк исходной таблицы известно, что первый столбец содержит 11, а третий — 00, нужно проверить, какие из переменных могут стоять в этих столбцах. Затем аналогично рассматриваются остальные строки. Правильным будет только такое расположение переменных, которое одновременно подходит ко всему данному фрагменту таблицы.

Таким образом, общий алгоритм решения можно сформулировать так: переводим логическое выражение на язык Python; перебираем все значения переменных; оставляем строки с нужным значением функции; сопоставляем полученные наборы с данными из таблицы; записываем переменные в порядке соответствующих им столбцов. Главное при переводе выражения в Python — не менять его структуру. Скобки из исходной формулы лучше сохранять, а импликацию, записанную через <=, обязательно заключать в скобки. Это позволяет избежать ошибок из-за приоритета операций и делает программную запись максимально похожей на исходное логическое выражение.