Haskell biblioteca como SymPy?
symbolic-math computer-algebra-systems (3)
Necesito manipular expresiones como 1 + sqrt (3) y hacer aritmética básica como suma, resta y división. Me gustaría que el resultado estuviera en algún tipo de forma canónica para que se pueda utilizar como una clave en un mapa. Convertir 1 + sqrt (3) en un flotador no es factible debido a problemas de redondeo.
Utilicé SymPy para esta tarea en Python. ¿Hay una biblioteca nativa equivalente para Haskell?
Parece que estás buscando Computer Algebra System (CAS) en Haskell. A pesar de tantas referencias a objetos algebraicos en los nombres de paquetes / módulos de Haskell, nunca he oído hablar de un sistema CA de propósito general y bien mantenido en Haskell (como SymPy o Sage en Python).
Sin embargo, en la lista de Sistemas de álgebra computacional en Wikipedia, he encontrado una referencia a
DoCon. El constructor de dominio algebraico
Utiliza una licencia no estándar , pero me atrevo a decir que aún es de código abierto (aunque con requisitos de cambio de nombre y atribución). A partir de julio de 2010, docon-2.11
aún se construye con GHC 6.12.1 y ejecuta demostraciones / pruebas (solo tuve que insertar un pragma LANGUAGE FlexibleContexts
en un archivo de la demostración).
DoCon está bien documentado (362 páginas del Manual). Su manual está empaquetado dentro de la cremallera con las fuentes, así que lo puse en línea por separado para su conveniencia:
Por favor revise para ver si se ajusta a sus necesidades.
Por favor revisa el paquete de numbers
. Si todo lo que necesita es almacenar números exactos como "1 + √3", puede usar Data.Number.CReal lugar de aritmética simbólica. Almacena las expresiones y se puede calcular a un número arbitrario de dígitos cuando sea necesario.
Prelude Data.Number.CReal> let cx = 1 + sqrt (3 :: CReal)
Prelude Data.Number.CReal> showCReal 400 cx
"2.7320508075688772935274463415058723669428052538103806280558069794519330169088000370811461867572485756756261414154067030299699450949989524788116555120943736485280932319023055820679748201010846749232650153123432669033228866506722546689218379712270471316603678615880190499865373798593894676503475065760507566183481296061009476021871903250831458295239598329977898245082887144638329173472241639845878553977"
También hay un módulo Data.Number.Symbolic en el paquete, pero la descripción dice "Es principalmente útil para la depuración".
Revise el paquete cyclotomic , que implementa la aritmética exacta en los números ciclotómicos. Estos incluyen todos los números algebraicos (por lo tanto, en particular 1 + sqrt (3)) y las operaciones clave (como la igualdad) son decidibles.
No proporcionan una instancia de Ord
(por la misma razón que los números complejos no lo hacen), pero uno puede implementar una instancia no semántica si todo lo que uno necesita es usarlos como claves en una tabla de búsqueda. Es posible que desee ponerse en contacto con el autor para saber cómo hacer esto correctamente, ya que puede haber algunas invariantes que no sean obvias (por ejemplo, es posible que tenga que tener cuidado con los ceros en el mapa).