在Python中为任何表达式创建真值表

时间:2015-04-09 20:52:01

标签: python boolean

我正在尝试创建一个程序,在运行时会询问布尔表达式,变量然后为输入的内容创建一个真值表。我需要使用一个类,这是我到目前为止。我不知道从哪里开始。

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()

3 个答案:

答案 0 :(得分:6)

我有一个完全符合您要求的库! 查看github repo或在pypi上找到它here

自述文件描述了一切如何运作,但这是一个简单的例子:

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          |
+---+---+---+---+-----------+--------------+---------------------+

希望这有帮助!

答案 1 :(得分:5)

你可以直接在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]))

使用它会产生(如果你使用的是IPython Notebook,那么格式很好的html):

truth_table(f)

    w       x       y       z       f
0   False   False   False   False   False
1   False   False   False   True    False
2   False   False   True    False   False
3   False   False   True    True    False
4   False   True    False   False   False
5   False   True    False   True    False
6   False   True    True    False   False
7   False   True    True    True    True
8   True    False   False   False   False
9   True    False   False   True    False
10  True    False   True    False   False
11  True    False   True    True    False
12  True    True    False   False   False
13  True    True    False   True    False
14  True    True    True    False   True
15  True    True    True    True    True

干杯。

答案 2 :(得分:1)

你可能想做这样的事情:

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)]