|
|
1.1 ! root 1: procedure Gk(k) ! 2: local i, m_ ! 3: i := 0 ! 4: m_ := table(0) ! 5: ! 6: suspend m_[C_([i +:= |1,k])] := i - m_[C_([m_[C_([i - k,k])],k])] ! 7: end ! 8: procedure Q() ! 9: local i, m_ ! 10: i := 0 ! 11: m_ := table(0) ! 12: suspend m_[i +:= 1] := 1 ! 13: suspend m_[i +:= 1] := 1 ! 14: suspend m_[i +:= |1] := m_[i - m_[i - 1]] + m_[i - m_[i - 2]] ! 15: end ! 16: procedure Fib() ! 17: local i, m_ ! 18: i := 0 ! 19: m_ := table(0) ! 20: suspend m_[i +:= 1] := 1 ! 21: suspend m_[i +:= 1] := 1 ! 22: suspend m_[i +:= |1] := m_[i - 1] + m_[i - 2] ! 23: end ! 24: procedure G() ! 25: local i, m_ ! 26: i := 0 ! 27: m_ := table(0) ! 28: ! 29: suspend m_[i +:= |1] := i - m_[m_[i - 1]] ! 30: end ! 31: procedure Fibs() ! 32: local i, m_ ! 33: i := 0 ! 34: m_ := table("") ! 35: suspend m_[i +:= 1] := "a" ! 36: suspend m_[i +:= 1] := "b" ! 37: suspend m_[i +:= |1] := m_[i - 1] || m_[i - 2] ! 38: end ! 39: procedure Unop_(op,X) # op(X) ! 40: local e, a, i, s ! 41: if S_(X) then { ! 42: a := copy(X.a) ! 43: i := *X.a ! 44: e := create !a | Pre_(X.e,i) ! 45: return Sequence([],create |Unop_(op,@e)) ! 46: } ! 47: else suspend op(X) ! 48: end ! 49: ! 50: procedure Binop_(op,X1,X2) # op(X1,X2) ! 51: local e1, e2, a1, a2, i1, i2, s1, s2 ! 52: if not S_(X1 | X2) then suspend op(X1,X2) ! 53: else { ! 54: s1 := Seq_(X1) ! 55: s2 := Seq_(X2) ! 56: a1 := copy(s1.a) ! 57: a2 := copy(s2.a) ! 58: i1 := *s1.a ! 59: i2 := *s2.a ! 60: e1 := create !a1 | Pre_(s1.e,i1) ! 61: e2 := create !a2 | Pre_(s2.e,i2) ! 62: return Sequence([],create |Binop_(op,@e1,@e2)) ! 63: } ! 64: end ! 65: ! 66: procedure Triop_(op,X1,X2,X3) # op(X1,X2,X2) ! 67: local e1, e2, e3, a1, a2, a3, i1, i2, i3, s1, s2, s3 ! 68: if not S_(X1 | X2 | X3) then suspend op(X1,X2,X3) ! 69: else { ! 70: s1 := Seq_(X1) ! 71: s2 := Seq_(X2) ! 72: s3 := Seq_(X3) ! 73: a1 := copy(s1.a) ! 74: a2 := copy(s2.a) ! 75: a3 := copy(s3.a) ! 76: i1 := *s1.a ! 77: i2 := *s2.a ! 78: i3 := *s3.a ! 79: e1 := create !a1 | Pre_(s1.e,i1) ! 80: e2 := create !a2 | Pre_(s2.e,i2) ! 81: e3 := create !a3 | Pre_(s3.e,i3) ! 82: return Sequence([],create |Triop_(op,@e1,@e2,@e3)) ! 83: } ! 84: end ! 85: ! 86: procedure Quadop_(op,X1,X2,X3,X4) # op(X1,X2,X3,X4) ! 87: local e1, e2, e3, e4, a1, a2, a3, a4, i1, i2, i3, i4, s1, s2, s3, s4 ! 88: if not S_(X1 | X2 | X3 | X4) then suspend op(X1,X2,X3,X4) ! 89: else { ! 90: s1 := Seq_(X1) ! 91: s2 := Seq_(X2) ! 92: s3 := Seq_(X3) ! 93: s4 := Seq_(X4) ! 94: a1 := copy(s1.a) ! 95: a2 := copy(s2.a) ! 96: a3 := copy(s3.a) ! 97: a4 := copy(s4.a) ! 98: i1 := *s1.a ! 99: i2 := *s2.a ! 100: i3 := *s3.a ! 101: i4 := *s4.a ! 102: e1 := create !a1 | Pre_(s1.e,i1) ! 103: e2 := create !a2 | Pre_(s2.e,i2) ! 104: e3 := create !a3 | Pre_(s3.e,i3) ! 105: e4 := create !a4 | Pre_(s4.e,i4) ! 106: return Sequence([],create |Quadop_(op,@e1,@e2,@e3,@e4)) ! 107: } ! 108: end ! 109: ! 110: procedure P_(a) # limited evaluation ! 111: return case *a of { ! 112: 2 : Unop_(a[1],a[2]) ! 113: 3 : Binop_(a[1],a[2],a[3]) ! 114: 4 : Triop_(a[1],a[2],a[3],a[4]) ! 115: 5 : Quadop_(a[1],a[2],a[3],a[4],a[5]) ! 116: default : stop("Too many arguments in parallel evaluation") ! 117: } ! 118: end ! 119: ! 120: record Sequence(a,e) # sequence data type ! 121: record Undef() # for unique "undefined" value ! 122: ! 123: global Phi, Iplus, Iplus_, Izero, Undef_, X_, Genseq_, GenJ_ ! 124: ! 125: procedure At(X) # element generation for sequences ! 126: every i := seq() do ! 127: if s := Ref_(X,i) then suspend s ! 128: else fail ! 129: end ! 130: ! 131: procedure C_(a) # identifying "subscript" for ! 132: local s # recurrence lookup ! 133: s := a[1] ! 134: every s ||:= "." || image(a[2 to *a]) ! 135: return s ! 136: end ! 137: ! 138: procedure Cat_(X1,X2) # concatenation of X1 and X2 ! 139: local s1, s2, e1, e2, i1, i2, a1, a2 ! 140: s1 := Seq_(X1) ! 141: s2 := Seq_(X2) ! 142: e1 := s1.e ! 143: i1 := *s1.a ! 144: e2 := s2.e ! 145: i2 := *s2.a ! 146: a2 := copy(s2.a) ! 147: return Sequence(copy(s1.a),create Pre_(e1,i1) | !a2 | Pre_(e2,i2)) ! 148: end ! 149: ! 150: procedure Collapse_(X) # generate scalars from X ! 151: if S_(X) then ! 152: suspend Collapse_(Gen_(X)) ! 153: else return X ! 154: end ! 155: ! 156: procedure Expr_(X) # return refreshed co-expression for X ! 157: if type(X) == "Sequence" then return ^X.e | &null ! 158: else if /X then return Phi.e ! 159: else return create X ! 160: end ! 161: ! 162: procedure Gen_(X,v) # generate elements of X ! 163: local i, x ! 164: if X_[\v] === Undef_ then fail # termination heuristic ! 165: if not S_(X) then return X # note: does not fail if X null-valued ! 166: every i := seq() do { ! 167: if x := X.a[i] then # produce stored values first ! 168: suspend x ! 169: else { # transfer remaining values ! 170: put(X.a,@X.e) | fail ! 171: if x := X.a[i] then suspend x else fail ! 172: } ! 173: if X_[\v] === Undef_ then fail # termination heuristic ! 174: } ! 175: end ! 176: ! 177: procedure Generic_(p,X) # apply p to X ! 178: if /X then fail ! 179: return if S_(X) then every p(Gen_(X)) else p(X) ! 180: end ! 181: ! 182: procedure Init_() ! 183: GenJ_ := Gen_ ! 184: Undef_ := Undef() ! 185: X_ := table() ! 186: Iplus := Sequence([],create seq(1)) ! 187: Iplus_ := Sequence([],create seq(1)) ! 188: Izero := Sequence([],create seq(0)) ! 189: Izero_ := Sequence([],create seq(0)) ! 190: Phi := Sequence([], create &fail) ! 191: Genseq_ := Iplus_ ! 192: end ! 193: ! 194: procedure Lim_(X,i) # limit X to i elements ! 195: local e, s, a, n ! 196: ! 197: if i < 1 then return .Phi ! 198: s := Seq_(X) ! 199: a := copy(s.a) ! 200: n := *s.a ! 201: return Sequence([],create (!a | Pre_(s.e,n)) \ i) ! 202: ! 203: end ! 204: ! 205: procedure Post_(e,i) # limit X to at most i values ! 206: e := ^e ! 207: suspend |@e \ i ! 208: end ! 209: ! 210: procedure Pp_(v) # push/pop undefined marker ! 211: X_[\v] := &null ! 212: suspend ! 213: X_[\v] := &null ! 214: fail ! 215: end ! 216: ! 217: procedure Pre_(e,i) # skip first i values of X ! 218: e := ^e ! 219: every 1 to i ! 220: do @e | fail ! 221: suspend |@e ! 222: end ! 223: ! 224: procedure Qq_(v) # pop/push undefined marker ! 225: X_[\v] := &null ! 226: suspend ! 227: X_[\v] := &null ! 228: fail ! 229: end ! 230: ! 231: procedure Red_(X,op) # reduction of X over op ! 232: local x, y, i ! 233: i := 1 ! 234: suspend x := Ref_(X,i) ! 235: while y := Ref_(X,i +:= 1) do ! 236: suspend (x := op(x,y)) # op(x,y) may fail, not changing x ! 237: end ! 238: ! 239: procedure Ref_(X,i,v) # X!i ! 240: local x ! 241: if i < 1 then { ! 242: X_[\v] := Undef_ # termination heuristic ! 243: fail ! 244: } ! 245: if not S_(X) then # J: coerce to a sequence ! 246: X := Sequence([],create X) ! 247: if i > *X.a then ! 248: every 1 to i - *X.a do ! 249: put(X.a,@X.e) | { ! 250: X_[\v] := Undef_ # termination heuristic ! 251: fail ! 252: } ! 253: return X.a[i] # note that this is not dereffed ! 254: end ! 255: ! 256: procedure S_(x) # is X a sequence? ! 257: return type(x) == "Sequence" ! 258: end ! 259: ! 260: procedure Seq_(X) # coerce X to a unit sequence ! 261: if type(X) == "Sequence" then return X ! 262: else if /X then return Phi ! 263: else return Sequence([],create X) ! 264: end ! 265: ! 266: procedure Shift_(X,i) # shift X left by i elements ! 267: local e,a,n,s ! 268: if i < 1 then return .Phi ! 269: s := Seq_(X) ! 270: a := copy(s.a) ! 271: n := *a ! 272: if n > i then { ! 273: e := create a[i+1 to n] | Pre_(s.e,n) ! 274: return Sequence([],create |@e) ! 275: } ! 276: else ! 277: return Sequence([], create Pre_(s.e,i)) ! 278: end ! 279: global Fibseq, Abc, U, L ! 280: procedure main(); ! 281: Init_() ! 282: Abc := Sequence([], create ("") | ("a") | ("b") | ("c") | ("aa") | ("ab") | ("ac") | ("ba") | ("bb") | ("bc") | ("ca") | ("cb") | ("cc") | ("aaa")); ! 283: Fibseq := Sequence([], create (Fib())); ! 284: U := Sequence([], create ("A") | ("B") | ("C")); ! 285: L := Sequence([], create ("a") | ("b")); ! 286: sec1(); ! 287: sec1(); ! 288: sec1(); ! 289: sec2_0(); ! 290: sec2_0(); ! 291: sec2_0(); ! 292: sec2_1(); ! 293: sec2_1(); ! 294: sec2_1(); ! 295: sec2_3(); ! 296: sec2_3(); ! 297: sec2_3(); ! 298: sec2_4(); ! 299: sec2_4(); ! 300: sec2_4(); ! 301: sec3_1(); ! 302: sec3_1(); ! 303: sec3_1(); ! 304: sec3_2(); ! 305: sec3_2(); ! 306: sec3_2(); ! 307: sec3_3(); ! 308: sec3_3(); ! 309: sec3_3(); ! 310: sec4(); ! 311: sec4(); ! 312: sec4(); ! 313: sec5(); ! 314: sec5(); ! 315: sec5(); ! 316: end ! 317: procedure sec1(); ! 318: write("{x, {y}}: ",Image(Sequence([], create ("x") | (Sequence([], create ("y")))))); ! 319: write("|{{1,2}}|: ",Length(Sequence([], create (Sequence([], create (1) | (2)))))); ! 320: write("F!6: ",Ref_((Fibseq),6,)); ! 321: write("{1,2,3} -> {6,7,8,9}: ",Image(Cat_((Sequence([], create (1) | (2) | (3))),(Sequence([], create (6) | (7) | (8) | (9)))),10)); ! 322: write("F sub 3:5: ",Image(Subseq(Fibseq,3,5))); ! 323: write("F sub 5:inf: ",Image(Shift_((Fibseq),4))); ! 324: end ! 325: procedure sec2_0(); ! 326: write("Fibonacci sequence: ",Image(Fibseq,10)); ! 327: write("closure of a,b,c: ",Image(Abc,10)); ! 328: write("[i]: ",Image(Sequence([],create (Pp_("i") & ! 329: i := Gen_(Genseq_,"i") & 1(GenJ_((i) ,"i"),Qq_("i")))))); ! 330: write("[i - 1]: ",Image(Sequence([],create (Pp_("i") & ! 331: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("-",i,1)) ,"i"),Qq_("i")))))); ! 332: write("[i ^ 2]: ",Image(Sequence([],create (Pp_("i") & ! 333: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("^",i,2)) ,"i"),Qq_("i")))))); ! 334: write("[i mod 3]: ",Image(Sequence([],create (Pp_("i") & ! 335: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("%",i,3)) ,"i"),Qq_("i")))))); ! 336: write("[a to i]: ",Image(Sequence([],create (Pp_("i") & ! 337: i := Gen_(Genseq_,"i") & 1(GenJ_((repl("a",i)) ,"i"),Qq_("i")))))); ! 338: write("[1]: ",Image(Sequence([],create (Pp_("i") & ! 339: i := Gen_(Genseq_,"i") & 1(GenJ_((1) ,"i"),Qq_("i")))))); ! 340: write("[aa]: ",Image(Sequence([],create (Pp_("i") & ! 341: i := Gen_(Genseq_,"i") & 1(GenJ_(("aa") ,"i"),Qq_("i")))))); ! 342: end ! 343: procedure sec2_1(); ! 344: write("[Iplus:i]: ",Image(Sequence([],create (Pp_("i") & ! 345: i := Gen_(.Iplus,"i") & 1(GenJ_((i) ,"i"),Qq_("i")))))); ! 346: write("[Izero:i]: ",Image(Sequence([],create (Pp_("i") & ! 347: i := Gen_(.Izero,"i") & 1(GenJ_((i) ,"i"),Qq_("i")))))); ! 348: write("[Fibseq:i]: ",Image(Sequence([],create (Pp_("i") & ! 349: i := Gen_(Fibseq,"i") & 1(GenJ_((i) ,"i"),Qq_("i")))))); ! 350: write("[[i ^ 2]:F]: ",Image(Sequence([],create (Pp_("i") & ! 351: i := Gen_(Sequence([],create (Pp_("i") & ! 352: i := Gen_(Genseq_,"i") & 1(GenJ_((Binop_("^",i,2)) ,"i"),Qq_("i")))),"i") & 1(GenJ_((Ref_((Fibseq),i,"i")) ,"i"),Qq_("i")))))); ! 353: write("[[i ** 2]:F]: ",Image(Sequence([],create (Pp_("i") & ! 354: i := Gen_(Sequence([], create (1) | (4) | (9) | (16)),"i") & 1(GenJ_((Ref_((Fibseq),i,"i")) ,"i"),Qq_("i")))))); ! 355: write("[{1,3,5}:Abc!i]: ",Image(Sequence([],create (Pp_("i") & ! 356: i := Gen_(Sequence([], create (1) | (3) | (5)),"i") & 1(GenJ_((Ref_((Abc),i,"i")) ,"i"),Qq_("i")))))); ! 357: write("Iplus \\ 4: ",Image(Lim_((.Iplus) ,4),10)); ! 358: write("[Iplus \\ 4:Abc!i]: ",Image(Sequence([],create (Pp_("i") & ! 359: i := Gen_(Lim_((.Iplus) ,4),"i") & 1(GenJ_((Ref_((Abc),i,"i")) ,"i"),Qq_("i")))),10)); ! 360: end ! 361: procedure sec2_2(); ! 362: write("[{i,i}]: ",Image(Sequence([],create (Pp_("i") & ! 363: i := Gen_(Genseq_,"i") & 1(GenJ_((Sequence([], create (i) | (i))) ,"i"),Qq_("i")))))); ! 364: end ! 365: procedure sec2_3(); ! 366: k := 100; ! 367: write("[lambda(j)k + j]: ",Image(Sequence([],create (Pp_("j") & ! 368: j := Gen_(Genseq_,"j") & 1(GenJ_((Binop_("+",k,j)) ,"j"),Qq_("j")))))); ! 369: write("[F:lambda(j)k + j]: ",Image(Sequence([],create (Pp_("j") & ! 370: j := Gen_(Fibseq,"j") & 1(GenJ_((Binop_("+",k,j)) ,"j"),Qq_("j")))))); ! 371: write("[Abc:lambda(s)s || s]: ",Image(Sequence([],create (Pp_("s") & ! 372: s := Gen_(Abc,"s") & 1(GenJ_((Binop_("||",s,s)) ,"s"),Qq_("s")))))); ! 373: end ! 374: procedure sec2_4(); ! 375: write("[lambda(i)[lambda(j) U!i || L!j]: ",Image(Sequence([],create (Pp_("i") & ! 376: i := Gen_(Genseq_,"i") & 1(GenJ_((Sequence([],create (Pp_("j") & ! 377: j := Gen_(Genseq_,"j") & 1(GenJ_((Binop_("||",Ref_((U),i,"i"),Ref_((L),j,"j"))) ,"j"),Qq_("j"))))) ,"i"),Qq_("i")))))); ! 378: write("[lambda(i)[lambda(j) U!j || L!i]: ",Image(Sequence([],create (Pp_("i") & ! 379: i := Gen_(Genseq_,"i") & 1(GenJ_((Sequence([],create (Pp_("j") & ! 380: j := Gen_(Genseq_,"j") & 1(GenJ_((Binop_("||",Ref_((U),j,"j"),Ref_((L),i,"i"))) ,"j"),Qq_("j"))))) ,"i"),Qq_("i")))))); ! 381: write("[Izero:lambda(j)[(Iplus %% j) \\ (j + 1):i]]: ",Image(Sequence([],create (Pp_("j") & ! 382: j := Gen_(.Izero,"j") & 1(GenJ_((Sequence([],create (Pp_("i") & ! 383: i := Gen_(Lim_(((Shift_((.Iplus),j))) ,(Binop_("+",j,1))),"i") & 1(GenJ_((i) ,"i"),Qq_("i"))))) ,"j"),Qq_("j")))))); ! 384: end ! 385: procedure sec3_1(); ! 386: I := Sequence([], create (1) | (2) | (3) | (4) | (5) | (6)); ! 387: J := Sequence([], create (100) | (200) | (300) | (400) | (500) | (600)); ! 388: write("I + J: ",Image(Binop_("+",I,J))); ! 389: write("{a, ab, c} || {c, b, a}: ",Image(Binop_("||",Sequence([], create ("a") | ("ab") | ("c")),Sequence([], create ("c") | ("b") | ("a"))))); ! 390: write("Abc || Abc: ",Image(Binop_("||",Abc,Abc))); ! 391: write("{1,2,3,4} + {1,4}: ",Image(Binop_("+",Sequence([], create (1) | (2) | (3) | (4)),Sequence([], create (1) | (4))))); ! 392: write("{a, ab, c} || {x}: ",Image(Binop_("||",Sequence([], create ("a") | ("ab") | ("c")),Sequence([], create ("x"))))); ! 393: end ! 394: procedure sec3_2(); ! 395: I := Sequence([], create (1) | (2) | (0) | (0) | (45) | (0)); ! 396: write("[if I!i = 0 then {0} else {1}]: ",Image(Sequence([],create (Pp_("i") & ! 397: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Ref_((I),i,"i"),0) then Sequence([], create (0)) else Sequence([], create (1))) ,"i"),Qq_("i")))))); ! 398: write("[if I!i = 0 then 0 else 1]: ",Image(Sequence([],create (Pp_("i") & ! 399: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Ref_((I),i,"i"),0) then 0 else 1) ,"i"),Qq_("i")))))); ! 400: end ! 401: procedure sec3_3(); ! 402: write("Red(Iplus \\ 5,+): ",Image(Red(Lim_((.Iplus) ,5),"+"))); ! 403: write("[Red(F \\ i,+)]: ",Image(Sequence([],create (Pp_("i") & ! 404: i := Gen_(Genseq_,"i") & 1(GenJ_((Red(Lim_((Fibseq) ,i),"+")) ,"i"),Qq_("i")))))); ! 405: write("[Red(Abc \\ (i + 1),||)]: ",Image(Sequence([],create (Pp_("i") & ! 406: i := Gen_(Genseq_,"i") & 1(GenJ_((Red(Lim_((Abc) ,(Binop_("+",i,1))),"||")) ,"i"),Qq_("i")))))); ! 407: end ! 408: procedure sec4(); ! 409: write("[if Iplus!i mod 2 = 0 then Iplus!i]: ",Image(Sequence([],create (Pp_("i") & ! 410: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",Ref_((.Iplus),i,"i"),2),0) then Ref_((.Iplus),i,"i")) ,"i"),Qq_("i")))))); ! 411: write("[if |Abc!i| mod 2 = 0 then Abc!i]: ",Image(Sequence([],create (Pp_("i") & ! 412: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",Unop_("*",(Ref_((Abc),i,"i"))),2),0) then Ref_((Abc),i,"i")) ,"i"),Qq_("i")))))); ! 413: write("[if i mod 2 = 1 then F!(i + 1) else F!(i - 1)]: ",Image(Sequence([],create (Pp_("i") & ! 414: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",i,2),1) then Ref_((Fibseq),(Binop_("+",i,1)),) else Ref_((Fibseq),(Binop_("-",i,1)),)) ,"i"),Qq_("i")))),10)); ! 415: write("[if i mod 2 = 1 then Iplus!i + Iplus!(i + 1)]: ",Image(Sequence([],create (Pp_("i") & ! 416: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Binop_("%",i,2),1) then Binop_("+",Ref_((.Iplus),i,"i"),Ref_((.Iplus),(Binop_("+",i,1)),))) ,"i"),Qq_("i")))))); ! 417: I := Sequence([], create (0) | (1) | (2) | (3) | (0) | (2) | (0) | (5)); ! 418: write("[if I!i = 0 then i]: ",Image(Sequence([],create (Pp_("i") & ! 419: i := Gen_(Genseq_,"i") & 1(GenJ_((if Binop_("=",Ref_((I),i,"i"),0) then i) ,"i"),Qq_("i")))))); ! 420: end ! 421: procedure sec5(); ! 422: write("[Fib(i)]: ",Image(Sequence([],create (Pp_("i") & ! 423: i := Gen_(Genseq_,"i") & 1(GenJ_((Fib()) ,"i"),Qq_("i")))))); ! 424: write("[Fibs(i)]: ",Image(Sequence([],create (Pp_("i") & ! 425: i := Gen_(Genseq_,"i") & 1(GenJ_((Fibs()) ,"i"),Qq_("i")))))); ! 426: write("[G(i - 1)]: ",Image(Sequence([], create (0 | G())))); ! 427: write("[Izero:G(i)]: ",Image(Sequence([], create (0 | G())))); ! 428: write("[Izero:Gk(i,2)]: ",Image(Sequence([], create (Gk(2))))); ! 429: end ! 430: procedure Compress(X) # compression of X to scalar sequence ! 431: return Sequence([],create Collapse_(Copy(X))) ! 432: end ! 433: ! 434: procedure Copy(X) # copy X ! 435: local e, i ! 436: i := *X.a ! 437: return Sequence(copy(X.a),create Pre_(X.e,i)) ! 438: end ! 439: ! 440: procedure Compose(f,X1,X2,X3,X4) # apply f in parallel ! 441: local a ! 442: end ! 443: ! 444: procedure Empty(X) # is X an empty sequence? ! 445: if /X then return Phi ! 446: if not(S_(X)) | (*X.a > 0) | put(X.a,@X.e) then fail ! 447: else return Phi ! 448: end ! 449: ! 450: procedure Image(X,i,r) # image of X to i values ! 451: local s, t, j ! 452: if S_(X) then { ! 453: /i := 5 ! 454: /r := 0 ! 455: if r >= i then return "{...}" ! 456: j := 0 ! 457: s := "{" ! 458: every t := (Gen_(X) \ i) do { ! 459: s ||:= Image(t,i,r +:= 1) || "," ! 460: j +:= 1 ! 461: } ! 462: if j = 0 then return "{}" ! 463: if Ref_(X,i + 1) then s ||:= "...," ! 464: s[-1] := "}" ! 465: return s ! 466: } ! 467: else return image(X) ! 468: end ! 469: ! 470: ! 471: procedure ImageW(X,i,r) # image of X to i values ! 472: local s, t, j ! 473: if S_(X) then { ! 474: /i := 5 ! 475: /r := 0 ! 476: if r >= i then return "{...}" ! 477: j := 0 ! 478: s := "{" ! 479: every t := (Gen_(X) \ i) do { ! 480: s ||:= write(ImageW(t,i,r +:= 1)) || "," ! 481: j +:= 1 ! 482: } ! 483: if j = 0 then return "{}" ! 484: if Ref_(X,i + 1) then s ||:= "...," ! 485: s[-1] := "}" ! 486: return s ! 487: } ! 488: else return image(X) ! 489: end ! 490: ! 491: procedure Index(X) # current size of X ! 492: if not S_(X) then return 1 ! 493: return *X.a ! 494: end ! 495: ! 496: procedure Last(X) # produce all values of X ! 497: if not S_(X) then return X ! 498: return X.a[Length(X)] ! 499: end ! 500: ! 501: procedure Length(X) # length of X ! 502: if not S_(X) then return 1 ! 503: while put(X.a,@X.e) ! 504: return *X.a ! 505: end ! 506: ! 507: procedure Next(X) # produce next value of X ! 508: local x ! 509: if not S_(X) then fail ! 510: if x := @X.e then { ! 511: put(X.a,x) ! 512: return x ! 513: } ! 514: end ! 515: ! 516: procedure Print(X,i) # write the image of a stream ! 517: Write(Image(X,i)) ! 518: return X ! 519: end ! 520: ! 521: procedure Read(f) # sequence from file f ! 522: return Sequence([],create read(!f)) ! 523: end ! 524: ! 525: procedure Red(X,op) # reduction of X over op ! 526: local S ! 527: ! 528: S := Seq_(X) ! 529: a := copy(S.a) ! 530: e := S.e ! 531: return Sequence([], create Red_(Sequence([], create !a | |@e),op)) ! 532: end ! 533: ! 534: procedure Run(X,i) # force computation of next i elements ! 535: ! 536: if not S_(X) then return X ! 537: every 1 to i do ! 538: put(X.a,@X.e) | fail ! 539: return X ! 540: end ! 541: ! 542: procedure Subseq(X,i,j) # subsequence of X from i to j ! 543: return Lim_(Shift_(X,i-1),j - i + 1) ! 544: end ! 545: ! 546: procedure Trace(X,i) # image of X, returning X ! 547: write(Image(X,i)) ! 548: return X ! 549: end ! 550: ! 551: procedure Write(X) # write elements in X with linefeeds ! 552: return Generic_(write,X) ! 553: end ! 554: ! 555: procedure Writes(X) # write elements in X without linefeeds ! 556: return Generic_(writes,X) ! 557: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.