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

Daniel Hlynskyi abcz2.uprola at gmail.com
Sun Jun 17 07:32:34 CEST 2012


Not for equality testing, only for prettyprinting. So I want some
simple way to apply all the rules with smallest number of expression
tree traverses

As for ipoly, it looks like CAS. I will use Maxima as CAS and I don't
want to do extra Maxima call for something, that can be easily
(expecting) done in Haskell.

2012/6/17 Máté Kovács <mkovaxx at gmail.com>:
> Hi Daniel,
>
> It depends on what you want to use the normalized / canonical form for.
>
> If it's to reduce semantic equivalence testing to simple syntactic
> equality, e.g.
> (A == B) = (canonize(A) == canonize(B)),
> then you could just use the fully expanded form, which isn't really
> simplification. :)
>
> I'm doing something similar here (for polynomial expressions over an
> inner product space):
> https://github.com/mkovacs/ipoly/blob/master/Poly.hs
>
> Cheers,
> Máté
>
> On Sat, Jun 16, 2012 at 2:17 PM, Daniel Hlynskyi <abcz2.uprola at gmail.com> wrote:
>> Hello.
>>
>> I am new to typefull programming, so I've got a question.
>> I have a simple mathematical expression (addition, product and
>> exponentiation only):
>>
>>> data Expr = I Int -- integer constant
>>>           | V -- symbolic variable
>>>           | Sum [Expr]
>>>           | Prod [Expr]
>>>           | Pow Expr Expr
>>
>> What I want is normalize\simplify this expression. Eg `Prod [Pow V (I
>> 0), Pow V (I 1)] ` must be simplified to just `V`. What techniques
>> should I use to write `normalize` function?
>> 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)] `.
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners



More information about the Beginners mailing list