在我的项目中,我生成具有(非)等式链形式的逻辑表达式的虚拟字符串,例如:
(z > x) & (7 < y) & (x = 2) & (y < x) & (y < z)
其中的操作数可以是x,y,z或数字,比较形式为'> = <',始终链接为逻辑末尾。
然后我将sympy.parsing.sympy_parser.parse_expr用于此字符串。如果条件错误,则必须仅返回False,例如在:
情况下('3', '=', 'x'), ('x', '=', '2'), ('5', '<', 'z'), ('9', '>', 'x'), ('x', '<', '9')
或
('y', '=', '3'), ('y', '=', '9'), ('y', '>', 'x'), ('z', '>', '0'), ('y', '>', 'x')
但是其他一些表达式的解释不像false一样
P.S:同样,sympy会评估错误的真实表达式,例如:
('y', '<', 'z'), ('y', '<', 'z'), ('z', '>', 'y'), ('x', '=', 'x'), ('z', '=', 'x')
('x', '<', 'y'), ('z', '=', 'z'), ('x', '<', 'y'), ('x', '=', 'z'), ('8', '>', 'z')
其有效,但解析器返回False。
答案 0 :(得分:1)
显示您传递给解析器的会话的副本将是不错的选择,但是对于更复杂的输入,此答案可能就足够了:像(x < x)
之类的东西不会评估,因为x
可能是任何东西...并非所有事物都会给出False。有些事情会引发错误,例如I < I
既不是True也不是False,这是无效的比较。
如果您告诉SymPy x
是真实的,则表达式将求值:
>>> var('x',real=True)
x
>>> x<x
False
要在解析时这样做,请传递“本地”字典,告诉解析器遇到给定符号时要使用什么符号,例如
>>> parse_expr('x<x',dict(x=symbols('x', real=True)))
False
这不足以解决(x < y) & (y < z ) & (z < x)
-simplify
仍然不够聪明,无法识别这一点-为False:
>>> locals = dict(zip('xyz',symbols('x,y,z', real=True)))
>>> parse_expr('(x < y) & (y < z ) & (z < x)', locals).simplify()
(x > z) & (x < y) & (y < z)