7

我对允许符号操作的 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 理解非数字变量,或者另一个可以做类似事情的库?

4

3 回答 3

1

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

于 2012-03-26T16:24:41.330 回答
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)

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

于 2012-02-29T14:21:42.807 回答
0

你能把所有东西都映射成一个 Sympy 符号吗?例如,在您的最后一个表达式中:sympy.Eq(sympy.Symbol("foo"), sympy.Symbol("bar"))。或者你的意思是你真的想写关于集合关系的逻辑语句?

于 2011-09-26T06:53:35.823 回答