2011-09-26 17 views
8

Me interesa una biblioteca de Python que permita la manipulación simbólica donde los símbolos y pueden ser desconocidos de un tipo arbitrario.Manipulación simbólica sobre tipos no numéricos

Este es el código que yo quiero a escribir:

>>> myexpression = symbol("foo") == "bar" 
>>> print myexpression 
foo == "bar" 
>>> print myexpression(foo="quux") 
False 
>>> myexpression.or_(True) 
True 

O alguna aproximación de ello. En realidad, ni siquiera necesita ser tan inteligente, me alegra tener que recurrir a muchos métodos de introspección adicionales para obtener algo como lo anterior (por ejemplo, incluso si la tautología lógica no se simplifica directamente)

Mi primer instinto fue mirar sympy, pero parece que la biblioteca hace la fuerte suposición de que las variables simbólicas deben ser números; y me gustaría al menos operar en secuencias y conjuntos:

>>> 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' 

¿Hay una manera de conseguir sympy para comprender las variables no numéricas, u otra biblioteca que puede hacer cosas similares?

+0

¿Qué hay de usar uno o más diccionarios con objetos 'sympy.Symbol' como claves? – wberry

Respuesta

0

¿Podría simplemente asignar todo en un símbolo de Sympy? Por ejemplo, en su última expresión: sympy.Eq (sympy.Symbol ("foo"), sympy.Symbol ("bar")). ¿O quiere decir que realmente quiere escribir declaraciones lógicas sobre las relaciones establecidas?

+0

Quiero escribir declaraciones lógicas; Por ejemplo, me gustaría poder expresar 'X & (Y | Z)', y poder distribuir la intersección '(X e Y) | (X y Z) ', o viceversa; con la esperanza de escoger uno para ejecutar realmente (basado en algún costo considerando la distribución de elementos en 'X',' Y' y 'Z'.) – SingleNegationElimination

0

La lógica booleana está en SymPy aunque no es tan fácil de expresar como debería ser. Sin embargo, definitivamente está allí.

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) 

No conozco muchos métodos para simplificar estas expresiones. Este es el tipo de cosa que sería fácil de hacer si hubiera interés.

+0

Bueno, lo que realmente me interesa es usar * knowns * con tipos otros que escalares. Por ejemplo, me gustaría manipular expresiones/ecuaciones donde las variables son conjuntos. Las variables sin par no son realmente lo que busco. – SingleNegationElimination

1

No estoy seguro de qué tan bien se adapta a los usos que tiene en mente, pero nltk (Natural Language Toolkit) tiene módulos para manipulación simbólica, incluida lógica de primer orden, cálculo lambda tipado y demostrador de teoremas. Eche un vistazo al this howto.

Cuestiones relacionadas