Создание таблицы истинности для любого выражения в Python

Я пытаюсь создать программу, которая при запуске будет запрашивать логическое выражение, переменные, а затем создавать таблицу истинности для всего, что вводится. Мне нужно использовать класс, и это то, что я имею до сих пор. Я не уверен, куда идти отсюда.

from itertools import product

class Boolean(object):

       def __init__(self, statement, vars):
           self.exp = statement
           self.vars = vars

       def __call__(self, statement, vars):

def main():
   expression = raw_input('Give an expression:')
   vars = raw_input('Give names of variables:')
   variables = vars.split(' ')
   b = Boolean(expression, variables)

if __name__ == "__main__":
   main()

4 ответа

У меня есть библиотека, которая делает именно то, что вы хотите! Проверьте репозиторий github или найдите его здесь на pypi.

В файле readme описано, как все работает, но вот небольшой пример:

from truths import Truths
print Truths(['a', 'b', 'x', 'd'], ['(a and b)', 'a and b or x', 'a and (b or x) or d'])
+---+---+---+---+-----------+--------------+---------------------+
| a | b | x | d | (a and b) | a and b or x | a and (b or x) or d |
+---+---+---+---+-----------+--------------+---------------------+
| 0 | 0 | 0 | 0 |     0     |      0       |          0          |
| 0 | 0 | 0 | 1 |     0     |      0       |          1          |
| 0 | 0 | 1 | 0 |     0     |      1       |          0          |
| 0 | 0 | 1 | 1 |     0     |      1       |          1          |
| 0 | 1 | 0 | 0 |     0     |      0       |          0          |
| 0 | 1 | 0 | 1 |     0     |      0       |          1          |
| 0 | 1 | 1 | 0 |     0     |      1       |          0          |
| 0 | 1 | 1 | 1 |     0     |      1       |          1          |
| 1 | 0 | 0 | 0 |     0     |      0       |          0          |
| 1 | 0 | 0 | 1 |     0     |      0       |          1          |
| 1 | 0 | 1 | 0 |     0     |      1       |          1          |
| 1 | 0 | 1 | 1 |     0     |      1       |          1          |
| 1 | 1 | 0 | 0 |     1     |      1       |          1          |
| 1 | 1 | 0 | 1 |     1     |      1       |          1          |
| 1 | 1 | 1 | 0 |     1     |      1       |          1          |
| 1 | 1 | 1 | 1 |     1     |      1       |          1          |
+---+---+---+---+-----------+--------------+---------------------+

Надеюсь это поможет!

Вы можете просто определить любую булеву функцию прямо в Python.

рассмотрим следующий пример:

def f(w,x,y,z):
    return (x and y) and (w or z)

Я написал фрагмент, который принимает любую функцию f и возвращает таблицу истинности:

import pandas as pd
from itertools import product

def truth_table(f):
    values = [list(x) + [f(*x)] for x in product([False,True], repeat=f.func_code.co_argcount)]
    return pd.DataFrame(values,columns=(list(f.func_code.co_varnames) + [f.func_name]))

Использование этого приведет к (в красиво отформатированном HTML, если вы используете IPython Notebook):

truth_table (е)

    w       x       y       z       f
0 Ложь Ложь Ложь Ложь Ложь
1 Ложь Ложь Ложь Правда Ложь
2 Ложь Ложь Правда Ложь Ложь
3 Ложь Ложь Правда Ложь
4 Ложь Правда Ложь Ложь Ложь
5 Ложь Правда Ложь Правда Ложь
6 Ложь Истина Правда Ложь Ложь
7 Неверно верно верно верно верно
8 Верно Ложно Ложь Ложь Ложь
9 верно неверно неверно верно неверно
10 верно неверно верно неверно неверно
11 Верно Неверно Верно Верно Неверно
12 Истинный Истинный Ложный Ложный Ложный
13 верно верно неверно верно неверно
14 верно верно верно неверно верно
15 верно верно верно верно верно

Приветствия.

Вы, вероятно, хотите сделать что-то вроде этого:

from itertools import product
for p in product((True, False), repeat=len(variables)):
    # Map variable in variables to value in p
    # Apply boolean operators to variables that now have values
    # add result of each application to column in truth table
    pass

Но внутренняя часть цикла for - самая трудная часть, так что удачи.

Это пример того, что вы будете повторять в случае трех переменных:

>>> list(product((True, False), repeat=3))
[(True, True, True), (True, True, False), (True, False, True), (True, False, False), (False, True, True), (False, True, False), (False, False, True), (False, False, False)]

Если вы не возражаете, укажите количество переменных функции (я думаю, что это возможно, но я не знаю, как на данный момент). У меня есть следующее:

      from itertools import product
B = {0,1}
varNames= ["r","s","t","u","v","w","x","y","z"]

def booltable(f,n):
    vars = varNames[-n:]
    header = vars + ["f"]
    table = [*reversed([*map(lambda input: [*input,f(*input)], product(B,repeat=len(vars)))])]
    return [header] + table

Если вы хотите, чтобы ваши единицы были наверху (как я), просто переверните ответ.

      return [*reversed([*map(lambda input: [*input,f(*input)],product(B,repeat=len(vars)))])]

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

  • x | y- побитовое или x и y
  • x ^ y- побитовое исключающее или x и y
  • x & y- побитовое и x и y
  • ~x- биты x инвертированы
      # Example function
def aBooleanFunction(x,y,z):
    return (x | y) ^ ~(x ^ z) % 2
    
# Run
display(booltable(aBooleanFunction,3))

Результат:

      [['x', 'y', 'z', 'f'],
 [1, 1, 1, 0],
 [1, 1, 0, 1],
 [1, 0, 1, 0],
 [1, 0, 0, 1],
 [0, 1, 1, 1],
 [0, 1, 0, 0],
 [0, 0, 1, 0],
 [0, 0, 0, 1]]

Затем вы можете проанализировать это в таблице в любом формате, который вы хотите использовать, например,tabulate.

Другие вопросы по тегам