;;;;; ;;;;; ;;;;; 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 {[> (*' a (**' -1 (quotient k 2)) (foldl *' 1 (map 2#(**' %1 %2) 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 {[> (*' a (**' w (remainder k 3)) (foldl *' 1 (map 2#(**' %1 %2) ts)))] [> (*' a (- -1 w) (foldl *' 1 (map 2#(**' %1 %2) ts)))] [_ term]}))) (define $rewrite-rule-rtu (lambda [$term] (match term term-expr {[> (*' a (**' (rtu n) (remainder k n)) (foldl *' 1 (map 2#(**' %1 %2) ts)))] [_ term]}))) (define $rewrite-rule-sqrt (lambda [$term] (match term term-expr {[>> (* a x (foldl *' 1 (map 2#(**' %1 %2) 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 {[> (*' a (**' x (quotient k n)) (**' (rt n x) (remainder k n)) (foldl *' 1 (map 2#(**' %1 %2) ts)))] [_ term]})))