Python: Логические операторы
Мы уже умеем писать функции, которые проверяют одиночные условия. А в этом уроке научимся строить составные условия.
Предположим, что сайт при регистрации требует, чтобы пароль был длиннее восьми символов и содержал хотя бы одну заглавную букву. Попробуем написать два отдельных логических выражения и соединим их специальным оператором «И»:
Пароль длиннее 8 символов И пароль содержит хотя бы одну заглавную букву
Вот функция, которая принимает пароль и говорит, соответствует ли он условиям ( True ) или не соответствует ( False ):
def has_capital_letter(string): # Проверяет наличие хотя бы одной заглавной буквы в строке def is_correct_password(password): length = len(password) return length > 8 and has_capital_letter(password) print(is_correct_password('Qwerty')) # => False print(is_correct_password('Qwerty1234')) # => True print(is_correct_password('qwerty1234')) # => False
and — означает «И». В математической логике это называют конъюнкцией. Все выражение считается истинным, если истинен каждый операнд — каждое из составных выражений. Иными словами, and означает «и то, и другое». Приоритет этого оператора ниже, чем приоритет операторов сравнения. Поэтому выражение has_capital_letter(password) and length > 8 тоже правильно отрабатывает без скобок.
Кроме and часто используется оператор or — «ИЛИ» (дизъюнкция). Он означает «или то, или другое, или оба». Выражение a or b считается истинным, если хотя бы один из операндов или одновременно все — истинные. В другом случае выражение ложное.
Операторы можно комбинировать в любом количестве и любой последовательности. Если в коде одновременно встречаются and и or , то приоритет задают скобками. Ниже пример расширенной функции, которая определяет корректность пароля:
def has_capital_letter(string): # Проверяет наличие хотя бы одной заглавной буквы в строке def has_special_chars(string): # Проверяет содержание специальных символов в строке def is_strong_password(password): length = len(password) # Скобки задают приоритет. Понятно, что к чему относится. return (length > 8 and has_capital_letter(password)) and has_special_chars(password)
Теперь представим, что мы хотим купить квартиру, которая удовлетворяет таким условиям: площадь от 100 квадратных метров и больше на любой улице ИЛИ площадь от 80 квадратных метров и больше, но на центральной улице Main Street .
Напишем функцию, которая проверит квартиру. Она принимает два аргумента: площадь — число и название улицы — строку:
def is_good_apartment(area, street): return area >= 100 or (area >= 80 and street == 'Main Street') print(is_good_apartment(91, 'Queens Street')) # => False print(is_good_apartment(78, 'Queens Street')) # => False print(is_good_apartment(70, 'Main Street')) # => False print(is_good_apartment(120, 'Queens Street')) # => True print(is_good_apartment(120, 'Main Street')) # => True print(is_good_apartment(80, 'Main Street')) # => True
Область математики, в которой изучаются логические операторы, называется булевой алгеброй. Ниже увидите таблицы истинности — по ним можно определить, каким будет результат, если применить оператора:
И and
| A | B | A and B |
|---|---|---|
| True | True | True |
| True | False | False |
| False | True | False |
| False | False | False |
ИЛИ or
| A | B | A or B |
|---|---|---|
| True | True | True |
| True | False | True |
| False | True | True |
| False | False | False |
Задание
Реализуйте функцию is_leap_year() , которая принимает год в форме числа и определяет является ли он високосным или нет. Год будет високосным, если он кратен (то есть делится без остатка) 400 или он одновременно кратен 4 и не кратен 100. Как видите, в определении уже заложена вся необходимая логика, осталось только переложить её на код:
is_leap_year(2018) # false is_leap_year(2017) # false is_leap_year(2016) # true
Кратность можно проверять так:
# % - возвращает остаток от деления левого операнда на правый # Проверяем что number кратен 10 number % 10 == 0 # Проверяем что number не кратен 10 number % 10 != 0
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
- Булева алгебра
- Логическое «И»
- Логическое «ИЛИ»
Определения
- Логические операторы — операторы «И» ( and ), ИЛИ ( or ), позволяющие создавать составные логические условия.
Как сделать импликацию?
Не получается импликация. При выводе переменной, содержащей ее, выводится не понятно для меня что.
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 11 апр 2021 в 11:56
Михаил Безбородко Михаил Безбородко
13 2 2 серебряных знака 7 7 бронзовых знаков
Объясните пожалуйста лучше, что вы хотите сделать(получить) и что у вас не получается.
11 апр 2021 в 12:02
Нужно сделать таблицу истинности по данной формуле: F = (А→В)˄¬А. И тут есть действие импликация (А→В). И я вот не знаю как его сделать. При выводе, результатом выводится: 1111111111111111111111111111111100110011001100110011001100110011, хотя не должно. И вот я не понимаю, где я сделал ошибку
11 апр 2021 в 12:08
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
У меня не удалось найти ошибку в коде, но если нужно просто решить задачу, то можно воспользоваться фрагментом ниже. Там правда задействованы функции, словари и срезы строк, однако в этом не очень сложно, зато очень важно разобраться. Если пишешь свой «мудрённый» код (по сути любой код, в частности если опираешься на самые базовые команды), то опиши алгоритм действий.
def binary(number): b = bin(number) # result is str ans = b[2:] # first 2 simbol is '0b' return ans a = binary(5) b = binary(7) A = a[::-1] # перевернём строки, чтобы уравнять длины B = b[::-1] # строк простым оператором (+=) k = len(A) - len(B) # разница длин чисел в двоичной системе while k != 0: if k > 0: A += '0' else: B += '0' a = A[::-1] #возвращаем строки в исходный b = B[::-1] # порядок c = ' ' dimpl = < '00': '1', '01': '1', '11': '1', '10': '0' >for i in range(len(a)): c += dimpl[ a[i]+b[i] ] '''Все сценарии импликации указаны в словаре dimpl (dict - impl). Поочерёдно подставляем ему в качестве ключа склееные биты из наших бинарных чисел в формате строк, не боясь получить ошибку выхода за конец строки. В результате также получим строку''' print('a =', a, 'b =', b, 'iplicatiom(a,b) =', c)
Разбор 2 задания из ЕГЭ по информатике 2023
Логические выражения несколько отличаются от обычных математических. Например, Выражение 1 + 1 = 1 не имеет никакого смысла с точки зрения математики, но абсолютно верно с точки зрения логики. Логика оперирует понятиями Истина и Ложь, или True и False, или 1 и 0. Поэтому логическая сумма двух истинных высказываний также является истинной.
Приглашаем преподавателей на направления: разработка игр, программирование
Бесплатно обучаем, освобождаем от рутины и отчетов, гарантируем стабильный доход, сами ищем учеников!

