Converse (反过来) R^~1
我们可以写成
p1 = x $wire <a, a, x> .
p2 = [id, R, id] .
p3 = <b, y, y> $wire b .
current = p1 ; p2 ; p3 . # x R bConverse 有一些规则 $$ \begin{align*} &(R^{-1})^{-1} = R\ &(Q ; R)^{-1} = R^{-1} ; Q^{-1}\ &[Q, R]^{-1} = [Q^{-1}, R^{-1}]\ &R ; R^{-1} \neq id \text{ (in general)} \end{align*} $$
Constant (常数操作
敞亮电路 c 会将相同的常量值输出道 x, y 两端
如果考虑一个电路
add2 = VAR x . x $rel (`add` <x, 2>) .
我们可以把常数 2 定义为 snd 2
snd R = [id, R]. # <x, y> (snd R) <x, z> = y R z pi1 = <x,y> $wire x.
add2 = pi1^~1 ; snd 2 ; add .
Converse 有一些规则 $$ \begin{align*} &(R^{-1})^{-1} = R\ &(Q ; R)^{-1} = R^{-1} ; Q^{-1}\ &[Q, R]^{-1} = [Q^{-1}, R^{-1}]\ &R ; R^{-1} \neq id \text{ (in general)} \end{align*} $$
$$ P^{-1} ; Q;P \Leftrightarrow Q \setminus P \\ \begin{align*} P \setminus (Q;R) &= (Q;R)^{-1}; P; (Q; R) \\&=R^{-1}; Q^{-1}; P; Q; R \\&= R^{-1};(P\setminus Q); R \\&= (P\setminus Q) \setminus R\end{align*} $$
$$ R^3 = R ; R; R $$ 我们可以通过递归定义: $$ \begin{align*} \text{base case: } &R^0 = id\\ \text{inductive case: } & R^{n+1} = R ; R^n\\ \end{align*} $$ 也就是R^n = IF (n $eq 0) THEN id
ELSE (R ; R^(n-1)) .
# <<x1, ..., xm>, <y1, ..., yn>>
# -> <x1, ..., xm, y1, ..., yn>
append m n
# <x, <y1, ..., yn>>
# -> <x1, y1, ..., yn>
apl n = append 1 n
# <<x1, ..., xm>, y1>
# -> <x1, ..., xm, y1>
apr m = append m 1
# <
# <k1, ..., kn>,
# <v1, ..., vn>
# > : 2 x n
# -> <
# <k1, v1>,
# ...
# <kn, vn>
# >
zip n
# m x n -> n x m
tran m n# map (n+1) R
# INPUT : <x1, x2, ..., xn>
# OUTPUT: <y1, y2, ..., yn>
# <x0, x1, ..., xn>
# <x0, <x1, ..., xn>> # (apl n)^~1
# R # [R, map n R]
# map n R
# <y0, <y1, ..., yn>> # apl n
# <y0, y1, ..., yn>
# map (n+1) R = (apl n)^~1 ; [R, map n R] ; apl n
# = [R, map n R] \ (apl n)
也就是
map n R = IF (n $eq 0)
THEN []
ELSE ( [R, map (n-1) R] \ (apl (n01))) .
Primitive: bit, uint, sint, ureal, sreal
Composite: $$ \begin{cases} Q: (A\sim B)\ R: (B\sim C) \end{cases} \Longrightarrow(Q;R):(A\sim C) $$
Series:
Parallel
Append
# <x1, ..., xn, y1, ..., yn>
# -> <<x1, ..., xn>, <y1, ..., yn>>
half n = (append n n)^~1 .
我们期望的树结构是
因此可以定义 $$ \begin{align*} \text{base case: } &btree_1 = R\ \text{inductive case: } & btree_{n+1} = half_{m=2^n} ; [btree_{n}, R, btree_n, R] ; R \end{align*} $$
如果不使用 half,则最终类型会变成
<<<X, X>, <X, X>> , <<X, X>, <X, X>>> ~ X
例如对于点积,即
$$
\mathbf{z} =
\sum [
\mathbf{x}_i \times \mathbf{y}_i
]
$$
我们假设类型为
/\ n R = IF (n $eq 0)
THEN []
ELSE ( [/\ (n-1) R, R^(n-1)] \ apr (n-1) ).
# apr : (xs:x) -> (xxs)
# n = 1: [[], R^0]
Flipped Triangle: $$ \Delta_n^\sim, R = [R^{n-1}, \dots, R^2, R^1, R^0] $$
/\~ n R = IF (n $eq 0)
THEN []
ELSE ( [R^(n-1), /\~ (n-1) R] \ apl (n-1) ).







