(let z (rep + i 3 (#= z i (* (# x i) => (expand-get-index) (L (* x (ecd (mask (set i)))) i) (# y i) => (expand-get-index) (L (* y (ecd (mask (set i)))) i) )) ))
(rep i 3 (let m (ecd (mask (set i)))) (let v (* (L (* x m) i) (L (* y m) i)) => (hom-rot-mul-exchange) (L (* (* x m) (* y m)) i) => (hom-mul-dist) (L (* (* x y) m)) ) (#= z i v))
; ex. x = [1 2 3], y = [4 5 6], i = 1(rep + i 3 (let m (ecd (mask (set i)))) ; [0 1 0] (let v (L (* (* x y) m)))) ; [10 0 0] (#= z i v) => (expand-set-index) (let im (ecd (setinv (mask (set i))))) (= z (+ (* z im) ; (* (L v -i) i) )))
rep-assign-rep-op
どうにか副作用の無い形に出来ないか?
unroll?
expr-expand
(let z 0) ; z = 0(rep i 2 (= z (+ z i)) ) => (rep-unroll) (let i 0) ; i = 0 (= z (+ z i)) => (expr-expand) (= z (+ 0 0)) ; z => 0, i => 0, z = (+ 0 0) (let i 1) ; i = 1 (= z (+ z i)) ; z => (+ 0 0), i => 1, z = (+ (+ 0 0) 1) => (expr-expand) (= z (+ (+ 0 0) 1)
(rep + i 4 (# a 0))=> loop-unroll(+ (then (let i 0) (# a 0)) (+ (then (let i 1) (# a 0)) (+ (then (let i 2) (# a 0)) (then (let i 3) (# a 0)) ) ))=>()