Цель урока: научиться строить таблицы истинности и логические схемы сложных логических выражений и решать задание №2 из ЕГЭ по информатике 2023.
Задачи урока:
- повторить определение логических операций;
- повторить таблицы истинности простых логических выражений,
- вспомнить порядок выполнения логических операций,
- записать законы алгебры логики,
- научиться упрощать сложные логические выражения,
- изучить понятия нормальной дизъюнктивной и нормальной конъюнктивной формы.
Детям преподаем основы программирования и создания игр, а подростков учим разработке на Python и написанию сайтов.
Хотели бы стать нашим преподавателем? Подробно знакомим вас со всеми направлениями!

Повторяем определение логических операций
В алгебре логики изучаются логические операции, производимые над высказываниями. Такие высказывания могут быть истинными или ложными. Применяя к простым высказываниям логические операции, можно строить составные высказывания.
Повторим основные логические операции (буквами A, B или C будем обозначать элементарные логические высказывания):
Отрицание (инверсия, логическое НЕ) — это логическая операция, которая делает ложное высказывание истинным, а истинное — ложным.
Обозначение: ¬A, или not(A), или НЕ(A), или
Таблица истинности:
| A | |
| 0 | 1 |
| 1 | 0 |
Логическое сложение (дизъюнкция, логическое ИЛИ) — это сложное логическое выражение, которое истинно, если хотя бы одно из простых логических выражений истинно, и ложно тогда и только тогда, когда оба простых логических выражения ложны.
Обозначение: A ∨ B, или A or B, или A ИЛИ B, или A + B
Таблица истинности:
| A | B | A+B |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
Логическое умножение (конъюнкция, логическое И) — это сложное логическое выражение, которое считается истинным в том и только том случае, когда оба простых выражения являются истинными, во всех остальных случаях данное сложное выражение ложно.
Обозначение: A ∧ B, или A and B, или A И B, или A * B
Преподаватели компьютерных курсов проходят бесплатное обучение во время отбора. У нас преподают Roblox, Unity, Unreal, Scratch, Construct 3, App Inventor, Minecraft, Thunkable, Web, Python.
Подробно рассказываем, как проходит обучение!

Таблица истинности:
| A | B | A * B |
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Логическое следование (импликация) — это сложное логическое выражение, которое истинно во всех случаях, кроме того случая, когда из истины следует ложь. То есть данная логическая операция связывает два простых логических выражения, из которых первое (А) является условием, а второе (В) является следствием.
Обозначение: A → B
Таблица истинности:
| A | B | A → B |
| 0 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Логическая эквивалентность (равносильность) — это сложное логическое выражение, которое является истинным тогда и только тогда, когда оба простых логических выражения имеют одинаковую истинность.
Обозначение: A ≡ B
Таблица истинности:
| A | B | A ≡ B |
| 0 | 0 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
Логическая операция XOR (сложение по модулю 2 или исключающее ИЛИ) — это логическая операция, по своему применению максимально приближенная к грамматической конструкции «либо … либо …».
Обозначение: A ⊕ B
Таблица истинности:
| A | B | A ⊕ B |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Вспоминаем порядок выполнения логических операций
Порядок выполнения логических операций в сложном логическом выражении:
- Инверсия
- Конъюнкция
- Дизъюнкция
- Импликация
- Эквивалентность
Для изменения указанного порядка выполнения логических операций используются скобки.

Законы алгебры логики — это некоторые стандартные преобразования логических выражений, при которых сохраняется равносильность.
1. Законы поглощения констант
2. Законы поглощения переменных
3. Законы идемпотентности
4. Закон двойного отрицания
= А
5. Закон противоречия
A * = 0
6. Закон исключенного третьего
A + = 1
7. Законы коммутативности
8. Законы ассоциативности
(A * B) * C = A * (B * C)
(A + B) + C = A + (B + C)
9. Законы дистрибутивности
A * (B + C) = (A * B) + (A * C)
A + (B * C) = (A + B) * (A + C) — обратите особое внимание!
10. Законы де Моргана
Правило для запоминания: «Крыша упала, знак поменяла (+ на *, * на +)».
11. Законы поглощения
12. Закон преобразования импликации
A → B = + B — импликация из A в B равна «не A плюс B»
Учимся упрощать сложные логические выражения
После этого можно тренироваться в упрощении логических выражений.
Логическое выражение будем обозначать буквой F. В качестве упрощения логического выражения удобно заменить логические символы конъюнкции и дизъюнкции на * и +, а затем можно избавиться и от импликации (при использовании программного метода импликацию в логическом выражении заменяют на выражение <=).

