gpt4 book ai didi

scala - Scala 计算机代数系统 (CAS)

转载 作者:行者123 更新时间:2023-12-04 20:21:28 27 4
gpt4 key购买 nike

我正在为 Scala 寻找一个简单的 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看起来它可能会变得凌乱
  • 最佳答案

    我不知道 Scala 的现有 CAS。

    在进行语言处理时,我通常会发现在密封的层次结构上使用模式匹配而不是 OO 风格的多态性要愉快得多。由于添加新的术语类型很少见(这意味着语言的改变)并且添加新的操作在表达式问题的这一方面似乎更适合。

    sealed trait Term
    case class Const(c : Double) extends Term
    case class Var(x : String) extends Term
    case class Negate(x : Term) extends Term
    case class Multiply(xs : List[Term]) extends Term
    // etc

    object CAS {

    // I assume that the assignment map may be incomplete, thus
    // evaluation is really a partial substitution and then simplification
    def evaluate(t : Term, assignment : Var => Option[Double]) : Term = t match {
    case _ : Const => t
    case v : Var => assignment(v) map Const getOrElse v
    case Negate(x) => evaluate(Multiply(Const(-1) :: evaluate(x, assignment) :: Nil), assignment)
    case Multiply(ts) => {
    val evalTs = ts map { t => evaluate(t, assignment) }
    val flattened = evalTs flatMap {
    case Multiply(subs) => subs
    case t => List(t)
    }
    val constTotal = Const((flattened collect { case Const(c) => c }).product)
    val otherTerms = flattened filter { case t : Const => false; case _ => true }
    (constTotal, otherTerms) match {
    case (Const(0), _) => Const(0)
    case (Const(1), Nil) => Const(1)
    case (Const(1), _) => Multiply(otherTerms)
    case _ => Multiply(constTotal +: otherTerms)
    }
    }
    // etc

    }

    private val emptyAssignment : (Var => Option[Double]) = { x : Var => None }

    // simplfication is just evaluation with an empty assignment
    def simplify(t : Term) : Term = evaluate(t, emptyAssignment)
    }

    我一直想学习但还没有学习的一项技术是属性语法。他们应该从这种 AST 处理中消除大部分乏味。见 kiama http://code.google.com/p/kiama/对于 Scala 实现

    顺便说一句,虽然我确实在这里为您的域使用了 double 数,但您最好使用“大理性” - 一对 BigIntegers。它们很慢但非常精确。

    关于scala - Scala 计算机代数系统 (CAS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6042340/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com