2008-11-26 65 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