Символьные манипуляции над нечисловыми типами - PullRequest
8 голосов
/ 26 сентября 2011

Мне интересна библиотека 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 ]

1 голос
/ 26 марта 2012

Не уверен, насколько он подходит для использования, которое вы имеете в виду, но nltk (Natural Language Toolkit) имеет модули для символьных манипуляций, включая логику первого порядка, типизированное лямбда-исчисление и доказательство теорем.Взгляните на это Howto .

0 голосов
/ 29 февраля 2012

Булева логика в 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 голосов
/ 26 сентября 2011

Не могли бы вы просто отобразить все в символ Sympy?Например, в вашем последнем выражении: sympy.Eq (sympy.Symbol ("foo"), sympy.Symbol ("bar")).Или вы имеете в виду, что вы действительно хотите написать логические утверждения о множестве отношений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...