2013-10-23 63 views
0

我正在搜索一个可以进行布尔操作并找到sympy的库。我写了下面的程序并执行布尔操作。我最终会有例外。 使用sympy的布尔操作

import itertools 
import sympy 

data = ['iq,next_state=((!SE&D&RS)|(SE&SI)))'] 
data_1 = data[0].split(',') 
for item in data_1: 
    if item.find('next_state=')!= -1: 
     item_list = item.split('=') 
     item_op = item_list[len(item_list) -1].lstrip('(').rstrip(')') 
     item_list = item_list[len(item_list) -1].replace('(','').replace(')','') 
     item_list = item_list.replace("&",",").replace("|",",").replace("!","") 
     item_list = item_list.split(',') 
     item_list = list(set(item_list)) 
     print item_list 

     item_op = "(" + item_op + ")" 
     print "item-op",item_op 
     list_exp = item_op.split('|') 
     #print list_exp 
     expr = sympy.sympify(item_op) 
     variables = sorted(expr.free_symbols) 
     for truth_values in sympy.cartes([0, 1], repeat=len(item_list)): 
      values = dict(zip(variables, truth_values)) 
      print sorted(values.items()), expr.subs(values) 

错误:

['SI', 'D', 'SE', 'RS'] #Need to truth table for 4 element 
item-op (!SE&D&RS)|(SE&SI) #This operation need to perform 
Traceback (most recent call last): 
    File "next_state.py", line 21, in <module> 
    expr = sympy.sympify(item_op) 
    File "/.local/lib/python2.7/site-packages/sympy/core/sympify.py", line 297, in sympify 
    raise SympifyError('could not parse %r' % a, exc) 
sympy.core.sympify.SympifyError: Sympify of expression 'could not parse u'(!SE&D&RS)|(SE&SI)'' failed, because of exception being raised: 
TokenError: 
+3

异常堆栈跟踪会帮助很多 – J0HN

+0

同意。对于不完整的信息 – user765443

回答

3

我假定!装置在表达式(即逻辑补)。在将字符串传递给sympy.sympify之前,将其更改为~

In [15]: sympy.sympify("(~SE&D&RS)|(SE&SI)") 
Out[15]: Or(And(D, Not(SE), RS), And(SE, SI)) 
+0

嗯,它错了...... – user765443

+0

是的,不幸的是,SymPy仅限于Python操作符,而Python不允许您在操作中定义'!'。但是如果你的输入是字符串,一个简单的'.replace('!','〜')'应该可以做到。 – asmeurer