Построение truth table в Python: от простого к сложному
Основные методы создания таблицы истинности
Наиболее эффективный способ генерации таблицы истинности в Python основан на применении модуля itertools, в частности функции product. Этот подход обеспечивает перебор всех возможных комбинаций логических значений для произвольного числа переменных и позволяет вычислять результат любого логического выражения.
import itertools
def truth_table(variables, expression):
print(*variables, 'Result')
for values in itertools.product([True, False], repeat=len(variables)):
env = dict(zip(variables, values))
result = eval(expression, {"__builtins__": None}, env)
print(*values, result)
truth_table(['A', 'B', 'C'], 'A and B or not C')булевы значения python (булевы значения (true/false) в python)
A B C Result True True True True True True False True True False True False True False False True False True True False False True False True False False True True False False False True
1 и 1 в python примеры (примеры булевых операций в python)
В коде определяется функция truth_table, которая принимает список имен переменных и строку с логическим выражением. Для каждой комбинации значений (через product) создается словарь env, связывающий имена переменных с их значениями, после чего выражение вычисляется с помощью eval. Важно ограничить глобальные и локальные пространства имен, передавая пустой словарь для __builtins__ и env как локальные, чтобы избежать нежелательного доступа к встроенным функциям.
Как построить таблицу истинности с помощью вложенных циклов?
Для двух или трех переменных можно использовать вложенные циклы for. Это наглядный способ, не требующий дополнительных модулей.
variables = ['A', 'B']
for a in [True, False]:
for b in [True, False]:
result = a and b
print(a, b, result)
таблица истинности python (таблица истинности в python)
True True True True False False False True False False False False
Для большего количества переменных код становится громоздким, поэтому такой подход применяется только для демонстрации или фиксированного малого числа переменных.
Как красиво отформатировать таблицу истинности с помощью pandas?
Библиотека pandas предоставляет удобный способ отображения таблицы с заголовками и выравниванием. Особенно полезно в среде Jupyter Notebook.
import itertools
import pandas as pd
def truth_table_pandas(variables, expression):
rows = []
for values in itertools.product([True, False], repeat=len(variables)):
env = dict(zip(variables, values))
result = eval(expression, {"__builtins__": None}, env)
rows.append(list(values) + [result])
df = pd.DataFrame(rows, columns=variables + ['Result'])
return df
df = truth_table_pandas(['A', 'B'], 'A and B')
print(df)
A B Result 0 True True True 1 True False False 2 False True False 3 False False False
Pandas DataFrame автоматически отображает типы данных и позволяет экспортировать таблицу в CSV, Excel и другие форматы.
Как использовать sympy для символьного вычисления таблицы истинности?
Библиотека sympy позволяет работать с символьными логическими выражениями и строить таблицы истинности на основе символьных переменных.
import sympy as sp
from sympy.logic.boolalg import truth_table
A, B = sp.symbols('A B')
expr = A & B | ~A
table = list(truth_table(expr, [A, B]))
print("A B Result")
for values, result in table:
print(*values, result)
A B Result False False True False True True True False False True True True
Sympy автоматически преобразует логическое выражение в нормальную форму и генерирует все комбинации. Это удобно для анализа и упрощения выражений.
Как вычислить таблицу истинности для выражения, заданного строкой, с помощью eval?
Метод с eval позволяет вычислять произвольные логические выражения, переданные в виде строки. Это гибко, но требует осторожности с безопасностью.
import itertools
expr_str = "(A and B) or (not C)"
vars_list = ['A', 'B', 'C']
combs = itertools.product([True, False], repeat=len(vars_list))
for comb in combs:
env = dict(zip(vars_list, comb))
res = eval(expr_str, {"__builtins__":None}, env)
print(*comb, "->", res)
True True True -> True True True False -> True True False True -> False True False False -> True False True True -> False False True False -> True False False True -> True False False False -> True
Этот подход прост и не требует дополнительных библиотек. Однако eval выполняет произвольный код, поэтому его не стоит использовать с непроверенными входными данными. Для безопасной альтернативы можно разобрать выражение с помощью ast.literal_eval (но он не поддерживает логические операторы).
Расширенные примеры использования таблиц истинности
В этом разделе представлены более сложные сценарии: создание универсального класса, использование сторонней библиотеки, визуализация и работа с лямбда-функциями.
Пример 1: класс TruthTable с гибким интерфейсом
Создадим класс TruthTable, который хранит переменные и выражение, и предоставляет методы для вывода таблицы в разных форматах.
import itertools
import pandas as pd
class TruthTable:
def __init__(self, variables, func):
self.variables = variables
self.func = func
self._rows = None
self._build()
def _build(self):
rows = []
for vals in itertools.product([True, False], repeat=len(self.variables)):
env = dict(zip(self.variables, vals))
result = self.func(**env)
rows.append(list(vals) + [result])
self._rows = rows
def to_string(self):
header = self.variables + ['Result']
lines = [' '.join(header)]
for row in self._rows:
lines.append(' '.join(str(v) for v in row))
return '\n'.join(lines)
def to_dataframe(self):
return pd.DataFrame(self._rows, columns=self.variables + ['Result'])
# Использование
def my_expr(A, B, C):
return (A and B) or (not C)
tt = TruthTable(['A','B','C'], my_expr)
print(tt.to_string())
A B C Result True True True True True True False True True False True False True False False True False True True False False True False True False False True True False False False True
Класс принимает функцию, а не строку, что полностью безопасно и эффективно. Метод to_dataframe возвращает DataFrame для дальнейшего анализа.
Пример 2: использование сторонней библиотеки truth-table-generator
Библиотека truth-table-generator специально создана для построения таблиц истинности. Установка: pip install truth-table-generator
from truthtable import TruthTable
table = TruthTable(['A', 'B', 'C'], ['(A & B) | ~C'])
table.display()
+-------+-------+-------+-------+ | A | B | C | Result| +-------+-------+-------+-------+ | True | True | True | True | | True | True | False | True | | True | False | True | False | | True | False | False | True | | False | True | True | False | | False | True | False | True | | False | False | True | True | | False | False | False | True | +-------+-------+-------+-------+
Библиотека поддерживает символьные операции (&, |, ~, ^) и упрощает вывод. Однако она менее гибкая, чем ручная реализация.
Пример 3: визуализация таблицы истинности с помощью тепловой карты
Для анализа больших таблиц можно использовать тепловую карту (heatmap) библиотеки seaborn, где цвет показывает результат.
import itertools
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
def truth_heatmap(variables, expression):
n = len(variables)
size = 2**n
combos = list(itertools.product([True, False], repeat=n))
results = []
for vals in combos:
env = dict(zip(variables, vals))
results.append(eval(expression, {"__builtins__":None}, env))
matrix = np.array(results).reshape((2,)*n)
if n == 2:
sns.heatmap(matrix, annot=True, xticklabels=['False','True'], yticklabels=['False','True'],
cbar=False, cmap='viridis')
plt.xlabel(variables[1])
plt.ylabel(variables[0])
plt.title('Heatmap of ' + expression)
plt.show()
else:
print('Heatmap только для 2 переменных')
truth_heatmap(['A','B'], 'A and B')
(выводится график с тепловой картой 2x2)
Тепловая карта наглядно показывает области истинности. Для большего числа переменных можно использовать другие виды визуализации (например, параллельные координаты).