2008-11-26 67 views
6

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

例如

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

回答

0

我们谈论有理数的功能,如GMP的有理数?如果是这样,那么可以通过将第二个参数变为其倒数然后相乘来简化分裂。

除此之外,乘法是不止一次加法完成的,而除法是不止一次完成的。正如米奇在评论中所说,我们可以通过更多的信息来了解你想要简化的内容。

10

那么,你有正确的一般模式。您只需要更多规则并递归应用简化流程。

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 
+0

@ user41000提供的示例只有两个孩子。例如,我将它扩展到2个以上的术语时需要考虑什么:simplify(Plus(Plus(Const 2)(Const 1))(Const 3))= Const 6。递归如何在这里工作? – plopd 2014-12-11 12:26:27

1

我几年前做过类似AI项目的项目。 这个类使用了LISP,所以我做的第一件事就是将表达式从中缀表达式转换为S表达式。

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

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

最后,将S表达式转换回中缀符号进行显示。

1

只是举一个例子,下面是一个简化表达式的函数。我们的想法是,每一个简化的定义都是从上到下尝试,直到等号左边的一个模式匹配。最后一个定义的目的是在没有已知方法进一步简化的情况下突破递归。

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