Estoy intentando crear un programa que usa sympy para tomar un conjunto de variables y evaluar una expresión de lógica simbólica sobre el dominio de esas variables. El problema es que no puedo hacer que Python evalúe la expresión después de que escupe la tabla de verdad.Tablas de verdad en python usando sympy
Aquí está el código:
from sympy import *
from sympy.abc import p, q, r
def get_vars():
vars = []
print "Please enter the number of variables to use in the equation"
numVars = int(raw_input())
print "please enter each of the variables on a newline"
for i in xrange(numVars):
vars.append(raw_input())
return vars
def get_expr():
print "Please enter the expression to use"
return str(raw_input())
def convert_to_expr(inputStr):
return eval(inputStr)
def main():
vars = get_vars()
expr = get_expr()
print("recieved input: " + str(vars) + " expr " + str(expr))
print "Truth table for " + str(len(vars)) + "variable(s)"
for i in enumerate(truth_table(vars, expr)):
print i
def fixed_table(numvars):
"""
Generate true/false permutations for the given number of variables.
So if numvars=2
Returns (not necessarily in this order):
True, True
True, False
False, False
False, True
"""
if numvars is 1:
yield [True]
yield [False]
else:
for i in fixed_table(numvars-1):
yield i + [True]
yield i + [False]
def truth_table(vars, expr):
"""
Takes an array of variables, vars, and displays a truth table
for each possible value combination of vars.
"""
for cond in fixed_table(len(vars)):
values=dict(zip(vars,cond))
yield cond + [eval(expr)]
if __name__ == "__main__":
main()
Si hago lo siguiente, aquí está la salida:
Please enter the number of variables to use in the equation
3
please enter each of the variables on a newline
p
q
r
Please enter the expression to use
p&q&r
recieved input: ['p', 'q', 'r'] expr p&q&r
Truth table for 3variable(s)
(0, [True, True, True, And(p, q, r)])
(1, [True, True, False, And(p, q, r)])
(2, [True, False, True, And(p, q, r)])
(3, [True, False, False, And(p, q, r)])
(4, [False, True, True, And(p, q, r)])
(5, [False, True, False, And(p, q, r)])
(6, [False, False, True, And(p, q, r)])
(7, [False, False, False, And(p, q, r)])
Si algún software existe para realizar esta tarea, que realmente me gustaría saber sobre él :-)
Gracias de antemano.
Eres increíble. ¡Muchas gracias, funcionó perfectamente! – alvonellos