【问题标题】:How do I simplify the below expressions using primitive recursion? [duplicate]如何使用原始递归简化以下表达式? [复制]
【发布时间】:2012-09-25 23:21:42
【问题描述】:

可能重复:
Symbolic simplification in Haskell (using recursion?)

我想到的简化是

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"

【问题讨论】:

    标签: haskell functional-programming lambda-calculus


    【解决方案1】:

    那么,您不能将模式匹配应用于个别情况吗?

    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
    

    编辑:是的,当然……添加了递归。

    【讨论】:

    • 这里的语法有点不对劲 - 你需要把括号放在例如 (Plus (Const 0) (Expr x)) 周围 - 但否则在正确的轨道上
    【解决方案2】:

    我对 haskell 了解不多,但基本上你会想做一个表达式树遍历。

    树是 经验:(操作员)(经验)(经验) 经验:(常量) 经验:(变量)

    那么你的简化就变成了 这是伪代码

    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 风格,但我认为这个想法就在那里,基本上你将不得不进行树遍历。

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      相关资源
      最近更新 更多