对非数字类型的符号操作

时间:2011-09-26 00:28:26

标签: python sympy

我对一个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'

有没有办法让人们了解非数字变量或其他可以做类似事情的库?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您能将所有内容映射到Sympy符号吗?例如,在你的最后一个表达式中: sympy.Eq(sympy.Symbol(“foo”),sympy.Symbol(“bar”))。或者你的意思是你真的想写关于集合关系的逻辑陈述吗?

答案 2 :(得分: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)

我不知道有很多简化这些表达式的方法。如果有兴趣的话,这是很容易做到的事情。