非数字类型的符号操作

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理解非数值变量,或者有其他类似功能的库?

使用一个或多个以 sympy.Symbol 对象为键的字典怎么样? - wberry
3个回答

1

不确定它是否完全符合您的需求,但是 nltk(自然语言工具包)具有用于符号操作的模块,包括一阶逻辑、类型化λ演算和定理证明器。请查看this howto


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)

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


我真正感兴趣的是在类型为标量以外的情况下使用“已知”。例如,我想操作变量为集合的表达式/方程。未经过类型定义的变量并不是我所追求的。 - SingleNegationElimination

0

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


我确实想编写逻辑语句;例如,我希望能够表达 X & (Y | Z),并且能够分配交集 (X & Y) | (X & Z),或者反过来;希望根据考虑到 XYZ 中元素的分布来选择一个实际执行的语句(基于某些成本)。 - SingleNegationElimination

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接