Estoy buscando un sistema CAS simple para scala.Computer Algebra System (CAS) para Scala
Se debe tener las siguientes características:
- dar acceso al árbol de sintaxis abstracta (preferiblemente a través de clases de casos para una fácil adaptación)
- de análisis
String
a AST - simplificar las expresiones
Si no existe ninguno y tengo que escribir algo básico, ¿cuál es el la mejor representación?
estoy pensando algo como esto:
abstract trait Term
{
def simplify:Term
def evaluate(assignment:Var => Double):Double
def derivative:Term
}
case class Const(c:Int) extends Term
case class Var(x:String) extends Term
case class Negate(x:Term) extends Term
case class Subtract(x:Term, y:Term) extends Term
case class Divide(x:Term, y:Term) extends Term
object Add { def apply(x:Term*):Add = Add(x.toList) }
case class Add(xs : List[Term]) extends Term
object Multiply { def apply(x:Term*):Multiply = Multiply(x.toList) }
case class Multiply(xs:List[Term]) extends Term
case class Power(x:Term, y:Term) extends Term
case class Exp(x:Term) extends Term
me gustaría poner en práctica el simplification algorithm described here, que parece tedioso. (Pero tal vez el tedio es inevitable cuando se trata de simplificar las expresiones algebraicas?)
Algunas críticas de esta aplicación específica son:
- voy a estar llamando de forma recursiva
simplify
por todo el lugar en los argumentos al caso clases (parece que podría ser centralizada de alguna manera) - Tratar con los varargs/
List
argumentos aAdd
yMutliply
parece que podría causar problemas
Gracias! ¿Alguna sugerencia sobre cómo simplificar expresiones de la forma: '((a * c * x^2) + (b * x^2))' ser '(a * c + b) * x^2'? El análogo fue fácil de hacer con 'Power', pero las listas para' Multiply' y 'Add' me lo están poniendo difícil. – dsg
El documento al que se vincula describe una transformación similar de (x^a * y^b * x^c) a (x^(a + c) * y^b). El enfoque que usan es simple, después de asegurarse de que todos los nodos secundarios de multiplicación tengan la misma forma canónica, sacan el primer elemento de la lista y ver si otros nodos tienen la misma base. Si es así, combinan los dos. Luego hacen lo mismo con el resto. Las listas de Scala tienen una función práctica llamada "partición" que te permitirá dividir una lista de acuerdo con criterios arbitrarios que te permitirán hacer eso. –