Система компьютерной алгебры (CAS) для Scala

Я ищу простую систему CAS для scala.

Она должна иметь следующие особенности:

  • предоставлять доступ к абстрактному синтаксическому дереву (желательно через классы для облегчения сопоставления)
  • parse Строка в AST
  • Упростить выражения

Если ничего не существует, и я должен написать что-то базовое, какое представление лучше всего?

Я думаю примерно так:

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

Я Я бы реализовал алгоритм упрощения , описанный здесь , который кажется утомительным. (Но, может быть, скука неизбежна, когда дело доходит до упрощения алгебраических выражений?)

Некоторые критические замечания по поводу этой конкретной реализации:

  • I ' Я буду рекурсивно вызывать simpleify повсюду в аргументах к классам case (кажется, что это может быть каким-то образом централизовано)
  • Работа с аргументами varargs / List для ] Добавить и Mutliply кажется, что это может стать беспорядочным

5
задан dsg 18 May 2011 в 09:12
поделиться