【问题标题】:How can I simplify a basic arithmetic expression?如何简化基本算术表达式?
【发布时间】:2011-12-18 05:55:55
【问题描述】:

如何简化基本的算术表达式?

例如

module ExprOps where 

simplify :: Expr -> Expr
simplify (Plus(Var"x") (Const 0)) = Var "x"

我该怎么办?


module Expr where

-- Variables are named by strings, assumed to be identifiers.
type Variable = String

-- Representation of expressions.
data Expr = Const Integer
          | Var Variable
          | Plus Expr Expr
          | Minus Expr Expr
          | Mult Expr Expr
          deriving (Eq, Show)

我想到的简化是:

0*e = e*0 = 0
1*e = e*1 = 0+e = e+0 = e-0 = e

并简化常量子表达式,例如Plus (Const 1) (Const 2) 将变为 Const 3。我不希望变量(或变量和常量)被连接:Var“st”是与 Var“s”不同的变量。

我想要实现的是创建一个像上面那样的模块,它使用一个名为simplify :: Expr->Expr的函数

【问题讨论】:

    标签: math haskell algebra


    【解决方案1】:

    嗯,你有正确的通用模型。您只需要更多规则并递归地应用简化过程。

    simplify :: Expr -> Expr 
    simplify (Mult (Const 0) x) = Const 0 
    simplify (Mult x (Const 0)) = Const 0
    simplify (Plus (Const 0) x) = simplify x
    simplify (Plus x (Const 0)) = simplify x 
    simplify (Mult (Const 1) x) = simplify x 
    simplify (Mult x (Const 1)) = simplify x 
    simplify (Minus x (Const 0)) = simpify x
    simplify (Plus (Const x) (Const y)) = Const (x + y)
    simplify (Minus (Const x) (Const y)) = Const (x - y)
    simplify (Mult (Const x) (Const y)) = Const (x * y)
    simplify x = x
    

    【讨论】:

    • @user41000 提供的示例只有两个孩子。将其扩展到 2 个以上的术语时,我必须考虑什么,例如:简化 (Plus(Plus(Const 2) (Const 1)) (Const 3)) = Const 6 。递归在这里是如何工作的?
    • 您可以稍微调整一下,使其比我在头顶上写的更具侵略性:simplify (Plus a b) = case (simplify a, simplify b) of (Const ca, Const cb) -> Const (ca + cb) 等。或者您可以使用镜头rewrite 组合器来做同样的事情到一个固定点。
    【解决方案2】:

    几十年前,我在一个 AI 课程的项目中做过类似的事情。 该类使用 LISP,所以我做的第一件事就是将表达式从中缀表示法转换为 S-Expression。

    然后就是递归遍历“树”并在每个节点上应用一组规则的问题。例如如果该节点包含一个操作数都是常量的操作,则立即执行该操作并用结果替换该节点。

    一旦基本功能到位,就需要向系统添加新的简化规则。

    最后,将 S-Expression 转换回中缀表示法进行显示。

    【讨论】:

      【解决方案3】:

      举个例子,这里有一个函数可以简化你给出的表达式。这个想法是从上到下尝试简化的每个定义,直到等号左侧的模式之一匹配。最后一个定义的目的是在没有已知方法进一步简化的情况下打破递归。

      simplify :: Expr -> Expr
      simplify (Plus l         (Const 0)) = simplify l
      simplify (Plus (Const 0) r        ) = simplify r
      simplify x                          = x
      

      【讨论】:

        【解决方案4】:

        我们在这里谈论的是理性,比如 GMP 的理性吗?如果是这样,那么可以通过将第二个参数变为倒数然后相乘来简化除法。

        除此之外,乘法是多次加法,除法是多次减法。

        正如米奇在 cmets 中所说,我们可以提供更多关于您要简化的内容的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-17
          • 2011-01-25
          • 2014-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多