1

重複の可能性:
Haskell でのシンボリック単純化 (再帰を使用?)

私が考えている単純化は、

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(Plus (Var "x") (Const 0))= Var "x"

4

2 に答える 2

2

では、個々のケースにパターン マッチングを適用できないでしょうか。

simplify (Plus (Const 0) (Expr x)) = simplify (Expr x)
simplify (Plus (Expr x) (Const 0)) = simplify (Expr x)
simplify (Mult (Const 0) _) = Const 0
simplify (Mult _ (Const 0)) = Const 0
– … and so on

編集:はい、もちろん…再帰が追加されました。

于 2008-11-27T18:29:46.787 に答える
0

Haskell についてはよくわかりませんが、本質的には、式ツリーのトラバーサルを行いたいと思うでしょう。

ツリーは EXP: (演算子) (EXP) (EXP) EXP: (const) EXP: (var)

次に、あなたの単純化は擬似コードになります

simplify(Exp e)
if (e is const) return e
else if (e is var) return e
else
{//encode simplification rules
    Exp left = simplify(e.left)
    Exp right = simplify(e.right)
    if(operator is PLUS)
    {
        if(left == 0) return right;
        if(right == 0) return left;
    }
    else if(operator is MULT)
    {
        if(left == 1) return right;
        if(right == 1) return left;
        if(left == 0) return 0;
        if(right == 0) return 0;
    }
//and so on for other operators
} 

これは一種の Java 風ですが、アイデアはそこにあると思います。本質的には、ツリー トラバーサルを行う必要があります。

于 2008-11-27T19:46:43.760 に答える