Я ищу простую систему CAS для scala.
Он должен иметь следующие особенности:
- предоставить доступ к абстрактному синтаксическому дереву (предпочтительно через классы case для легкого сопоставления)
- разобрать
String
в 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
Я бы реализовал алгоритм упрощения, описанный здесь, который кажется утомительным . (Но, может быть, скука неизбежна, когда дело доходит до упрощения алгебраических выражений?)
Вот некоторые критические замечания по поводу этой конкретной реализации:
- Я буду рекурсивно вызывать
simplify
повсюду в аргументах классов case (похоже, это можно как-то централизованно) - Работа с аргументами varargs /
List
дляAdd
иMutliply
может привести к путанице.