# [Haskell-beginners] Simplify (normalize) symbolic polynom-like expression

Chaddaï Fouché chaddai.fouche at gmail.com
Sun Jun 17 09:36:01 CEST 2012

```On Sat, Jun 16, 2012 at 11:17 PM, Daniel Hlynskyi
<abcz2.uprola at gmail.com> wrote:
> Hello.
> Simplification rules are quite simple:
>
>> normalize (Sum [a]) = normalize a
>> normalize (Sum xs) | (I 0) `elem` xs = map nomalize . Sum \$ filter (/= I 0) xs
>>                          | otherwise = map normalize xs
>> normalize (Prod xs) | (I 0) `elem` xs = I 0
>> normalize (Prod xs) | (I 1) `elem` xs = map nomalize . Prod \$ filter (/= I 1) xs
>>                          | otherwise = map normalize xs
>> normalize (Pow a (I 0)) = I 1
>> normalize (Pow a (I 1)) = normalize a
>
> and so on. But rules like theese cannot simplify some expressions, for
> example, `Prod [Pow V (I 0), Pow V (I 1)] `.

It's because you're doing it in the wrong direction : in a tree always
normalize leaves before you try to normalize branches.

normalize (Sum xs) = case sort . filter (/= I 0) . map normalize \$ xs of
[] -> I 0
[a] -> a
ys -> sumPrefix ys
where
sumPrefix (I n : I m : ys) = sumPrefix \$ I (n+m) : ys
sumPrefix ys = ys

See how I normalize the elements of xs before anything else.

Note that this isn't quite the right way to represent a poly if you
want to get to a canonical representation.

--
Jedaï

```

More information about the Beginners mailing list