packages feed

egison-3.6.0: lib/math/normalize.egi

;;;;;
;;;;;
;;;;; Term Rewriting
;;;;;
;;;;;

;(set-term-rewriting-rule {[(rt $n $x)^,n x]
;                          [(* (sqrt $x) (sqrt $y)) (* (gcd x y) (sqrt (/ (* x y) (gcd x y))))]
;                          [(rtu $n)^,n 1]
;                          [w^3 1]
;                          [w^2 (- -1 w)]
;                          [i^2 -1]})

(define $math-normalize
  (lambda [$mexpr]
    (if (tensor? mexpr)
      (tensor-map math-normalize mexpr)
      (if (number? mexpr)
        (if (rational? mexpr)
          mexpr
          (map-terms rewrite-rule-rt
                     (map-terms rewrite-rule-sqrt
                                (map-terms rewrite-rule-rtu
                                           (map-terms rewrite-rule-w
                                                      (map-terms rewrite-rule-i
                                                                 mexpr
                                                                 ))))))
        mexpr))))

(define $rewrite-rule-i
  (lambda [$term]
    (match term term-expr
      {[<term $a <ncons (& ?even? $k) ,i $ts>>
        (*' a (**' -1 (quotient k 2)) (foldl *' 1 (map 2#(**' %1 %2) ts)))]
       [<term $a <ncons $k ,i $ts>>
        (*' a (**' -1 (quotient k 2)) i (foldl *' 1 (map 2#(**' %1 %2) ts)))]
       [_ term]})))

(define $rewrite-rule-w
  (lambda [$term]
    (match term term-expr
      {[<term $a <ncons (& ?(gte? $ 3) $k) ,w $ts>>
        (*' a (**' w (remainder k 3)) (foldl *' 1 (map 2#(**' %1 %2) ts)))]
       [<term $a <ncons ,2 ,w $ts>>
        (*' a (- -1 w) (foldl *' 1 (map 2#(**' %1 %2) ts)))]
       [_ term]})))

(define $rewrite-rule-rtu
  (lambda [$term]
    (match term term-expr
      {[<term $a <ncons $k (,rtu (& ?(gte? k $) $n)) $ts>>
        (*' a (**' (rtu n) (remainder k n)) (foldl *' 1 (map 2#(**' %1 %2) ts)))]
       [_ term]})))

(define $rewrite-rule-sqrt
  (lambda [$term]
    (match term term-expr
      {[<term $a <cons (,sqrt $x) <cons (,sqrt ,x) $ts>>>
        (* a x (foldl *' 1 (map 2#(**' %1 %2) ts)))]
       [<term $a <cons (,sqrt (& ?term? $x)) <cons (,sqrt (& ?term? $y)) $ts>>>
        (let* {[$d (gcd x y)]
               [[$a1 $x1] (from-monomial (/ x d))]
               [[$a2 $y1] (from-monomial (/ y d))]}
            (*' a d
               (sqrt (*' a1 a2)) (sqrt x1) (sqrt y1)
               (foldl *' 1 (map 2#(**' %1 %2) ts))))]
       [_ term]})))

(define $rewrite-rule-rt
  (lambda [$term]
    (match term term-expr
      {[<term $a <ncons $k (,rt (& ?(gte? k $) $n) $x) $ts>>
        (*' a (**' x (quotient k n)) (**' (rt n x) (remainder k n)) (foldl *' 1 (map 2#(**' %1 %2) ts)))]
       [_ term]})))