5
我正在寻找一个简单的CAS系统的斯卡拉。斯卡拉计算机代数系统(CAS)
它应具有以下特征:
- 给访问抽象语法树(优选经由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
我实现simplification algorithm described here,这似乎有些单调乏味。 (但也许单调乏味是不可避免的,当涉及到简化代数表达式?)
这种具体实施的一些批评是:
- 我会递归调用
simplify
各地对参数的情况下的地方类(似乎是它可以以某种方式集中) - 与可变参数/
List
参数Add
和Mutliply
处理似乎是它可以变得混乱
谢谢!有关如何简化表达式:((a * c * x^2)+(b * x^2))'为'(a * c + b)* x^2'的任何提示?这个模拟器很容易处理'Power',但是'Multiply'和'Add'列表让我很难受。 – dsg 2011-05-19 07:13:09
您链接的论文描述了从(x^a * y^b * x^c)到(x ^(a + c)* y^b)的类似转换。他们使用的方法很简单,在确保乘法的所有子节点都是相同的规范形式之后,他们将第一个项目从列表中弹出并查看是否有其他节点具有相同的基础。如果是的话,他们结合在一起。然后他们对剩下的部分也一样。 Scala的列表有一个称为“分区”的方便函数,它可以让你根据任意标准分割列表,这些标准应该让你做到这一点。 – 2011-05-19 17:00:07