对非数值类型进行符号计算
我想找一个Python库,可以进行符号运算,符号可以是任意类型的未知数。
这是我想写的代码:
>>> myexpression = symbol("foo") == "bar"
>>> print myexpression
foo == "bar"
>>> print myexpression(foo="quux")
False
>>> myexpression.or_(True)
True
或者说是类似的粗略版本。其实不需要太复杂,我也能接受需要调用很多额外的方法来实现上面的功能(比如,即使逻辑恒等式没有直接简化也没关系)。
我最初的想法是看看sympy这个库,但它似乎强烈假设符号变量必须是数字;而我希望至少能对序列和集合进行操作:
>>> myexpression = sympy.Eq(sympy.Symbol("foo"), 5)
>>> myexpression
foo == 5
>>> myexpression = sympy.Eq(sympy.Symbol("foo"), "bar")
Traceback (most recent call last):
...
sympy.core.sympify.SympifyError: SympifyError: 'bar'
有没有办法让sympy理解非数字变量,或者有没有其他库可以做类似的事情?
3 个回答
0
布尔逻辑在SymPy里是有的,不过表达起来没有那么简单。它确实存在。
In [1]: x,y,z = symbols('x y z')
In [2]: A = Eq(x,y)
In [3]: A
Out[3]: x = y
In [4]: B = Gt(y,z)
In [5]: And(A,B)
Out[5]: x = y ∧ y > z
In [6]: C = Gt(x,z)
In [7]: And(A, Or(B,C))
Out[7]: x = y ∧ (y > z ∨ x > z)
我不知道有多少方法可以简化这些表达式。如果大家对此感兴趣,这种事情其实是很容易做到的。
0
你能不能把所有东西都映射成一个Sympy的符号?比如,在你最后的表达式中:sympy.Eq(sympy.Symbol("foo"), sympy.Symbol("bar"))。还是说你其实是想写一些关于集合关系的逻辑语句?
1
我不太确定这是否适合你想要的用途,但nltk
(自然语言工具包)有一些模块可以进行符号操作,包括一阶逻辑、类型化的λ演算和定理证明器。你可以看看这个指南。