-- Arithmetische Ausdrücke: data Exp = Lit Int | Var String | Add Exp Exp | Mul Exp Exp exp1 = Mul (Lit 1) (Add (Var "x") (Lit 0)) -- replace operation: replace e p t === e[t]_p replace :: Exp -> [Int] -> Exp -> Exp replace _ [] t = t replace (Add l r) (1:p) t = Add (replace l p t) r replace (Add l r) (2:p) t = Add l (replace r p t) replace (Mul l r) (1:p) t = Mul (replace l p t) r replace (Mul l r) (2:p) t = Mul l (replace r p t) -- Liefere mögliche komplexere Ausdrücke, die äquivalent zu e evalTo :: Exp -> Exp evalTo e = Add (Lit 0) e ? Add e (Lit 0) ? Mul (Lit 1) e ? Mul e (Lit 1) simplify :: Exp -> Exp simplify (replace e p (evalTo t)) = replace e p t varInExp :: Exp -> String varInExp (replace _ _ (Var v)) = v