2011-09-26 119 views
8

我感兴趣的是一个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了解非数字变量,或另一个库,可以做类似的事情?

+0

怎么样使用一个或多个字典以'sympy.Symbol'对象作为键? – wberry

回答

0

你能不能映射一切都变成Sympy符号?例如,在你的最后一个表达式中: sympy.Eq(sympy.Symbol(“foo”),sympy.Symbol(“bar”))。或者你的意思是你真的想写关于设置关系的逻辑陈述?

+0

我确实想写逻辑语句;例如,我希望能够表达'X&(Y | Z)',并且能够分配交叉点'(X&Y)| (X&Z)',或反之亦然;在选择一个实际执行的希望(基于一定的成本考虑'X','Y'和'Z'元素的分布。) – SingleNegationElimination

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

好什么,我在用很感兴趣*的已知,*与其他类型比标量。例如,我想操纵变量集合的表达式/方程式。非类型变量并不是我所追求的。 – SingleNegationElimination

1

不知道它符合您的想法,但nltk(自然语言工具包)具有用于符号操作的模块,包括一阶逻辑,类型型lambda演算和一个定理证明器。看看this howto