Практикуемся выполнять задание №2 ЕГЭ
Теперь можно переходить к изучению тонкостей и особенностей решения задания №2 по информатике.
На это задание по рекомендации ФИПИ требуется 3 минуты. Чтобы успешно справиться с ним, необходимо уметь строить таблицы истинности и логические схемы.
Строим таблицы истинности и логические схемы
Таблица истинности выражения определяет его значения при всех возможных комбинациях исходных данных. Если известна только часть таблицы истинности, соответствующее логическое выражение однозначно определить нельзя, поскольку частичной таблице могут соответствовать несколько разных логических выражений (не совпадающих для других вариантов входных данных).
Количество разных логических функций, удовлетворяющих неполной таблице истинности, равно , где k — число отсутствующих строк.
Например, полная таблица истинности выражения с тремя переменными содержит 2 3 = 8 строчек; если заданы только 6 из них, то можно найти 2 8−6 = 2 2 = 4 разные логические функции, удовлетворяющие этим 6 строчкам (но отличающиеся в двух оставшихся).
Очень хорошей помощью в решении этого задания будет полная таблица истинности данного в условии логического выражения.
Полную таблицу истинности легче всего составить в табличном редакторе (Excel) или с использованием языка программирования (Python).
После получения полной таблицы истинности остается провести анализ на соответствие строк данной в условии части таблицы строкам составленной. При анализе строк особое внимание следует обратить на значение выражения в таблице истинности.
Если выражение равно 0, то нужно постараться привести данное в условие выражение к виду A + B + C + … . Логическая сумма A + B + C + … равна 0 (выражение ложно) тогда и только тогда, когда все слагаемые одновременно равны нулю, а в остальных случаях равна 1 (выражение истинно).
Если выражение равно 1, то приводите выражение к виду A · B · C · … . Логическое произведение A · B · C · … равно 1 (выражение истинно) тогда и только тогда, когда все сомножители одновременно равны единице, а в остальных случаях равно 0 (выражение ложно).
И еще два факта, которые пригодятся при анализе: логическое следование (импликация) А → В равно 0 тогда и только тогда, когда A (посылка) истинна, а B (следствие) ложно; эквивалентность А º B равна 1 тогда и только тогда, когда оба значения одновременно равны 0 или одновременно равны 1.
Используем 3 способа решения задания
Способы решения задания:
- ручной;
- с помощью электронных таблиц;
- с помощью языка программирования (Python).
Ручной способ решения
При ручном способе решения особенно важно сначала упростить выражение, данное в условии задачи, то есть привести логическое выражение к такому виду, который будет удобнее анализировать.
Например, если в условии представлена часть таблицы истинности, в которой значение выражения равно 1 — то можно постараться привести логическое выражение к нормальной дизъюнктивной форме (ДНФ — произведение нескольких литералов). Тогда выражение будет истинным, только если каждый литерал (сомножитель) будет истинен.
Если же в таблице истинности логическое выражение равно 0 — приводим выражение к нормальной конъюнктивной форме (КНФ — сумма нескольких литералов). В этом случае выражение будет ложным, только если каждый литерал (слагаемое) ложен.
После преобразования логического выражения производится анализ данной в условии таблицы истинности (или ее фрагмента) и для каждого столбца находится его значение (x, y и т. д.)
Решение с помощью электронных таблиц
При использовании электронных таблиц самым сложным является ввод в ячейку таблицы выражения, данного в условии в нотации, соответствующей программе. Чаще всего в качестве программ электронных таблиц используются электронные таблицы пакетов Libre Office, Open Office или Microsoft Office (Excel). Последняя — наиболее распространенная, поэтому здесь будем говорить про нее.
Шаг 1. Сначала количество столбцов в электронной таблице равно количеству переменных логического выражения. Каждый столбец обозначается по именам переменных логического выражения.
Шаг 2. Затем добавляется количество строк электронной таблицы, равное , где k — количество переменных логического уравнения.
Шаг 3. После этого создается еще один столбец электронной таблицы, в первой строке которого (не заголовка) записывается формула, соответствующая логическому выражению. Растянув эту формулу при помощи маркера автозаполнения на все строки таблицы, получаем полную таблицу истинности выражения.
Таблица функций электронной таблицы Excel и их соответствия логическим операциям:
| Логическая операция | Строка Excel |
| Инверсия | =ЕСЛИ(A2=1;0;1) |
| Дизъюнкция | =ЕСЛИ(ИЛИ(A2=1;B2=1);1;0) |
| Конъюнкция | =ЕСЛИ(И(A2=1;B2=1);1;0) |
| Импликация | =ЕСЛИ(И(A2=1;B2=0);0;1) |
| Эквивалентность | =ЕСЛИ(A2=B2;1;0) |
Решение с помощью языка программирования (Python)
При использовании программы на языке Python можно описать функцию, например так:
def f(arg):
x, y, z, w = arg
return (здесь записывается логическое выражение),
а затем, используя полный переборный алгоритм, перебрать значения 0 и 1 для каждой переменной во вложенных циклах и провести проверку истинности выражения:
print (‘x y w z’) # заголовок таблицы (в алфавитном порядке)
k = 0, 1 # k — кортеж констант (0 — False, 1 — True)
for x in k:
for y in k:
for w in k:
for z in k:
if f(x, y, w, z) == 1:
print(x, y, w, z) # если F = 1
Или просто вывести таблицу истинности print(x, y, w, z), не используя условный оператор во внутреннем цикле.
Полученную таблицу истинности остается проанализировать вручную и записать единственно верный ответ.
Для того чтобы записать логическое выражение на Python, воспользуйтесь следующей таблицей:
| Обозначение | Название | Оператор в Python |
| ∧ | конъюнкция | and |
В Python логическое значение True воспринимается как 1, а False — как 0, благодаря этому можно использовать обычное умножение *
| ∨ | дизъюнкция | or |
В Python логическое значение True воспринимается как 1, а False — как 0, благодаря этому можно использовать обычное сложение +
| ¬ | отрицание | not() |
| ≡ | тождество | == |
| ⊕ | строгая дизъюнкция | != |
| → | импликация | not(a) or b или not a or b или a |
Желаем вашим ученикам высоких баллов по ЕГЭ!
ML: Нечёткая логика
Неопределённость некоторого утверждения может возникать из-за нехватки информации или неопределённости результатов будущих событий. В этих случаях, обычно, используют вероятностную логику. Однако, иногда об утверждении известно всё, но его нельзя считать истинным или ложным. Обычно это оценочные, сравнительные суждения: «Маша красивая» (но всё же не мечта); «Кофе горячий» (но пить его уже можно). Оценочный характер имеют также оппозиционные нечёткие квантификаторы: далеко-близко, давно-недавно, много-мало, большой-маленький и размытые порядковые шкалы: никогда, очень редко, редко, не часто, часто, очень часто, почти всегда, всегда.
Нечётким может быть отношение: $\text(x,y)$ — «объект $x$ находится внутри объекта $y$». Например, «карандаш в пенале» может немного выглядывать из пенала, тем не менее находясь внутри него.
Наконец, нечёткими могут быть правила: ЕСЛИ завтра будет дождь И ветер, TO похолодает. Каждое из трёх элементарных высказываний (дождь, ветер, похолодает) может быть как вероятностным (будущие события), так и оценочным (одна дождинка — ещё не дождь. ). Кроме этого, само правило может не всегда выполняться (быть вероятностным). Другой, немого отличный пример обыденных знаний (высказывания оценочные, а правило вероятностное): ЕСЛИ по стеклу сильно ударить достаточно твёрдым предметом, TO стекло разобъётся.
Одним из инструментов для работы с подобными утверждениями являются нечёткая логика и теория нечётких множеств, которым посвящён этот документ.
Логические связки
Будем считать, что оценочное суждение $A$ характеризуется степенью истинности $T_A$, которое является вещественным числом из диапазона $[0. 1]$. Значение $T_A=0$ соответствует ложному суждению, а $T_A =1$ — истинному. Промежуточные значения — это «промежуточная истинность». При, например, $T_A=0.7$ для $A:$ «Маша красивая», означает, что утверждение скорее истинно, чем ложно.
Степень истинности логического отрицания «НЕ $A$» естественно определить следующим образом:
Для логических И, ИЛИ чаще всего используются минимум и максимум степеней истинности суждений: $$ A\,\&\,B:~~~\min(T_A,T_B),~~~~~~~~~~~~~A\vee B:~~~\max(T_A,T_B). $$ Напомним, что в теории вероятности неравенства $P(A\,\&\,B)\le \min(P_A,\,P_B)$ и $ \max(P_A,\,P_B)\le P(A\vee B)$ выполняются для любых двух событий. Нечёткая логика не эквивалентна теории вероятностей или вероятностной логике и использует верхнюю границу для конъюнкции ($\,\&\,$) и нижнюю для дизъюнкции ($\vee $).
Ниже на рисунках приведены карты высот для степеней истинности результатов логических операций:
Эти операции для границ диапазона $[0. 1]$ воспроизводят таблицы истинности булевой логики: $$ \begin A & B & A \,\&\, B & A\vee B\\ \hline 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 1 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 \\ \end $$
Таким образом определённые логические связки удовлетворяют всем аксиомам булевой алгебры, за исключением закона исключения третьего: $$ A\vee \neg A = 1,~~~~~~~~~~~~~~~A\,\&\,\neg A = 0. $$ Стоит это проверить, например, для $T_A=0.5$. Нарушение этого закона типично для многозначных логик, в которых требование, чтобы утверждение было или истинным, или ложным уже, очевидно, теряет свой смысл.
Отметим, что в вероятностной логике степень истинности $P(A\,\&\,B)$ зависит не только от $P(A)$ и $P(B)$, но и от степени скоррелированности (зависимости) этих утверждений (событий). В нечёткой логике подобная корреляция игнорируется.
В дальнейшем, если это не будет приводить к неоднозначности, вместо $T_A$ будем просто писать $A$. Тогда для отрицания $\neg A=1-A$, дизъюнкции $A\vee B =\max(A,B)$ и конъюнкции $A\,\&\, B =\min(A,B)$.
Нечёткие множества
Истинность оценочных суждений удобно описывать при помощи еории множеств. Говоря о том, что «Маша красивая», мы подразумеваем множество красивых женщин, к которому с той или иной степенью точности принадлежит Маша.
Таким образом, в теории нечётких множеств вводится функция принадлежности $\mu_A(x)$, характеризующая степень принадлежности объекта $x$ к множеству $A$: $x\in A$. Значения этой функции лежат в интервале $[0. 1]$, где $1$ означает точно принадлежит, а $0$ — точно не принадлежит.

