################################# ################################# ### ### ### Rebecca Prelude 2.1a ### ### ### ### ### ################################# ################################# ########################## ### ### ### Wiring primitives: ### ### ### ########################## ####################################################### id = x $wire x. [-] = x $wire . pi1 = $wire x. pi2 = $wire y. lsh = <,z> $wire >. rsh = > $wire <,z>. mid = <,> $wire ,b>. swap = $wire . fork = x $wire . ####################################################### ### ### n-way fork: ### x (mfork n) (product of n x's) mfork n = IF (n $eq 0) THEN ( x $wire <> ) ELSE ( fork ; snd (mfork (n-1)) ; apl (n-1) ). ####################################################### ### ### append: ### > (apl n) ### <,a> (apr n) apl n = fst [-] ; append 1 n. apr n = snd [-] ; append n 1. ####################################################### ### ### <,> (zip n) <,,..,> zip n = snd (flatl n)^~1 ; col n (> $wire >) ; pi2. ####################################################### ### ### <, <, ### , (tran m n) , ### ... ... ### > > tran m n = IF (m $eq 0) THEN ( [] ; mfork n ) ELSE ( (apl (m-1))^~1 ; snd (tran (m-1) n) ; zip n ; map n (apl (m-1)) ). ####################################################### ### ### distribute: ### > (dstl n) <,,..,> ### <,x> (dstr n) <,,..,> dstl n = row n ( $wire <,x>) ; pi1. dstr n = col n ( $wire >) ; pi2. ####################################################### ### ### reverse: ### (rev n) rev n = IF (n $eq 0) THEN [] ELSE ( (apl (n-1))^~1 ; snd (rev (n-1)) ; swap ; apr (n-1) ). ####################################################### ### ### , ### x21,x22,..,x2n, (group m n) , ### ... ... ### xm1,xm2,..,xmn> > group m n = IF (m $eq 0) THEN [] ELSE ( (append n (n*(m-1)))^~1 ; snd (group (m-1) n) ; apl (m-1) ). ####################################################### ### ### (pair n) <,,..,> pair n = group n 2. ####################################################### ### ### (half n) <,> half n = (append n n)^~1. ####################################################### ### ### (riffle n) riffle n = half n ; zip n ; (pair n)^~1. ####################################################### ### ### >>>> (flatr n) flatr n = IF (n $eq 0) THEN [] ELSE ( snd (flatr (n-1)) ; apl (n-1) ). ####################################################### ### ### <<<<>,x1>,x2>,x3>,..,xn> (flatl n) flatl n = IF (n $eq 0) THEN [] ELSE ( fst (flatl (n-1)) ; apr (n-1) ). ####################################################### ### ### (take m n) ### (drop m n) take m n = LET s = m $min n IN (append s (n-s))^~1 ; pi1 END. drop m n = LET s = m $min n IN (append s (n-s))^~1 ; pi2 END. ########################## ### ### ### Device primitives: ### ### ### ########################## ####################################################### ### ### hadd where x+y = 2*c+s (x,y,s,c are booleans) hadd = fork ; [xor, and]. ### > fadd where x+y+z = 2*c+s (x,y,z,s,c are booleans) fadd = (hadd;swap) <-> (hadd;swap) ; fst or ; swap. ####################################################### ### ### multiplexor with inputs swapped: muxl n = swap ; muxr n. ########################## ### ### ### Serial primitives: ### ### ### ########################## bundle n = sdpr n. inv_bundle n = pdsr n. ev n = bundle n ; apl (n-1)^~1 ; pi1. inv_ev n = pi1^~1 ; snd ("?" ; mfork (n - 1)) ; apl (n-1) ; inv_bundle n. cmx n = map 2 (bundle n ; apl (n-1)^~1) ; [pi1,pi2] ; apl (n-1) ; inv_bundle n. ############################## ### ### ### Arithmetic primitives: ### ### ### ############################## ####################################################### ### ### integral and real exponentiation and log (to base n): x $exp n = IF (n $eq 0) THEN 1 ELSE ( x * (x $exp (n-1)) ). x $rexp n = IF (n $ltn 0) THEN (1.0 / (x $rexp (~ n))) ELSE ( IF (n $eq 0) THEN 1.0 ELSE (x * (x $rexp (n-1))) ). x $log n = log' 0 1 n x. log' p q n x = IF (q $geq x) THEN p ELSE ( log' (p+1) (2*q) n x ). #################### ### ### ### Combinators: ### ### ### #################### ####################################################### ### ### (fst R) <=> x R z ### (snd R) <=> y R z fst R = [R, id]. snd R = [id, R]. ####################################################### ### ### converse: ### x (R^~1) y <=> y R x R ^~1 = x $wire ; [id, R, id] ; $wire x. ####################################################### ### ### vertical and horizontal reflection: ### (R^V) <=> R ### (R^H) <=> R R ^V = $wire ,t>; [id, R, id] ; ,t> $wire . R ^H = $wire ,z>; [id, R, id] ; ,z> $wire . ####################################################### ### ### binary parallel composition: ### (R||S) <=> (x R x') & (y S y') R || S = [R, S]. ####################################################### ### ### repeated relational composition: ### R^n = R;R;..;R (composed with itself n times) R ^ n = IF (n $eq 0) THEN id ELSE ( R ; R^(n-1) ). ####################################################### ### ### conjugation: ### R\\[S,T] = [T^~1,S^~1] ; R ; [S,T] R \ S = S^~1 ; R ; S. R \\ S = swap ; S^~1 ; swap ; R ; S. ####################################################### ### ### repeated parallel composition: ### map n R = [R,R,..,R] (composed with itself n times) map n R = IF (n $eq 0) THEN [] ELSE ( [R, map (n-1) R] \ (apl (n-1)) ). pmap n R = map n R \ (pair n)^~1. ####################################################### ### ### triangle: ### /\ n R = [R^0,R^1,R^2,..,R^(n-1)] ### /\~ n R = [R^(n-1),R^(n-2),..,R^0] /\ n R = IF (n $eq 0) THEN [] ELSE ( [/\ (n-1) R, R^(n-1)] \ apr (n-1) ). /\~ n R = IF (n $eq 0) THEN [] ELSE ( [R^(n-1), /\~ (n-1) R] \ apl (n-1) ). ####################################################### ### ### beside: ### > (R<->S) <,f> ### <=> ### ( R ) & ( S ) for some x R <-> S = rsh ; fst R ; lsh ; snd S ; rsh. fsth R = R <-> swap. sndh R = swap <-> R. ####################################################### ### ### below: ### <,c> (R<|>S) > ### <=> ### ( R ) & ( S ) for some x R <|> S = lsh ; snd S ; rsh ; fst R ; lsh. fstv R = R <|> swap. sndv R = swap <|> R. ####################################################### ### ### repeated beside: row n R = IF (n $eq 0) THEN ( > $wire <<>,x> ) ELSE ( (R <-> (row (n-1) R)) \\ fst (apl (n-1)) ). ####################################################### ### ### repeated below: col n R = IF (n $eq 0) THEN ( <<>,x> $wire > ) ELSE ( (R <|> (col (n-1) R)) \\ snd (apl (n-1)) ). ####################################################### ### ### rectangular grid: grid m n R = row m (col n R). ####################################################### ### ### left reduction: rdl n R = row n (R ; pi2^~1 ) ; pi2. ####################################################### ### ### horizontally-reflected left reduction: rdlh n R = pi1^~1 ; row n (pi1 ; R). ####################################################### ### ### right reduction: rdr n R = col n (R ; pi1^~1 ) ; pi1. ####################################################### ### ### vertically-reflected right reduction: rdrv n R = pi2^~1 ; col n (pi2 ; R). ####################################################### ### ### x (loop R) y <=> R for some s loop R = x $wire <,y> ; fst R ; <,x> $wire y. ####################################################### ### ### (vloop R) <=> <,b> R > for some s vloop R = $wire <<,y>,z> ; fst R ; <>,z> $wire .