1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// Rules
dup(a1,a2) >< (int i):xs => a1~(i:xs1), a2~(i:xs2), dup(xs1,xs2)~xs;
dup(a1,a2) >< [] => a1~[], a2~[];
add(r, ys) >< (int i):xs => addn(r, xs, i)~ys;
addn(r, xs, int i) >< (int j):ys => r~(i+j):w, add(w,ys)~xs;
// Nets
dup(r, r1)~(1:xs), r1~add(sum, w), dup(xs, w)~(1:sum);
// r,r1 << dup(1:xs),
// xs,w << dup(1:sum),
// sum << add(r1,w);
// +-----+ +---+
// r ----| | | | xs +-----+ +---+
// | dup |---><---| 1 |-----| | | |
// +---| | | | | dup |---><---| 1 |----+
// | +-----+ +---+ +--| | | | |
// | | +-----+ +---+ | sum
// | | |
// | | +-----+
// | | | add |
// | | +-----+
// | | w | |
// | +------------------------+ v
// | r1 |
// +------------------------------------------------------+
//
|