Объединение $A\cup B$ нечётких множеств $A$, $B$ соответствует дизъюнкции (ИЛИ), а пересечение $A\cap B$ — конъюнкции (И). Поэтому их функции принадлежности равны: $$ \begin \mu_(x) = \min\< \mu_A(x),~\mu_B(x)\>,\\ \mu_(x) = \max\< \mu_A(x),~\mu_B(x)\>. \end $$ Справа на рисунке в виде прямой $x$ изображено множество различных чашек с кофе (эти объекты не упорядочены и обычно рисуются областями на плоскости). Каждой чашке соответствует то или иное значение её принадлежности к множествам «горячий» и «крепкий». Пунктиры — это границы чётких множеств. Красная линия является функцией принадлежности пересечения множеств ($\min$).

В этом примере нечёткое пересечение включает чёткое пересечение, т.к. его высота (максимальное значение) равна 1. Но в общем случае это может быть и не так (если высота меньше 1). Множество называется нормальным, если его высота равна 1. Справа приведен пример в котором перечечение не является нормальным.
Включение или строгое подмножество $A\subset B$ по определению истинно, если $\mu_A(x) \lt \mu_B(x)$. В противном случае оно ложно. Это чёткое логическое понятие. Различными способами можно определить и нечёткое включение (например, как нормированную сумму $|\mu_A(x)-\mu_B(x)|$ по всем элементам множества $x$).
Срезом нечёткого множества $A$ на уровне $\alpha$ называется множество элементов для которых функция принадлежности больше уровня: $\$. Эти элементы принадлежат $A$ с точностью не менее $\alpha$.
Логическое высказывание «кофе горячий и крепкий» означает, что существует множество различных чашек кофе. Часть из них относится к множеству «горячий», а часть к множеству «крепкий». Данная чашка (о которой идёт речь в утверждении) принадлежит к обоим множествам (в нечётком смысле).
Нечёткие предикаты
В бинарной логике высказывания являются частным случаем предикатов. Предикат является логической функцией (значения $0,1$) предметных переменных: $A(x),~ B(x,y)$. Предметные переменные — это элементы некоторых множеств (области определения предиката). Примеры предикатов: $P(x)$ — число $x$ положительно, $M(x,y)$ — некая $x$ является матерью для $y$, $A \in \alpha$ — точка $A$ лежит на прямой $\alpha$.
В нечёткой логике значения предикатов, естественно, лежат в диапазоне $[0. 1]$. Унарные предикаты $A(x)$ являются нечёткими функциями приндлежности элемента $x$ множеству $A$. Выше для $x\in A$ мы использовали a $\mu_A(x)$, теперь для краткости будем писать просто $A(x)$.
Частными случаями нечётких предикатов являются нечеткие переменные и отношения.
Нечёткие переменные

