擅长:python、mysql、java
<p>SymPy集可用于进行单变量简化,例如<code>((x < 3) & (x < 5)).as_set() -> Interval.open(-oo, 3)</code>,集可转换回关系。下面将复杂表达式转换为cnf形式,根据自由符号分隔参数,并简化单变量的参数,同时保持多变量参数不变</p>
<pre><code>def f(eq):
from collections import defaultdict
from sympy import to_cnf, ordered
cnf = to_cnf(eq)
args = defaultdict(list)
for a in cnf.args:
args[tuple(ordered(a.free_symbols))].append(a)
_args = []
for k in args:
if len(k) == 1:
_args.append(cnf.func(*args[k]).as_set().as_relational(k[0]))
else:
_args.append(cnf.func(*args[k]))
return cnf.func(*_args)
</code></pre>
<p>例如:</p>
<pre><code>>>> from sympy.abc import a, c
>>> f((a < 1) | ((c >= 4) & (a < 3) & (a < 12)))
(a < 3) & ((c >= 4) | (a < 1))
</code></pre>