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