_fn <- "sets.cam"; flat(l) = CONC(< if (is-STR(x) || is-INT(x) || is-SYM(x)) then < x > else flat(x) | x <- l >); i1(x)=<1,x>; i2(x)=<2,x>; j606o(y) = let (a=p1(y),b=p2(y),k=p1(b),x=p2(b)) in < k, >; nilit(x)=; swap(x)=; PLUS(s) = plus-orio([],s); prod(f,g)= lambda(t).; const(f,g)= lambda(x).; comp(f,g)= lambda(x).f(g(x)); Kons(c)= lambda(x).c; id(x)=x; FUNC curry(f:AxB->C):A->(B->C) RETURN let (X=dom(f), Y=p1-set(X)) in [ a -> [ p2(p) -> f[p] | p <- X : p1(p)==a ] | a <- Y ]; FUNC uncurry(f:A->(B->C)):AxB->C RETURN PLUS({ let (g=f[a]) in [ < a, b> -> g[b] | b <- dom(g) ] | a <- dom(f) }); ffAset(s) = [ a -> nil | a <- s ]; join(f1,f2) = [ a -> < f1[a],f2[a]> | a <- dom(f1) * dom(f2) ]; joinInv <- const((*->p1),(*->p2)); uplus(p) = p1(p) + p2(p); ujoin(p) = join(p1(p),p2(p)); nJoin <- comp(ujoin,const(p1,comp(uplus,prod((*->Kons(nil)),curry)))); nJoinInv <- const((*->p1),comp(uncurry,(*->p2))); pJoinInv(f) = let (a=[ p2(x) -> f[x] | x <- dom(f): p1(x) == 1 ], b=[ p2(x) -> f[x] | x <- dom(f): p1(x) == 2 ]) in < a , b >; discollect(f) = UNION({ { | b <- f[a] } | a <- dom(f) }); collect(r) = [ a -> { p2(q) | q <- r: a==p1(q) } | a <- { p1(p) | p <- r } ]; pair2ff(p)= [ "Att1"-> p1(p), "Att2"-> p2(p) ]; ;seq2ff(t)= let (f=lambda(i)."Att"++itoa(i)) in (f->*)(seq2ff(t)); ff2pair(f)= ff2seq(f,""); mkr(f) = { | a <- dom(f) }; mkf(r) = [ p1(t) -> p2(t) | t <- r ]; rinv(r) = { | p <- r }; FUNC f822(p:AxB):BxA RETURN ; f870 <- uncurry; f87x <- curry; flatten(r) = UNION({ { | b <- p2(p) } | p <- r }); rcircle(r,s) = { | p <- r, q <- s: p2(p)==p1(q) };