2

我已经用 S1 替换了 S,它工作正常。我不明白 S 在 sympy 中的意义是什么。

#!/usr/bin/env py
import itertools
import sys
import sympy

data = ['next_state=(D1&S1&~SE)|(~S1&~SE&D0)|(SE&SI))']

#data = ['next_state=(D1&S&~SE)|(~S&~SE&D0)|(SE&SI))']


data_1 = data[0].split(',')
com = None
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_op = "(" + item_op + ")"
        print item_op
        expr = sympy.sympify(item_op)
        temp_list = [ str(data) for data in expr.free_symbols]
        temp_list.remove('D1')

        #print len(temp_list), temp_list
        for truth_values in sympy.cartes([0, 1], repeat=len(temp_list)):
            values = dict(zip(temp_list, truth_values))
            print  values.items(), expr.subs(values)
            if str(expr.subs(values)) =="D1":
                com = sorted(values.items())
                break
        print "com",com
4

2 回答 2

3

S 是 SymPy 的单例注册表。它实现了call方法,它是 sympify() 的简写。使用 S 是构造有理数的最简洁方法

http://mattpap.github.io/scipy-2011-tutorial/html/gotchas.html

于 2013-11-13T12:07:33.660 回答
1

您可以通过使用对解析进行更细粒度的控制parse_expr。特别是,如果您不想使用任何 SymPy 名称,您可以将全局变量设置为{}.

>>> from sympy.parsing.sympy_parser import parse_expr
>>> parse_expr('(D1&S&~SE)|(~S&~SE&D0)|(SE&SI)', global_dict={'Symbol':Symbol})
(SE ∧ SI) ∨ (D₀ ∧ ¬S ∧ ¬SE) ∨ (D₁ ∧ S ∧ ¬SE)

(包括Symbol它解析符号所必需的)。

或者,如果您知道不想使用的名称,您可以在sympify

>>> sympify('(D1&S&~SE)|(~S&~SE&D0)|(SE&SI)', {'S': Symbol('S')})
(SE ∧ SI) ∨ (D₀ ∧ ¬S ∧ ¬SE) ∨ (D₁ ∧ S ∧ ¬SE)
于 2013-11-14T04:14:46.700 回答