Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a truth table for any expression in Python

Tags:

python

boolean

I am attempting to create a program that when run will ask for the boolean expression, the variables and then create a truth table for whatever is entered. I need to use a class and this is what I have so far. I am not sure where to go from here.

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()
like image 577
say786 Avatar asked Apr 09 '15 20:04

say786


People also ask

How do you make a truth table in Python?

Here is the Python code for our Truth Table Generator function truthTable() which takes two parameters: A Boolean expression: e.g. A AND NOT (B OR C) The number of inputs: either 2, 3 or 4: A, B, C and D.

How do truth tables work Python?

Truth Tables. A truth table is a small table that allows us to list all the possible inputs, and to give the results for the logical operators. Because the and and or operators each have two operands, there are only four rows in a truth table that describes the semantics of and.


3 Answers

I have a library that does exactly what you want! Check out the github repo or find it here on pypi.

The readme describes how everything works, but here's a quick example:

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

Hope this helps!

like image 89
penchant Avatar answered Sep 29 '22 16:09

penchant


You could simply define any boolean function right in python.

consider the following example:

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

I've wrote a snippet that takes any function f, and returns its truth table:

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

Using this will yield (in a nicely formatted html if you're using IPython Notebook):

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

Cheers.

like image 33
OmerBA Avatar answered Sep 29 '22 14:09

OmerBA


You probably want to do something like this:

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

But the inside of the for loop is the hardest part, so good luck.

This is an example of what you would be iterating over in the case of three variables:

>>> 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)]
like image 32
Shashank Avatar answered Sep 29 '22 14:09

Shashank