// 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 | // +------------------------------------------------------+ //