Нечёткая переменная — это предикат, зависящий от одного или нескольких вещественных чисел.. Например, говоря о кофе, можно определить следующие нечёткие переменные, зависящие от его температуры $t$: $C(t)$ — «холодный«, $W(t)$ — «тёплый«, $H(t)$ — «горячий«.
Другие примеры: медленный, быстрый (функции скорости); лёгкий, тяжёлый (функции массы); молодой, старый (функции возраста) и т.д.

К нечётким переменным можно применять различные модификаторы: $$ \text:$~A^2(x),$$\text:$~\sqrt. $$ Так «очень тёплый» $W^2(t)$ усиливает функцию $W(t)$, а «не очень тёплый» $\sqrt$ её ослабляет. Первый модификатор называют также концентрацией, а второй — разбавлением.
Приведём пример формирования трапецивидной функции принадлежности, зависящей от одной вещественной переменной, на Python при помощи библиотеки NumPy:
def tra(min_X, x1,x2,x3,x4, max_X, num=100): X = np.linspace(min_X, max_X, num, dtype = 'float32') Y = np.zeros_like(X) idx = (X >= x1) & (X x2) & (X x3) & (X
Нечёткие отношения
Нечёткое отношение является предикатом, зависящим от двух предметных переменных. Функция $R(x,y)$ данной паре сущностей $x,y$ (предметных констант) ставит в соответствие вещественное число из диапазона $[0. 1]$ (степень истинности отношения). Например, для отношения "два числа почти совпадают" $x\approx y$ можно положить $R(x,y)=e^.$ Тогда $R(x,x)=1$; если $x$ и $y$ близки, то $R(x,x)\approx 1$; и в противном случае $R(x,y)\to 0$.
В бинарной логике отношение $R(x,y)$ является подмножеством множества пар (декартово произведение) $\mathbb\times \mathbb$. Поэтому нечёткое отношение является нечётким множеством. Все определения (объединение, пересечение, дополнение отношений и т.д.) на этот случай переносятся без изменений.
Рассмотрим подробнее композицию $(A \circ B)(x,y)$ двух отношений $A(x,z)$ и $B(z,y)$.
Пусть есть три множества $\mathbb,\mathbb,\mathbb$ (в общем случае различные). Отношение $A(x,z)$ задано на множестве $\mathbb\times \mathbb$, а отношение $B(z,y)$ на множестве $\mathbb\times \mathbb$. В бинарной логике, если $A(x_i,z_k)$ истинно, то элементы $x_i$ и $z_k$ связаны отношением $A$. Это можно представить в виде стрелки из $x_i$ в $z_k$ (см. рисунок справа). Композиция отношений $(A \circ B)(x_i,y_j)$ будет истинна, если из $x_i$ можно "попасть" в $y_j$ через некоторый $z_k$. Формально это записывается при помощи квантора существования (есть такой $z$, что . ): $$ (A \circ B)(x,y) : $$\exists_z\, A(x,z)\,\&\,B(z,y) = \bigr[A(x,z_1)\,\&\,B(z_1,y)\bigr]\vee \bigr[A(x,z_2)\,\&\,B(z_2,y)\bigr]\vee . $$ где квантор существования выражен через "сумму" логических ИЛИ по всем элементам конечного множества $\mathbb$. Для нечётких отношений это определение обобщается естественным образом: $$ (A \circ B)(x,y) = \max_z \bigr[\min\\bigr], $$ где для $\max$ вычисляется по всем элементам $z\in \mathbb$.Часто встречаются следующие аксиомы фиксирующие свойства отношений: $$ \begin \text & R(x,x) = 1 \\ \text & R(x,x) = 0 \\ \text & R(x,y) = R(y,x) \\ \text & \min\bigr\ = 0 \\ \text & x\neq y ~\Rightarrow~ \min\bigr\ = 0 \\ \text & \min\bigr\ \le R(x,z) \\ \end $$ Например, отношение близости $x\approx y$ рефлексивно и симметрично.
Норма и конорма *
Выбор функций $\min$ для конъюнкции (пересечения) и $\max$ для дизъюнкции (объединения) не является единственно возможным (хотя часто он более предпочтителен). Обозначим логическое И в виде функции $T(x,y)$ (норма), а логическое $ИЛИ$ как $S(x,y)$ (конорма). Потребуем, чтобы они были симметричными и ассоциативными: $$ \begin \&:~ \\ \vee\,:\\ \end~~~~~~~~~~~~~~~~~~~~~~~~~~~ \left\< \begin T(x,y) &=& T(y,x) \\ S(x,y) &=& S(y,x) \end\right.,~~~~~~~~~~~~~~~~~~~ \left\< \begin T(x, T(y,z)) &=& T(T(x, y),z)\\ S(x, S(y,z)) &=& S(S(x, y),z)\\ \end\right.. $$ Кроме этого наложим свойства ограниченности и монотонности (выполняющиеся для $\&, \vee$ и в бинарной логике): $$ \begin \&:~ \\ \vee\,:\\ \end~~~~~ \left\< \begin T(0,0) = 0, & T(1,x) = x\\ S(1,1) = 1, & S(0,x) = x\\ \end \right.,~~~~~~~ \left\< \begin x_1 \le x_2,~~~ y_1 \le y_2~~~\Rightarrow~~~~~T(x_1, y_1) \le T(x_2, y_2)\\ x_1 \ge x_2,~~~ y_1 \ge y_2~~~\Rightarrow~~~~~S(x_1, y_1) \ge S(x_2, y_2)\\ \end \right.. $$
Отметим, что условие монотонности выполняется не только в булевой логике, но и достаточно естественно для нечёткой логики. Например: $0.5 \,\&\, 0.8 ~\lt~ 0.7 \,\&\, 0.9$ означет, что $0.5$ менее истинно, чем $0.7~~~$ И $~~~0.8$ менее истинно, чем $0.9$.
Будем также предполагать, что выполняются законы де-Моргана $\neg(X\,\&\,Y) = \neg X\vee \neg Y$ и $\neg(X\vee Y) = \neg X\,\&\, \neg Y$, связывающие эти две операции: $$ \begin 1-T(x,y) = S(1-x,1-y), & ~~~~~ & 1-S(x,y) = T(1-x,1-y). \\ \end $$ Возможны различные функции, удовлетворяющие этим аксиомам (обычно задаётся, например, $T(x,y)$, а $S(x,y)$ получается из закона де-Моргана). Приведём для примера три следующих варианта: $$ \begin
& \text & \text & \text \\ \hline A\,\&\,B & \min(A,B) & A\,B & \max(A+B-1,~ 0) \\ A\vee B & \max(A,B) & A+B - A\,B & \min(A+B,~ 1) \\ \hline A \,\&\, A \equiv A & \mathbb & (0,1) & (0, 1) \\ A \vee A \equiv A & \mathbb & (0,1) & (0, 1) \\ A \,\&\, \neg A & (0.0,0.5) & (0,0.25) & \mathbb \\ A \vee \neg A & (0.5,1.0) & (0.75,1) & \mathbb \\ A\,\&\,(B\vee C) \equiv~. & \mathbb & (0,1) & (0, 1) \\ A\vee (B\,\&\,C)\equiv~. & \mathbb & (0,1) & (0, 1) \\ \end $$ Под определением связок указаны значения истинности некоторых тождеств булевой алгебры при использовании этих связок. Если стоит $\mathbb$ - тождество истинно, при $\mathbb$ - ложно, в противном случае указаны диапазоны изменения истинности при всех возможных значениях истинности аргументов. Обратим внимание, что законы исключения третьего для варианта (3.) выполняются, а в остальных случаях $A \,\&\, \neg A$ стремиться быть скорее ложным, а $A \vee \neg A$ - скорее истинным. Свойства идемпотентности: $$ A\,\&\,A \equiv A,~~~~~~~~~~~~A\vee A \equiv A. $$ выполняются только для "логического" варианта ($\min,\max$). На самом деле, это очень естественные свойства, как для логических величин, так и для множеств ($A\cap A=A$ и $A\cup A=A$). Поэтому, обычно, их выполнение желательно.
Отметим также, что для определений 2,3 нарушаются законы дистрибутивности: $$ \begin A\,\&\,(B\vee C) &\equiv& (A\,\&\,B)\vee (A\,\&\,B)\\ A\vee(B\,\&\,C) &\equiv& (A\vee B)\,\&\, (A\vee B). \end $$ Это не так критично, но не вполне соответствует обыденному пониманию смысла логических операций.
Импликация
В булевой логике важную роль играет импликация: $A\to B$. Эта логическая связка в языке соответствует фразам: "из $A$ следует $B$", "если $A$, то $B$". Принято, что она ложна только для $1\to 0$ ("из истины нельзя получить ложь"). Во всех остальных случаях: $0\to 0$, $0\to 1$, $1\to 1$ она истинна.
Обычно предполагается наличие некоторой связи между посылкой $A$ и следствием $B$ импликации $A\to B$.
Так, в арифметике при любом $x$ истинна формула: $(x 2) \to (xПервые три определения "крутятся" вокруг выражения импликации через диъюнкцию в бинарной логике. В определении Клини это записано в явном виде. У Заде, при выполнении дистрибутивности (для $\&=\min,$ $\vee=\max$), можно записать $(\neg A \vee A)\,\&\,(\neg A \vee B)$. Первая скобка в бинарной логике равна $1$. В нечёткой (с $\min$, $\max$) она больше $0.5$ и тем ближе к $1$, чем истиннее $A$. Численные значения этих импликаций отличаются, если один из аргументов связки находится в окрестности неопределённого значения $0.5$.
Последние четыре опредления исходят из того, что импликация должна быть строго истинной, если из менее истинного утверждения "следует" не менее истинное ($A \le B$). Отличия возникают когда $A$ истиннее $B$.
Логический вывод
В бинарной логике из $P$ логически следует $Q$, если всегда, когда формула $P$ истинна, то истинна и формула $Q$. Это обозначается так: $P\Rightarrow Q$. Логический вывод - это способ получения одних истинных формул из других, также истинных. Не стоит путать вывод и импликацию $P\to Q$, которая является логической связкой, принимающая значения $0$ или $1$.
Рассмотрим простейший пример логического вывода: если истинна конъюнкция утверждений, то истинно (выводимо) каждое из утверждений. В нечёткой логике это правило обобщается очевидным образом, приводя к интервальным оценкам для выводимой формулы: $$ A\,\&\,B~~~~~ \Rightarrow~~~~~~ A,~~~~~~~~~~~~~~~~~~~~~~\min(A,~B) ~~~\le~~~ A ~~~\le~~~ 1, $$ где $\min(A,~B)$, с одной стороны является значением конъюнкции $A\,\&\,B$, а с другой, нижней границей для $A$. Естественно, в данном выводе предполагается, что степень истинности $A\,\&\,B$ задана и в результате логического вывода, она ограничивает снизу значение истинности $A$. Аналогично интерпретируются неравенства для следующего вывода: $$ A~~~~~ \Rightarrow~~~~~~ A\vee B,~~~~~~~~~~~~~~~~~~~~~~0 ~~~\le~~~ A ~~~\le~~~ \max(A,~B). $$
Таким образом, в нечёткой логике, по-мимо указания выводимой формулы, необходимо уметь вычислять степень её истинности. Определение такого логического вывода не вполне неоднозначно, что отражено в многообразии предложенных вариантов для импликации двух высказываний.
Одна из возможностей, как и в вероятностной логике считать, что $A~\Rightarrow~B$, если $A \le B$. Примеры выводов, приведенные выше, удовлетворяют этому условию. В случае предикатов, заданных на одном множестве $\mathbb$, такой вывод $A(x)~\Rightarrow~B(x)$ означает, что $A\subset B$ и множества $A,B$ являются нормальными, т.е. имеют единичную высоту (см. рисунок справа). Тогда на срезе $\alpha=1$, $A$ будет обычным подмножеством $B$.
Часто знания (обыденные или математические) формулируют как правила "ЕСЛИ . TO . " (импликация).
Тогда в бинарной логике важными методами вывода являются modus ponens и modus tollens (запись посылок вывода через запятую подразумевает связывание их логическим И): $$ \begin A, & A\to B&~~~~~~~~&\Rightarrow&~~~~~~~~&B\\ \neg B,& A\to B&~~~~~~~~&\Rightarrow&~~~~~~~~&\neg A\\ \end $$ Считая эти выводы справедливыми в нечёткой логике, найдём значения истинности получаемых формул.Для modus ponens имеем $\min(A,~A\to B) ~\le~ B~\le~ 1$. В случае когда "аксиома" $A \to B$ всегда истинна, то $A \le B$. Если $A=1$, то $B=1$ (бинарный случай), а при $A=0$ имеем $0 \le B\le 1$, т.е. значение $B$ полностью не определено (что также согласуется с бинарной логикой). Для modus tollens для истинного правила $A \to B$ также получаем $$ A ~\le~ B ~\le~ 1. $$ Напомним, что получение значение истинности выводимых формул в виде неравенства типично и для вероятностной логики.
Когда истинность правила $A\to B$ отлична от $1$, необходим выбор той или иной формулы для импликации. Отметим также, что из всех определений импликации с неравенством $\min(A,~A\to B) \le B$ в общем случае согласуются только импликации Шарпа и Брауэра.
Рассмотрим простой пример из двух правил: $$ A\to B,~~~~~~~\neg A\to \neg B. $$ Например, они справедливы для $A$: "сильно ударить по стеклу", $B$: "стекло разобьётся". Из первого правила следует, что $A \le B$, а из второго $1-A \le 1-B$ или $B\le A$. Поэтому $B = A$ (точное значение при заданном $A$). Это естественный результат: если по стеклу ударить несильно ($A = 0.2$), то видимо оно не разобьётся ($B = 0.2$).
✒ В бинарной логике существует очень мощный метод вывода по резолюции, применяемый в машинном выводе: $$ A\vee C,~\neg A\vee B~~~~~~~~~~\Rightarrow~~~~~~~~~~C\vee B. $$ В нечёткой логике он не работает, т.к. неравенство $\min\bigr(\max(A,C),~\max(1-A, B)\,\bigr)~\le \max(C,B)$ не является верным (например, для $A=1/2,~B=C=0$). Это связано с нарушением закона исключения третьего. В бинарной логике резолюция означает, если посылки истинны, то либо $A=0$ и тогда $C=1$, $B$ - любое, либо $A=1$ и тогда $B=1$, $C$ - любое. Поэтому в любом случае $B \vee C$ истинно.
Вывод Заде для предикатов
Вывод Заде обобщает правило modus ponens на случай нечётких предикатов. Пусть есть правило $A(x)\to B(y)$ и задан предикат $A'(x)$ "похожий" на $A(x)$. Тогда: $$ A'(x),~~A(x)\to B(y)~~~~~~~~~\Rightarrow~~~~~~~B'(x) = A'\circ (A\to B) = \max_x\bigr[ \min\bigr[ A'(x),~ A(x)\to B(y)\bigr]\bigr]. $$ Нечёткое правило $A(x)\to B(y)$ может быть задано в виде отношения (матрица $\mathbb\times\mathbb$) или вычислено при помощи заданных предикатов $A(x), B(y)$ и одного из определений импликации (что проще).
В частном случае высказываний $A'=A$ и импликации Брауэра $A\to B:~R=\text< if >(A \le B): \$, получаем: $$ B' = \left\< \begin \min(A,~1)=A, & ~~~& A \le B \\ \min(A,~B)=B, & ~~~& A \gt B \end \right. ~~~~~=~~~~ \min(A,B) $$ Если $A=1$, то $B'= B = R$ (степени истинности правила), если $A=0$, то $B'=0$ (?), хотя в бинарной логике истинность $B$ не определена. При $A=0.5$ имеем $B'=0.5$.
Вывод Мамдани
Логический вывод Мамдани - это эвристический способ нечётких рассуждений, который используется при наличии набора правил, содержащих нечёткие переменные. Пусть, например, есть два правила, зависящие от 6 нечётких переменных $A_i,B_i,C_i$, определяемых тремя параметрами $x,y,z$: $$ \begin
A_1(x) \,\&\,B_1(y) \to C_1(z),\\ A_2(x) \,\&\,B_2(y) \to C_2(z).\\ \end $$ Предположим, что значения вещественных параметров $x,y$ известны и равны $x_0,y_0$.
Задача состоит в определении наиболее подходящего значения параметра $z$, удовлетворяющего этим правилам.
На первом этапе поиска $z$ проводится фаззификация (получение значений нечётких переменных $A_1(x_0)$ и т.д.) и вычисление значений посылок на основе формул нечёткой логики ($\min$ для $\&$ и $\max$ для $\vee$): $$ \left\< \begin \alpha_1 = \min\bigr(A_1(x_0),~B_1(y_0)\bigr) \\ \alpha_2 = \min\bigr(A_2(x_0),~B_2(y_0)\bigr) \end\right., $$$$~~ \left\< \begin \alpha_1 \to C_1(z)\\ \alpha_2 \to C_2(z)\\ \end\right.. $$ Затем "активизируются" следствия правил, в предположении, что их истинность не должна превышать истинности посылок (справа на рисунке уровни $\alpha_i$ отсекают более высокие значения истинности следствий): $$ $$$$$$$$$$$~C'_i(z) = \min (\alpha_i, C(z)). $$ Эти модифицированные следствия объединяются по всем правилам (логическое ИЛИ), в результате чего получается функция распределения $\mu(z)\in[0. 1]$ для переменной $z$: $$ \mu(z) = \max_i C'_i(z).$$ $$ На последнем этапе проводится дефаззификация, в результате которой выбирается конкретное значение для $z$. Например, можно взять точку центра тяжести функции $\mu(z)$: $$ z_0 =\int z\,\mu(z)\,dz ~\Bigr/~ \int \mu(z)\,dz. $$ Обратим внимание, что, как на этапе активизации, так и при дефаззификации посылки с низкой истинностью дают слабый вклад в результат (совсем ложные посылки вообще на него не влияют). Поэтому при активизации вместо функции $\min$ можно также использовать произведение: $C'_i(z)=\alpha_i\,C_i(z)$ (алгоритм Ларсена).
Существует модификация этого метода - вывод Цукамото. На этапе активизации следствий решаются уравнения: $C_i(z) = \alpha_i$, дающие единственные решения $z_i$. Такой подход возможен только, когда нечёткие переменные $C_i(z)$ в правилах являются монотонными функциями $z$ (растущими или убывающими), иначе решений будет несколько. На этапе дефаззификации также вычисляется центр тяжести по полученным решениям $z_1,z_2. $: $$ z= \sum_i \alpha_i z_i~\Bigr/~\sum_i\alpha_i. $$
Существует также подход Сугено, в котором в правилах следствия записываются в виде инструкций для значений $z=F(x,y)$, где $F$ - некоторые функции (обычно линейные). После фаззификации мы сразу получаем значения $z_i$, по которым, как и выше, при помощи истинностей посылок $\alpha_i$ вычисляется центр тяжести.
Нечёткие числа
Нечёткое число $X$ - это функция принадлежности $\mu_X(x)$ от вещественного числа $x$, имеющая единственный единичный максимум при $x=X$. На рисунке справа $\mu_0(x)$ - это "примерно ноль", а $\mu_3(x)$ - примерно три.
Пусть есть вещественная функция двух (обычных) чисел $z=f(x,y)$ и два нечётких числа $A(x), B(y)$. Нас интересует функция принадлежности $\mu_(z)$, равная степени уверенности в том, что конкретное число $z$ является результатом операции (функции) $f$.
Переберём все возможные значения $x,y$ для которых $z=f(x,y)$ и выясним степени уверенности того, что это нечёткие числа $A(x), B(y)$. Тогда по принципу расширения Заде функция принадлежности операции, по определению, будет равна: $$ \mu_(z) = \sup_\min\bigr\<\mu_A(x),\,\mu_B(y)\bigr\>. $$ Таким образом, из всех возможных "чётких" способов получить $z$ выбираем то, которое даёт наибольшее ($\sup$) значение минимума функций принадлежности нечётких чисел аргументов функции.
Часто для нечётких чисел используют функции принадлежности $L-R$ типа $$ \mu_A(x) = \left\< \begin L(a-x) & x \ge a \\ R(x-a) & x \ge a \\ \end \right. $$~ \begin L(0)=R(0) = 1 \\ L,R \text < - не возрастают>\\ \end $$ Простейшим примером является треугольная функция принадлежности $\langle a;\, \alpha, \beta \rangle$, приведенная на рисунке. При помощи принципа расширения для треугольных чисел можно получить следующие результаты для стандартных арифметических операций: $$ \begin \langle a_1;\, \alpha_1,\beta_1 \rangle \pm \langle a_2;\, \alpha_2,\beta_2 \rangle = \langle a_1\pm a_2;\, \alpha_1+\alpha_2,\beta_1+\beta_2 \rangle\\ \langle a_1;\, \alpha_1,\beta_1 \rangle \cdot \langle a_2;\, \alpha_2,\beta_2 \rangle = \langle a_1\cdot a_2;\, \alpha_1 a_2+\alpha_2 a_1,\beta_1 b_2+\beta_2 b_1\rangle\\ \langle a;\, \alpha,\beta \rangle^ = \langle 1/a;\, \beta/a^2,\alpha/a^2 \rangle \\ \end $$ Обратм внимание, что для положения максимума выполняются обычные арифметические операции, а величина нечёткости (ширина треугольника) увеличивается.
Другой способ задания функций принадлежности $\langle a,b; \alpha, \beta \rangle$ - это трапеция c максимумом на интервале $[a,b]$ и граничными точками $\alpha,\beta$.
Нечёткая логика на Python
Определим класс с перегруженными логическими операторами для нечёткой логики:
class Fuzzy: def __init__(self, val=0): val = np.array(val) if isinstance(val,(list, np.ndarray)) else np.array([val]) self.val = val.astype('float32') def __invert__(self): # ~x NOT return Fuzzy(1-self.val) def __and__(self, other): # x & y AND return Fuzzy( np.minimum(self.val, other.val) ) def __or__(self, other): # x | y OR return Fuzzy( np.maximum(self.val, other.val) ) def __eq__(self, other): return Fuzzy(self.val == other.val) def __str__(self): return f"" if len(self.val)==1 else f"" def minmax(self): return (self.val.min(), self.val.max()) def __gt__(self, other): return Fuzzy( np.minimum( np.ones_like(self.val), 1-self.val+other.val) )Пример его использования:
x = Fuzzy( [0, 0, 0, 0.5,0.5,0.5,1, 1, 1] ) y = Fuzzy( [0, 0.5,1, 0, 0.5,1, 0, 0.5,1] ) print(x & y ) # [0. 0. 0. 0. 0.5 0.5 0. 0.5 1. ] print(x | y ) # [0. 0.5 1. 0.5 0.5 1. 1. 1. 1. ]Проверка тождеств булевой алгебры:
vals = np.linspace(0,1,101, dtype='float32') x = Fuzzy(vals) print ( (x & x).minmax() ) # (0.0, 1.0) print ( (x & ~x).minmax() ) # (0.0, 0.5) print ( (x | ~x).minmax() ) # (0.5, 1.0) x, y, z = np.meshgrid(vals, vals, vals) x, y, z = Fuzzy(x), Fuzzy(y), Fuzzy(z) print ( ((x & (y | z)) == ((x & y) | (x & z))).minmax() ) # (1.0, 1.0)








