diff --git a/books/bookvol10.pamphlet b/books/bookvol10.pamphlet
index 86f0b99..f836ded 100644
--- a/books/bookvol10.pamphlet
+++ b/books/bookvol10.pamphlet
@@ -8,12 +8,28 @@
 %%
 %% pagehead consolidates standard page indexing
 %%
-\newcommand{\pagehead}[3]{% e.g. \pagehead{page}{file.ht}{title}
-\subsection{#3}%
-\label{#1}
-\index{pages!#1!#2}%
-\index{#1!#2!pages}%
-\index{#2!pages!#1}}
+\newcommand{\pagehead}[2]{% e.g. \pagehead{name}{abb}
+\section{#1}
+\label{#1}%
+\label{#2}%
+\index{{#1}}%
+\index{{#2}}}%
+%%
+%% pagepic adds an image and an index entry
+%%
+\newcommand{\pagepic}[2]{% e.g. \pagepic{pathandfile}{abb}
+\includegraphics{#1}%
+\index{images!#2}}
+%%
+%% pageto is a forward link to a referenced page
+%%
+\newcommand{\pageto}[2]{% e.g. \pageto{abb}{name}
+\ \\${\bf\Rightarrow{}}${``#1''} (#2) \ref{#1} on page~\pageref{#1}}
+%%
+%% pageback is a backward link to a referencing page
+%%
+\newcommand{\pagefrom}[2]{% e.g. \pagefrom{name}{abb}
+\ \\${\bf\Leftarrow{}}${``#1''} (#2) \ref{#1} on page~\pageref{#1}}
 %%
 % special meanings for math characters
 \providecommand{\N}{\mbox{\bbold N}}
@@ -1982,8 +1998,289 @@ constructing the divisors $\delta_j$ and the $u_j$'s as in that
 case. Again, the details are quite technical and can be found in 
 \cite{2,12,13}.
 
-\chapter{Categories Layers}
-\section{category AGG Aggregate}
+\chapter{Category Layer 1}
+\pagehead{Category}{CATEGORY}
+This is the root of the category hierarchy and is not represented by code.
+
+See:\\
+\pageto{Eltable}{ELTAB}
+\pageto{CoercibleTo}{KOERCE}
+\pageto{ConvertibleTo}{KONVERT}
+\pageto{RetractableTo}{RETRACT}
+\pageto{Type}{TYPE}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{CoercibleTo}{KOERCE}
+\pagepic{ps/v10koerce.ps}{KOERCE}
+
+See:\\
+\pagefrom{Category}{CATEGORY}
+<<category KOERCE CoercibleTo>>=
+)abbrev category KOERCE CoercibleTo
+++ Category for coerce
+++ Author: Manuel Bronstein
+++ Date Created: ???
+++ Date Last Updated: 14 May 1991
+++ Description:
+++ A is coercible to B means any element of A can automatically be
+++ converted into an element of B by the interpreter.
+CoercibleTo(S:Type): Category == with
+    coerce: % -> S
+      ++ coerce(a) transforms a into an element of S.
+
+@
+<<KOERCE.dotabb>>=
+"KOERCE" [color=lightblue,href="books/bookvol10.pamphlet"];
+"KOERCE" -> "CATEGORY"
+
+@
+<<KOERCE.dotfull>>=
+"CoercibleTo(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"CoercibleTo(a:Type)" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen,href="books/bookvol10.pamphlet"];
+"CoercibleTo(OutputForm)" ->
+    "CoercibleTo(a:Type)"
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{ConvertibleTo}{KONVERT}
+\pagepic{ps/v10konvert.ps}{KONVERT}
+
+See:\\
+\pagefrom{Category}{CATEGORY}
+<<category KONVERT ConvertibleTo>>=
+)abbrev category KONVERT ConvertibleTo
+++ Category for convert
+++ Author: Manuel Bronstein
+++ Date Created: ???
+++ Date Last Updated: 14 May 1991
+++ Description:
+++ A is convertible to B means any element of A
+++ can be converted into an element of B,
+++ but not automatically by the interpreter.
+ConvertibleTo(S:Type): Category == with
+    convert: % -> S
+      ++ convert(a) transforms a into an element of S.
+
+@
+<<KONVERT.dotabb>>=
+"KONVERT" [color=lightblue,href="books/bookvol10.pamphlet"];
+"KONVERT" -> "CATEGORY"
+
+@
+<<KONVERT.dotfull>>=
+"ConvertibleTo(a:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(a:Type)" -> "Category"
+
+"ConvertibleTo(DoubleFloat)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(DoubleFloat)" -> "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Float)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Float)" -> "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(InputForm)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(InputForm)" -> "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Integer)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Integer)" -> "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Pattern(Integer))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Pattern(Integer))" -> "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Pattern(Float))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Pattern(Float))" -> "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Complex(Float))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Complex(Float))" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Complex(DoubleFloat))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Complex(DoubleFloat))" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(String)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(String)" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Symbol)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Symbol)" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(SExpression)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(SExpression)" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(Pattern(Base))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(Pattern(Base))" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(List(Integer))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(List(Integer))" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(List(Character))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(List(Character))" ->  "ConvertibleTo(a:Type)"
+
+"ConvertibleTo(UnivariatePolynomialCategory(CommutativeRing))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ConvertibleTo(UnivariatePolynomialCategory(CommutativeRing))" ->
+    "ConvertibleTo(a:Type)"
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Eltable}{ELTAB}
+\pagepic{ps/v10eltab.ps}{ELTAB}
+
+See:\\
+\pagefrom{Category}{CATEGORY}
+<<category ELTAB Eltable>>=
+)abbrev category ELTAB Eltable
+++ Author: Michael Monagan; revised by Manuel Bronstein and Manuel Bronstein
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ An eltable over domains D and I is a structure which can be viewed
+++ as a function from D to I.
+++ Examples of eltable structures range from data structures, e.g. those
+++ of type \spadtype{List}, to algebraic structures like \spadtype{Polynomial}.
+Eltable(S:SetCategory, Index:Type): Category == with
+  elt : (%, S) -> Index
+     ++ elt(u,i) (also written: u . i) returns the element of u indexed by i.
+     ++ Error: if i is not an index of u.
+
+@
+<<ELTAB.dotabb>>=
+"ELTAB" [color=lightblue,href="books/bookvol10.pamphlet"];
+"ELTAB" -> "CATEGORY"
+
+@
+<<ELTAB.dotfull>>=
+"Eltable(a:SetCategory,b:Type)" 
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"Eltable(a:SetCategory,b:Type)" -> "Category"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{RetractableTo}{RETRACT}
+\pagepic{ps/v10retractableto.ps}{RETRACT}
+
+See:\\
+\pagefrom{Category}{CATEGORY}
+<<category RETRACT RetractableTo>>=
+)abbrev category RETRACT RetractableTo
+++ Category for retract
+++ Author: ???
+++ Date Created: ???
+++ Date Last Updated: 14 May 1991
+++ Description:
+++ A is retractable to B means that some elementsif A can be converted
+++ into elements of B and any element of B can be converted into an
+++ element of A.
+RetractableTo(S: Type): Category == with
+    coerce:       S -> %
+      ++ coerce(a) transforms a into an element of %.
+    retractIfCan: % -> Union(S,"failed")
+      ++ retractIfCan(a) transforms a into an element of S if possible.
+      ++ Returns "failed" if a cannot be made into an element of S.
+    retract:      % -> S
+      ++ retract(a) transforms a into an element of S if possible.
+      ++ Error: if a cannot be made into an element of S.
+  add
+    retract(s) ==
+      (u:=retractIfCan s) case "failed" => error "not retractable"
+      u
+
+@
+<<RETRACT.dotabb>>=
+"RETRACT" [color=lightblue,href="books/bookvol10.pamphlet"];
+"RETRACT" -> "CATEGORY"
+
+@
+<<RETRACT.dotfull>>=
+"RetractableTo(a:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"RetractableTo(a:Type)" -> "Category"
+
+"RetractableTo(SetCategory)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(SetCategory)" -> "RetractableTo(a:Type)"
+
+"RetractableTo(Symbol)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(Symbol)" -> "RetractableTo(a:Type)"
+
+"RetractableTo(Integer)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(Integer)" -> "RetractableTo(a:Type)"
+
+"RetractableTo(NonNegativeInteger)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(NonNegativeInteger)" -> "RetractableTo(a:Type)"
+
+"RetractableTo(Fraction(Integer))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(Fraction(Integer))" -> "RetractableTo(a:Type)"
+
+"RetractableTo(Float)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(Float)" -> "RetractableTo(a:Type)"
+
+"RetractableTo(Kernel(ExpressionSpace))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(Kernel(ExpressionSpace))" -> "RetractableTo(a:Type)"
+
+"RetractableTo(CommutativeRing)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"RetractableTo(CommutativeRing)" -> "RetractableTo(a:Type)"
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Type}{TYPE}
+\pagepic{ps/v10type.ps}{TYPE}
+
+See:\\
+\pageto{Aggregate}{AGG}
+\pagefrom{Category}{CATEGORY}
+<<category TYPE Type>>=
+)abbrev category TYPE Type
+++ The new fundamental Type (keeping Object for 1.5 as well)
+++ Author: Richard Jenks
+++ Date Created: 14 May 1992
+++ Date Last Updated: 14 May 1992
+++ Description: The fundamental Type;
+Type(): Category == with nil
+
+@
+<<TYPE.dotabb>>=
+"TYPE" [color=lightblue,href="books/bookvol10.pamphlet"];
+"TYPE" -> "CATEGORY"
+
+@
+<<TYPE.dotfull>>=
+"Type()" [color=lightblue,href="books/bookvol10.pamphlet"];
+"Type()" -> "Category"
+
+@
+\chapter{Category Layer 2}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Aggregate}{AGG}
+\pagepic{ps/v10agg.ps}{AGG}
+
+See:\\
+\pageto{HomogeneousAggregate}{HOAGG}
+\pagefrom{Type}{TYPE}
 <<category AGG Aggregate>>=
 )abbrev category AGG Aggregate
 ++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
@@ -2047,9 +2344,17 @@ Aggregate: Category == Type with
 "Aggregate()" -> "Type()"
 
 @
-\section{category ALAGG AssociationListAggregate}
-<<category ALAGG AssociationListAggregate>>=
-)abbrev category ALAGG AssociationListAggregate
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{EltableAggregate}{ELTAGG}
+%\pagepic{ps/v10eltableaggregate.ps}{ELTAGG}
+\includegraphics[scale=0.75]{ps/v10eltableaggregate.ps}
+\index{images!STAGG}
+
+See:\\
+\pageto{IndexedAggregate}{IXAGG}
+\pagefrom{Eltable}{ELTAB}
+<<category ELTAGG EltableAggregate>>=
+)abbrev category ELTAGG EltableAggregate
 ++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
 ++ Date Created: August 87 through August 88
 ++ Date Last Updated: April 1991
@@ -2060,100 +2365,1859 @@ Aggregate: Category == Type with
 ++ Keywords:
 ++ References:
 ++ Description:
-++ An association list is a list of key entry pairs which may be viewed
-++ as a table.	It is a poor mans version of a table:
-++ searching for a key is a linear operation.
-AssociationListAggregate(Key:SetCategory,Entry:SetCategory): Category ==
-   Join(TableAggregate(Key, Entry), ListAggregate Record(key:Key,entry:Entry)) with
-      assoc: (Key, %) -> Union(Record(key:Key,entry:Entry), "failed")
-	++ assoc(k,u) returns the element x in association list u stored
-	++ with key k, or "failed" if u has no key k.
+++ An eltable aggregate is one which can be viewed as a function.
+++ For example, the list \axiom{[1,7,4]} can applied to 0,1, and 2 respectively
+++ will return the integers 1,7, and 4; thus this list may be viewed
+++ as mapping 0 to 1, 1 to 7 and 2 to 4. In general, an aggregate
+++ can map members of a domain {\em Dom} to an image domain {\em Im}.
+EltableAggregate(Dom:SetCategory, Im:Type): Category ==
+-- This is separated from Eltable
+-- and series won't have to support qelt's and setelt's.
+  Eltable(Dom, Im) with
+    elt : (%, Dom, Im) -> Im
+       ++ elt(u, x, y) applies u to x if x is in the domain of u,
+       ++ and returns y otherwise.
+       ++ For example, if u is a polynomial in \axiom{x} over the rationals,
+       ++ \axiom{elt(u,n,0)} may define the coefficient of \axiom{x}
+       ++ to the power n, returning 0 when n is out of range.
+    qelt: (%, Dom) -> Im
+       ++ qelt(u, x) applies \axiom{u} to \axiom{x} without checking whether
+       ++ \axiom{x} is in the domain of \axiom{u}.  If \axiom{x} is not in the
+       ++ domain of \axiom{u} a memory-access violation may occur.  If a check
+       ++ on whether \axiom{x} is in the domain of \axiom{u} is required, use
+       ++ the function \axiom{elt}.
+    if % has shallowlyMutable then
+       setelt : (%, Dom, Im) -> Im
+	   ++ setelt(u,x,y) sets the image of x to be y under u,
+	   ++ assuming x is in the domain of u.
+	   ++ Error: if x is not in the domain of u.
+	   -- this function will soon be renamed as setelt!.
+       qsetelt_!: (%, Dom, Im) -> Im
+	   ++ qsetelt!(u,x,y) sets the image of \axiom{x} to be \axiom{y} under
+           ++ \axiom{u}, without checking that \axiom{x} is in the domain of
+           ++ \axiom{u}.
+           ++ If such a check is required use the function \axiom{setelt}.
+ add
+  qelt(a, x) == elt(a, x)
+  if % has shallowlyMutable then
+    qsetelt_!(a, x, y) == (a.x := y)
 
 @
-<<ALAGG.dotabb>>=
-"ALAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"ALAGG" -> "TBAGG"
-"ALAGG" -> "LSAGG"
+<<ELTAGG.dotabb>>=
+"ELTAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"ELTAGG" -> "ELTAB"
 
 @
-<<ALAGG.dotfull>>=
-"AssociationListAggregate(a:SetCategory,b:SetCategory)"
+<<ELTAGG.dotfull>>=
+"EltableAggregate(a:SetCategory,b:Type)"
     [color=lightblue,href="books/bookvol10.pamphlet"];
-"AssociationListAggregate(a:SetCategory,b:SetCategory)" ->
-    "TableAggregate(a:SetCategory,b:SetCategory)"
-"AssociationListAggregate(a:SetCategory,b:SetCategory)" ->
-    "ListAggregate(Record(a:SetCategory,b:SetCategory))"
+"EltableAggregate(a:SetCategory,b:Type)" -> "Eltable(a:SetCategory,b:Type)"
 
 @
-\section{ALAGG.lsp BOOTSTRAP}
-{\bf ALAGG} depends on a chain of files. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf ALAGG}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf ALAGG.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
+\chapter{Category Layer 3}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{HomogeneousAggregate}{HOAGG}
+\pagepic{ps/v10homogeneousaggregate.ps}{HOAGG}
+
+See:\\
+\pageto{BagAggregate}{BGAGG}
+\pageto{Collection}{CLAGG}
+\pageto{IndexedAggregate}{IXAGG}
+\pageto{RecursiveAggregate}{RCAGG}
+\pagefrom{Aggregate}{AGG}
+<<category HOAGG HomogeneousAggregate>>=
+)abbrev category HOAGG HomogeneousAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991, May 1995
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A homogeneous aggregate is an aggregate of elements all of the
+++ same type.
+++ In the current system, all aggregates are homogeneous.
+++ Two attributes characterize classes of aggregates.
+++ Aggregates from domains with attribute \spadatt{finiteAggregate}
+++ have a finite number of members.
+++ Those with attribute \spadatt{shallowlyMutable} allow an element
+++ to be modified or updated without changing its overall value.
+HomogeneousAggregate(S:Type): Category == Aggregate with
+   if S has SetCategory then SetCategory
+   if S has SetCategory then
+      if S has Evalable S then Evalable S
+   map	   : (S->S,%) -> %
+     ++ map(f,u) returns a copy of u with each element x replaced by f(x).
+     ++ For collections, \axiom{map(f,u) = [f(x) for x in u]}.
+   if % has shallowlyMutable then
+     map_!: (S->S,%) -> %
+	++ map!(f,u) destructively replaces each element x of u 
+        ++ by \axiom{f(x)}.
+   if % has finiteAggregate then
+      any?: (S->Boolean,%) -> Boolean
+	++ any?(p,u) tests if \axiom{p(x)} is true for any element x of u.
+	++ Note: for collections,
+	++ \axiom{any?(p,u) = reduce(or,map(f,u),false,true)}.
+      every?: (S->Boolean,%) -> Boolean
+	++ every?(f,u) tests if p(x) is true for all elements x of u.
+	++ Note: for collections,
+	++ \axiom{every?(p,u) = reduce(and,map(f,u),true,false)}.
+      count: (S->Boolean,%) -> NonNegativeInteger
+	++ count(p,u) returns the number of elements x in u
+	++ such that \axiom{p(x)} is true. For collections,
+	++ \axiom{count(p,u) = reduce(+,[1 for x in u | p(x)],0)}.
+      parts: % -> List S
+	++ parts(u) returns a list of the consecutive elements of u.
+	++ For collections, \axiom{parts([x,y,...,z]) = (x,y,...,z)}.
+      members: % -> List S
+	++ members(u) returns a list of the consecutive elements of u.
+	++ For collections, \axiom{parts([x,y,...,z]) = (x,y,...,z)}.
+      if S has SetCategory then
+	count: (S,%) -> NonNegativeInteger
+	  ++ count(x,u) returns the number of occurrences of x in u. For
+	  ++ collections, \axiom{count(x,u) = reduce(+,[x=y for y in u],0)}.
+	member?: (S,%) -> Boolean
+	  ++ member?(x,u) tests if x is a member of u.
+	  ++ For collections,
+	  ++ \axiom{member?(x,u) = reduce(or,[x=y for y in u],false)}.
+  add
+   if S has Evalable S then
+     eval(u:%,l:List Equation S):% == map(eval(#1,l),u)
+   if % has finiteAggregate then
+     #c			  == # parts c
+     any?(f, c)		  == _or/[f x for x in parts c]
+     every?(f, c)	  == _and/[f x for x in parts c]
+     count(f:S -> Boolean, c:%) == _+/[1 for x in parts c | f x]
+     members x		  == parts x
+     if S has SetCategory then
+       count(s:S, x:%) == count(s = #1, x)
+       member?(e, c)   == any?(e = #1,c)
+       x = y ==
+	  size?(x, #y) and _and/[a = b for a in parts x for b in parts y]
+       coerce(x:%):OutputForm ==
+	 bracket
+	    commaSeparate [a::OutputForm for a in parts x]$List(OutputForm)
 
-Note that this code is not included in the generated catdef.spad file.
+@
+<<HOAGG.dotabb>>=
+"HOAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"HOAGG" -> "AGG"
 
-<<ALAGG.lsp BOOTSTRAP>>=
+@
+<<HOAGG.dotfull>>=
+"HomogeneousAggregate(a:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"HomogeneousAggregate(a:Type)" -> "Aggregate()"
 
-(|/VERSIONCHECK| 2) 
+@
+\chapter{Category Layer 4}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{BagAggregate}{BGAGG}
+\pagepic{ps/v10bagaggregate.ps}{BGAGG}
+
+See:\\
+\pageto{DictionaryOperations}{DIOPS}
+\pageto{PriorityQueueAggregate}{PRQAGG}
+\pageto{QueueAggregate}{QUAGG}
+\pageto{StackAggregate}{SKAGG}
+\pagefrom{HomogeneousAggregate}{HOAGG}
+<<category BGAGG BagAggregate>>=
+)abbrev category BGAGG BagAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A bag aggregate is an aggregate for which one can insert and extract 
+++ objects, and where the order in which objects are inserted determines 
+++ the order of extraction.
+++ Examples of bags are stacks, queues, and dequeues.
+BagAggregate(S:Type): Category == HomogeneousAggregate S with
+   shallowlyMutable
+     ++ shallowlyMutable means that elements of bags may be 
+     ++ destructively changed.
+   bag: List S -> %
+     ++ bag([x,y,...,z]) creates a bag with elements x,y,...,z.
+   extract_!: % -> S
+     ++ extract!(u) destructively removes a (random) item from bag u.
+   insert_!: (S,%) -> %
+     ++ insert!(x,u) inserts item x into bag u.
+   inspect: % -> S
+     ++ inspect(u) returns an (random) element from a bag.
+ add
+   bag(l) ==
+     x:=empty()
+     for s in l repeat x:=insert_!(s,x)
+     x
 
-(SETQ |AssociationListAggregate;CAT| (QUOTE NIL)) 
+@
+<<BGAGG.dotabb>>=
+"BGAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"BGAGG" -> "HOAGG"
 
-(SETQ |AssociationListAggregate;AL| (QUOTE NIL)) 
+@
+<<BGAGG.dotfull>>=
+"BagAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"BagAggregate(a:Type)" -> "HomogeneousAggregate(a:Type)"
 
-(DEFUN |AssociationListAggregate|
- (|&REST| #1=#:G88404 |&AUX| #2=#:G88402)
-  (DSETQ #2# #1#)
-  (LET (#3=#:G88403)
-   (COND
-    ((SETQ #3# (|assoc| (|devaluateList| #2#) |AssociationListAggregate;AL|))
-      (CDR #3#))
-    (T
-      (SETQ |AssociationListAggregate;AL|
-       (|cons5|
-        (CONS
-         (|devaluateList| #2#)
-         (SETQ #3# (APPLY (FUNCTION |AssociationListAggregate;|) #2#)))
-        |AssociationListAggregate;AL|)) #3#)))) 
+"BagAggregate(a:SetCategory)" [color=seagreen,href="books/bookvol10.pamphlet"];
+"BagAggregate(a:SetCategory)" -> "BagAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Collection}{CLAGG}
+\pagepic{ps/v10collection.ps}{CLAGG}
+
+See:\\
+\pageto{DictionaryOperations}{DIOPS}
+\pageto{LinearAggregate}{LNAGG}
+\pagefrom{HomogeneousAggregate}{HOAGG}
+<<category CLAGG Collection>>=
+)abbrev category CLAGG Collection
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A collection is a homogeneous aggregate which can built from
+++ list of members. The operation used to build the aggregate is
+++ generically named \spadfun{construct}. However, each collection
+++ provides its own special function with the same name as the
+++ data type, except with an initial lower case letter, e.g.
+++ \spadfun{list} for \spadtype{List},
+++ \spadfun{flexibleArray} for \spadtype{FlexibleArray}, and so on.
+Collection(S:Type): Category == HomogeneousAggregate(S) with
+   construct: List S -> %
+     ++ \axiom{construct(x,y,...,z)} returns the collection of elements 
+     ++ \axiom{x,y,...,z} ordered as given. Equivalently written as 
+     ++ \axiom{[x,y,...,z]$D}, where
+     ++ D is the domain. D may be omitted for those of type List.
+   find: (S->Boolean, %) -> Union(S, "failed")
+     ++ find(p,u) returns the first x in u such that \axiom{p(x)} is true, and
+     ++ "failed" otherwise.
+   if % has finiteAggregate then
+      reduce: ((S,S)->S,%) -> S
+	++ reduce(f,u) reduces the binary operation f across u. For example,
+	++ if u is \axiom{[x,y,...,z]} then \axiom{reduce(f,u)} 
+        ++ returns \axiom{f(..f(f(x,y),...),z)}.
+	++ Note: if u has one element x, \axiom{reduce(f,u)} returns x.
+	++ Error: if u is empty.
+        ++
+        ++C )clear all
+        ++X reduce(+,[C[i]*x**i for i in 1..5])
+
+      reduce: ((S,S)->S,%,S) -> S
+	++ reduce(f,u,x) reduces the binary operation f across u, where x is
+	++ the identity operation of f.
+	++ Same as \axiom{reduce(f,u)} if u has 2 or more elements.
+	++ Returns \axiom{f(x,y)} if u has one element y,
+	++ x if u is empty.
+	++ For example, \axiom{reduce(+,u,0)} returns the
+	++ sum of the elements of u.
+      remove: (S->Boolean,%) -> %
+	++ remove(p,u) returns a copy of u removing all elements x such that
+	++ \axiom{p(x)} is true.
+	++ Note: \axiom{remove(p,u) == [x for x in u | not p(x)]}.
+      select: (S->Boolean,%) -> %
+	++ select(p,u) returns a copy of u containing only those elements such
+	++ \axiom{p(x)} is true.
+	++ Note: \axiom{select(p,u) == [x for x in u | p(x)]}.
+      if S has SetCategory then
+	reduce: ((S,S)->S,%,S,S) -> S
+	  ++ reduce(f,u,x,z) reduces the binary operation f across u, stopping
+	  ++ when an "absorbing element" z is encountered.
+	  ++ As for \axiom{reduce(f,u,x)}, x is the identity operation of f.
+	  ++ Same as \axiom{reduce(f,u,x)} when u contains no element z.
+	  ++ Thus the third argument x is returned when u is empty.
+	remove: (S,%) -> %
+	  ++ remove(x,u) returns a copy of u with all
+	  ++ elements \axiom{y = x} removed.
+	  ++ Note: \axiom{remove(y,c) == [x for x in c | x ^= y]}.
+	removeDuplicates: % -> %
+	  ++ removeDuplicates(u) returns a copy of u with all duplicates 
+          ++ removed.
+   if S has ConvertibleTo InputForm then ConvertibleTo InputForm
+ add
+   if % has finiteAggregate then
+     #c			  == # parts c
+     count(f:S -> Boolean, c:%) == _+/[1 for x in parts c | f x]
+     any?(f, c)		  == _or/[f x for x in parts c]
+     every?(f, c)	  == _and/[f x for x in parts c]
+     find(f:S -> Boolean, c:%) == find(f, parts c)
+     reduce(f:(S,S)->S, x:%) == reduce(f, parts x)
+     reduce(f:(S,S)->S, x:%, s:S) == reduce(f, parts x, s)
+     remove(f:S->Boolean, x:%) ==
+       construct remove(f, parts x)
+     select(f:S->Boolean, x:%) ==
+       construct select(f, parts x)
+
+     if S has SetCategory then
+       remove(s:S, x:%) == remove(#1 = s, x)
+       reduce(f:(S,S)->S, x:%, s1:S, s2:S) == reduce(f, parts x, s1, s2)
+       removeDuplicates(x) == construct removeDuplicates parts x
+
+@
+<<CLAGG.dotabb>>=
+"CLAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"CLAGG" -> "HOAGG"
+
+@
+<<CLAGG.dotfull>>=
+"Collection(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"Collection(a:Type)" -> "HomogeneousAggregate(a:Type)"
+
+"Collection(a:SetCategory)" [color=seagreen,href="books/bookvol10.pamphlet"];
+"Collection(a:SetCategory)" -> "Collection(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{IndexedAggregate}{IXAGG}
+\pagepic{ps/v10indexedaggregate.ps}{IXAGG}
+
+See:\\
+\pageto{LinearAggregate}{LNAGG}
+\pageto{TableAggregate}{TBAGG}
+\pagefrom{EltableAggregate}{ELTAGG}
+\pagefrom{HomogeneousAggregate}{HOAGG}
+<<category IXAGG IndexedAggregate>>=
+)abbrev category IXAGG IndexedAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ An indexed aggregate is a many-to-one mapping of indices to entries.
+++ For example, a one-dimensional-array is an indexed aggregate where
+++ the index is an integer.  Also, a table is an indexed aggregate
+++ where the indices and entries may have any type.
+IndexedAggregate(Index: SetCategory, Entry: Type): Category ==
+  Join(HomogeneousAggregate(Entry), EltableAggregate(Index, Entry)) with
+   entries: % -> List Entry
+      ++ entries(u) returns a list of all the entries of aggregate u
+      ++ in no assumed order.
+      -- to become entries: % -> Entry* and entries: % -> Iterator(Entry,Entry)
+   index?: (Index,%) -> Boolean
+      ++ index?(i,u) tests if i is an index of aggregate u.
+   indices: % -> List Index
+      ++ indices(u) returns a list of indices of aggregate u in no
+      ++ particular order. to become indices:
+      --  % -> Index* and indices: % -> Iterator(Index,Index).
+-- map: ((Entry,Entry)->Entry,%,%,Entry) -> %
+--    ++ exists c = map(f,a,b,x), i:Index where
+--    ++    c.i = f(a(i,x),b(i,x)) | index?(i,a) or index?(i,b)
+   if Entry has SetCategory and % has finiteAggregate then
+      entry?: (Entry,%) -> Boolean
+	++ entry?(x,u) tests if x equals \axiom{u . i} for some index i.
+   if Index has OrderedSet then
+      maxIndex: % -> Index
+	++ maxIndex(u) returns the maximum index i of aggregate u.
+	++ Note: in general,
+	++ \axiom{maxIndex(u) = reduce(max,[i for i in indices u])};
+	++ if u is a list, \axiom{maxIndex(u) = #u}.
+      minIndex: % -> Index
+	++ minIndex(u) returns the minimum index i of aggregate u.
+	++ Note: in general,
+	++ \axiom{minIndex(a) = reduce(min,[i for i in indices a])};
+	++ for lists, \axiom{minIndex(a) = 1}.
+      first   : % -> Entry
+	++ first(u) returns the first element x of u.
+	++ Note: for collections, \axiom{first([x,y,...,z]) = x}.
+	++ Error: if u is empty.
+
+   if % has shallowlyMutable then
+      fill_!: (%,Entry) -> %
+	++ fill!(u,x) replaces each entry in aggregate u by x.
+	++ The modified u is returned as value.
+      swap_!: (%,Index,Index) -> Void
+	++ swap!(u,i,j) interchanges elements i and j of aggregate u.
+	++ No meaningful value is returned.
+ add
+  elt(a, i, x) == (index?(i, a) => qelt(a, i); x)
+
+  if % has finiteAggregate then
+    entries x == parts x
+    if Entry has SetCategory then
+      entry?(x, a) == member?(x, a)
+
+  if Index has OrderedSet then
+    maxIndex a == "max"/indices(a)
+    minIndex a == "min"/indices(a)
+    first a    == a minIndex a
+
+  if % has shallowlyMutable then
+    map(f, a) == map_!(f, copy a)
+
+    map_!(f, a) ==
+      for i in indices a repeat qsetelt_!(a, i, f qelt(a, i))
+      a
+
+    fill_!(a, x) ==
+      for i in indices a repeat qsetelt_!(a, i, x)
+      a
+
+    swap_!(a, i, j) ==
+      t := a.i
+      qsetelt_!(a, i, a.j)
+      qsetelt_!(a, j, t)
+      void
+
+@
+<<IXAGG.dotabb>>=
+"IXAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"IXAGG" -> "HOAGG"
+"IXAGG" -> "ELTAGG"
+
+@
+<<IXAGG.dotfull>>=
+"IndexedAggregate(a:SetCategory,b:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"IndexedAggregate(a:SetCategory,b:Type)" -> 
+    "HomogeneousAggregate(a:Type)"
+"IndexedAggregate(a:SetCategory,b:Type)" -> 
+    "EltableAggregate(a:SetCategory,b:Type)"
+
+"IndexedAggregate(a:SetCategory,b:SetCategory)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"IndexedAggregate(a:SetCategory,b:SetCategory)" ->
+    "IndexedAggregate(a:SetCategory,b:Type)"
+
+"IndexedAggregate(b:Integer,a:Type)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"IndexedAggregate(b:Integer,a:Type)" ->
+    "IndexedAggregate(a:SetCategory,b:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{RecursiveAggregate}{RCAGG}
+\pagepic{ps/v10recursiveaggregate.ps}{RCAGG}
+
+See:\\
+\pageto{BinaryRecursiveAggregate}{BRAGG}
+\pageto{DoublyLinkedAggregate}{DLAGG}
+\pageto{StreamAggregate}{STAGG}
+\pageto{UnaryRecursiveAggregate}{URAGG}
+\pagefrom{HomogeneousAggregate}{HOAGG}
+<<category RCAGG RecursiveAggregate>>=
+)abbrev category RCAGG RecursiveAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A recursive aggregate over a type S is a model for a
+++ a directed graph containing values of type S.
+++ Recursively, a recursive aggregate is a {\em node}
+++ consisting of a \spadfun{value} from S and 0 or more \spadfun{children}
+++ which are recursive aggregates.
+++ A node with no children is called a \spadfun{leaf} node.
+++ A recursive aggregate may be cyclic for which some operations as noted
+++ may go into an infinite loop.
+RecursiveAggregate(S:Type): Category == HomogeneousAggregate(S) with
+   children: % -> List %
+     ++ children(u) returns a list of the children of aggregate u.
+   -- should be % -> %* and also needs children: % -> Iterator(S,S)
+   nodes: % -> List %
+     ++ nodes(u) returns a list of all of the nodes of aggregate u.
+   -- to become % -> %* and also nodes: % -> Iterator(S,S)
+   leaf?: % -> Boolean
+     ++ leaf?(u) tests if u is a terminal node.
+   value: % -> S
+     ++ value(u) returns the value of the node u.
+   elt: (%,"value") -> S
+     ++ elt(u,"value") (also written: \axiom{a. value}) is
+     ++ equivalent to \axiom{value(a)}.
+   cyclic?: % -> Boolean
+     ++ cyclic?(u) tests if u has a cycle.
+   leaves: % -> List S
+     ++ leaves(t) returns the list of values in obtained by visiting the
+     ++ nodes of tree \axiom{t} in left-to-right order.
+   distance: (%,%) -> Integer
+     ++ distance(u,v) returns the path length (an integer) from node u to v.
+   if S has SetCategory then
+      child?: (%,%) -> Boolean
+	++ child?(u,v) tests if node u is a child of node v.
+      node?: (%,%) -> Boolean
+	++ node?(u,v) tests if node u is contained in node v
+	++ (either as a child, a child of a child, etc.).
+   if % has shallowlyMutable then
+      setchildren_!: (%,List %)->%
+	++ setchildren!(u,v) replaces the current children of node u
+	++ with the members of v in left-to-right order.
+      setelt: (%,"value",S) -> S
+	++ setelt(a,"value",x) (also written \axiom{a . value := x})
+	++ is equivalent to \axiom{setvalue!(a,x)}
+      setvalue_!: (%,S) -> S
+	++ setvalue!(u,x) sets the value of node u to x.
+ add
+   elt(x,"value") == value x
+   if % has shallowlyMutable then
+     setelt(x,"value",y) == setvalue_!(x,y)
+   if S has SetCategory then
+     child?(x,l) == member?(x,children(l))
+
+@
+<<RCAGG.dotabb>>=
+"RCAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"RCAGG" -> "HOAGG"
+
+@
+<<RCAGG.dotfull>>=
+"RecursiveAggregate(a:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"RecursiveAggregate(a:Type)" -> "HomogeneousAggregate(a:Type)"
+
+@
+\chapter{Category Layer 5}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{BinaryRecursiveAggregate}{BRAGG}
+\pagepic{ps/v10binaryrecursiveaggregate.ps}{BRAGG}
+
+See:\\
+\pagefrom{RecursiveAggregate}{RCAGG}
+<<category BRAGG BinaryRecursiveAggregate>>=
+)abbrev category BRAGG BinaryRecursiveAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A binary-recursive aggregate has 0, 1 or 2 children and
+++ serves as a model for a binary tree or a doubly-linked aggregate structure
+BinaryRecursiveAggregate(S:Type):Category == RecursiveAggregate S with
+   -- needs preorder, inorder and postorder iterators
+   left: % -> %
+     ++ left(u) returns the left child.
+   elt: (%,"left") -> %
+     ++ elt(u,"left") (also written: \axiom{a . left}) is
+     ++ equivalent to \axiom{left(a)}.
+   right: % -> %
+     ++ right(a) returns the right child.
+   elt: (%,"right") -> %
+     ++ elt(a,"right") (also written: \axiom{a . right})
+     ++ is equivalent to \axiom{right(a)}.
+   if % has shallowlyMutable then
+      setelt: (%,"left",%) -> %
+	++ setelt(a,"left",b) (also written \axiom{a . left := b}) is 
+	++ equivalent to \axiom{setleft!(a,b)}.
+      setleft_!: (%,%) -> %
+	 ++ setleft!(a,b) sets the left child of \axiom{a} to be b.
+      setelt: (%,"right",%) -> %
+	 ++ setelt(a,"right",b) (also written \axiom{b . right := b})
+	 ++ is equivalent to \axiom{setright!(a,b)}.
+      setright_!: (%,%) -> %
+	 ++ setright!(a,x) sets the right child of t to be x.
+ add
+   cycleMax ==> 1000
+
+   elt(x,"left")  == left x
+   elt(x,"right") == right x
+   leaf? x == empty? x or empty? left x and empty? right x
+   leaves t ==
+     empty? t => empty()$List(S)
+     leaf? t => [value t]
+     concat(leaves left t,leaves right t)
+   nodes x ==
+     l := empty()$List(%)
+     empty? x => l
+     concat(nodes left x,concat([x],nodes right x))
+   children x ==
+     l := empty()$List(%)
+     empty? x => l
+     empty? left x  => [right x]
+     empty? right x => [left x]
+     [left x, right x]
+   if % has SetAggregate(S) and S has SetCategory then
+     node?(u,v) ==
+       empty? v => false
+       u = v => true
+       for y in children v repeat node?(u,y) => return true
+       false
+     x = y ==
+       empty?(x) => empty?(y)
+       empty?(y) => false
+       value x = value y and left x = left y and right x = right y
+     if % has finiteAggregate then
+       member?(x,u) ==
+	 empty? u => false
+	 x = value u => true
+	 member?(x,left u) or member?(x,right u)
+
+   if S has SetCategory then
+     coerce(t:%): OutputForm ==
+       empty? t =>  "[]"::OutputForm
+       v := value(t):: OutputForm
+       empty? left t =>
+	 empty? right t => v
+	 r := coerce(right t)@OutputForm
+	 bracket ["."::OutputForm, v, r]
+       l := coerce(left t)@OutputForm
+       r :=
+	 empty? right t => "."::OutputForm
+	 coerce(right t)@OutputForm
+       bracket [l, v, r]
+
+   if % has finiteAggregate then
+     aggCount: (%,NonNegativeInteger) -> NonNegativeInteger
+     #x == aggCount(x,0)
+     aggCount(x,k) ==
+       empty? x => 0
+       k := k + 1
+       k = cycleMax and cyclic? x => error "cyclic tree"
+       for y in children x repeat k := aggCount(y,k)
+       k
+
+   isCycle?:  (%, List %) -> Boolean
+   eqMember?: (%, List %) -> Boolean
+   cyclic? x	 == not empty? x and isCycle?(x,empty()$(List %))
+   isCycle?(x,acc) ==
+     empty? x => false
+     eqMember?(x,acc) => true
+     for y in children x | not empty? y repeat
+       isCycle?(y,acc) => return true
+     false
+   eqMember?(y,l) ==
+     for x in l repeat eq?(x,y) => return true
+     false
+   if % has shallowlyMutable then
+     setelt(x,"left",b)  == setleft_!(x,b)
+     setelt(x,"right",b) == setright_!(x,b)
+
+@
+<<BRAGG.dotabb>>=
+"BRAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"BRAGG" -> "RCAGG"
+
+@
+<<BRAGG.dotfull>>=
+"BinaryRecursiveAggregate(a:Type)" 
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"BinaryRecursiveAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{DictionaryOperations}{DIOPS}
+\pagepic{ps/v10dictionaryoperations.ps}{DIOPS}
+
+See:\\
+\pageto{Dictionary}{DIAGG}
+\pageto{MultiDictionary}{MDAGG}
+\pagefrom{BagAggregate}{BGAGG}
+\pagefrom{Collection}{CLAGG}
+<<category DIOPS DictionaryOperations>>=
+)abbrev category DIOPS DictionaryOperations
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ This category is a collection of operations common to both
+++ categories \spadtype{Dictionary} and \spadtype{MultiDictionary}
+DictionaryOperations(S:SetCategory): Category ==
+  Join(BagAggregate S, Collection(S)) with
+   dictionary: () -> %
+     ++ dictionary()$D creates an empty dictionary of type D.
+   dictionary: List S -> %
+     ++ dictionary([x,y,...,z]) creates a dictionary consisting of
+     ++ entries \axiom{x,y,...,z}.
+-- insert: (S,%) -> S		      ++ insert an entry
+-- member?: (S,%) -> Boolean		      ++ search for an entry
+-- remove_!: (S,%,NonNegativeInteger) -> %
+--   ++ remove!(x,d,n) destructively changes dictionary d by removing
+--   ++ up to n entries y such that \axiom{y = x}.
+-- remove_!: (S->Boolean,%,NonNegativeInteger) -> %
+--   ++ remove!(p,d,n) destructively changes dictionary d by removing
+--   ++ up to n entries x such that \axiom{p(x)} is true.
+   if % has finiteAggregate then
+     remove_!: (S,%) -> %
+       ++ remove!(x,d) destructively changes dictionary d by removing
+       ++ all entries y such that \axiom{y = x}.
+     remove_!: (S->Boolean,%) -> %
+       ++ remove!(p,d) destructively changes dictionary d by removeing
+       ++ all entries x such that \axiom{p(x)} is true.
+     select_!: (S->Boolean,%) -> %
+       ++ select!(p,d) destructively changes dictionary d by removing
+       ++ all entries x such that \axiom{p(x)} is not true.
+ add
+   construct l == dictionary l
+   dictionary() == empty()
+   if % has finiteAggregate then
+     copy d == dictionary parts d
+     coerce(s:%):OutputForm ==
+       prefix("dictionary"@String :: OutputForm,
+				      [x::OutputForm for x in parts s])
+
+@
+<<DIOPS.dotabb>>=
+"DIOPS" [color=lightblue,href="books/bookvol10.pamphlet"];
+"DIOPS" -> "BGAGG"
+"DIOPS" -> "CLAGG"
+
+@
+<<DIOPS.dotfull>>=
+"DictionaryOperations(a:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"DictionaryOperations(a:SetCategory)" -> "BagAggregate(a:SetCategory)"
+"DictionaryOperations(a:SetCategory)" -> "Collection(a:SetCategory)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{DoublyLinkedAggregate}{DLAGG}
+\pagepic{ps/v10doublylinkedaggregate.ps}{DLAGG}
+
+See:\\
+\pagefrom{RecursiveAggregate}{RCAGG}
+<<category DLAGG DoublyLinkedAggregate>>=
+)abbrev category DLAGG DoublyLinkedAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A doubly-linked aggregate serves as a model for a doubly-linked
+++ list, that is, a list which can has links to both next and previous
+++ nodes and thus can be efficiently traversed in both directions.
+DoublyLinkedAggregate(S:Type): Category == RecursiveAggregate S with
+   last: % -> S
+     ++ last(l) returns the last element of a doubly-linked aggregate l.
+     ++ Error: if l is empty.
+   head: % -> %
+     ++ head(l) returns the first element of a doubly-linked aggregate l.
+     ++ Error: if l is empty.
+   tail: % -> %
+     ++ tail(l) returns the doubly-linked aggregate l starting at
+     ++ its second element.
+     ++ Error: if l is empty.
+   previous: % -> %
+     ++ previous(l) returns the doubly-link list beginning with its previous
+     ++ element.
+     ++ Error: if l has no previous element.
+     ++ Note: \axiom{next(previous(l)) = l}.
+   next: % -> %
+     ++ next(l) returns the doubly-linked aggregate beginning with its next
+     ++ element.
+     ++ Error: if l has no next element.
+     ++ Note: \axiom{next(l) = rest(l)} and \axiom{previous(next(l)) = l}.
+   if % has shallowlyMutable then
+      concat_!: (%,%) -> %
+	++ concat!(u,v) destructively concatenates doubly-linked aggregate v 
+        ++ to the end of doubly-linked aggregate u.
+      setprevious_!: (%,%) -> %
+	++ setprevious!(u,v) destructively sets the previous node of 
+        ++ doubly-linked aggregate u to v, returning v.
+      setnext_!: (%,%) -> %
+	++ setnext!(u,v) destructively sets the next node of doubly-linked 
+        ++ aggregate u to v, returning v.
+
+@
+<<DLAGG.dotabb>>=
+"DLAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"DLAGG" -> "RCAGG"
+
+@
+<<DLAGG.dotfull>>=
+"DoublyLinkedAggregate(a:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"DoublyLinkedAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{LinearAggregate}{LNAGG}
+\pagepic{ps/v10linearaggregate.ps}{LNAGG}
+
+See:\\
+\pageto{ExtensibleLinearAggregate}{ELAGG}
+\pageto{FiniteLinearAggregate}{FLAGG}
+\pageto{StreamAggregate}{STAGG}
+\pagefrom{Collection}{CLAGG}
+\pagefrom{IndexedAggregate}{IXAGG}
+<<category LNAGG LinearAggregate>>=
+)abbrev category LNAGG LinearAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A linear aggregate is an aggregate whose elements are indexed by integers.
+++ Examples of linear aggregates are strings, lists, and
+++ arrays.
+++ Most of the exported operations for linear aggregates are non-destructive
+++ but are not always efficient for a particular aggregate.
+++ For example, \spadfun{concat} of two lists needs only to copy its first
+++ argument, whereas \spadfun{concat} of two arrays needs to copy both 
+++ arguments. Most of the operations exported here apply to infinite 
+++ objects (e.g. streams) as well to finite ones.
+++ For finite linear aggregates, see \spadtype{FiniteLinearAggregate}.
+LinearAggregate(S:Type): Category ==
+  Join(IndexedAggregate(Integer, S), Collection(S)) with
+   new	 : (NonNegativeInteger,S) -> %
+     ++ new(n,x) returns \axiom{fill!(new n,x)}.
+   concat: (%,S) -> %
+     ++ concat(u,x) returns aggregate u with additional element x at the end.
+     ++ Note: for lists, \axiom{concat(u,x) == concat(u,[x])}
+   concat: (S,%) -> %
+     ++ concat(x,u) returns aggregate u with additional element at the front.
+     ++ Note: for lists: \axiom{concat(x,u) == concat([x],u)}.
+   concat: (%,%) -> %
+      ++ concat(u,v) returns an aggregate consisting of the elements of u
+      ++ followed by the elements of v.
+      ++ Note: if \axiom{w = concat(u,v)} then 
+      ++ \axiom{w.i = u.i for i in indices u}
+      ++ and \axiom{w.(j + maxIndex u) = v.j for j in indices v}.
+   concat: List % -> %
+      ++ concat(u), where u is a lists of aggregates \axiom{[a,b,...,c]}, 
+      ++ returns a single aggregate consisting of the elements of \axiom{a}
+      ++ followed by those
+      ++ of b followed ... by the elements of c.
+      ++ Note: \axiom{concat(a,b,...,c) = concat(a,concat(b,...,c))}.
+   map: ((S,S)->S,%,%) -> %
+     ++ map(f,u,v) returns a new collection w with elements \axiom{z = f(x,y)}
+     ++ for corresponding elements x and y from u and v.
+     ++ Note: for linear aggregates, \axiom{w.i = f(u.i,v.i)}.
+   elt: (%,UniversalSegment(Integer)) -> %
+      ++ elt(u,i..j) (also written: \axiom{a(i..j)}) returns the aggregate of
+      ++ elements \axiom{u} for k from i to j in that order.
+      ++ Note: in general, \axiom{a.s = [a.k for i in s]}.
+   delete: (%,Integer) -> %
+      ++ delete(u,i) returns a copy of u with the \axiom{i}th element deleted.
+      ++ Note: for lists, 
+      ++ \axiom{delete(a,i) == concat(a(0..i - 1),a(i + 1,..))}.
+   delete: (%,UniversalSegment(Integer)) -> %
+      ++ delete(u,i..j) returns a copy of u with the \axiom{i}th through
+      ++ \axiom{j}th element deleted.
+      ++ Note: \axiom{delete(a,i..j) = concat(a(0..i-1),a(j+1..))}.
+   insert: (S,%,Integer) -> %
+      ++ insert(x,u,i) returns a copy of u having x as its \axiom{i}th element.
+      ++ Note: \axiom{insert(x,a,k) = concat(concat(a(0..k-1),x),a(k..))}.
+   insert: (%,%,Integer) -> %
+      ++ insert(v,u,k) returns a copy of u having v inserted beginning at the
+      ++ \axiom{i}th element.
+      ++ Note: \axiom{insert(v,u,k) = concat( u(0..k-1), v, u(k..) )}.
+   if % has shallowlyMutable then setelt: (%,UniversalSegment(Integer),S) -> S
+      ++ setelt(u,i..j,x) (also written: \axiom{u(i..j) := x}) destructively
+      ++ replaces each element in the segment \axiom{u(i..j)} by x.
+      ++ The value x is returned.
+      ++ Note: u is destructively change so
+      ++ that \axiom{u.k := x for k in i..j};
+      ++ its length remains unchanged.
+ add
+  indices a	 == [i for i in minIndex a .. maxIndex a]
+  index?(i, a)	 == i >= minIndex a and i <= maxIndex a
+  concat(a:%, x:S)	== concat(a, new(1, x))
+  concat(x:S, y:%)	== concat(new(1, x), y)
+  insert(x:S, a:%, i:Integer) == insert(new(1, x), a, i)
+  if % has finiteAggregate then
+    maxIndex l == #l - 1 + minIndex l
+
+--if % has shallowlyMutable then new(n, s)  == fill_!(new n, s)
+
+@
+<<LNAGG.dotabb>>=
+"LNAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"LNAGG" -> "IXAGG"
+"LNAGG" -> "CLAGG"
+
+@
+<<LNAGG.dotfull>>=
+"LinearAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"LinearAggregate(a:Type)" -> "IndexedAggregate(b:Integer,a:Type)"
+"LinearAggregate(a:Type)" -> "Collection(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{PriorityQueueAggregate}{PRQAGG}
+\pagepic{ps/v10priorityqueueaggregate.ps}{PRQAGG}
+
+See:\\
+\pagefrom{BagAggregate}{BGAGG}
+<<category PRQAGG PriorityQueueAggregate>>=
+)abbrev category PRQAGG PriorityQueueAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A priority queue is a bag of items from an ordered set where the item
+++ extracted is always the maximum element.
+PriorityQueueAggregate(S:OrderedSet): Category == BagAggregate S with
+   finiteAggregate
+   max: % -> S
+     ++ max(q) returns the maximum element of priority queue q.
+   merge: (%,%) -> %
+     ++ merge(q1,q2) returns combines priority queues q1 and q2 to return
+     ++ a single priority queue q.
+   merge_!: (%,%) -> %
+     ++ merge!(q,q1) destructively changes priority queue q to include the
+     ++ values from priority queue q1.
+
+@
+<<PRQAGG.dotabb>>=
+"PRQAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"PRQAGG" -> "BGAGG"
+
+@
+<<PRQAGG.dotfull>>=
+"PriorityQueueAggregate(a:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"PriorityQueueAggregate(a:Type)" -> "BagAggregate(a:Type)"
+
+"PriorityQueueAggregate(a:SetCategory)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"PriorityQueueAggregate(a:SetCategory)" -> "PriorityQueueAggregate(a:Type)"
+
+"PriorityQueueAggregate(a:OrderedSet)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"PriorityQueueAggregate(a:OrderedSet)" ->
+   "PriorityQueueAggregate(a:SetCategory)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{QueueAggregate}{QUAGG}
+\pagepic{ps/v10queueaggregate.ps}{QUAGG}
+
+See:\\
+\pageto{DequeueAggregate}{DQAGG}
+\pagefrom{BagAggregate}{BGAGG}
+<<category QUAGG QueueAggregate>>=
+)abbrev category QUAGG QueueAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A queue is a bag where the first item inserted is the first item extracted.
+QueueAggregate(S:Type): Category == BagAggregate S with
+   finiteAggregate
+   enqueue_!: (S, %) -> S
+     ++ enqueue!(x,q) inserts x into the queue q at the back end.
+   dequeue_!: % -> S
+     ++ dequeue! s destructively extracts the first (top) element from queue q.
+     ++ The element previously second in the queue becomes the first element.
+     ++ Error: if q is empty.
+   rotate_!: % -> %
+     ++ rotate! q rotates queue q so that the element at the front of
+     ++ the queue goes to the back of the queue.
+     ++ Note: rotate! q is equivalent to enqueue!(dequeue!(q)).
+   length: % -> NonNegativeInteger
+     ++ length(q) returns the number of elements in the queue.
+     ++ Note: \axiom{length(q) = #q}.
+   front: % -> S
+     ++ front(q) returns the element at the front of the queue.
+     ++ The queue q is unchanged by this operation.
+     ++ Error: if q is empty.
+   back: % -> S
+     ++ back(q) returns the element at the back of the queue.
+     ++ The queue q is unchanged by this operation.
+     ++ Error: if q is empty.
+
+@
+<<QUAGG.dotabb>>=
+"QUAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"QUAGG" -> "BGAGG"
+
+@
+<<QUAGG.dotfull>>=
+"QueueAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"QueueAggregate(a:Type)" -> "BagAggregate(a:Type)"
+
+"QueueAggregate(a:SetCategory)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"QueueAggregate(a:SetCategory)" -> "QueueAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{StackAggregate}{SKAGG}
+\pagepic{ps/v10stackaggregate.ps}{SKAGG}
+
+See:\\
+\pageto{DequeueAggregate}{DQAGG}
+\pagefrom{BagAggregate}{BGAGG}
+<<category SKAGG StackAggregate>>=
+)abbrev category SKAGG StackAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A stack is a bag where the last item inserted is the first item extracted.
+StackAggregate(S:Type): Category == BagAggregate S with
+   finiteAggregate
+   push_!: (S,%) -> S
+     ++ push!(x,s) pushes x onto stack s, i.e. destructively changing s
+     ++ so as to have a new first (top) element x.
+     ++ Afterwards, pop!(s) produces x and pop!(s) produces the original s.
+   pop_!: % -> S
+     ++ pop!(s) returns the top element x, destructively removing x from s.
+     ++ Note: Use \axiom{top(s)} to obtain x without removing it from s.
+     ++ Error: if s is empty.
+   top: % -> S
+     ++ top(s) returns the top element x from s; s remains unchanged.
+     ++ Note: Use \axiom{pop!(s)} to obtain x and remove it from s.
+   depth: % -> NonNegativeInteger
+     ++ depth(s) returns the number of elements of stack s.
+     ++ Note: \axiom{depth(s) = #s}.
+
+
+@
+<<SKAGG.dotabb>>=
+"SKAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"SKAGG" -> "BGAGG"
+
+@
+<<SKAGG.dotfull>>=
+"StackAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"StackAggregate(a:Type)" -> "BagAggregate(a:Type)"
+
+"StackAggregate(a:SetCategory)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"StackAggregate(a:SetCategory)" -> "StackAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{UnaryRecursiveAggregate}{URAGG}
+\pagepic{ps/v10unaryrecursiveaggregate.ps}{URAGG}
+
+See:\\
+\pagefrom{RecursiveAggregate}{RCAGG}
+<<category URAGG UnaryRecursiveAggregate>>=
+)abbrev category URAGG UnaryRecursiveAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A unary-recursive aggregate is a one where nodes may have either
+++ 0 or 1 children.
+++ This aggregate models, though not precisely, a linked
+++ list possibly with a single cycle.
+++ A node with one children models a non-empty list, with the
+++ \spadfun{value} of the list designating the head, or \spadfun{first}, of the
+++ list, and the child designating the tail, or \spadfun{rest}, of the list.
+++ A node with no child then designates the empty list.
+++ Since these aggregates are recursive aggregates, they may be cyclic.
+UnaryRecursiveAggregate(S:Type): Category == RecursiveAggregate S with
+   concat: (%,%) -> %
+      ++ concat(u,v) returns an aggregate w consisting of the elements of u
+      ++ followed by the elements of v.
+      ++ Note: \axiom{v = rest(w,#a)}.
+   concat: (S,%) -> %
+      ++ concat(x,u) returns aggregate consisting of x followed by
+      ++ the elements of u.
+      ++ Note: if \axiom{v = concat(x,u)} then \axiom{x = first v}
+      ++ and \axiom{u = rest v}.
+   first: % -> S
+      ++ first(u) returns the first element of u
+      ++ (equivalently, the value at the current node).
+   elt: (%,"first") -> S
+      ++ elt(u,"first") (also written: \axiom{u . first}) 
+      ++ is equivalent to first u.
+   first: (%,NonNegativeInteger) -> %
+      ++ first(u,n) returns a copy of the first n (\axiom{n >= 0}) 
+      ++ elements of u.
+   rest: % -> %
+      ++ rest(u) returns an aggregate consisting of all but the first
+      ++ element of u
+      ++ (equivalently, the next node of u).
+   elt: (%,"rest") -> %
+      ++ elt(%,"rest") (also written: \axiom{u.rest}) is
+      ++ equivalent to \axiom{rest u}.
+   rest: (%,NonNegativeInteger) -> %
+      ++ rest(u,n) returns the \axiom{n}th (n >= 0) node of u.
+      ++ Note: \axiom{rest(u,0) = u}.
+   last: % -> S
+      ++ last(u) resturn the last element of u.
+      ++ Note: for lists, \axiom{last(u) = u . (maxIndex u) = u . (# u - 1)}.
+   elt: (%,"last") -> S
+      ++ elt(u,"last") (also written: \axiom{u . last}) is equivalent 
+      ++ to last u.
+   last: (%,NonNegativeInteger) -> %
+      ++ last(u,n) returns a copy of the last n (\axiom{n >= 0}) nodes of u.
+      ++ Note: \axiom{last(u,n)} is a list of n elements.
+   tail: % -> %
+      ++ tail(u) returns the last node of u.
+      ++ Note: if u is \axiom{shallowlyMutable},
+      ++ \axiom{setrest(tail(u),v) = concat(u,v)}.
+   second: % -> S
+      ++ second(u) returns the second element of u.
+      ++ Note: \axiom{second(u) = first(rest(u))}.
+   third: % -> S
+      ++ third(u) returns the third element of u.
+      ++ Note: \axiom{third(u) = first(rest(rest(u)))}.
+   cycleEntry: % -> %
+      ++ cycleEntry(u) returns the head of a top-level cycle contained in
+      ++ aggregate u, or \axiom{empty()} if none exists.
+   cycleLength: % -> NonNegativeInteger
+      ++ cycleLength(u) returns the length of a top-level cycle
+      ++ contained  in aggregate u, or 0 is u has no such cycle.
+   cycleTail: % -> %
+      ++ cycleTail(u) returns the last node in the cycle, or
+      ++ empty if none exists.
+   if % has shallowlyMutable then
+      concat_!: (%,%) -> %
+	++ concat!(u,v) destructively concatenates v to the end of u.
+	++ Note: \axiom{concat!(u,v) = setlast_!(u,v)}.
+      concat_!: (%,S) -> %
+	++ concat!(u,x) destructively adds element x to the end of u.
+	++ Note: \axiom{concat!(a,x) = setlast!(a,[x])}.
+      cycleSplit_!: % -> %
+	++ cycleSplit!(u) splits the aggregate by dropping off the cycle.
+	++ The value returned is the cycle entry, or nil if none exists.
+	++ For example, if \axiom{w = concat(u,v)} is the cyclic list where 
+	++ v is the head of the cycle, \axiom{cycleSplit!(w)} will drop v 
+	++ off w thus destructively changing w to u, and returning v.
+      setfirst_!: (%,S) -> S
+	++ setfirst!(u,x) destructively changes the first element of a to x.
+      setelt: (%,"first",S) -> S
+	++ setelt(u,"first",x) (also written: \axiom{u.first := x}) is
+	++ equivalent to \axiom{setfirst!(u,x)}.
+      setrest_!: (%,%) -> %
+	++ setrest!(u,v) destructively changes the rest of u to v.
+      setelt: (%,"rest",%) -> %
+	++ setelt(u,"rest",v) (also written: \axiom{u.rest := v}) is 
+	++ equivalent to \axiom{setrest!(u,v)}.
+      setlast_!: (%,S) -> S
+	++ setlast!(u,x) destructively changes the last element of u to x.
+      setelt: (%,"last",S) -> S
+	++ setelt(u,"last",x) (also written: \axiom{u.last := b})
+	++ is equivalent to \axiom{setlast!(u,v)}.
+      split_!: (%,Integer) -> %
+	 ++ split!(u,n) splits u into two aggregates: \axiom{v = rest(u,n)}
+	 ++ and \axiom{w = first(u,n)}, returning \axiom{v}.
+	 ++ Note: afterwards \axiom{rest(u,n)} returns \axiom{empty()}.
+ add
+  cycleMax ==> 1000
+
+  findCycle: % -> %
+
+  elt(x, "first") == first x
+  elt(x,  "last") == last x
+  elt(x,  "rest") == rest x
+  second x	  == first rest x
+  third x	  == first rest rest x
+  cyclic? x	  == not empty? x and not empty? findCycle x
+  last x	  == first tail x
+
+  nodes x ==
+    l := empty()$List(%)
+    while not empty? x repeat
+      l := concat(x, l)
+      x := rest x
+    reverse_! l
+
+  children x ==
+    l := empty()$List(%)
+    empty? x => l
+    concat(rest x,l)
+
+  leaf? x == empty? x
+
+  value x ==
+    empty? x => error "value of empty object"
+    first x
+
+  less?(l, n) ==
+    i := n::Integer
+    while i > 0 and not empty? l repeat (l := rest l; i := i - 1)
+    i > 0
+
+  more?(l, n) ==
+    i := n::Integer
+    while i > 0 and not empty? l repeat (l := rest l; i := i - 1)
+    zero?(i) and not empty? l
+
+  size?(l, n) ==
+    i := n::Integer
+    while not empty? l and i > 0 repeat (l := rest l; i := i - 1)
+    empty? l and zero? i
+
+  #x ==
+    for k in 0.. while not empty? x repeat
+      k = cycleMax and cyclic? x => error "cyclic list"
+      x := rest x
+    k
+
+  tail x ==
+    empty? x => error "empty list"
+    y := rest x
+    for k in 0.. while not empty? y repeat
+      k = cycleMax and cyclic? x => error "cyclic list"
+      y := rest(x := y)
+    x
+
+  findCycle x ==
+    y := rest x
+    while not empty? y repeat
+      if eq?(x, y) then return x
+      x := rest x
+      y := rest y
+      if empty? y then return y
+      if eq?(x, y) then return y
+      y := rest y
+    y
+
+  cycleTail x ==
+    empty?(y := x := cycleEntry x) => x
+    z := rest x
+    while not eq?(x,z) repeat (y := z; z := rest z)
+    y
+
+  cycleEntry x ==
+    empty? x => x
+    empty?(y := findCycle x) => y
+    z := rest y
+    for l in 1.. while not eq?(y,z) repeat z := rest z
+    y := x
+    for k in 1..l repeat y := rest y
+    while not eq?(x,y) repeat (x := rest x; y := rest y)
+    x
+
+  cycleLength x ==
+    empty? x => 0
+    empty?(x := findCycle x) => 0
+    y := rest x
+    for k in 1.. while not eq?(x,y) repeat y := rest y
+    k
+
+  rest(x, n) ==
+    for i in 1..n repeat
+      empty? x => error "Index out of range"
+      x := rest x
+    x
+
+  if % has finiteAggregate then
+    last(x, n) ==
+      n > (m := #x) => error "index out of range"
+      copy rest(x, (m - n)::NonNegativeInteger)
+
+  if S has SetCategory then
+    x = y ==
+      eq?(x, y) => true
+      for k in 0.. while not empty? x and not empty? y repeat
+	k = cycleMax and cyclic? x => error "cyclic list"
+	first x ^= first y => return false
+	x := rest x
+	y := rest y
+      empty? x and empty? y
+
+    node?(u, v) ==
+      for k in 0.. while not empty? v repeat
+	u = v => return true
+	k = cycleMax and cyclic? v => error "cyclic list"
+	v := rest v
+      u=v
+
+  if % has shallowlyMutable then
+    setelt(x, "first", a) == setfirst_!(x, a)
+    setelt(x,  "last", a) == setlast_!(x, a)
+    setelt(x,  "rest", a) == setrest_!(x, a)
+    concat(x:%, y:%)	  == concat_!(copy x, y)
+
+    setlast_!(x, s) ==
+      empty? x => error "setlast: empty list"
+      setfirst_!(tail x, s)
+      s
+
+    setchildren_!(u,lv) ==
+      #lv=1 => setrest_!(u, first lv)
+      error "wrong number of children specified"
+
+    setvalue_!(u,s) == setfirst_!(u,s)
+
+    split_!(p, n) ==
+      n < 1 => error "index out of range"
+      p := rest(p, (n - 1)::NonNegativeInteger)
+      q := rest p
+      setrest_!(p, empty())
+      q
+
+    cycleSplit_! x ==
+      empty?(y := cycleEntry x) or eq?(x, y) => y
+      z := rest x
+      while not eq?(z, y) repeat (x := z; z := rest z)
+      setrest_!(x, empty())
+      y
+
+@
+<<URAGG.dotabb>>=
+"URAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"URAGG" -> "RCAGG"
+
+@
+<<URAGG.dotfull>>=
+"UnaryRecursiveAggregate(a:Type)" 
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"UnaryRecursiveAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
+
+@
+\chapter{Category Layer 6}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Dictionary}{DIAGG}
+\pagepic{ps/v10dictionary.ps}{DIAGG}
+
+See:\\
+\pageto{KeyedDictionary}{KDAGG}
+\pagefrom{DictionaryOperations}{DIOPS}
+<<category DIAGG Dictionary>>=
+)abbrev category DIAGG Dictionary
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A dictionary is an aggregate in which entries can be inserted,
+++ searched for and removed. Duplicates are thrown away on insertion.
+++ This category models the usual notion of dictionary which involves
+++ large amounts of data where copying is impractical.
+++ Principal operations are thus destructive (non-copying) ones.
+Dictionary(S:SetCategory): Category ==
+ DictionaryOperations S add
+   dictionary l ==
+     d := dictionary()
+     for x in l repeat insert_!(x, d)
+     d
+
+   if % has finiteAggregate then
+    -- remove(f:S->Boolean,t:%)  == remove_!(f, copy t)
+    -- select(f, t)	   == select_!(f, copy t)
+     select_!(f, t)	 == remove_!(not f #1, t)
+
+     --extract_! d ==
+     --	 empty? d => error "empty dictionary"
+     --	 remove_!(x := first parts d, d, 1)
+     --	 x
+
+     s = t ==
+       eq?(s,t) => true
+       #s ^= #t => false
+       _and/[member?(x, t) for x in parts s]
+
+     remove_!(f:S->Boolean, t:%) ==
+       for m in parts t repeat if f m then remove_!(m, t)
+       t
+
+@
+<<DIAGG.dotabb>>=
+"DIAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"DIAGG" -> "DIOPS"
+
+@
+<<DIAGG.dotfull>>=
+"Dictionary(a:SetCategory)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"Dictionary(a:SetCategory)" -> "DictionaryOperations(a:SetCategory)"
+
+"Dictionary(Record(a:SetCategory,b:SetCategory))"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"Dictionary(Record(a:SetCategory,b:SetCategory))" ->
+    "Dictionary(a:SetCategory)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{DequeueAggregate}{DQAGG}
+\pagepic{ps/v10dequeueaggregate.ps}{DQAGG}
+
+See:\\
+\pagefrom{QueueAggregate}{QUAGG}
+\pagefrom{StackAggregate}{SKAGG}
+<<category DQAGG DequeueAggregate>>=
+)abbrev category DQAGG DequeueAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A dequeue is a doubly ended stack, that is, a bag where first items
+++ inserted are the first items extracted, at either the front or the back end
+++ of the data structure.
+DequeueAggregate(S:Type):
+ Category == Join(StackAggregate S,QueueAggregate S) with
+   dequeue: () -> %
+     ++ dequeue()$D creates an empty dequeue of type D.
+   dequeue: List S -> %
+     ++ dequeue([x,y,...,z]) creates a dequeue with first (top or front)
+     ++ element x, second element y,...,and last (bottom or back) element z.
+   height: % -> NonNegativeInteger
+     ++ height(d) returns the number of elements in dequeue d.
+     ++ Note: \axiom{height(d) = # d}.
+   top_!: % -> S
+     ++ top!(d) returns the element at the top (front) of the dequeue.
+   bottom_!: % -> S
+     ++ bottom!(d) returns the element at the bottom (back) of the dequeue.
+   insertTop_!: (S,%) -> S
+     ++ insertTop!(x,d) destructively inserts x into the dequeue d, that is,
+     ++ at the top (front) of the dequeue.
+     ++ The element previously at the top of the dequeue becomes the
+     ++ second in the dequeue, and so on.
+   insertBottom_!: (S,%) -> S
+     ++ insertBottom!(x,d) destructively inserts x into the dequeue d
+     ++ at the bottom (back) of the dequeue.
+   extractTop_!: % -> S
+     ++ extractTop!(d) destructively extracts the top (front) element
+     ++ from the dequeue d.
+     ++ Error: if d is empty.
+   extractBottom_!: % -> S
+     ++ extractBottom!(d) destructively extracts the bottom (back) element
+     ++ from the dequeue d.
+     ++ Error: if d is empty.
+   reverse_!: % -> %
+     ++ reverse!(d) destructively replaces d by its reverse dequeue, i.e.
+     ++ the top (front) element is now the bottom (back) element, and so on.
+
+@
+<<DQAGG.dotabb>>=
+"DQAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"DQAGG" -> "SKAGG"
+"DQAGG" -> "QUAGG"
+
+@
+<<DQAGG.dotfull>>=
+"DequeueAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"DequeueAggregate(a:Type)" -> "StackAggregate(a:Type)"
+"DequeueAggregate(a:Type)" -> "QueueAggregate(a:Type)"
+
+"DequeueAggregate(a:SetCategory)"
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"DequeueAggregate(a:SetCategory)" -> "DequeueAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{ExtensibleLinearAggregate}{ELAGG}
+\pagepic{ps/v10extensiblelinearaggregate.ps}{ELAGG}
+
+See:\\
+\pageto{ListAggregate}{LSAGG}
+\pagefrom{LinearAggregate}{LNAGG}
+<<category ELAGG ExtensibleLinearAggregate>>=
+)abbrev category ELAGG ExtensibleLinearAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ An extensible aggregate is one which allows insertion and deletion of 
+++ entries. These aggregates are models of lists and streams which are 
+++ represented by linked structures so as to make insertion, deletion, and
+++ concatenation efficient. However, access to elements of these
+++ extensible aggregates is generally slow since access is made from the end.
+++ See \spadtype{FlexibleArray} for an exception.
+ExtensibleLinearAggregate(S:Type):Category == LinearAggregate S with
+   shallowlyMutable
+   concat_!: (%,S) -> %
+     ++ concat!(u,x) destructively adds element x to the end of u.
+   concat_!: (%,%) -> %
+     ++ concat!(u,v) destructively appends v to the end of u.
+     ++ v is unchanged
+   delete_!: (%,Integer) -> %
+     ++ delete!(u,i) destructively deletes the \axiom{i}th element of u.
+     ++
+     ++E Data:=Record(age:Integer,gender:String)
+     ++E a1:AssociationList(String,Data):=table()
+     ++E a1."tim":=[55,"male"]$Data
+     ++E delete!(a1,1)
+
+   delete_!: (%,UniversalSegment(Integer)) -> %
+     ++ delete!(u,i..j) destructively deletes elements u.i through u.j.
+   remove_!: (S->Boolean,%) -> %
+     ++ remove!(p,u) destructively removes all elements x of
+     ++ u such that \axiom{p(x)} is true.
+   insert_!: (S,%,Integer) -> %
+     ++ insert!(x,u,i) destructively inserts x into u at position i.
+   insert_!: (%,%,Integer) -> %
+     ++ insert!(v,u,i) destructively inserts aggregate v into u at position i.
+   merge_!: ((S,S)->Boolean,%,%) -> %
+     ++ merge!(p,u,v) destructively merges u and v using predicate p.
+   select_!: (S->Boolean,%) -> %
+     ++ select!(p,u) destructively changes u by keeping only values x such that
+     ++ \axiom{p(x)}.
+   if S has SetCategory then
+     remove_!: (S,%) -> %
+       ++ remove!(x,u) destructively removes all values x from u.
+     removeDuplicates_!: % -> %
+       ++ removeDuplicates!(u) destructively removes duplicates from u.
+   if S has OrderedSet then merge_!: (%,%) -> %
+       ++ merge!(u,v) destructively merges u and v in ascending order.
+ add
+   delete(x:%, i:Integer)	   == delete_!(copy x, i)
+   delete(x:%, i:UniversalSegment(Integer))	   == delete_!(copy x, i)
+   remove(f:S -> Boolean, x:%)   == remove_!(f, copy x)
+   insert(s:S, x:%, i:Integer)   == insert_!(s, copy x, i)
+   insert(w:%, x:%, i:Integer)   == insert_!(copy w, copy x, i)
+   select(f, x)		   == select_!(f, copy x)
+   concat(x:%, y:%)	   == concat_!(copy x, y)
+   concat(x:%, y:S)	   == concat_!(copy x, new(1, y))
+   concat_!(x:%, y:S)	   == concat_!(x, new(1, y))
+   if S has SetCategory then
+     remove(s:S, x:%)	     == remove_!(s, copy x)
+     remove_!(s:S, x:%)	     == remove_!(#1 = s, x)
+     removeDuplicates(x:%)   == removeDuplicates_!(copy x)
+
+   if S has OrderedSet then
+     merge_!(x, y) == merge_!(_<$S, x, y)
+
+@
+<<ELAGG.dotabb>>=
+"ELAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"ELAGG" -> "LNAGG"
+
+@
+<<ELAGG.dotfull>>=
+"ExtensibleLinearAggregate(a:Type)" 
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"ExtensibleLinearAggregate(a:Type)" -> "LinearAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{FiniteLinearAggregate}{FLAGG}
+\pagepic{ps/v10finitelinearaggregate.ps}{FLAGG}
+
+See:\\
+\pageto{OneDimensionalArrayAggregate}{A1AGG}
+\pageto{ListAggregate}{LSAGG}
+\pagefrom{LinearAggregate}{LNAGG}
+<<category FLAGG FiniteLinearAggregate>>=
+)abbrev category FLAGG FiniteLinearAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A finite linear aggregate is a linear aggregate of finite length.
+++ The finite property of the aggregate adds several exports to the
+++ list of exports from \spadtype{LinearAggregate} such as
+++ \spadfun{reverse}, \spadfun{sort}, and so on.
+FiniteLinearAggregate(S:Type): Category == LinearAggregate S with
+   finiteAggregate
+   merge: ((S,S)->Boolean,%,%) -> %
+      ++ merge(p,a,b) returns an aggregate c which merges \axiom{a} and b.
+      ++ The result is produced by examining each element x of \axiom{a} and y
+      ++ of b successively. If \axiom{p(x,y)} is true, then x is inserted into
+      ++ the result; otherwise y is inserted. If x is chosen, the next element
+      ++ of \axiom{a} is examined, and so on. When all the elements of one
+      ++ aggregate are examined, the remaining elements of the other
+      ++ are appended.
+      ++ For example, \axiom{merge(<,[1,3],[2,7,5])} returns 
+      ++ \axiom{[1,2,3,7,5]}.
+   reverse: % -> %
+      ++ reverse(a) returns a copy of \axiom{a} with elements in reverse order.
+   sort: ((S,S)->Boolean,%) -> %
+      ++ sort(p,a) returns a copy of \axiom{a} sorted using total ordering 
+      ++ predicate p.
+   sorted?: ((S,S)->Boolean,%) -> Boolean
+      ++ sorted?(p,a) tests if \axiom{a} is sorted according to predicate p.
+   position: (S->Boolean, %) -> Integer
+      ++ position(p,a) returns the index i of the first x in \axiom{a} 
+      ++ such that \axiom{p(x)} is true, and \axiom{minIndex(a) - 1} 
+      ++ if there is no such x.
+   if S has SetCategory then
+      position: (S, %)	-> Integer
+	++ position(x,a) returns the index i of the first occurrence of x in a,
+	++ and \axiom{minIndex(a) - 1} if there is no such x.
+      position: (S,%,Integer) -> Integer
+	++ position(x,a,n) returns the index i of the first occurrence of x in
+	++ \axiom{a} where \axiom{i >= n}, and \axiom{minIndex(a) - 1} 
+        ++ if no such x is found.
+   if S has OrderedSet then
+      OrderedSet
+      merge: (%,%) -> %
+	++ merge(u,v) merges u and v in ascending order.
+	++ Note: \axiom{merge(u,v) = merge(<=,u,v)}.
+      sort: % -> %
+	++ sort(u) returns an u with elements in ascending order.
+	++ Note: \axiom{sort(u) = sort(<=,u)}.
+      sorted?: % -> Boolean
+	++ sorted?(u) tests if the elements of u are in ascending order.
+   if % has shallowlyMutable then
+      copyInto_!: (%,%,Integer) -> %
+	++ copyInto!(u,v,i) returns aggregate u containing a copy of
+	++ v inserted at element i.
+      reverse_!: % -> %
+	++ reverse!(u) returns u with its elements in reverse order.
+      sort_!: ((S,S)->Boolean,%) -> %
+	++ sort!(p,u) returns u with its elements ordered by p.
+      if S has OrderedSet then sort_!: % -> %
+	++ sort!(u) returns u with its elements in ascending order.
+ add
+    if S has SetCategory then
+      position(x:S, t:%) == position(x, t, minIndex t)
+
+    if S has OrderedSet then
+--    sorted? l	  == sorted?(_<$S, l)
+      sorted? l	  == sorted?(#1 < #2 or #1 = #2, l)
+      merge(x, y) == merge(_<$S, x, y)
+      sort l	  == sort(_<$S, l)
+
+    if % has shallowlyMutable then
+      reverse x	 == reverse_! copy x
+      sort(f, l) == sort_!(f, copy l)
+      reverse x	 == reverse_! copy x
+
+      if S has OrderedSet then
+	sort_! l == sort_!(_<$S, l)
 
-(DEFUN |AssociationListAggregate;| (|t#1| |t#2|)
- (PROG (#1=#:G88401)
-  (RETURN 
-   (PROG1 
-    (LETT #1#
-     (|sublisV|
-      (PAIR 
-       (QUOTE (|t#1| |t#2|)) (LIST (|devaluate| |t#1|) (|devaluate| |t#2|)))
-      (|sublisV| 
-       (PAIR
-        (QUOTE (#2=#:G88400))
-        (LIST (QUOTE (|Record| (|:| |key| |t#1|) (|:| |entry| |t#2|)))))
-       (COND
-        (|AssociationListAggregate;CAT|)
-        ((QUOTE T)
-         (LETT |AssociationListAggregate;CAT|
-          (|Join|
-           (|TableAggregate| (QUOTE |t#1|) (QUOTE |t#2|))
-           (|ListAggregate| (QUOTE #2#))
-           (|mkCategory|
-            (QUOTE |domain|)
-            (QUOTE
-             (((|assoc|
-                ((|Union|
-                  (|Record| (|:| |key| |t#1|) (|:| |entry| |t#2|)) "failed")
-                 |t#1| |$|))
-                T)))
-            NIL (QUOTE NIL) NIL))
-          . #3=(|AssociationListAggregate|))))))
-       . #3#)
-    (SETELT #1# 0 
-     (LIST 
-      (QUOTE |AssociationListAggregate|)
-      (|devaluate| |t#1|)
-      (|devaluate| |t#2|))))))) 
 @
-\section{category A1AGG OneDimensionalArrayAggregate}
+<<FLAGG.dotabb>>=
+"FLAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"FLAGG" -> "LNAGG"
+
+@
+<<FLAGG.dotfull>>=
+"FiniteLinearAggregate(a:Type)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"FiniteLinearAggregate(a:Type)" -> "LinearAggregate(a:Type)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{MultiDictionary}{MDAGG}
+\pagepic{ps/v10multidictionary.ps}{MDAGG}
+
+See:\\
+\pagefrom{DictionaryOperations}{DIOPS}
+<<category MDAGG MultiDictionary>>=
+)abbrev category MDAGG MultiDictionary
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A multi-dictionary is a dictionary which may contain duplicates.
+++ As for any dictionary, its size is assumed large so that
+++ copying (non-destructive) operations are generally to be avoided.
+MultiDictionary(S:SetCategory): Category == DictionaryOperations S with
+-- count: (S,%) -> NonNegativeInteger		       ++ multiplicity count
+   insert_!: (S,%,NonNegativeInteger) -> %
+     ++ insert!(x,d,n) destructively inserts n copies of x into dictionary d.
+-- remove_!: (S,%,NonNegativeInteger) -> %
+--   ++ remove!(x,d,n) destructively removes (up to) n copies of x from
+--   ++ dictionary d.
+   removeDuplicates_!: % -> %
+     ++ removeDuplicates!(d) destructively removes any duplicate values
+     ++ in dictionary d.
+   duplicates: % -> List Record(entry:S,count:NonNegativeInteger)
+     ++ duplicates(d) returns a list of values which have duplicates in d
+--   ++ duplicates(d) returns a list of		     ++ duplicates iterator
+-- to become duplicates: % -> Iterator(D,D)
+
+@
+<<MDAGG.dotabb>>=
+"MDAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"MDAGG" -> "DIOPS"
+
+@
+<<MDAGG.dotfull>>=
+"MultiDictionary(a:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"MultiDictionary(a:SetCategory)" -> "DictionaryOperations(a:SetCategory)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{StreamAggregate}{STAGG}
+%\pagepic{ps/v10streamaggregate.ps}{STAGG}
+\includegraphics[scale=0.75]{ps/v10streamaggregate.ps}
+\index{images!STAGG}
+
+See:\\
+\pagefrom{LinearAggregate}{LNAGG}
+\pagefrom{RecursiveAggregate}{RCAGG}
+<<category STAGG StreamAggregate>>=
+)abbrev category STAGG StreamAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A stream aggregate is a linear aggregate which possibly has an infinite
+++ number of elements. A basic domain constructor which builds stream
+++ aggregates is \spadtype{Stream}. From streams, a number of infinite
+++ structures such power series can be built. A stream aggregate may
+++ also be infinite since it may be cyclic.
+++ For example, see \spadtype{DecimalExpansion}.
+StreamAggregate(S:Type): Category ==
+   Join(UnaryRecursiveAggregate S, LinearAggregate S) with
+      explicitlyFinite?: % -> Boolean
+	++ explicitlyFinite?(s) tests if the stream has a finite
+	++ number of elements, and false otherwise.
+	++ Note: for many datatypes, 
+        ++ \axiom{explicitlyFinite?(s) = not possiblyInfinite?(s)}.
+      possiblyInfinite?: % -> Boolean
+	++ possiblyInfinite?(s) tests if the stream s could possibly
+	++ have an infinite number of elements.
+	++ Note: for many datatypes, 
+        ++ \axiom{possiblyInfinite?(s) = not explictlyFinite?(s)}.
+ add
+   c2: (%, %) -> S
+
+   explicitlyFinite? x == not cyclic? x
+   possiblyInfinite? x == cyclic? x
+   first(x, n)	       == construct [c2(x, x := rest x) for i in 1..n]
+
+   c2(x, r) ==
+     empty? x => error "Index out of range"
+     first x
+
+   elt(x:%, i:Integer) ==
+     i := i - minIndex x
+     (i < 0) or empty?(x := rest(x, i::NonNegativeInteger)) => _
+         error "index out of range"
+     first x
+
+   elt(x:%, i:UniversalSegment(Integer)) ==
+     l := lo(i) - minIndex x
+     l < 0 => error "index out of range"
+     not hasHi i => copy(rest(x, l::NonNegativeInteger))
+     (h := hi(i) - minIndex x) < l => empty()
+     first(rest(x, l::NonNegativeInteger), (h - l + 1)::NonNegativeInteger)
+
+   if % has shallowlyMutable then
+     concat(x:%, y:%) == concat_!(copy x, y)
+
+     concat l ==
+       empty? l => empty()
+       concat_!(copy first l, concat rest l)
+
+     map_!(f, l) ==
+       y := l
+       while not empty? l repeat
+	 setfirst_!(l, f first l)
+	 l := rest l
+       y
+
+     fill_!(x, s) ==
+       y := x
+       while not empty? y repeat (setfirst_!(y, s); y := rest y)
+       x
+
+     setelt(x:%, i:Integer, s:S) ==
+      i := i - minIndex x
+      (i < 0) or empty?(x := rest(x,i::NonNegativeInteger)) => _
+          error "index out of range"
+      setfirst_!(x, s)
+
+     setelt(x:%, i:UniversalSegment(Integer), s:S) ==
+      (l := lo(i) - minIndex x) < 0 => error "index out of range"
+      h := if hasHi i then hi(i) - minIndex x else maxIndex x
+      h < l => s
+      y := rest(x, l::NonNegativeInteger)
+      z := rest(y, (h - l + 1)::NonNegativeInteger)
+      while not eq?(y, z) repeat (setfirst_!(y, s); y := rest y)
+      s
+
+     concat_!(x:%, y:%) ==
+       empty? x => y
+       setrest_!(tail x, y)
+       x
+
+@
+<<STAGG.dotabb>>=
+"STAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"STAGG" -> "RCAGG"
+"STAGG" -> "LNAGG"
+
+@
+<<STAGG.dotfull>>=
+"StreamAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"StreamAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
+"StreamAggregate(a:Type)" -> "LinearAggregate(a:Type)"
+
+@
+\chapter{Category Layer 7}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OneDimensionalArrayAggregate}{A1AGG}
+\pagepic{ps/v10onedimensionalarrayaggregate.ps}{A1AGG}
+
+See:\\
+\pageto{StringAggregate}{SRAGG}
+\pagefrom{FiniteLinearAggregate}{FLAGG}
 <<category A1AGG OneDimensionalArrayAggregate>>=
 )abbrev category A1AGG OneDimensionalArrayAggregate
 ++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
@@ -2423,9 +4487,15 @@ OneDimensionalArrayAggregate(S:Type): Category ==
     "OneDimensionalArrayAggregate(a:Type)"
 
 @
-\section{category BGAGG BagAggregate}
-<<category BGAGG BagAggregate>>=
-)abbrev category BGAGG BagAggregate
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{KeyedDictionary}{KDAGG}
+\pagepic{ps/v10keyeddictionary.ps}{KDAGG}
+
+See:\\
+\pageto{TableAggregate}{TBAGG}
+\pagefrom{Dictionary}{DIAGG}
+<<category KDAGG KeyedDictionary>>=
+)abbrev category KDAGG KeyedDictionary
 ++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
 ++ Date Created: August 87 through August 88
 ++ Date Last Updated: April 1991
@@ -2436,44 +4506,56 @@ OneDimensionalArrayAggregate(S:Type): Category ==
 ++ Keywords:
 ++ References:
 ++ Description:
-++ A bag aggregate is an aggregate for which one can insert and extract 
-++ objects, and where the order in which objects are inserted determines 
-++ the order of extraction.
-++ Examples of bags are stacks, queues, and dequeues.
-BagAggregate(S:Type): Category == HomogeneousAggregate S with
-   shallowlyMutable
-     ++ shallowlyMutable means that elements of bags may be destructively changed.
-   bag: List S -> %
-     ++ bag([x,y,...,z]) creates a bag with elements x,y,...,z.
-   extract_!: % -> S
-     ++ extract!(u) destructively removes a (random) item from bag u.
-   insert_!: (S,%) -> %
-     ++ insert!(x,u) inserts item x into bag u.
-   inspect: % -> S
-     ++ inspect(u) returns an (random) element from a bag.
+++ A keyed dictionary is a dictionary of key-entry pairs for which there is
+++ a unique entry for each key.
+KeyedDictionary(Key:SetCategory, Entry:SetCategory): Category ==
+  Dictionary Record(key:Key,entry:Entry) with
+   key?: (Key, %) -> Boolean
+     ++ key?(k,t) tests if k is a key in table t.
+   keys: % -> List Key
+     ++ keys(t) returns the list the keys in table t.
+   -- to become keys: % -> Key* and keys: % -> Iterator(Entry,Entry)
+   remove_!: (Key, %) -> Union(Entry,"failed")
+     ++ remove!(k,t) searches the table t for the key k removing
+     ++ (and return) the entry if there.
+     ++ If t has no such key, \axiom{remove!(k,t)} returns "failed".
+   search: (Key, %) -> Union(Entry,"failed")
+     ++ search(k,t) searches the table t for the key k,
+     ++ returning the entry stored in t for key k.
+     ++ If t has no such key, \axiom{search(k,t)} returns "failed".
  add
-   bag(l) ==
-     x:=empty()
-     for s in l repeat x:=insert_!(s,x)
-     x
+   key?(k, t) == search(k, t) case Entry
 
-@
-<<BGAGG.dotabb>>=
-"BGAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"BGAGG" -> "HOAGG"
+   member?(p, t) ==
+     r := search(p.key, t)
+     r case Entry and r::Entry = p.entry
+
+   if % has finiteAggregate then
+     keys t == [x.key for x in parts t]
 
 @
-<<BGAGG.dotfull>>=
-"BagAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"BagAggregate(a:Type)" -> "HomogeneousAggregate(a:Type)"
+<<KDAGG.dotabb>>=
+"KDAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"KDAGG" -> "DIAGG"
 
-"BagAggregate(a:SetCategory)" [color=seagreen,href="books/bookvol10.pamphlet"];
-"BagAggregate(a:SetCategory)" -> "BagAggregate(a:Type)"
+@
+<<KDAGG.dotfull>>=
+"KeyedDictionary(a:SetCategory,b:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"KeyedDictionary(a:SetCategory,b:SetCategory)" -> 
+    "Dictionary(Record(a:SetCategory,b:SetCategory))"
 
 @
-\section{category BRAGG BinaryRecursiveAggregate}
-<<category BRAGG BinaryRecursiveAggregate>>=
-)abbrev category BRAGG BinaryRecursiveAggregate
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{ListAggregate}{LSAGG}
+\pagepic{ps/v10listaggregate.ps}{LSAGG}
+
+See:\\
+\pageto{AssociationListAggregate}{ALAGG}
+\pagefrom{ExtensibleLinearAggregate}{ELAGG}
+\pagefrom{FiniteLinearAggregate}{FLAGG}
+<<category LSAGG ListAggregate>>=
+)abbrev category LSAGG ListAggregate
 ++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
 ++ Date Created: August 87 through August 88
 ++ Date Last Updated: April 1991
@@ -2484,117 +4566,670 @@ BagAggregate(S:Type): Category == HomogeneousAggregate S with
 ++ Keywords:
 ++ References:
 ++ Description:
-++ A binary-recursive aggregate has 0, 1 or 2 children and
-++ serves as a model for a binary tree or a doubly-linked aggregate structure
-BinaryRecursiveAggregate(S:Type):Category == RecursiveAggregate S with
-   -- needs preorder, inorder and postorder iterators
-   left: % -> %
-     ++ left(u) returns the left child.
-   elt: (%,"left") -> %
-     ++ elt(u,"left") (also written: \axiom{a . left}) is
-     ++ equivalent to \axiom{left(a)}.
-   right: % -> %
-     ++ right(a) returns the right child.
-   elt: (%,"right") -> %
-     ++ elt(a,"right") (also written: \axiom{a . right})
-     ++ is equivalent to \axiom{right(a)}.
-   if % has shallowlyMutable then
-      setelt: (%,"left",%) -> %
-	++ setelt(a,"left",b) (also written \axiom{a . left := b}) is equivalent
-	++ to \axiom{setleft!(a,b)}.
-      setleft_!: (%,%) -> %
-	 ++ setleft!(a,b) sets the left child of \axiom{a} to be b.
-      setelt: (%,"right",%) -> %
-	 ++ setelt(a,"right",b) (also written \axiom{b . right := b})
-	 ++ is equivalent to \axiom{setright!(a,b)}.
-      setright_!: (%,%) -> %
-	 ++ setright!(a,x) sets the right child of t to be x.
+++ A list aggregate is a model for a linked list data structure.
+++ A linked list is a versatile
+++ data structure. Insertion and deletion are efficient and
+++ searching is a linear operation.
+ListAggregate(S:Type): Category == Join(StreamAggregate S,
+   FiniteLinearAggregate S, ExtensibleLinearAggregate S) with
+      list: S -> %
+	++ list(x) returns the list of one element x.
  add
    cycleMax ==> 1000
 
-   elt(x,"left")  == left x
-   elt(x,"right") == right x
-   leaf? x == empty? x or empty? left x and empty? right x
-   leaves t ==
-     empty? t => empty()$List(S)
-     leaf? t => [value t]
-     concat(leaves left t,leaves right t)
-   nodes x ==
-     l := empty()$List(%)
-     empty? x => l
-     concat(nodes left x,concat([x],nodes right x))
-   children x ==
-     l := empty()$List(%)
-     empty? x => l
-     empty? left x  => [right x]
-     empty? right x => [left x]
-     [left x, right x]
-   if % has SetAggregate(S) and S has SetCategory then
-     node?(u,v) ==
-       empty? v => false
-       u = v => true
-       for y in children v repeat node?(u,y) => return true
-       false
-     x = y ==
-       empty?(x) => empty?(y)
-       empty?(y) => false
-       value x = value y and left x = left y and right x = right y
-     if % has finiteAggregate then
-       member?(x,u) ==
-	 empty? u => false
-	 x = value u => true
-	 member?(x,left u) or member?(x,right u)
+   mergeSort: ((S, S) -> Boolean, %, Integer) -> %
+
+   sort_!(f, l)	      == mergeSort(f, l, #l)
+   list x		   == concat(x, empty())
+   reduce(f, x)		   ==
+     empty? x => error "reducing over an empty list needs the 3 argument form"
+     reduce(f, rest x, first x)
+   merge(f, p, q)	   == merge_!(f, copy p, copy q)
+
+   select_!(f, x) ==
+     while not empty? x and not f first x repeat x := rest x
+     empty? x => x
+     y := x
+     z := rest y
+     while not empty? z repeat
+       if f first z then (y := z; z := rest z)
+		    else (z := rest z; setrest_!(y, z))
+     x
+
+   merge_!(f, p, q) ==
+     empty? p => q
+     empty? q => p
+     eq?(p, q) => error "cannot merge a list into itself"
+     if f(first p, first q)
+       then (r := t := p; p := rest p)
+       else (r := t := q; q := rest q)
+     while not empty? p and not empty? q repeat
+       if f(first p, first q)
+	 then (setrest_!(t, p); t := p; p := rest p)
+	 else (setrest_!(t, q); t := q; q := rest q)
+     setrest_!(t, if empty? p then q else p)
+     r
+
+   insert_!(s:S, x:%, i:Integer) ==
+     i < (m := minIndex x) => error "index out of range"
+     i = m => concat(s, x)
+     y := rest(x, (i - 1 - m)::NonNegativeInteger)
+     z := rest y
+     setrest_!(y, concat(s, z))
+     x
+
+   insert_!(w:%, x:%, i:Integer) ==
+     i < (m := minIndex x) => error "index out of range"
+     i = m => concat_!(w, x)
+     y := rest(x, (i - 1 - m)::NonNegativeInteger)
+     z := rest y
+     setrest_!(y, w)
+     concat_!(y, z)
+     x
+
+   remove_!(f:S -> Boolean, x:%) ==
+     while not empty? x and f first x repeat x := rest x
+     empty? x => x
+     p := x
+     q := rest x
+     while not empty? q repeat
+       if f first q then q := setrest_!(p, rest q)
+		    else (p := q; q := rest q)
+     x
+
+   delete_!(x:%, i:Integer) ==
+     i < (m := minIndex x) => error "index out of range"
+     i = m => rest x
+     y := rest(x, (i - 1 - m)::NonNegativeInteger)
+     setrest_!(y, rest(y, 2))
+     x
+
+   delete_!(x:%, i:UniversalSegment(Integer)) ==
+     (l := lo i) < (m := minIndex x) => error "index out of range"
+     h := if hasHi i then hi i else maxIndex x
+     h < l => x
+     l = m => rest(x, (h + 1 - m)::NonNegativeInteger)
+     t := rest(x, (l - 1 - m)::NonNegativeInteger)
+     setrest_!(t, rest(t, (h - l + 2)::NonNegativeInteger))
+     x
+
+   find(f, x) ==
+     while not empty? x and not f first x repeat x := rest x
+     empty? x => "failed"
+     first x
+
+   position(f:S -> Boolean, x:%) ==
+     for k in minIndex(x).. while not empty? x and not f first x repeat
+       x := rest x
+     empty? x => minIndex(x) - 1
+     k
+
+   mergeSort(f, p, n) ==
+     if n = 2 and f(first rest p, first p) then p := reverse_! p
+     n < 3 => p
+     l := (n quo 2)::NonNegativeInteger
+     q := split_!(p, l)
+     p := mergeSort(f, p, l)
+     q := mergeSort(f, q, n - l)
+     merge_!(f, p, q)
+
+   sorted?(f, l) ==
+     empty? l => true
+     p := rest l
+     while not empty? p repeat
+       not f(first l, first p) => return false
+       p := rest(l := p)
+     true
+
+   reduce(f, x, i) ==
+     r := i
+     while not empty? x repeat (r := f(r, first x); x := rest x)
+     r
 
    if S has SetCategory then
-     coerce(t:%): OutputForm ==
-       empty? t =>  "[]"::OutputForm
-       v := value(t):: OutputForm
-       empty? left t =>
-	 empty? right t => v
-	 r := coerce(right t)@OutputForm
-	 bracket ["."::OutputForm, v, r]
-       l := coerce(left t)@OutputForm
-       r :=
-	 empty? right t => "."::OutputForm
-	 coerce(right t)@OutputForm
-       bracket [l, v, r]
+      reduce(f, x, i,a) ==
+	r := i
+	while not empty? x and r ^= a repeat
+	  r := f(r, first x)
+	  x := rest x
+	r
+
+   new(n, s) ==
+     l := empty()
+     for k in 1..n repeat l := concat(s, l)
+     l
+
+   map(f, x, y) ==
+     z := empty()
+     while not empty? x and not empty? y repeat
+       z := concat(f(first x, first y), z)
+       x := rest x
+       y := rest y
+     reverse_! z
+
+-- map(f, x, y, d) ==
+--   z := empty()
+--   while not empty? x and not empty? y repeat
+--     z := concat(f(first x, first y), z)
+--     x := rest x
+--     y := rest y
+--   z := reverseInPlace z
+--   if not empty? x then
+--	z := concat_!(z, map(f(#1, d), x))
+--   if not empty? y then
+--	z := concat_!(z, map(f(d, #1), y))
+--   z
+
+   reverse_! x ==
+     empty? x => x
+     empty?(y := rest x) => x
+     setrest_!(x, empty())
+     while not empty? y repeat
+       z := rest y
+       setrest_!(y, x)
+       x := y
+       y := z
+     x
+
+   copy x ==
+     y := empty()
+     for k in 0.. while not empty? x repeat
+       k = cycleMax and cyclic? x => error "cyclic list"
+       y := concat(first x, y)
+       x := rest x
+     reverse_! y
+
+   copyInto_!(y, x, s) ==
+     s < (m := minIndex y) => error "index out of range"
+     z := rest(y, (s - m)::NonNegativeInteger)
+     while not empty? z and not empty? x repeat
+       setfirst_!(z, first x)
+       x := rest x
+       z := rest z
+     y
+
+   if S has SetCategory then
+     position(w, x, s) ==
+       s < (m := minIndex x) => error "index out of range"
+       x := rest(x, (s - m)::NonNegativeInteger)
+       for k in s.. while not empty? x and w ^= first x repeat
+	 x := rest x
+       empty? x => minIndex x - 1
+       k
+
+     removeDuplicates_! l ==
+       p := l
+       while not empty? p repeat
+	 p := setrest_!(p, remove_!(#1 = first p, rest p))
+       l
+
+   if S has OrderedSet then
+     x < y ==
+	while not empty? x and not empty? y repeat
+	  first x ^= first y => return(first x < first y)
+	  x := rest x
+	  y := rest y
+	empty? x => not empty? y
+	false
+
+@
+<<LSAGG.dotabb>>=
+"LSAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"LSAGG" -> "FLAGG"
+"LSAGG" -> "ELAGG"
+
+@
+<<LSAGG.dotfull>>=
+"ListAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
+"ListAggregate(a:Type)" -> "FiniteLinearAggregate(a:Type)"
+"ListAggregate(a:Type)" -> "ExtensibleLinearAggregate(a:Type)"
+
+"ListAggregate(Record(a:SetCategory,b:SetCategory))" 
+    [color=seagreen,href="books/bookvol10.pamphlet"];
+"ListAggregate(Record(a:SetCategory,b:SetCategory))" ->
+    "ListAggregate(a:Type)"
+
+@
+\chapter{Category Layer 8}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{AssociationListAggregate}{ALAGG}
+%\pagepic{ps/v10associationlistaggregate.ps}{ALAGG}
+\includegraphics[scale=0.50]{ps/v10associationlistaggregate.ps}
+\index{images!ALAGG}
+
+See:\\
+\pagefrom{ListAggregate}{LSAGG}
+\pagefrom{TableAggregate}{TBAGG}
+<<category ALAGG AssociationListAggregate>>=
+)abbrev category ALAGG AssociationListAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ An association list is a list of key entry pairs which may be viewed
+++ as a table.	It is a poor mans version of a table:
+++ searching for a key is a linear operation.
+AssociationListAggregate(Key:SetCategory,Entry:SetCategory): Category ==
+   Join(TableAggregate(Key, Entry), ListAggregate Record(key:Key,entry:Entry)) with
+      assoc: (Key, %) -> Union(Record(key:Key,entry:Entry), "failed")
+	++ assoc(k,u) returns the element x in association list u stored
+	++ with key k, or "failed" if u has no key k.
+
+@
+<<ALAGG.dotabb>>=
+"ALAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"ALAGG" -> "TBAGG"
+"ALAGG" -> "LSAGG"
+
+@
+<<ALAGG.dotfull>>=
+"AssociationListAggregate(a:SetCategory,b:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"AssociationListAggregate(a:SetCategory,b:SetCategory)" ->
+    "TableAggregate(a:SetCategory,b:SetCategory)"
+"AssociationListAggregate(a:SetCategory,b:SetCategory)" ->
+    "ListAggregate(Record(a:SetCategory,b:SetCategory))"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{StringAggregate}{SRAGG}
+\pagepic{ps/v10stringaggregate.ps}{SRAGG}
+
+See:\\
+\pagefrom{OneDimensionalArrayAggregate}{A1AGG}
+<<category SRAGG StringAggregate>>=
+)abbrev category SRAGG StringAggregate
+++ Author: Stephen Watt and Michael Monagan. 
+++ revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A string aggregate is a category for strings, that is,
+++ one dimensional arrays of characters.
+StringAggregate: Category == OneDimensionalArrayAggregate Character with
+    lowerCase	    : % -> %
+      ++ lowerCase(s) returns the string with all characters in lower case.
+    lowerCase_!: % -> %
+      ++ lowerCase!(s) destructively replaces the alphabetic characters
+      ++ in s by lower case.
+    upperCase	    : % -> %
+      ++ upperCase(s) returns the string with all characters in upper case.
+    upperCase_!: % -> %
+      ++ upperCase!(s) destructively replaces the alphabetic characters
+      ++ in s by upper case characters.
+    prefix?	    : (%, %) -> Boolean
+      ++ prefix?(s,t) tests if the string s is the initial substring of t.
+      ++ Note: \axiom{prefix?(s,t) == 
+      ++   reduce(and,[s.i = t.i for i in 0..maxIndex s])}.
+    suffix?	    : (%, %) -> Boolean
+      ++ suffix?(s,t) tests if the string s is the final substring of t.
+      ++ Note: \axiom{suffix?(s,t) == 
+      ++  reduce(and,[s.i = t.(n - m + i) for i in 0..maxIndex s])}
+      ++ where m and n denote the maxIndex of s and t respectively.
+    substring?: (%, %, Integer) -> Boolean
+      ++ substring?(s,t,i) tests if s is a substring of t beginning at
+      ++ index i.
+      ++ Note: \axiom{substring?(s,t,0) = prefix?(s,t)}.
+    match: (%, %, Character) -> NonNegativeInteger
+      ++ match(p,s,wc) tests if pattern \axiom{p} matches subject \axiom{s}
+      ++ where \axiom{wc} is a wild card character. If no match occurs,
+      ++ the index \axiom{0} is returned; otheriwse, the value returned
+      ++ is the first index of the first character in the subject matching
+      ++ the subject (excluding that matched by an initial wild-card).
+      ++ For example, \axiom{match("*to*","yorktown","*")} returns \axiom{5}
+      ++ indicating a successful match starting at index \axiom{5} of
+      ++ \axiom{"yorktown"}.
+    match?: (%, %, Character) -> Boolean
+      ++ match?(s,t,c) tests if s matches t except perhaps for
+      ++ multiple and consecutive occurrences of character c.
+      ++ Typically c is the blank character.
+    replace	    : (%, UniversalSegment(Integer), %) -> %
+      ++ replace(s,i..j,t) replaces the substring \axiom{s(i..j)} 
+      ++ of s by string t.
+    position	    : (%, %, Integer) -> Integer
+      ++ position(s,t,i) returns the position j of the substring s in string t,
+      ++ where \axiom{j >= i} is required.
+    position	    : (CharacterClass, %, Integer) -> Integer
+      ++ position(cc,t,i) returns the position \axiom{j >= i} in t of
+      ++ the first character belonging to cc.
+    coerce	    : Character -> %
+      ++ coerce(c) returns c as a string s with the character c.
+
+    split: (%, Character) -> List %
+      ++ split(s,c) returns a list of substrings delimited by character c.
+    split: (%, CharacterClass) -> List %
+      ++ split(s,cc) returns a list of substrings delimited by 
+      ++ characters in cc.
+
+    trim: (%, Character) -> %
+      ++ trim(s,c) returns s with all characters c deleted from right
+      ++ and left ends.
+      ++ For example, \axiom{trim(" abc ", char " ")} returns \axiom{"abc"}.
+    trim: (%, CharacterClass) -> %
+      ++ trim(s,cc) returns s with all characters in cc deleted from right
+      ++ and left ends.
+      ++ For example, \axiom{trim("(abc)", charClass "()")} 
+      ++ returns \axiom{"abc"}.
+    leftTrim: (%, Character) -> %
+      ++ leftTrim(s,c) returns s with all leading characters c deleted.
+      ++ For example, \axiom{leftTrim("  abc  ", char " ")} 
+      ++ returns \axiom{"abc  "}.
+    leftTrim: (%, CharacterClass) -> %
+      ++ leftTrim(s,cc) returns s with all leading characters in cc deleted.
+      ++ For example, \axiom{leftTrim("(abc)", charClass "()")} 
+      ++ returns \axiom{"abc)"}.
+    rightTrim: (%, Character) -> %
+      ++ rightTrim(s,c) returns s with all trailing occurrences of c deleted.
+      ++ For example, \axiom{rightTrim("  abc  ", char " ")} 
+      ++ returns \axiom{"  abc"}.
+    rightTrim: (%, CharacterClass) -> %
+      ++ rightTrim(s,cc) returns s with all trailing occurences of
+      ++ characters in cc deleted.
+      ++ For example, \axiom{rightTrim("(abc)", charClass "()")} 
+      ++ returns \axiom{"(abc"}.
+    elt: (%, %) -> %
+      ++ elt(s,t) returns the concatenation of s and t. It is provided to
+      ++ allow juxtaposition of strings to work as concatenation.
+      ++ For example, \axiom{"smoo" "shed"} returns \axiom{"smooshed"}.
+ add
+   trim(s: %, c:  Character)	  == leftTrim(rightTrim(s, c),	c)
+   trim(s: %, cc: CharacterClass) == leftTrim(rightTrim(s, cc), cc)
+
+   lowerCase s		 == lowerCase_! copy s
+   upperCase s		 == upperCase_! copy s
+   prefix?(s, t)	 == substring?(s, t, minIndex t)
+   coerce(c:Character):% == new(1, c)
+   elt(s:%, t:%): %	 == concat(s,t)$%
+
+@
+<<SRAGG.dotabb>>=
+"SRAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"SRAGG" -> "A1AGG"
+
+@
+<<SRAGG.dotfull>>=
+"StringAggregate()" [color=lightblue,href="books/bookvol10.pamphlet"];
+"StringAggregate()" -> "OneDimensionalArrayAggregate(Character)"
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{TableAggregate}{TBAGG}
+%\pagepic{ps/v10tableaggregate.ps}{TBAGG}
+\includegraphics[scale=0.60]{ps/v10tableaggregate.ps}
+\index{images!TBAGG}
+
+See:\\
+\pageto{AssociationListAggregate}{ALAGG}
+\pagefrom{IndexedAggregate}{IXAGG}
+\pagefrom{KeyedDictionary}{KDAGG}
+<<category TBAGG TableAggregate>>=
+)abbrev category TBAGG TableAggregate
+++ Author: Michael Monagan, Stephen Watt; 
+++ revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A table aggregate is a model of a table, i.e. a discrete many-to-one
+++ mapping from keys to entries.
+TableAggregate(Key:SetCategory, Entry:SetCategory): Category ==
+  Join(KeyedDictionary(Key,Entry),IndexedAggregate(Key,Entry)) with
+   setelt: (%,Key,Entry) -> Entry	   -- setelt_! later
+     ++ setelt(t,k,e) (also written \axiom{t.k := e}) is equivalent
+     ++ to \axiom{(insert([k,e],t); e)}.
+   table: () -> %
+     ++ table()$T creates an empty table of type T.
+     ++
+     ++E Data:=Record(age:Integer,gender:String)
+     ++E a1:AssociationList(String,Data):=table()
+     ++E a1."tim":=[55,"male"]$Data
+
+   table: List Record(key:Key,entry:Entry) -> %
+     ++ table([x,y,...,z]) creates a table consisting of entries
+     ++ \axiom{x,y,...,z}.
+   -- to become table: Record(key:Key,entry:Entry)* -> %
+   map: ((Entry, Entry) -> Entry, %, %) -> %
+     ++ map(fn,t1,t2) creates a new table t from given tables t1 and t2 with
+     ++ elements fn(x,y) where x and y are corresponding elements from t1
+     ++ and t2 respectively.
+ add
+   table()	       == empty()
+   table l	       == dictionary l
+-- empty()	       == dictionary()
+
+   insert_!(p, t)      == (t(p.key) := p.entry; t)
+   indices t	       == keys t
+
+   coerce(t:%):OutputForm ==
+     prefix("table"::OutputForm,
+		    [k::OutputForm = (t.k)::OutputForm for k in keys t])
+
+   elt(t, k) ==
+      (r := search(k, t)) case Entry => r::Entry
+      error "key not in table"
+
+   elt(t, k, e) ==
+      (r := search(k, t)) case Entry => r::Entry
+      e
+
+   map_!(f, t) ==
+      for k in keys t repeat t.k := f t.k
+      t
+
+   map(f:(Entry, Entry) -> Entry, s:%, t:%) ==
+      z := table()
+      for k in keys s | key?(k, t) repeat z.k := f(s.k, t.k)
+      z
+
+-- map(f, s, t, x) ==
+--    z := table()
+--    for k in keys s repeat z.k := f(s.k, t(k, x))
+--    for k in keys t | not key?(k, s) repeat z.k := f(t.k, x)
+--    z
 
    if % has finiteAggregate then
-     aggCount: (%,NonNegativeInteger) -> NonNegativeInteger
-     #x == aggCount(x,0)
-     aggCount(x,k) ==
-       empty? x => 0
-       k := k + 1
-       k = cycleMax and cyclic? x => error "cyclic tree"
-       for y in children x repeat k := aggCount(y,k)
+     parts(t:%):List Record(key:Key,entry:Entry) == [[k, t.k] for k in keys t]
+     parts(t:%):List Entry   == [t.k for k in keys t]
+     entries(t:%):List Entry == parts(t)
+
+     s:% = t:% ==
+       eq?(s,t) => true
+       #s ^= #t => false
+       for k in keys s repeat
+	 (e := search(k, t)) case "failed" or (e::Entry) ^= s.k => return false
+       true
+
+     map(f: Record(key:Key,entry:Entry)->Record(key:Key,entry:Entry),t:%):%==
+       z := table()
+       for k in keys t repeat
+	 ke: Record(key:Key,entry:Entry) := f [k, t.k]
+	 z ke.key := ke.entry
+       z
+     map_!(f: Record(key:Key,entry:Entry)->Record(key:Key,entry:Entry),t:%):%_
+      ==
+       lke: List Record(key:Key,entry:Entry) := nil()
+       for k in keys t repeat
+	 lke := cons(f [k, remove_!(k,t)::Entry], lke)
+       for ke in lke repeat
+	 t ke.key := ke.entry
+       t
+
+     inspect(t: %): Record(key:Key,entry:Entry) ==
+       ks := keys t
+       empty? ks => error "Cannot extract from an empty aggregate"
+       [first ks, t first ks]
+
+     find(f: Record(key:Key,entry:Entry)->Boolean, t:%):_
+           Union(Record(key:Key,entry:Entry), "failed") ==
+       for ke in parts(t)@List(Record(key:Key,entry:Entry)) _
+          repeat if f ke then return ke
+       "failed"
+
+     index?(k: Key, t: %): Boolean ==
+       search(k,t) case Entry
+
+     remove_!(x:Record(key:Key,entry:Entry), t:%) ==
+       if member?(x, t) then remove_!(x.key, t)
+       t
+     extract_!(t: %): Record(key:Key,entry:Entry) ==
+       k: Record(key:Key,entry:Entry) := inspect t
+       remove_!(k.key, t)
        k
 
-   isCycle?:  (%, List %) -> Boolean
-   eqMember?: (%, List %) -> Boolean
-   cyclic? x	 == not empty? x and isCycle?(x,empty()$(List %))
-   isCycle?(x,acc) ==
-     empty? x => false
-     eqMember?(x,acc) => true
-     for y in children x | not empty? y repeat
-       isCycle?(y,acc) => return true
-     false
-   eqMember?(y,l) ==
-     for x in l repeat eq?(x,y) => return true
-     false
-   if % has shallowlyMutable then
-     setelt(x,"left",b)  == setleft_!(x,b)
-     setelt(x,"right",b) == setright_!(x,b)
+     any?(f: Entry->Boolean, t: %): Boolean ==
+       for k in keys t | f t k repeat return true
+       false
+     every?(f: Entry->Boolean, t: %): Boolean ==
+       for k in keys t | not f t k repeat return false
+       true
+     count(f: Entry->Boolean, t: %): NonNegativeInteger ==
+       tally: NonNegativeInteger := 0
+       for k in keys t | f t k repeat tally := tally + 1
+       tally
 
 @
-<<BRAGG.dotabb>>=
-"BRAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"BRAGG" -> "RCAGG"
+<<TBAGG.dotabb>>=
+"TBAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"TBAGG" -> "KDAGG"
+"TBAGG" -> "IXAGG"
 
 @
-<<BRAGG.dotfull>>=
-"BinaryRecursiveAggregate(a:Type)" 
+<<TBAGG.dotfull>>=
+"TableAggregate(a:SetCategory,b:SetCategory)"
     [color=lightblue,href="books/bookvol10.pamphlet"];
-"BinaryRecursiveAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
+"TableAggregate(a:SetCategory,b:SetCategory)" -> 
+    "KeyedDictionary(a:SetCategory,b:SetCategory)"
+"TableAggregate(a:SetCategory,b:SetCategory)" -> 
+    "IndexedAggregate(a:SetCategory,b:SetCategory)"
+
+@
+\chapter{Category Layers}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{FiniteSetAggregate}{FSAGG}
+%%%%%%%%\pagepic{ps/v10finitesetaggregate.ps}{FSAGG}
+
+See:\\
+<<category FSAGG FiniteSetAggregate>>=
+)abbrev category FSAGG FiniteSetAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: 14 Oct, 1993 by RSS
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A finite-set aggregate models the notion of a finite set, that is,
+++ a collection of elements characterized by membership, but not
+++ by order or multiplicity.
+++ See \spadtype{Set} for an example.
+FiniteSetAggregate(S:SetCategory): Category ==
+  Join(Dictionary S, SetAggregate S) with
+    finiteAggregate
+    cardinality: % -> NonNegativeInteger
+      ++ cardinality(u) returns the number of elements of u.
+      ++ Note: \axiom{cardinality(u) = #u}.
+    if S has Finite then
+      Finite
+      complement: % -> %
+	++ complement(u) returns the complement of the set u,
+	++ i.e. the set of all values not in u.
+      universe: () -> %
+	++ universe()$D returns the universal set for finite set aggregate D.
+    if S has OrderedSet then
+      max: % -> S
+	++ max(u) returns the largest element of aggregate u.
+      min: % -> S
+	++ min(u) returns the smallest element of aggregate u.
+
+ add
+   s < t	   == #s < #t and s = intersect(s,t)
+   s = t	   == #s = #t and empty? difference(s,t)
+   brace l	   == construct l
+   set	 l	   == construct l
+   cardinality s   == #s
+   construct l	   == (s := set(); for x in l repeat insert_!(x,s); s)
+   count(x:S, s:%) == (member?(x, s) => 1; 0)
+   subset?(s, t)   == #s < #t and _and/[member?(x, t) for x in parts s]
+
+   coerce(s:%):OutputForm ==
+     brace [x::OutputForm for x in parts s]$List(OutputForm)
+
+   intersect(s, t) ==
+     i := {}
+     for x in parts s | member?(x, t) repeat insert_!(x, i)
+     i
+
+   difference(s:%, t:%) ==
+     m := copy s
+     for x in parts t repeat remove_!(x, m)
+     m
+
+   symmetricDifference(s, t) ==
+     d := copy s
+     for x in parts t repeat
+       if member?(x, s) then remove_!(x, d) else insert_!(x, d)
+     d
+
+   union(s:%, t:%) ==
+      u := copy s
+      for x in parts t repeat insert_!(x, u)
+      u
+
+   if S has Finite then
+     universe()	  == {index(i::PositiveInteger) for i in 1..size()$S}
+     complement s == difference(universe(), s )
+     size()  == 2 ** size()$S
+     index i ==
+       {index(j::PositiveInteger)$S for j in 1..size()$S | bit?(i-1,j-1)}
+     random()  == index((random()$Integer rem (size()$% + 1))::PositiveInteger)
+
+     lookup s ==
+       n:PositiveInteger := 1
+       for x in parts s repeat _
+         n := n + 2 ** ((lookup(x) - 1)::NonNegativeInteger)
+       n
+
+   if S has OrderedSet then
+     max s ==
+       empty?(l := parts s) => error "Empty set"
+       reduce("max", l)
+
+     min s ==
+       empty?(l := parts s) => error "Empty set"
+       reduce("min", l)
+
+@
+<<FSAGG.dotabb>>=
+"FSAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"FSAGG" -> "DIAGG"
+"FSAGG" -> "SETAGG"
+
+@
+<<FSAGG.dotfull>>=
+"FiniteSetAggregate(a:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"FiniteSetAggregate(a:SetCategory)" -> "Dictionary(a:SetCategory)"
+"FiniteSetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
 
 @
 \section{category BTAGG BitAggregate}
@@ -2660,9 +5295,9 @@ BitAggregate(): Category ==
 "BitAggregate()" -> "OneDimensionalArrayAggregate(Boolean)"
 
 @
-\section{category CLAGG Collection}
-<<category CLAGG Collection>>=
-)abbrev category CLAGG Collection
+\section{category MSETAGG MultisetAggregate}
+<<category MSETAGG MultisetAggregate>>=
+)abbrev category MSETAGG MultisetAggregate
 ++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
 ++ Date Created: August 87 through August 88
 ++ Date Last Updated: April 1991
@@ -2673,94 +5308,226 @@ BitAggregate(): Category ==
 ++ Keywords:
 ++ References:
 ++ Description:
-++ A collection is a homogeneous aggregate which can built from
-++ list of members. The operation used to build the aggregate is
-++ generically named \spadfun{construct}. However, each collection
-++ provides its own special function with the same name as the
-++ data type, except with an initial lower case letter, e.g.
-++ \spadfun{list} for \spadtype{List},
-++ \spadfun{flexibleArray} for \spadtype{FlexibleArray}, and so on.
-Collection(S:Type): Category == HomogeneousAggregate(S) with
-   construct: List S -> %
-     ++ \axiom{construct(x,y,...,z)} returns the collection of elements \axiom{x,y,...,z}
-     ++ ordered as given. Equivalently written as \axiom{[x,y,...,z]$D}, where
-     ++ D is the domain. D may be omitted for those of type List.
-   find: (S->Boolean, %) -> Union(S, "failed")
-     ++ find(p,u) returns the first x in u such that \axiom{p(x)} is true, and
-     ++ "failed" otherwise.
-   if % has finiteAggregate then
-      reduce: ((S,S)->S,%) -> S
-	++ reduce(f,u) reduces the binary operation f across u. For example,
-	++ if u is \axiom{[x,y,...,z]} then \axiom{reduce(f,u)} 
-        ++ returns \axiom{f(..f(f(x,y),...),z)}.
-	++ Note: if u has one element x, \axiom{reduce(f,u)} returns x.
-	++ Error: if u is empty.
-        ++
-        ++C )clear all
-        ++X reduce(+,[C[i]*x**i for i in 1..5])
+++ A multi-set aggregate is a set which keeps track of the multiplicity
+++ of its elements.
+MultisetAggregate(S:SetCategory):
+ Category == Join(MultiDictionary S, SetAggregate S)
 
-      reduce: ((S,S)->S,%,S) -> S
-	++ reduce(f,u,x) reduces the binary operation f across u, where x is
-	++ the identity operation of f.
-	++ Same as \axiom{reduce(f,u)} if u has 2 or more elements.
-	++ Returns \axiom{f(x,y)} if u has one element y,
-	++ x if u is empty.
-	++ For example, \axiom{reduce(+,u,0)} returns the
-	++ sum of the elements of u.
-      remove: (S->Boolean,%) -> %
-	++ remove(p,u) returns a copy of u removing all elements x such that
-	++ \axiom{p(x)} is true.
-	++ Note: \axiom{remove(p,u) == [x for x in u | not p(x)]}.
-      select: (S->Boolean,%) -> %
-	++ select(p,u) returns a copy of u containing only those elements such
-	++ \axiom{p(x)} is true.
-	++ Note: \axiom{select(p,u) == [x for x in u | p(x)]}.
-      if S has SetCategory then
-	reduce: ((S,S)->S,%,S,S) -> S
-	  ++ reduce(f,u,x,z) reduces the binary operation f across u, stopping
-	  ++ when an "absorbing element" z is encountered.
-	  ++ As for \axiom{reduce(f,u,x)}, x is the identity operation of f.
-	  ++ Same as \axiom{reduce(f,u,x)} when u contains no element z.
-	  ++ Thus the third argument x is returned when u is empty.
-	remove: (S,%) -> %
-	  ++ remove(x,u) returns a copy of u with all
-	  ++ elements \axiom{y = x} removed.
-	  ++ Note: \axiom{remove(y,c) == [x for x in c | x ^= y]}.
-	removeDuplicates: % -> %
-	  ++ removeDuplicates(u) returns a copy of u with all duplicates 
-          ++ removed.
-   if S has ConvertibleTo InputForm then ConvertibleTo InputForm
+@
+<<MSETAGG.dotabb>>=
+"MSETAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"MSETAGG" -> "MDAGG"
+"MSETAGG" -> "SETAGG"
+
+@
+<<MSETAGG.dotfull>>=
+"MultisetAggregate(a:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"MultisetAggregate(a:SetCategory)" -> "MultiDictionary(a:SetCategory)"
+"MultisetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
+
+@
+\section{category OMSAGG OrderedMultisetAggregate}
+<<category OMSAGG OrderedMultisetAggregate>>=
+)abbrev category OMSAGG OrderedMultisetAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: April 1991
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ An ordered-multiset aggregate is a multiset built over an ordered set S
+++ so that the relative sizes of its entries can be assessed.
+++ These aggregates serve as models for priority queues.
+OrderedMultisetAggregate(S:OrderedSet): Category ==
+   Join(MultisetAggregate S,PriorityQueueAggregate S) with
+   -- max: % -> S		      ++ smallest entry in the set
+   -- duplicates: % -> List Record(entry:S,count:NonNegativeInteger)
+        ++ to become an in order iterator
+   -- parts: % -> List S	      ++ in order iterator
+      min: % -> S
+	++ min(u) returns the smallest entry in the multiset aggregate u.
+
+@
+<<OMSAGG.dotabb>>=
+"OMSAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"OMSAGG" -> "MSETAGG"
+"OMSAGG" -> "PRQAGG"
+
+@
+<<OMSAGG.dotfull>>=
+"OrderedMultisetAggregate(a:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"OrderedMultisetAggregate(a:SetCategory)" -> "MultisetAggregate(a:SetCategory)"
+"OrderedMultisetAggregate(a:SetCategory)" -> 
+   "PriorityQueueAggregate(a:SetCategory)"
+
+@
+\section{category SETAGG SetAggregate}
+<<category SETAGG SetAggregate>>=
+)abbrev category SETAGG SetAggregate
+++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
+++ Date Created: August 87 through August 88
+++ Date Last Updated: 14 Oct, 1993 by RSS
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A set category lists a collection of set-theoretic operations
+++ useful for both finite sets and multisets.
+++ Note however that finite sets are distinct from multisets.
+++ Although the operations defined for set categories are
+++ common to both, the relationship between the two cannot
+++ be described by inclusion or inheritance.
+SetAggregate(S:SetCategory):
+  Category == Join(SetCategory, Collection(S)) with
+   partiallyOrderedSet
+   "<"         : (%, %) -> Boolean
+     ++ s < t returns true if all elements of set aggregate s are also
+     ++ elements of set aggregate t.
+   brace       : () -> %
+     ++ brace()$D (otherwise written {}$D)
+     ++ creates an empty set aggregate of type D.
+     ++ This form is considered obsolete. Use \axiomFun{set} instead.
+   brace       : List S -> %
+     ++ brace([x,y,...,z]) 
+     ++ creates a set aggregate containing items x,y,...,z.
+     ++ This form is considered obsolete. Use \axiomFun{set} instead.
+   set	       : () -> %
+     ++ set()$D creates an empty set aggregate of type D.
+   set	       : List S -> %
+     ++ set([x,y,...,z]) creates a set aggregate containing items x,y,...,z.
+   intersect: (%, %) -> %
+     ++ intersect(u,v) returns the set aggregate w consisting of
+     ++ elements common to both set aggregates u and v.
+     ++ Note: equivalent to the notation (not currently supported)
+     ++ {x for x in u | member?(x,v)}.
+   difference  : (%, %) -> %
+     ++ difference(u,v) returns the set aggregate w consisting of
+     ++ elements in set aggregate u but not in set aggregate v.
+     ++ If u and v have no elements in common, \axiom{difference(u,v)}
+     ++ returns a copy of u.
+     ++ Note: equivalent to the notation (not currently supported)
+     ++ \axiom{{x for x in u | not member?(x,v)}}.
+   difference  : (%, S) -> %
+     ++ difference(u,x) returns the set aggregate u with element x removed.
+     ++ If u does not contain x, a copy of u is returned.
+     ++ Note: \axiom{difference(s, x) = difference(s, {x})}.
+   symmetricDifference : (%, %) -> %
+     ++ symmetricDifference(u,v) returns the set aggregate of elements x which
+     ++ are members of set aggregate u or set aggregate v but not both.
+     ++ If u and v have no elements in common, \axiom{symmetricDifference(u,v)}
+     ++ returns a copy of u.
+     ++ Note: \axiom{symmetricDifference(u,v) = 
+     ++  union(difference(u,v),difference(v,u))}
+   subset?     : (%, %) -> Boolean
+     ++ subset?(u,v) tests if u is a subset of v.
+     ++ Note: equivalent to
+     ++ \axiom{reduce(and,{member?(x,v) for x in u},true,false)}.
+   union       : (%, %) -> %
+     ++ union(u,v) returns the set aggregate of elements which are members
+     ++ of either set aggregate u or v.
+   union       : (%, S) -> %
+     ++ union(u,x) returns the set aggregate u with the element x added.
+     ++ If u already contains x, \axiom{union(u,x)} returns a copy of u.
+   union       : (S, %) -> %
+     ++ union(x,u) returns the set aggregate u with the element x added.
+     ++ If u already contains x, \axiom{union(x,u)} returns a copy of u.
  add
-   if % has finiteAggregate then
-     #c			  == # parts c
-     count(f:S -> Boolean, c:%) == _+/[1 for x in parts c | f x]
-     any?(f, c)		  == _or/[f x for x in parts c]
-     every?(f, c)	  == _and/[f x for x in parts c]
-     find(f:S -> Boolean, c:%) == find(f, parts c)
-     reduce(f:(S,S)->S, x:%) == reduce(f, parts x)
-     reduce(f:(S,S)->S, x:%, s:S) == reduce(f, parts x, s)
-     remove(f:S->Boolean, x:%) ==
-       construct remove(f, parts x)
-     select(f:S->Boolean, x:%) ==
-       construct select(f, parts x)
+  symmetricDifference(x, y)    == union(difference(x, y), difference(y, x))
+  union(s:%, x:S) == union(s, {x})
+  union(x:S, s:%) == union(s, {x})
+  difference(s:%, x:S) == difference(s, {x})
 
-     if S has SetCategory then
-       remove(s:S, x:%) == remove(#1 = s, x)
-       reduce(f:(S,S)->S, x:%, s1:S, s2:S) == reduce(f, parts x, s1, s2)
-       removeDuplicates(x) == construct removeDuplicates parts x
+@
+<<SETAGG.dotabb>>=
+"SETAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
+"SETAGG" -> "SETCAT"
+"SETAGG" -> "CLAGG"
 
 @
-<<CLAGG.dotabb>>=
-"CLAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"CLAGG" -> "HOAGG"
+<<SETAGG.dotfull>>=
+"SetAggregate(a:SetCategory)"
+    [color=lightblue,href="books/bookvol10.pamphlet"];
+"SetAggregate(a:SetCategory)" -> "SetCategory()"
+"SetAggregate(a:SetCategory)" -> "Collection(a:SetCategory)"
 
 @
-<<CLAGG.dotfull>>=
-"Collection(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"Collection(a:Type)" -> "HomogeneousAggregate(a:Type)"
+\chapter{The bootstrap code}
+\section{ALAGG.lsp BOOTSTRAP}
+{\bf ALAGG} depends on a chain of files. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf ALAGG}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf ALAGG.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
 
-"Collection(a:SetCategory)" [color=seagreen,href="books/bookvol10.pamphlet"];
-"Collection(a:SetCategory)" -> "Collection(a:Type)"
+Note that this code is not included in the generated catdef.spad file.
+
+<<ALAGG.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |AssociationListAggregate;CAT| (QUOTE NIL)) 
+
+(SETQ |AssociationListAggregate;AL| (QUOTE NIL)) 
+
+(DEFUN |AssociationListAggregate|
+ (|&REST| #1=#:G88404 |&AUX| #2=#:G88402)
+  (DSETQ #2# #1#)
+  (LET (#3=#:G88403)
+   (COND
+    ((SETQ #3# (|assoc| (|devaluateList| #2#) |AssociationListAggregate;AL|))
+      (CDR #3#))
+    (T
+      (SETQ |AssociationListAggregate;AL|
+       (|cons5|
+        (CONS
+         (|devaluateList| #2#)
+         (SETQ #3# (APPLY (FUNCTION |AssociationListAggregate;|) #2#)))
+        |AssociationListAggregate;AL|)) #3#)))) 
+
+(DEFUN |AssociationListAggregate;| (|t#1| |t#2|)
+ (PROG (#1=#:G88401)
+  (RETURN 
+   (PROG1 
+    (LETT #1#
+     (|sublisV|
+      (PAIR 
+       (QUOTE (|t#1| |t#2|)) (LIST (|devaluate| |t#1|) (|devaluate| |t#2|)))
+      (|sublisV| 
+       (PAIR
+        (QUOTE (#2=#:G88400))
+        (LIST (QUOTE (|Record| (|:| |key| |t#1|) (|:| |entry| |t#2|)))))
+       (COND
+        (|AssociationListAggregate;CAT|)
+        ((QUOTE T)
+         (LETT |AssociationListAggregate;CAT|
+          (|Join|
+           (|TableAggregate| (QUOTE |t#1|) (QUOTE |t#2|))
+           (|ListAggregate| (QUOTE #2#))
+           (|mkCategory|
+            (QUOTE |domain|)
+            (QUOTE
+             (((|assoc|
+                ((|Union|
+                  (|Record| (|:| |key| |t#1|) (|:| |entry| |t#2|)) "failed")
+                 |t#1| |$|))
+                T)))
+            NIL (QUOTE NIL) NIL))
+          . #3=(|AssociationListAggregate|))))))
+       . #3#)
+    (SETELT #1# 0 
+     (LIST 
+      (QUOTE |AssociationListAggregate|)
+      (|devaluate| |t#1|)
+      (|devaluate| |t#2|))))))) 
 @
 \section{CLAGG.lsp BOOTSTRAP}
 {\bf CLAGG} depends on a chain of files. We need to break this cycle to build
@@ -3055,731 +5822,6 @@ Note that this code is not included in the generated catdef.spad file.
         12 0 13 2 0 14 12 0 15 1 0 10 0 11))))))
     (QUOTE |lookupComplete|))) 
 @
-\section{category DIAGG Dictionary}
-<<category DIAGG Dictionary>>=
-)abbrev category DIAGG Dictionary
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A dictionary is an aggregate in which entries can be inserted,
-++ searched for and removed. Duplicates are thrown away on insertion.
-++ This category models the usual notion of dictionary which involves
-++ large amounts of data where copying is impractical.
-++ Principal operations are thus destructive (non-copying) ones.
-Dictionary(S:SetCategory): Category ==
- DictionaryOperations S add
-   dictionary l ==
-     d := dictionary()
-     for x in l repeat insert_!(x, d)
-     d
-
-   if % has finiteAggregate then
-    -- remove(f:S->Boolean,t:%)  == remove_!(f, copy t)
-    -- select(f, t)	   == select_!(f, copy t)
-     select_!(f, t)	 == remove_!(not f #1, t)
-
-     --extract_! d ==
-     --	 empty? d => error "empty dictionary"
-     --	 remove_!(x := first parts d, d, 1)
-     --	 x
-
-     s = t ==
-       eq?(s,t) => true
-       #s ^= #t => false
-       _and/[member?(x, t) for x in parts s]
-
-     remove_!(f:S->Boolean, t:%) ==
-       for m in parts t repeat if f m then remove_!(m, t)
-       t
-
-@
-<<DIAGG.dotabb>>=
-"DIAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"DIAGG" -> "DIOPS"
-
-@
-<<DIAGG.dotfull>>=
-"Dictionary(a:SetCategory)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"Dictionary(a:SetCategory)" -> "DictionaryOperations(a:SetCategory)"
-
-"Dictionary(Record(a:SetCategory,b:SetCategory))"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"Dictionary(Record(a:SetCategory,b:SetCategory))" ->
-    "Dictionary(a:SetCategory)"
-
-@
-\section{category DIOPS DictionaryOperations}
-<<category DIOPS DictionaryOperations>>=
-)abbrev category DIOPS DictionaryOperations
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ This category is a collection of operations common to both
-++ categories \spadtype{Dictionary} and \spadtype{MultiDictionary}
-DictionaryOperations(S:SetCategory): Category ==
-  Join(BagAggregate S, Collection(S)) with
-   dictionary: () -> %
-     ++ dictionary()$D creates an empty dictionary of type D.
-   dictionary: List S -> %
-     ++ dictionary([x,y,...,z]) creates a dictionary consisting of
-     ++ entries \axiom{x,y,...,z}.
--- insert: (S,%) -> S		      ++ insert an entry
--- member?: (S,%) -> Boolean		      ++ search for an entry
--- remove_!: (S,%,NonNegativeInteger) -> %
---   ++ remove!(x,d,n) destructively changes dictionary d by removing
---   ++ up to n entries y such that \axiom{y = x}.
--- remove_!: (S->Boolean,%,NonNegativeInteger) -> %
---   ++ remove!(p,d,n) destructively changes dictionary d by removing
---   ++ up to n entries x such that \axiom{p(x)} is true.
-   if % has finiteAggregate then
-     remove_!: (S,%) -> %
-       ++ remove!(x,d) destructively changes dictionary d by removing
-       ++ all entries y such that \axiom{y = x}.
-     remove_!: (S->Boolean,%) -> %
-       ++ remove!(p,d) destructively changes dictionary d by removeing
-       ++ all entries x such that \axiom{p(x)} is true.
-     select_!: (S->Boolean,%) -> %
-       ++ select!(p,d) destructively changes dictionary d by removing
-       ++ all entries x such that \axiom{p(x)} is not true.
- add
-   construct l == dictionary l
-   dictionary() == empty()
-   if % has finiteAggregate then
-     copy d == dictionary parts d
-     coerce(s:%):OutputForm ==
-       prefix("dictionary"@String :: OutputForm,
-				      [x::OutputForm for x in parts s])
-
-@
-<<DIOPS.dotabb>>=
-"DIOPS" [color=lightblue,href="books/bookvol10.pamphlet"];
-"DIOPS" -> "BGAGG"
-"DIOPS" -> "CLAGG"
-
-@
-<<DIOPS.dotfull>>=
-"DictionaryOperations(a:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"DictionaryOperations(a:SetCategory)" -> "BagAggregate(a:SetCategory)"
-"DictionaryOperations(a:SetCategory)" -> "Collection(a:SetCategory)"
-
-@
-\section{category DLAGG DoublyLinkedAggregate}
-<<category DLAGG DoublyLinkedAggregate>>=
-)abbrev category DLAGG DoublyLinkedAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A doubly-linked aggregate serves as a model for a doubly-linked
-++ list, that is, a list which can has links to both next and previous
-++ nodes and thus can be efficiently traversed in both directions.
-DoublyLinkedAggregate(S:Type): Category == RecursiveAggregate S with
-   last: % -> S
-     ++ last(l) returns the last element of a doubly-linked aggregate l.
-     ++ Error: if l is empty.
-   head: % -> %
-     ++ head(l) returns the first element of a doubly-linked aggregate l.
-     ++ Error: if l is empty.
-   tail: % -> %
-     ++ tail(l) returns the doubly-linked aggregate l starting at
-     ++ its second element.
-     ++ Error: if l is empty.
-   previous: % -> %
-     ++ previous(l) returns the doubly-link list beginning with its previous
-     ++ element.
-     ++ Error: if l has no previous element.
-     ++ Note: \axiom{next(previous(l)) = l}.
-   next: % -> %
-     ++ next(l) returns the doubly-linked aggregate beginning with its next
-     ++ element.
-     ++ Error: if l has no next element.
-     ++ Note: \axiom{next(l) = rest(l)} and \axiom{previous(next(l)) = l}.
-   if % has shallowlyMutable then
-      concat_!: (%,%) -> %
-	++ concat!(u,v) destructively concatenates doubly-linked aggregate v 
-        ++ to the end of doubly-linked aggregate u.
-      setprevious_!: (%,%) -> %
-	++ setprevious!(u,v) destructively sets the previous node of 
-        ++ doubly-linked aggregate u to v, returning v.
-      setnext_!: (%,%) -> %
-	++ setnext!(u,v) destructively sets the next node of doubly-linked 
-        ++ aggregate u to v, returning v.
-
-@
-<<DLAGG.dotabb>>=
-"DLAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"DLAGG" -> "RCAGG"
-
-@
-<<DLAGG.dotfull>>=
-"DoublyLinkedAggregate(a:Type)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"DoublyLinkedAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
-
-@
-\section{category DQAGG DequeueAggregate}
-<<category DQAGG DequeueAggregate>>=
-)abbrev category DQAGG DequeueAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A dequeue is a doubly ended stack, that is, a bag where first items
-++ inserted are the first items extracted, at either the front or the back end
-++ of the data structure.
-DequeueAggregate(S:Type):
- Category == Join(StackAggregate S,QueueAggregate S) with
-   dequeue: () -> %
-     ++ dequeue()$D creates an empty dequeue of type D.
-   dequeue: List S -> %
-     ++ dequeue([x,y,...,z]) creates a dequeue with first (top or front)
-     ++ element x, second element y,...,and last (bottom or back) element z.
-   height: % -> NonNegativeInteger
-     ++ height(d) returns the number of elements in dequeue d.
-     ++ Note: \axiom{height(d) = # d}.
-   top_!: % -> S
-     ++ top!(d) returns the element at the top (front) of the dequeue.
-   bottom_!: % -> S
-     ++ bottom!(d) returns the element at the bottom (back) of the dequeue.
-   insertTop_!: (S,%) -> S
-     ++ insertTop!(x,d) destructively inserts x into the dequeue d, that is,
-     ++ at the top (front) of the dequeue.
-     ++ The element previously at the top of the dequeue becomes the
-     ++ second in the dequeue, and so on.
-   insertBottom_!: (S,%) -> S
-     ++ insertBottom!(x,d) destructively inserts x into the dequeue d
-     ++ at the bottom (back) of the dequeue.
-   extractTop_!: % -> S
-     ++ extractTop!(d) destructively extracts the top (front) element
-     ++ from the dequeue d.
-     ++ Error: if d is empty.
-   extractBottom_!: % -> S
-     ++ extractBottom!(d) destructively extracts the bottom (back) element
-     ++ from the dequeue d.
-     ++ Error: if d is empty.
-   reverse_!: % -> %
-     ++ reverse!(d) destructively replaces d by its reverse dequeue, i.e.
-     ++ the top (front) element is now the bottom (back) element, and so on.
-
-@
-<<DQAGG.dotabb>>=
-"DQAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"DQAGG" -> "SKAGG"
-"DQAGG" -> "QUAGG"
-
-@
-<<DQAGG.dotfull>>=
-"DequeueAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"DequeueAggregate(a:Type)" -> "StackAggregate(a:Type)"
-"DequeueAggregate(a:Type)" -> "QueueAggregate(a:Type)"
-
-"DequeueAggregate(a:SetCategory)"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"DequeueAggregate(a:SetCategory)" -> "DequeueAggregate(a:Type)"
-
-@
-\section{category ELAGG ExtensibleLinearAggregate}
-<<category ELAGG ExtensibleLinearAggregate>>=
-)abbrev category ELAGG ExtensibleLinearAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ An extensible aggregate is one which allows insertion and deletion of 
-++ entries. These aggregates are models of lists and streams which are 
-++ represented by linked structures so as to make insertion, deletion, and
-++ concatenation efficient. However, access to elements of these
-++ extensible aggregates is generally slow since access is made from the end.
-++ See \spadtype{FlexibleArray} for an exception.
-ExtensibleLinearAggregate(S:Type):Category == LinearAggregate S with
-   shallowlyMutable
-   concat_!: (%,S) -> %
-     ++ concat!(u,x) destructively adds element x to the end of u.
-   concat_!: (%,%) -> %
-     ++ concat!(u,v) destructively appends v to the end of u.
-     ++ v is unchanged
-   delete_!: (%,Integer) -> %
-     ++ delete!(u,i) destructively deletes the \axiom{i}th element of u.
-     ++
-     ++E Data:=Record(age:Integer,gender:String)
-     ++E a1:AssociationList(String,Data):=table()
-     ++E a1."tim":=[55,"male"]$Data
-     ++E delete!(a1,1)
-
-   delete_!: (%,UniversalSegment(Integer)) -> %
-     ++ delete!(u,i..j) destructively deletes elements u.i through u.j.
-   remove_!: (S->Boolean,%) -> %
-     ++ remove!(p,u) destructively removes all elements x of
-     ++ u such that \axiom{p(x)} is true.
-   insert_!: (S,%,Integer) -> %
-     ++ insert!(x,u,i) destructively inserts x into u at position i.
-   insert_!: (%,%,Integer) -> %
-     ++ insert!(v,u,i) destructively inserts aggregate v into u at position i.
-   merge_!: ((S,S)->Boolean,%,%) -> %
-     ++ merge!(p,u,v) destructively merges u and v using predicate p.
-   select_!: (S->Boolean,%) -> %
-     ++ select!(p,u) destructively changes u by keeping only values x such that
-     ++ \axiom{p(x)}.
-   if S has SetCategory then
-     remove_!: (S,%) -> %
-       ++ remove!(x,u) destructively removes all values x from u.
-     removeDuplicates_!: % -> %
-       ++ removeDuplicates!(u) destructively removes duplicates from u.
-   if S has OrderedSet then merge_!: (%,%) -> %
-       ++ merge!(u,v) destructively merges u and v in ascending order.
- add
-   delete(x:%, i:Integer)	   == delete_!(copy x, i)
-   delete(x:%, i:UniversalSegment(Integer))	   == delete_!(copy x, i)
-   remove(f:S -> Boolean, x:%)   == remove_!(f, copy x)
-   insert(s:S, x:%, i:Integer)   == insert_!(s, copy x, i)
-   insert(w:%, x:%, i:Integer)   == insert_!(copy w, copy x, i)
-   select(f, x)		   == select_!(f, copy x)
-   concat(x:%, y:%)	   == concat_!(copy x, y)
-   concat(x:%, y:S)	   == concat_!(copy x, new(1, y))
-   concat_!(x:%, y:S)	   == concat_!(x, new(1, y))
-   if S has SetCategory then
-     remove(s:S, x:%)	     == remove_!(s, copy x)
-     remove_!(s:S, x:%)	     == remove_!(#1 = s, x)
-     removeDuplicates(x:%)   == removeDuplicates_!(copy x)
-
-   if S has OrderedSet then
-     merge_!(x, y) == merge_!(_<$S, x, y)
-
-@
-<<ELAGG.dotabb>>=
-"ELAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"ELAGG" -> "LNAGG"
-
-@
-<<ELAGG.dotfull>>=
-"ExtensibleLinearAggregate(a:Type)" 
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"ExtensibleLinearAggregate(a:Type)" -> "LinearAggregate(a:Type)"
-
-@
-\section{category ELTAB Eltable}
-<<category ELTAB Eltable>>=
-)abbrev category ELTAB Eltable
-++ Author: Michael Monagan; revised by Manuel Bronstein and Manuel Bronstein
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ An eltable over domains D and I is a structure which can be viewed
-++ as a function from D to I.
-++ Examples of eltable structures range from data structures, e.g. those
-++ of type \spadtype{List}, to algebraic structures like \spadtype{Polynomial}.
-Eltable(S:SetCategory, Index:Type): Category == with
-  elt : (%, S) -> Index
-     ++ elt(u,i) (also written: u . i) returns the element of u indexed by i.
-     ++ Error: if i is not an index of u.
-
-@
-<<ELTAB.dotabb>>=
-"ELTAB" [color=lightblue,href="books/bookvol10.pamphlet"];
-"ELTAB" -> "CATEGORY"
-
-@
-<<ELTAB.dotfull>>=
-"Eltable(a:SetCategory,b:Type)" 
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"Eltable(a:SetCategory,b:Type)" -> "Category"
-
-@
-\section{category ELTAGG EltableAggregate}
-<<category ELTAGG EltableAggregate>>=
-)abbrev category ELTAGG EltableAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ An eltable aggregate is one which can be viewed as a function.
-++ For example, the list \axiom{[1,7,4]} can applied to 0,1, and 2 respectively
-++ will return the integers 1,7, and 4; thus this list may be viewed
-++ as mapping 0 to 1, 1 to 7 and 2 to 4. In general, an aggregate
-++ can map members of a domain {\em Dom} to an image domain {\em Im}.
-EltableAggregate(Dom:SetCategory, Im:Type): Category ==
--- This is separated from Eltable
--- and series won't have to support qelt's and setelt's.
-  Eltable(Dom, Im) with
-    elt : (%, Dom, Im) -> Im
-       ++ elt(u, x, y) applies u to x if x is in the domain of u,
-       ++ and returns y otherwise.
-       ++ For example, if u is a polynomial in \axiom{x} over the rationals,
-       ++ \axiom{elt(u,n,0)} may define the coefficient of \axiom{x}
-       ++ to the power n, returning 0 when n is out of range.
-    qelt: (%, Dom) -> Im
-       ++ qelt(u, x) applies \axiom{u} to \axiom{x} without checking whether
-       ++ \axiom{x} is in the domain of \axiom{u}.  If \axiom{x} is not in the
-       ++ domain of \axiom{u} a memory-access violation may occur.  If a check
-       ++ on whether \axiom{x} is in the domain of \axiom{u} is required, use
-       ++ the function \axiom{elt}.
-    if % has shallowlyMutable then
-       setelt : (%, Dom, Im) -> Im
-	   ++ setelt(u,x,y) sets the image of x to be y under u,
-	   ++ assuming x is in the domain of u.
-	   ++ Error: if x is not in the domain of u.
-	   -- this function will soon be renamed as setelt!.
-       qsetelt_!: (%, Dom, Im) -> Im
-	   ++ qsetelt!(u,x,y) sets the image of \axiom{x} to be \axiom{y} under
-           ++ \axiom{u}, without checking that \axiom{x} is in the domain of
-           ++ \axiom{u}.
-           ++ If such a check is required use the function \axiom{setelt}.
- add
-  qelt(a, x) == elt(a, x)
-  if % has shallowlyMutable then
-    qsetelt_!(a, x, y) == (a.x := y)
-
-@
-<<ELTAGG.dotabb>>=
-"ELTAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"ELTAGG" -> "ELTAB"
-
-@
-<<ELTAGG.dotfull>>=
-"EltableAggregate(a:SetCategory,b:Type)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"EltableAggregate(a:SetCategory,b:Type)" -> "Eltable(a:SetCategory,b:Type)"
-
-@
-\section{category FLAGG FiniteLinearAggregate}
-<<category FLAGG FiniteLinearAggregate>>=
-)abbrev category FLAGG FiniteLinearAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A finite linear aggregate is a linear aggregate of finite length.
-++ The finite property of the aggregate adds several exports to the
-++ list of exports from \spadtype{LinearAggregate} such as
-++ \spadfun{reverse}, \spadfun{sort}, and so on.
-FiniteLinearAggregate(S:Type): Category == LinearAggregate S with
-   finiteAggregate
-   merge: ((S,S)->Boolean,%,%) -> %
-      ++ merge(p,a,b) returns an aggregate c which merges \axiom{a} and b.
-      ++ The result is produced by examining each element x of \axiom{a} and y
-      ++ of b successively. If \axiom{p(x,y)} is true, then x is inserted into
-      ++ the result; otherwise y is inserted. If x is chosen, the next element
-      ++ of \axiom{a} is examined, and so on. When all the elements of one
-      ++ aggregate are examined, the remaining elements of the other
-      ++ are appended.
-      ++ For example, \axiom{merge(<,[1,3],[2,7,5])} returns 
-      ++ \axiom{[1,2,3,7,5]}.
-   reverse: % -> %
-      ++ reverse(a) returns a copy of \axiom{a} with elements in reverse order.
-   sort: ((S,S)->Boolean,%) -> %
-      ++ sort(p,a) returns a copy of \axiom{a} sorted using total ordering 
-      ++ predicate p.
-   sorted?: ((S,S)->Boolean,%) -> Boolean
-      ++ sorted?(p,a) tests if \axiom{a} is sorted according to predicate p.
-   position: (S->Boolean, %) -> Integer
-      ++ position(p,a) returns the index i of the first x in \axiom{a} 
-      ++ such that \axiom{p(x)} is true, and \axiom{minIndex(a) - 1} 
-      ++ if there is no such x.
-   if S has SetCategory then
-      position: (S, %)	-> Integer
-	++ position(x,a) returns the index i of the first occurrence of x in a,
-	++ and \axiom{minIndex(a) - 1} if there is no such x.
-      position: (S,%,Integer) -> Integer
-	++ position(x,a,n) returns the index i of the first occurrence of x in
-	++ \axiom{a} where \axiom{i >= n}, and \axiom{minIndex(a) - 1} 
-        ++ if no such x is found.
-   if S has OrderedSet then
-      OrderedSet
-      merge: (%,%) -> %
-	++ merge(u,v) merges u and v in ascending order.
-	++ Note: \axiom{merge(u,v) = merge(<=,u,v)}.
-      sort: % -> %
-	++ sort(u) returns an u with elements in ascending order.
-	++ Note: \axiom{sort(u) = sort(<=,u)}.
-      sorted?: % -> Boolean
-	++ sorted?(u) tests if the elements of u are in ascending order.
-   if % has shallowlyMutable then
-      copyInto_!: (%,%,Integer) -> %
-	++ copyInto!(u,v,i) returns aggregate u containing a copy of
-	++ v inserted at element i.
-      reverse_!: % -> %
-	++ reverse!(u) returns u with its elements in reverse order.
-      sort_!: ((S,S)->Boolean,%) -> %
-	++ sort!(p,u) returns u with its elements ordered by p.
-      if S has OrderedSet then sort_!: % -> %
-	++ sort!(u) returns u with its elements in ascending order.
- add
-    if S has SetCategory then
-      position(x:S, t:%) == position(x, t, minIndex t)
-
-    if S has OrderedSet then
---    sorted? l	  == sorted?(_<$S, l)
-      sorted? l	  == sorted?(#1 < #2 or #1 = #2, l)
-      merge(x, y) == merge(_<$S, x, y)
-      sort l	  == sort(_<$S, l)
-
-    if % has shallowlyMutable then
-      reverse x	 == reverse_! copy x
-      sort(f, l) == sort_!(f, copy l)
-      reverse x	 == reverse_! copy x
-
-      if S has OrderedSet then
-	sort_! l == sort_!(_<$S, l)
-
-@
-<<FLAGG.dotabb>>=
-"FLAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"FLAGG" -> "LNAGG"
-
-@
-<<FLAGG.dotfull>>=
-"FiniteLinearAggregate(a:Type)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"FiniteLinearAggregate(a:Type)" -> "LinearAggregate(a:Type)"
-
-@
-\section{category FSAGG FiniteSetAggregate}
-<<category FSAGG FiniteSetAggregate>>=
-)abbrev category FSAGG FiniteSetAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: 14 Oct, 1993 by RSS
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A finite-set aggregate models the notion of a finite set, that is,
-++ a collection of elements characterized by membership, but not
-++ by order or multiplicity.
-++ See \spadtype{Set} for an example.
-FiniteSetAggregate(S:SetCategory): Category ==
-  Join(Dictionary S, SetAggregate S) with
-    finiteAggregate
-    cardinality: % -> NonNegativeInteger
-      ++ cardinality(u) returns the number of elements of u.
-      ++ Note: \axiom{cardinality(u) = #u}.
-    if S has Finite then
-      Finite
-      complement: % -> %
-	++ complement(u) returns the complement of the set u,
-	++ i.e. the set of all values not in u.
-      universe: () -> %
-	++ universe()$D returns the universal set for finite set aggregate D.
-    if S has OrderedSet then
-      max: % -> S
-	++ max(u) returns the largest element of aggregate u.
-      min: % -> S
-	++ min(u) returns the smallest element of aggregate u.
-
- add
-   s < t	   == #s < #t and s = intersect(s,t)
-   s = t	   == #s = #t and empty? difference(s,t)
-   brace l	   == construct l
-   set	 l	   == construct l
-   cardinality s   == #s
-   construct l	   == (s := set(); for x in l repeat insert_!(x,s); s)
-   count(x:S, s:%) == (member?(x, s) => 1; 0)
-   subset?(s, t)   == #s < #t and _and/[member?(x, t) for x in parts s]
-
-   coerce(s:%):OutputForm ==
-     brace [x::OutputForm for x in parts s]$List(OutputForm)
-
-   intersect(s, t) ==
-     i := {}
-     for x in parts s | member?(x, t) repeat insert_!(x, i)
-     i
-
-   difference(s:%, t:%) ==
-     m := copy s
-     for x in parts t repeat remove_!(x, m)
-     m
-
-   symmetricDifference(s, t) ==
-     d := copy s
-     for x in parts t repeat
-       if member?(x, s) then remove_!(x, d) else insert_!(x, d)
-     d
-
-   union(s:%, t:%) ==
-      u := copy s
-      for x in parts t repeat insert_!(x, u)
-      u
-
-   if S has Finite then
-     universe()	  == {index(i::PositiveInteger) for i in 1..size()$S}
-     complement s == difference(universe(), s )
-     size()  == 2 ** size()$S
-     index i ==
-       {index(j::PositiveInteger)$S for j in 1..size()$S | bit?(i-1,j-1)}
-     random()  == index((random()$Integer rem (size()$% + 1))::PositiveInteger)
-
-     lookup s ==
-       n:PositiveInteger := 1
-       for x in parts s repeat _
-         n := n + 2 ** ((lookup(x) - 1)::NonNegativeInteger)
-       n
-
-   if S has OrderedSet then
-     max s ==
-       empty?(l := parts s) => error "Empty set"
-       reduce("max", l)
-
-     min s ==
-       empty?(l := parts s) => error "Empty set"
-       reduce("min", l)
-
-@
-<<FSAGG.dotabb>>=
-"FSAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"FSAGG" -> "DIAGG"
-"FSAGG" -> "SETAGG"
-
-@
-<<FSAGG.dotfull>>=
-"FiniteSetAggregate(a:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"FiniteSetAggregate(a:SetCategory)" -> "Dictionary(a:SetCategory)"
-"FiniteSetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
-
-@
-\section{category HOAGG HomogeneousAggregate}
-<<category HOAGG HomogeneousAggregate>>=
-)abbrev category HOAGG HomogeneousAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991, May 1995
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A homogeneous aggregate is an aggregate of elements all of the
-++ same type.
-++ In the current system, all aggregates are homogeneous.
-++ Two attributes characterize classes of aggregates.
-++ Aggregates from domains with attribute \spadatt{finiteAggregate}
-++ have a finite number of members.
-++ Those with attribute \spadatt{shallowlyMutable} allow an element
-++ to be modified or updated without changing its overall value.
-HomogeneousAggregate(S:Type): Category == Aggregate with
-   if S has SetCategory then SetCategory
-   if S has SetCategory then
-      if S has Evalable S then Evalable S
-   map	   : (S->S,%) -> %
-     ++ map(f,u) returns a copy of u with each element x replaced by f(x).
-     ++ For collections, \axiom{map(f,u) = [f(x) for x in u]}.
-   if % has shallowlyMutable then
-     map_!: (S->S,%) -> %
-	++ map!(f,u) destructively replaces each element x of u 
-        ++ by \axiom{f(x)}.
-   if % has finiteAggregate then
-      any?: (S->Boolean,%) -> Boolean
-	++ any?(p,u) tests if \axiom{p(x)} is true for any element x of u.
-	++ Note: for collections,
-	++ \axiom{any?(p,u) = reduce(or,map(f,u),false,true)}.
-      every?: (S->Boolean,%) -> Boolean
-	++ every?(f,u) tests if p(x) is true for all elements x of u.
-	++ Note: for collections,
-	++ \axiom{every?(p,u) = reduce(and,map(f,u),true,false)}.
-      count: (S->Boolean,%) -> NonNegativeInteger
-	++ count(p,u) returns the number of elements x in u
-	++ such that \axiom{p(x)} is true. For collections,
-	++ \axiom{count(p,u) = reduce(+,[1 for x in u | p(x)],0)}.
-      parts: % -> List S
-	++ parts(u) returns a list of the consecutive elements of u.
-	++ For collections, \axiom{parts([x,y,...,z]) = (x,y,...,z)}.
-      members: % -> List S
-	++ members(u) returns a list of the consecutive elements of u.
-	++ For collections, \axiom{parts([x,y,...,z]) = (x,y,...,z)}.
-      if S has SetCategory then
-	count: (S,%) -> NonNegativeInteger
-	  ++ count(x,u) returns the number of occurrences of x in u. For
-	  ++ collections, \axiom{count(x,u) = reduce(+,[x=y for y in u],0)}.
-	member?: (S,%) -> Boolean
-	  ++ member?(x,u) tests if x is a member of u.
-	  ++ For collections,
-	  ++ \axiom{member?(x,u) = reduce(or,[x=y for y in u],false)}.
-  add
-   if S has Evalable S then
-     eval(u:%,l:List Equation S):% == map(eval(#1,l),u)
-   if % has finiteAggregate then
-     #c			  == # parts c
-     any?(f, c)		  == _or/[f x for x in parts c]
-     every?(f, c)	  == _and/[f x for x in parts c]
-     count(f:S -> Boolean, c:%) == _+/[1 for x in parts c | f x]
-     members x		  == parts x
-     if S has SetCategory then
-       count(s:S, x:%) == count(s = #1, x)
-       member?(e, c)   == any?(e = #1,c)
-       x = y ==
-	  size?(x, #y) and _and/[a = b for a in parts x for b in parts y]
-       coerce(x:%):OutputForm ==
-	 bracket
-	    commaSeparate [a::OutputForm for a in parts x]$List(OutputForm)
-
-@
-<<HOAGG.dotabb>>=
-"HOAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"HOAGG" -> "AGG"
-
-@
-<<HOAGG.dotfull>>=
-"HomogeneousAggregate(a:Type)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"HomogeneousAggregate(a:Type)" -> "Aggregate()"
-
-@
 \section{HOAGG.lsp BOOTSTRAP}
 {\bf HOAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf HOAGG}
@@ -4155,272 +6197,6 @@ Note that this code is not included in the generated catdef.spad file.
         0 17 0 0 30 1 0 15 0 16))))))
   (QUOTE |lookupComplete|))) 
 @
-\section{category IXAGG IndexedAggregate}
-<<category IXAGG IndexedAggregate>>=
-)abbrev category IXAGG IndexedAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ An indexed aggregate is a many-to-one mapping of indices to entries.
-++ For example, a one-dimensional-array is an indexed aggregate where
-++ the index is an integer.  Also, a table is an indexed aggregate
-++ where the indices and entries may have any type.
-IndexedAggregate(Index: SetCategory, Entry: Type): Category ==
-  Join(HomogeneousAggregate(Entry), EltableAggregate(Index, Entry)) with
-   entries: % -> List Entry
-      ++ entries(u) returns a list of all the entries of aggregate u
-      ++ in no assumed order.
-      -- to become entries: % -> Entry* and entries: % -> Iterator(Entry,Entry)
-   index?: (Index,%) -> Boolean
-      ++ index?(i,u) tests if i is an index of aggregate u.
-   indices: % -> List Index
-      ++ indices(u) returns a list of indices of aggregate u in no
-      ++ particular order. to become indices:
-      --  % -> Index* and indices: % -> Iterator(Index,Index).
--- map: ((Entry,Entry)->Entry,%,%,Entry) -> %
---    ++ exists c = map(f,a,b,x), i:Index where
---    ++    c.i = f(a(i,x),b(i,x)) | index?(i,a) or index?(i,b)
-   if Entry has SetCategory and % has finiteAggregate then
-      entry?: (Entry,%) -> Boolean
-	++ entry?(x,u) tests if x equals \axiom{u . i} for some index i.
-   if Index has OrderedSet then
-      maxIndex: % -> Index
-	++ maxIndex(u) returns the maximum index i of aggregate u.
-	++ Note: in general,
-	++ \axiom{maxIndex(u) = reduce(max,[i for i in indices u])};
-	++ if u is a list, \axiom{maxIndex(u) = #u}.
-      minIndex: % -> Index
-	++ minIndex(u) returns the minimum index i of aggregate u.
-	++ Note: in general,
-	++ \axiom{minIndex(a) = reduce(min,[i for i in indices a])};
-	++ for lists, \axiom{minIndex(a) = 1}.
-      first   : % -> Entry
-	++ first(u) returns the first element x of u.
-	++ Note: for collections, \axiom{first([x,y,...,z]) = x}.
-	++ Error: if u is empty.
-
-   if % has shallowlyMutable then
-      fill_!: (%,Entry) -> %
-	++ fill!(u,x) replaces each entry in aggregate u by x.
-	++ The modified u is returned as value.
-      swap_!: (%,Index,Index) -> Void
-	++ swap!(u,i,j) interchanges elements i and j of aggregate u.
-	++ No meaningful value is returned.
- add
-  elt(a, i, x) == (index?(i, a) => qelt(a, i); x)
-
-  if % has finiteAggregate then
-    entries x == parts x
-    if Entry has SetCategory then
-      entry?(x, a) == member?(x, a)
-
-  if Index has OrderedSet then
-    maxIndex a == "max"/indices(a)
-    minIndex a == "min"/indices(a)
-    first a    == a minIndex a
-
-  if % has shallowlyMutable then
-    map(f, a) == map_!(f, copy a)
-
-    map_!(f, a) ==
-      for i in indices a repeat qsetelt_!(a, i, f qelt(a, i))
-      a
-
-    fill_!(a, x) ==
-      for i in indices a repeat qsetelt_!(a, i, x)
-      a
-
-    swap_!(a, i, j) ==
-      t := a.i
-      qsetelt_!(a, i, a.j)
-      qsetelt_!(a, j, t)
-      void
-
-@
-<<IXAGG.dotabb>>=
-"IXAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"IXAGG" -> "HOAGG"
-"IXAGG" -> "ELTAGG"
-
-@
-<<IXAGG.dotfull>>=
-"IndexedAggregate(a:SetCategory,b:Type)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"IndexedAggregate(a:SetCategory,b:Type)" -> 
-    "HomogeneousAggregate(a:Type)"
-"IndexedAggregate(a:SetCategory,b:Type)" -> 
-    "EltableAggregate(a:SetCategory,b:Type)"
-
-"IndexedAggregate(a:SetCategory,b:SetCategory)"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"IndexedAggregate(a:SetCategory,b:SetCategory)" ->
-    "IndexedAggregate(a:SetCategory,b:Type)"
-
-"IndexedAggregate(b:Integer,a:Type)"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"IndexedAggregate(b:Integer,a:Type)" ->
-    "IndexedAggregate(a:SetCategory,b:Type)"
-
-@
-\section{category KDAGG KeyedDictionary}
-<<category KDAGG KeyedDictionary>>=
-)abbrev category KDAGG KeyedDictionary
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A keyed dictionary is a dictionary of key-entry pairs for which there is
-++ a unique entry for each key.
-KeyedDictionary(Key:SetCategory, Entry:SetCategory): Category ==
-  Dictionary Record(key:Key,entry:Entry) with
-   key?: (Key, %) -> Boolean
-     ++ key?(k,t) tests if k is a key in table t.
-   keys: % -> List Key
-     ++ keys(t) returns the list the keys in table t.
-   -- to become keys: % -> Key* and keys: % -> Iterator(Entry,Entry)
-   remove_!: (Key, %) -> Union(Entry,"failed")
-     ++ remove!(k,t) searches the table t for the key k removing
-     ++ (and return) the entry if there.
-     ++ If t has no such key, \axiom{remove!(k,t)} returns "failed".
-   search: (Key, %) -> Union(Entry,"failed")
-     ++ search(k,t) searches the table t for the key k,
-     ++ returning the entry stored in t for key k.
-     ++ If t has no such key, \axiom{search(k,t)} returns "failed".
- add
-   key?(k, t) == search(k, t) case Entry
-
-   member?(p, t) ==
-     r := search(p.key, t)
-     r case Entry and r::Entry = p.entry
-
-   if % has finiteAggregate then
-     keys t == [x.key for x in parts t]
-
-@
-<<KDAGG.dotabb>>=
-"KDAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"KDAGG" -> "DIAGG"
-
-@
-<<KDAGG.dotfull>>=
-"KeyedDictionary(a:SetCategory,b:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"KeyedDictionary(a:SetCategory,b:SetCategory)" -> 
-    "Dictionary(Record(a:SetCategory,b:SetCategory))"
-
-@
-\section{category LNAGG LinearAggregate}
-<<category LNAGG LinearAggregate>>=
-)abbrev category LNAGG LinearAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A linear aggregate is an aggregate whose elements are indexed by integers.
-++ Examples of linear aggregates are strings, lists, and
-++ arrays.
-++ Most of the exported operations for linear aggregates are non-destructive
-++ but are not always efficient for a particular aggregate.
-++ For example, \spadfun{concat} of two lists needs only to copy its first
-++ argument, whereas \spadfun{concat} of two arrays needs to copy both 
-++ arguments. Most of the operations exported here apply to infinite 
-++ objects (e.g. streams) as well to finite ones.
-++ For finite linear aggregates, see \spadtype{FiniteLinearAggregate}.
-LinearAggregate(S:Type): Category ==
-  Join(IndexedAggregate(Integer, S), Collection(S)) with
-   new	 : (NonNegativeInteger,S) -> %
-     ++ new(n,x) returns \axiom{fill!(new n,x)}.
-   concat: (%,S) -> %
-     ++ concat(u,x) returns aggregate u with additional element x at the end.
-     ++ Note: for lists, \axiom{concat(u,x) == concat(u,[x])}
-   concat: (S,%) -> %
-     ++ concat(x,u) returns aggregate u with additional element at the front.
-     ++ Note: for lists: \axiom{concat(x,u) == concat([x],u)}.
-   concat: (%,%) -> %
-      ++ concat(u,v) returns an aggregate consisting of the elements of u
-      ++ followed by the elements of v.
-      ++ Note: if \axiom{w = concat(u,v)} then 
-      ++ \axiom{w.i = u.i for i in indices u}
-      ++ and \axiom{w.(j + maxIndex u) = v.j for j in indices v}.
-   concat: List % -> %
-      ++ concat(u), where u is a lists of aggregates \axiom{[a,b,...,c]}, 
-      ++ returns a single aggregate consisting of the elements of \axiom{a}
-      ++ followed by those
-      ++ of b followed ... by the elements of c.
-      ++ Note: \axiom{concat(a,b,...,c) = concat(a,concat(b,...,c))}.
-   map: ((S,S)->S,%,%) -> %
-     ++ map(f,u,v) returns a new collection w with elements \axiom{z = f(x,y)}
-     ++ for corresponding elements x and y from u and v.
-     ++ Note: for linear aggregates, \axiom{w.i = f(u.i,v.i)}.
-   elt: (%,UniversalSegment(Integer)) -> %
-      ++ elt(u,i..j) (also written: \axiom{a(i..j)}) returns the aggregate of
-      ++ elements \axiom{u} for k from i to j in that order.
-      ++ Note: in general, \axiom{a.s = [a.k for i in s]}.
-   delete: (%,Integer) -> %
-      ++ delete(u,i) returns a copy of u with the \axiom{i}th element deleted.
-      ++ Note: for lists, 
-      ++ \axiom{delete(a,i) == concat(a(0..i - 1),a(i + 1,..))}.
-   delete: (%,UniversalSegment(Integer)) -> %
-      ++ delete(u,i..j) returns a copy of u with the \axiom{i}th through
-      ++ \axiom{j}th element deleted.
-      ++ Note: \axiom{delete(a,i..j) = concat(a(0..i-1),a(j+1..))}.
-   insert: (S,%,Integer) -> %
-      ++ insert(x,u,i) returns a copy of u having x as its \axiom{i}th element.
-      ++ Note: \axiom{insert(x,a,k) = concat(concat(a(0..k-1),x),a(k..))}.
-   insert: (%,%,Integer) -> %
-      ++ insert(v,u,k) returns a copy of u having v inserted beginning at the
-      ++ \axiom{i}th element.
-      ++ Note: \axiom{insert(v,u,k) = concat( u(0..k-1), v, u(k..) )}.
-   if % has shallowlyMutable then setelt: (%,UniversalSegment(Integer),S) -> S
-      ++ setelt(u,i..j,x) (also written: \axiom{u(i..j) := x}) destructively
-      ++ replaces each element in the segment \axiom{u(i..j)} by x.
-      ++ The value x is returned.
-      ++ Note: u is destructively change so
-      ++ that \axiom{u.k := x for k in i..j};
-      ++ its length remains unchanged.
- add
-  indices a	 == [i for i in minIndex a .. maxIndex a]
-  index?(i, a)	 == i >= minIndex a and i <= maxIndex a
-  concat(a:%, x:S)	== concat(a, new(1, x))
-  concat(x:S, y:%)	== concat(new(1, x), y)
-  insert(x:S, a:%, i:Integer) == insert(new(1, x), a, i)
-  if % has finiteAggregate then
-    maxIndex l == #l - 1 + minIndex l
-
---if % has shallowlyMutable then new(n, s)  == fill_!(new n, s)
-
-@
-<<LNAGG.dotabb>>=
-"LNAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"LNAGG" -> "IXAGG"
-"LNAGG" -> "CLAGG"
-
-@
-<<LNAGG.dotfull>>=
-"LinearAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"LinearAggregate(a:Type)" -> "IndexedAggregate(b:Integer,a:Type)"
-"LinearAggregate(a:Type)" -> "Collection(a:Type)"
-
-@
 \section{LNAGG.lsp BOOTSTRAP}
 {\bf LNAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf LNAGG}
@@ -4588,238 +6364,6 @@ Note that this code is not included in the generated catdef.spad file.
       0 7 0 8 21 1 0 11 0 12 2 0 13 8 0 14 2 0 0 0 7 18 2 0 0 7 0 19))))))
   (QUOTE |lookupComplete|))) 
 @
-\section{category LSAGG ListAggregate}
-<<category LSAGG ListAggregate>>=
-)abbrev category LSAGG ListAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A list aggregate is a model for a linked list data structure.
-++ A linked list is a versatile
-++ data structure. Insertion and deletion are efficient and
-++ searching is a linear operation.
-ListAggregate(S:Type): Category == Join(StreamAggregate S,
-   FiniteLinearAggregate S, ExtensibleLinearAggregate S) with
-      list: S -> %
-	++ list(x) returns the list of one element x.
- add
-   cycleMax ==> 1000
-
-   mergeSort: ((S, S) -> Boolean, %, Integer) -> %
-
-   sort_!(f, l)	      == mergeSort(f, l, #l)
-   list x		   == concat(x, empty())
-   reduce(f, x)		   ==
-     empty? x => error "reducing over an empty list needs the 3 argument form"
-     reduce(f, rest x, first x)
-   merge(f, p, q)	   == merge_!(f, copy p, copy q)
-
-   select_!(f, x) ==
-     while not empty? x and not f first x repeat x := rest x
-     empty? x => x
-     y := x
-     z := rest y
-     while not empty? z repeat
-       if f first z then (y := z; z := rest z)
-		    else (z := rest z; setrest_!(y, z))
-     x
-
-   merge_!(f, p, q) ==
-     empty? p => q
-     empty? q => p
-     eq?(p, q) => error "cannot merge a list into itself"
-     if f(first p, first q)
-       then (r := t := p; p := rest p)
-       else (r := t := q; q := rest q)
-     while not empty? p and not empty? q repeat
-       if f(first p, first q)
-	 then (setrest_!(t, p); t := p; p := rest p)
-	 else (setrest_!(t, q); t := q; q := rest q)
-     setrest_!(t, if empty? p then q else p)
-     r
-
-   insert_!(s:S, x:%, i:Integer) ==
-     i < (m := minIndex x) => error "index out of range"
-     i = m => concat(s, x)
-     y := rest(x, (i - 1 - m)::NonNegativeInteger)
-     z := rest y
-     setrest_!(y, concat(s, z))
-     x
-
-   insert_!(w:%, x:%, i:Integer) ==
-     i < (m := minIndex x) => error "index out of range"
-     i = m => concat_!(w, x)
-     y := rest(x, (i - 1 - m)::NonNegativeInteger)
-     z := rest y
-     setrest_!(y, w)
-     concat_!(y, z)
-     x
-
-   remove_!(f:S -> Boolean, x:%) ==
-     while not empty? x and f first x repeat x := rest x
-     empty? x => x
-     p := x
-     q := rest x
-     while not empty? q repeat
-       if f first q then q := setrest_!(p, rest q)
-		    else (p := q; q := rest q)
-     x
-
-   delete_!(x:%, i:Integer) ==
-     i < (m := minIndex x) => error "index out of range"
-     i = m => rest x
-     y := rest(x, (i - 1 - m)::NonNegativeInteger)
-     setrest_!(y, rest(y, 2))
-     x
-
-   delete_!(x:%, i:UniversalSegment(Integer)) ==
-     (l := lo i) < (m := minIndex x) => error "index out of range"
-     h := if hasHi i then hi i else maxIndex x
-     h < l => x
-     l = m => rest(x, (h + 1 - m)::NonNegativeInteger)
-     t := rest(x, (l - 1 - m)::NonNegativeInteger)
-     setrest_!(t, rest(t, (h - l + 2)::NonNegativeInteger))
-     x
-
-   find(f, x) ==
-     while not empty? x and not f first x repeat x := rest x
-     empty? x => "failed"
-     first x
-
-   position(f:S -> Boolean, x:%) ==
-     for k in minIndex(x).. while not empty? x and not f first x repeat
-       x := rest x
-     empty? x => minIndex(x) - 1
-     k
-
-   mergeSort(f, p, n) ==
-     if n = 2 and f(first rest p, first p) then p := reverse_! p
-     n < 3 => p
-     l := (n quo 2)::NonNegativeInteger
-     q := split_!(p, l)
-     p := mergeSort(f, p, l)
-     q := mergeSort(f, q, n - l)
-     merge_!(f, p, q)
-
-   sorted?(f, l) ==
-     empty? l => true
-     p := rest l
-     while not empty? p repeat
-       not f(first l, first p) => return false
-       p := rest(l := p)
-     true
-
-   reduce(f, x, i) ==
-     r := i
-     while not empty? x repeat (r := f(r, first x); x := rest x)
-     r
-
-   if S has SetCategory then
-      reduce(f, x, i,a) ==
-	r := i
-	while not empty? x and r ^= a repeat
-	  r := f(r, first x)
-	  x := rest x
-	r
-
-   new(n, s) ==
-     l := empty()
-     for k in 1..n repeat l := concat(s, l)
-     l
-
-   map(f, x, y) ==
-     z := empty()
-     while not empty? x and not empty? y repeat
-       z := concat(f(first x, first y), z)
-       x := rest x
-       y := rest y
-     reverse_! z
-
--- map(f, x, y, d) ==
---   z := empty()
---   while not empty? x and not empty? y repeat
---     z := concat(f(first x, first y), z)
---     x := rest x
---     y := rest y
---   z := reverseInPlace z
---   if not empty? x then
---	z := concat_!(z, map(f(#1, d), x))
---   if not empty? y then
---	z := concat_!(z, map(f(d, #1), y))
---   z
-
-   reverse_! x ==
-     empty? x => x
-     empty?(y := rest x) => x
-     setrest_!(x, empty())
-     while not empty? y repeat
-       z := rest y
-       setrest_!(y, x)
-       x := y
-       y := z
-     x
-
-   copy x ==
-     y := empty()
-     for k in 0.. while not empty? x repeat
-       k = cycleMax and cyclic? x => error "cyclic list"
-       y := concat(first x, y)
-       x := rest x
-     reverse_! y
-
-   copyInto_!(y, x, s) ==
-     s < (m := minIndex y) => error "index out of range"
-     z := rest(y, (s - m)::NonNegativeInteger)
-     while not empty? z and not empty? x repeat
-       setfirst_!(z, first x)
-       x := rest x
-       z := rest z
-     y
-
-   if S has SetCategory then
-     position(w, x, s) ==
-       s < (m := minIndex x) => error "index out of range"
-       x := rest(x, (s - m)::NonNegativeInteger)
-       for k in s.. while not empty? x and w ^= first x repeat
-	 x := rest x
-       empty? x => minIndex x - 1
-       k
-
-     removeDuplicates_! l ==
-       p := l
-       while not empty? p repeat
-	 p := setrest_!(p, remove_!(#1 = first p, rest p))
-       l
-
-   if S has OrderedSet then
-     x < y ==
-	while not empty? x and not empty? y repeat
-	  first x ^= first y => return(first x < first y)
-	  x := rest x
-	  y := rest y
-	empty? x => not empty? y
-	false
-
-@
-<<LSAGG.dotabb>>=
-"LSAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"LSAGG" -> "FLAGG"
-"LSAGG" -> "ELAGG"
-
-@
-<<LSAGG.dotfull>>=
-"ListAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"ListAggregate(a:Type)" -> "FiniteLinearAggregate(a:Type)"
-"ListAggregate(a:Type)" -> "ExtensibleLinearAggregate(a:Type)"
-
-@
 \section{LSAGG.lsp BOOTSTRAP}
 {\bf LSAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf LSAGG}
@@ -5727,297 +7271,6 @@ Note that this code is not included in the generated catdef.spad file.
        0 0 57 2 0 15 0 0 64))))))
    (QUOTE |lookupComplete|))) 
 @
-\section{category MDAGG MultiDictionary}
-<<category MDAGG MultiDictionary>>=
-)abbrev category MDAGG MultiDictionary
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A multi-dictionary is a dictionary which may contain duplicates.
-++ As for any dictionary, its size is assumed large so that
-++ copying (non-destructive) operations are generally to be avoided.
-MultiDictionary(S:SetCategory): Category == DictionaryOperations S with
--- count: (S,%) -> NonNegativeInteger		       ++ multiplicity count
-   insert_!: (S,%,NonNegativeInteger) -> %
-     ++ insert!(x,d,n) destructively inserts n copies of x into dictionary d.
--- remove_!: (S,%,NonNegativeInteger) -> %
---   ++ remove!(x,d,n) destructively removes (up to) n copies of x from
---   ++ dictionary d.
-   removeDuplicates_!: % -> %
-     ++ removeDuplicates!(d) destructively removes any duplicate values
-     ++ in dictionary d.
-   duplicates: % -> List Record(entry:S,count:NonNegativeInteger)
-     ++ duplicates(d) returns a list of values which have duplicates in d
---   ++ duplicates(d) returns a list of		     ++ duplicates iterator
--- to become duplicates: % -> Iterator(D,D)
-
-@
-<<MDAGG.dotabb>>=
-"MDAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"MDAGG" -> "DIOPS"
-
-@
-<<MDAGG.dotfull>>=
-"MultiDictionary(a:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"MultiDictionary(a:SetCategory)" -> "DictionaryOperations(a:SetCategory)"
-
-@
-\section{category MSETAGG MultisetAggregate}
-<<category MSETAGG MultisetAggregate>>=
-)abbrev category MSETAGG MultisetAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A multi-set aggregate is a set which keeps track of the multiplicity
-++ of its elements.
-MultisetAggregate(S:SetCategory):
- Category == Join(MultiDictionary S, SetAggregate S)
-
-@
-<<MSETAGG.dotabb>>=
-"MSETAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"MSETAGG" -> "MDAGG"
-"MSETAGG" -> "SETAGG"
-
-@
-<<MSETAGG.dotfull>>=
-"MultisetAggregate(a:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"MultisetAggregate(a:SetCategory)" -> "MultiDictionary(a:SetCategory)"
-"MultisetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
-
-@
-\section{category OMSAGG OrderedMultisetAggregate}
-<<category OMSAGG OrderedMultisetAggregate>>=
-)abbrev category OMSAGG OrderedMultisetAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ An ordered-multiset aggregate is a multiset built over an ordered set S
-++ so that the relative sizes of its entries can be assessed.
-++ These aggregates serve as models for priority queues.
-OrderedMultisetAggregate(S:OrderedSet): Category ==
-   Join(MultisetAggregate S,PriorityQueueAggregate S) with
-   -- max: % -> S		      ++ smallest entry in the set
-   -- duplicates: % -> List Record(entry:S,count:NonNegativeInteger)
-        ++ to become an in order iterator
-   -- parts: % -> List S	      ++ in order iterator
-      min: % -> S
-	++ min(u) returns the smallest entry in the multiset aggregate u.
-
-@
-<<OMSAGG.dotabb>>=
-"OMSAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"OMSAGG" -> "MSETAGG"
-"OMSAGG" -> "PRQAGG"
-
-@
-<<OMSAGG.dotfull>>=
-"OrderedMultisetAggregate(a:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"OrderedMultisetAggregate(a:SetCategory)" -> "MultisetAggregate(a:SetCategory)"
-"OrderedMultisetAggregate(a:SetCategory)" -> 
-   "PriorityQueueAggregate(a:SetCategory)"
-
-@
-\section{category PRQAGG PriorityQueueAggregate}
-<<category PRQAGG PriorityQueueAggregate>>=
-)abbrev category PRQAGG PriorityQueueAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A priority queue is a bag of items from an ordered set where the item
-++ extracted is always the maximum element.
-PriorityQueueAggregate(S:OrderedSet): Category == BagAggregate S with
-   finiteAggregate
-   max: % -> S
-     ++ max(q) returns the maximum element of priority queue q.
-   merge: (%,%) -> %
-     ++ merge(q1,q2) returns combines priority queues q1 and q2 to return
-     ++ a single priority queue q.
-   merge_!: (%,%) -> %
-     ++ merge!(q,q1) destructively changes priority queue q to include the
-     ++ values from priority queue q1.
-
-@
-<<PRQAGG.dotabb>>=
-"PRQAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"PRQAGG" -> "BGAGG"
-
-@
-<<PRQAGG.dotfull>>=
-"PriorityQueueAggregate(a:Type)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"PriorityQueueAggregate(a:Type)" -> "BagAggregate(a:Type)"
-
-"PriorityQueueAggregate(a:SetCategory)"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"PriorityQueueAggregate(a:SetCategory)" -> "PriorityQueueAggregate(a:Type)"
-
-"PriorityQueueAggregate(a:OrderedSet)"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"PriorityQueueAggregate(a:OrderedSet)" ->
-   "PriorityQueueAggregate(a:SetCategory)"
-
-@
-\section{category QUAGG QueueAggregate}
-<<category QUAGG QueueAggregate>>=
-)abbrev category QUAGG QueueAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A queue is a bag where the first item inserted is the first item extracted.
-QueueAggregate(S:Type): Category == BagAggregate S with
-   finiteAggregate
-   enqueue_!: (S, %) -> S
-     ++ enqueue!(x,q) inserts x into the queue q at the back end.
-   dequeue_!: % -> S
-     ++ dequeue! s destructively extracts the first (top) element from queue q.
-     ++ The element previously second in the queue becomes the first element.
-     ++ Error: if q is empty.
-   rotate_!: % -> %
-     ++ rotate! q rotates queue q so that the element at the front of
-     ++ the queue goes to the back of the queue.
-     ++ Note: rotate! q is equivalent to enqueue!(dequeue!(q)).
-   length: % -> NonNegativeInteger
-     ++ length(q) returns the number of elements in the queue.
-     ++ Note: \axiom{length(q) = #q}.
-   front: % -> S
-     ++ front(q) returns the element at the front of the queue.
-     ++ The queue q is unchanged by this operation.
-     ++ Error: if q is empty.
-   back: % -> S
-     ++ back(q) returns the element at the back of the queue.
-     ++ The queue q is unchanged by this operation.
-     ++ Error: if q is empty.
-
-@
-<<QUAGG.dotabb>>=
-"QUAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"QUAGG" -> "BGAGG"
-
-@
-<<QUAGG.dotfull>>=
-"QueueAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"QueueAggregate(a:Type)" -> "BagAggregate(a:Type)"
-
-"QueueAggregate(a:SetCategory)"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"QueueAggregate(a:SetCategory)" -> "QueueAggregate(a:Type)"
-
-@
-\section{category RCAGG RecursiveAggregate}
-<<category RCAGG RecursiveAggregate>>=
-)abbrev category RCAGG RecursiveAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A recursive aggregate over a type S is a model for a
-++ a directed graph containing values of type S.
-++ Recursively, a recursive aggregate is a {\em node}
-++ consisting of a \spadfun{value} from S and 0 or more \spadfun{children}
-++ which are recursive aggregates.
-++ A node with no children is called a \spadfun{leaf} node.
-++ A recursive aggregate may be cyclic for which some operations as noted
-++ may go into an infinite loop.
-RecursiveAggregate(S:Type): Category == HomogeneousAggregate(S) with
-   children: % -> List %
-     ++ children(u) returns a list of the children of aggregate u.
-   -- should be % -> %* and also needs children: % -> Iterator(S,S)
-   nodes: % -> List %
-     ++ nodes(u) returns a list of all of the nodes of aggregate u.
-   -- to become % -> %* and also nodes: % -> Iterator(S,S)
-   leaf?: % -> Boolean
-     ++ leaf?(u) tests if u is a terminal node.
-   value: % -> S
-     ++ value(u) returns the value of the node u.
-   elt: (%,"value") -> S
-     ++ elt(u,"value") (also written: \axiom{a. value}) is
-     ++ equivalent to \axiom{value(a)}.
-   cyclic?: % -> Boolean
-     ++ cyclic?(u) tests if u has a cycle.
-   leaves: % -> List S
-     ++ leaves(t) returns the list of values in obtained by visiting the
-     ++ nodes of tree \axiom{t} in left-to-right order.
-   distance: (%,%) -> Integer
-     ++ distance(u,v) returns the path length (an integer) from node u to v.
-   if S has SetCategory then
-      child?: (%,%) -> Boolean
-	++ child?(u,v) tests if node u is a child of node v.
-      node?: (%,%) -> Boolean
-	++ node?(u,v) tests if node u is contained in node v
-	++ (either as a child, a child of a child, etc.).
-   if % has shallowlyMutable then
-      setchildren_!: (%,List %)->%
-	++ setchildren!(u,v) replaces the current children of node u
-	++ with the members of v in left-to-right order.
-      setelt: (%,"value",S) -> S
-	++ setelt(a,"value",x) (also written \axiom{a . value := x})
-	++ is equivalent to \axiom{setvalue!(a,x)}
-      setvalue_!: (%,S) -> S
-	++ setvalue!(u,x) sets the value of node u to x.
- add
-   elt(x,"value") == value x
-   if % has shallowlyMutable then
-     setelt(x,"value",y) == setvalue_!(x,y)
-   if S has SetCategory then
-     child?(x,l) == member?(x,children(l))
-
-@
-<<RCAGG.dotabb>>=
-"RCAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"RCAGG" -> "HOAGG"
-
-@
-<<RCAGG.dotfull>>=
-"RecursiveAggregate(a:Type)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"RecursiveAggregate(a:Type)" -> "HomogeneousAggregate(a:Type)"
-
-@
 \section{RCAGG.lsp BOOTSTRAP}
 {\bf RCAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf RCAGG}
@@ -6155,99 +7408,6 @@ Note that this code is not included in the generated catdef.spad file.
      10 2 0 15 0 0 18))))))
   (QUOTE |lookupComplete|))) 
 @
-\section{category SETAGG SetAggregate}
-<<category SETAGG SetAggregate>>=
-)abbrev category SETAGG SetAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: 14 Oct, 1993 by RSS
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A set category lists a collection of set-theoretic operations
-++ useful for both finite sets and multisets.
-++ Note however that finite sets are distinct from multisets.
-++ Although the operations defined for set categories are
-++ common to both, the relationship between the two cannot
-++ be described by inclusion or inheritance.
-SetAggregate(S:SetCategory):
-  Category == Join(SetCategory, Collection(S)) with
-   partiallyOrderedSet
-   "<"         : (%, %) -> Boolean
-     ++ s < t returns true if all elements of set aggregate s are also
-     ++ elements of set aggregate t.
-   brace       : () -> %
-     ++ brace()$D (otherwise written {}$D)
-     ++ creates an empty set aggregate of type D.
-     ++ This form is considered obsolete. Use \axiomFun{set} instead.
-   brace       : List S -> %
-     ++ brace([x,y,...,z]) 
-     ++ creates a set aggregate containing items x,y,...,z.
-     ++ This form is considered obsolete. Use \axiomFun{set} instead.
-   set	       : () -> %
-     ++ set()$D creates an empty set aggregate of type D.
-   set	       : List S -> %
-     ++ set([x,y,...,z]) creates a set aggregate containing items x,y,...,z.
-   intersect: (%, %) -> %
-     ++ intersect(u,v) returns the set aggregate w consisting of
-     ++ elements common to both set aggregates u and v.
-     ++ Note: equivalent to the notation (not currently supported)
-     ++ {x for x in u | member?(x,v)}.
-   difference  : (%, %) -> %
-     ++ difference(u,v) returns the set aggregate w consisting of
-     ++ elements in set aggregate u but not in set aggregate v.
-     ++ If u and v have no elements in common, \axiom{difference(u,v)}
-     ++ returns a copy of u.
-     ++ Note: equivalent to the notation (not currently supported)
-     ++ \axiom{{x for x in u | not member?(x,v)}}.
-   difference  : (%, S) -> %
-     ++ difference(u,x) returns the set aggregate u with element x removed.
-     ++ If u does not contain x, a copy of u is returned.
-     ++ Note: \axiom{difference(s, x) = difference(s, {x})}.
-   symmetricDifference : (%, %) -> %
-     ++ symmetricDifference(u,v) returns the set aggregate of elements x which
-     ++ are members of set aggregate u or set aggregate v but not both.
-     ++ If u and v have no elements in common, \axiom{symmetricDifference(u,v)}
-     ++ returns a copy of u.
-     ++ Note: \axiom{symmetricDifference(u,v) = 
-     ++  union(difference(u,v),difference(v,u))}
-   subset?     : (%, %) -> Boolean
-     ++ subset?(u,v) tests if u is a subset of v.
-     ++ Note: equivalent to
-     ++ \axiom{reduce(and,{member?(x,v) for x in u},true,false)}.
-   union       : (%, %) -> %
-     ++ union(u,v) returns the set aggregate of elements which are members
-     ++ of either set aggregate u or v.
-   union       : (%, S) -> %
-     ++ union(u,x) returns the set aggregate u with the element x added.
-     ++ If u already contains x, \axiom{union(u,x)} returns a copy of u.
-   union       : (S, %) -> %
-     ++ union(x,u) returns the set aggregate u with the element x added.
-     ++ If u already contains x, \axiom{union(x,u)} returns a copy of u.
- add
-  symmetricDifference(x, y)    == union(difference(x, y), difference(y, x))
-  union(s:%, x:S) == union(s, {x})
-  union(x:S, s:%) == union(s, {x})
-  difference(s:%, x:S) == difference(s, {x})
-
-@
-<<SETAGG.dotabb>>=
-"SETAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"SETAGG" -> "SETCAT"
-"SETAGG" -> "CLAGG"
-
-@
-<<SETAGG.dotfull>>=
-"SetAggregate(a:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"SetAggregate(a:SetCategory)" -> "SetCategory()"
-"SetAggregate(a:SetCategory)" -> "Collection(a:SetCategory)"
-
-@
 \section{SETAGG.lsp BOOTSTRAP}
 {\bf SETAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf SETAGG}
@@ -6376,282 +7536,6 @@ Note that this code is not included in the generated catdef.spad file.
        0 0 7 0 14 2 0 0 0 7 13 2 0 0 0 0 10 2 0 0 0 7 15))))))
   (QUOTE |lookupComplete|))) 
 @
-\section{category SKAGG StackAggregate}
-<<category SKAGG StackAggregate>>=
-)abbrev category SKAGG StackAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A stack is a bag where the last item inserted is the first item extracted.
-StackAggregate(S:Type): Category == BagAggregate S with
-   finiteAggregate
-   push_!: (S,%) -> S
-     ++ push!(x,s) pushes x onto stack s, i.e. destructively changing s
-     ++ so as to have a new first (top) element x.
-     ++ Afterwards, pop!(s) produces x and pop!(s) produces the original s.
-   pop_!: % -> S
-     ++ pop!(s) returns the top element x, destructively removing x from s.
-     ++ Note: Use \axiom{top(s)} to obtain x without removing it from s.
-     ++ Error: if s is empty.
-   top: % -> S
-     ++ top(s) returns the top element x from s; s remains unchanged.
-     ++ Note: Use \axiom{pop!(s)} to obtain x and remove it from s.
-   depth: % -> NonNegativeInteger
-     ++ depth(s) returns the number of elements of stack s.
-     ++ Note: \axiom{depth(s) = #s}.
-
-
-@
-<<SKAGG.dotabb>>=
-"SKAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"SKAGG" -> "BGAGG"
-
-@
-<<SKAGG.dotfull>>=
-"StackAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"StackAggregate(a:Type)" -> "BagAggregate(a:Type)"
-
-"StackAggregate(a:SetCategory)"
-    [color=seagreen,href="books/bookvol10.pamphlet"];
-"StackAggregate(a:SetCategory)" -> "StackAggregate(a:Type)"
-
-@
-\section{category SRAGG StringAggregate}
-<<category SRAGG StringAggregate>>=
-)abbrev category SRAGG StringAggregate
-++ Author: Stephen Watt and Michael Monagan. 
-++ revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A string aggregate is a category for strings, that is,
-++ one dimensional arrays of characters.
-StringAggregate: Category == OneDimensionalArrayAggregate Character with
-    lowerCase	    : % -> %
-      ++ lowerCase(s) returns the string with all characters in lower case.
-    lowerCase_!: % -> %
-      ++ lowerCase!(s) destructively replaces the alphabetic characters
-      ++ in s by lower case.
-    upperCase	    : % -> %
-      ++ upperCase(s) returns the string with all characters in upper case.
-    upperCase_!: % -> %
-      ++ upperCase!(s) destructively replaces the alphabetic characters
-      ++ in s by upper case characters.
-    prefix?	    : (%, %) -> Boolean
-      ++ prefix?(s,t) tests if the string s is the initial substring of t.
-      ++ Note: \axiom{prefix?(s,t) == 
-      ++   reduce(and,[s.i = t.i for i in 0..maxIndex s])}.
-    suffix?	    : (%, %) -> Boolean
-      ++ suffix?(s,t) tests if the string s is the final substring of t.
-      ++ Note: \axiom{suffix?(s,t) == 
-      ++  reduce(and,[s.i = t.(n - m + i) for i in 0..maxIndex s])}
-      ++ where m and n denote the maxIndex of s and t respectively.
-    substring?: (%, %, Integer) -> Boolean
-      ++ substring?(s,t,i) tests if s is a substring of t beginning at
-      ++ index i.
-      ++ Note: \axiom{substring?(s,t,0) = prefix?(s,t)}.
-    match: (%, %, Character) -> NonNegativeInteger
-      ++ match(p,s,wc) tests if pattern \axiom{p} matches subject \axiom{s}
-      ++ where \axiom{wc} is a wild card character. If no match occurs,
-      ++ the index \axiom{0} is returned; otheriwse, the value returned
-      ++ is the first index of the first character in the subject matching
-      ++ the subject (excluding that matched by an initial wild-card).
-      ++ For example, \axiom{match("*to*","yorktown","*")} returns \axiom{5}
-      ++ indicating a successful match starting at index \axiom{5} of
-      ++ \axiom{"yorktown"}.
-    match?: (%, %, Character) -> Boolean
-      ++ match?(s,t,c) tests if s matches t except perhaps for
-      ++ multiple and consecutive occurrences of character c.
-      ++ Typically c is the blank character.
-    replace	    : (%, UniversalSegment(Integer), %) -> %
-      ++ replace(s,i..j,t) replaces the substring \axiom{s(i..j)} 
-      ++ of s by string t.
-    position	    : (%, %, Integer) -> Integer
-      ++ position(s,t,i) returns the position j of the substring s in string t,
-      ++ where \axiom{j >= i} is required.
-    position	    : (CharacterClass, %, Integer) -> Integer
-      ++ position(cc,t,i) returns the position \axiom{j >= i} in t of
-      ++ the first character belonging to cc.
-    coerce	    : Character -> %
-      ++ coerce(c) returns c as a string s with the character c.
-
-    split: (%, Character) -> List %
-      ++ split(s,c) returns a list of substrings delimited by character c.
-    split: (%, CharacterClass) -> List %
-      ++ split(s,cc) returns a list of substrings delimited by 
-      ++ characters in cc.
-
-    trim: (%, Character) -> %
-      ++ trim(s,c) returns s with all characters c deleted from right
-      ++ and left ends.
-      ++ For example, \axiom{trim(" abc ", char " ")} returns \axiom{"abc"}.
-    trim: (%, CharacterClass) -> %
-      ++ trim(s,cc) returns s with all characters in cc deleted from right
-      ++ and left ends.
-      ++ For example, \axiom{trim("(abc)", charClass "()")} 
-      ++ returns \axiom{"abc"}.
-    leftTrim: (%, Character) -> %
-      ++ leftTrim(s,c) returns s with all leading characters c deleted.
-      ++ For example, \axiom{leftTrim("  abc  ", char " ")} 
-      ++ returns \axiom{"abc  "}.
-    leftTrim: (%, CharacterClass) -> %
-      ++ leftTrim(s,cc) returns s with all leading characters in cc deleted.
-      ++ For example, \axiom{leftTrim("(abc)", charClass "()")} 
-      ++ returns \axiom{"abc)"}.
-    rightTrim: (%, Character) -> %
-      ++ rightTrim(s,c) returns s with all trailing occurrences of c deleted.
-      ++ For example, \axiom{rightTrim("  abc  ", char " ")} 
-      ++ returns \axiom{"  abc"}.
-    rightTrim: (%, CharacterClass) -> %
-      ++ rightTrim(s,cc) returns s with all trailing occurences of
-      ++ characters in cc deleted.
-      ++ For example, \axiom{rightTrim("(abc)", charClass "()")} 
-      ++ returns \axiom{"(abc"}.
-    elt: (%, %) -> %
-      ++ elt(s,t) returns the concatenation of s and t. It is provided to
-      ++ allow juxtaposition of strings to work as concatenation.
-      ++ For example, \axiom{"smoo" "shed"} returns \axiom{"smooshed"}.
- add
-   trim(s: %, c:  Character)	  == leftTrim(rightTrim(s, c),	c)
-   trim(s: %, cc: CharacterClass) == leftTrim(rightTrim(s, cc), cc)
-
-   lowerCase s		 == lowerCase_! copy s
-   upperCase s		 == upperCase_! copy s
-   prefix?(s, t)	 == substring?(s, t, minIndex t)
-   coerce(c:Character):% == new(1, c)
-   elt(s:%, t:%): %	 == concat(s,t)$%
-
-@
-<<SRAGG.dotabb>>=
-"SRAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"SRAGG" -> "A1AGG"
-
-@
-<<SRAGG.dotfull>>=
-"StringAggregate()" [color=lightblue,href="books/bookvol10.pamphlet"];
-"StringAggregate()" -> "OneDimensionalArrayAggregate(Character)"
-
-@
-\section{category STAGG StreamAggregate}
-<<category STAGG StreamAggregate>>=
-)abbrev category STAGG StreamAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A stream aggregate is a linear aggregate which possibly has an infinite
-++ number of elements. A basic domain constructor which builds stream
-++ aggregates is \spadtype{Stream}. From streams, a number of infinite
-++ structures such power series can be built. A stream aggregate may
-++ also be infinite since it may be cyclic.
-++ For example, see \spadtype{DecimalExpansion}.
-StreamAggregate(S:Type): Category ==
-   Join(UnaryRecursiveAggregate S, LinearAggregate S) with
-      explicitlyFinite?: % -> Boolean
-	++ explicitlyFinite?(s) tests if the stream has a finite
-	++ number of elements, and false otherwise.
-	++ Note: for many datatypes, 
-        ++ \axiom{explicitlyFinite?(s) = not possiblyInfinite?(s)}.
-      possiblyInfinite?: % -> Boolean
-	++ possiblyInfinite?(s) tests if the stream s could possibly
-	++ have an infinite number of elements.
-	++ Note: for many datatypes, 
-        ++ \axiom{possiblyInfinite?(s) = not explictlyFinite?(s)}.
- add
-   c2: (%, %) -> S
-
-   explicitlyFinite? x == not cyclic? x
-   possiblyInfinite? x == cyclic? x
-   first(x, n)	       == construct [c2(x, x := rest x) for i in 1..n]
-
-   c2(x, r) ==
-     empty? x => error "Index out of range"
-     first x
-
-   elt(x:%, i:Integer) ==
-     i := i - minIndex x
-     (i < 0) or empty?(x := rest(x, i::NonNegativeInteger)) => _
-         error "index out of range"
-     first x
-
-   elt(x:%, i:UniversalSegment(Integer)) ==
-     l := lo(i) - minIndex x
-     l < 0 => error "index out of range"
-     not hasHi i => copy(rest(x, l::NonNegativeInteger))
-     (h := hi(i) - minIndex x) < l => empty()
-     first(rest(x, l::NonNegativeInteger), (h - l + 1)::NonNegativeInteger)
-
-   if % has shallowlyMutable then
-     concat(x:%, y:%) == concat_!(copy x, y)
-
-     concat l ==
-       empty? l => empty()
-       concat_!(copy first l, concat rest l)
-
-     map_!(f, l) ==
-       y := l
-       while not empty? l repeat
-	 setfirst_!(l, f first l)
-	 l := rest l
-       y
-
-     fill_!(x, s) ==
-       y := x
-       while not empty? y repeat (setfirst_!(y, s); y := rest y)
-       x
-
-     setelt(x:%, i:Integer, s:S) ==
-      i := i - minIndex x
-      (i < 0) or empty?(x := rest(x,i::NonNegativeInteger)) => _
-          error "index out of range"
-      setfirst_!(x, s)
-
-     setelt(x:%, i:UniversalSegment(Integer), s:S) ==
-      (l := lo(i) - minIndex x) < 0 => error "index out of range"
-      h := if hasHi i then hi(i) - minIndex x else maxIndex x
-      h < l => s
-      y := rest(x, l::NonNegativeInteger)
-      z := rest(y, (h - l + 1)::NonNegativeInteger)
-      while not eq?(y, z) repeat (setfirst_!(y, s); y := rest y)
-      s
-
-     concat_!(x:%, y:%) ==
-       empty? x => y
-       setrest_!(tail x, y)
-       x
-
-@
-<<STAGG.dotabb>>=
-"STAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"STAGG" -> "RCAGG"
-"STAGG" -> "LNAGG"
-
-@
-<<STAGG.dotfull>>=
-"StreamAggregate(a:Type)" [color=lightblue,href="books/bookvol10.pamphlet"];
-"StreamAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
-"StreamAggregate(a:Type)" -> "LinearAggregate(a:Type)"
-
-@
 \section{STAGG.lsp BOOTSTRAP}
 {\bf STAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf STAGG}
@@ -7026,428 +7910,6 @@ Note that this code is not included in the generated catdef.spad file.
        0 19 22 2 0 0 0 23 30 2 0 0 0 0 46 1 0 0 33 35 2 0 0 0 0 32))))))
   (QUOTE |lookupComplete|))) 
 @
-\section{category TBAGG TableAggregate}
-<<category TBAGG TableAggregate>>=
-)abbrev category TBAGG TableAggregate
-++ Author: Michael Monagan, Stephen Watt; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A table aggregate is a model of a table, i.e. a discrete many-to-one
-++ mapping from keys to entries.
-TableAggregate(Key:SetCategory, Entry:SetCategory): Category ==
-  Join(KeyedDictionary(Key,Entry),IndexedAggregate(Key,Entry)) with
-   setelt: (%,Key,Entry) -> Entry	   -- setelt_! later
-     ++ setelt(t,k,e) (also written \axiom{t.k := e}) is equivalent
-     ++ to \axiom{(insert([k,e],t); e)}.
-   table: () -> %
-     ++ table()$T creates an empty table of type T.
-     ++
-     ++E Data:=Record(age:Integer,gender:String)
-     ++E a1:AssociationList(String,Data):=table()
-     ++E a1."tim":=[55,"male"]$Data
-
-   table: List Record(key:Key,entry:Entry) -> %
-     ++ table([x,y,...,z]) creates a table consisting of entries
-     ++ \axiom{x,y,...,z}.
-   -- to become table: Record(key:Key,entry:Entry)* -> %
-   map: ((Entry, Entry) -> Entry, %, %) -> %
-     ++ map(fn,t1,t2) creates a new table t from given tables t1 and t2 with
-     ++ elements fn(x,y) where x and y are corresponding elements from t1
-     ++ and t2 respectively.
- add
-   table()	       == empty()
-   table l	       == dictionary l
--- empty()	       == dictionary()
-
-   insert_!(p, t)      == (t(p.key) := p.entry; t)
-   indices t	       == keys t
-
-   coerce(t:%):OutputForm ==
-     prefix("table"::OutputForm,
-		    [k::OutputForm = (t.k)::OutputForm for k in keys t])
-
-   elt(t, k) ==
-      (r := search(k, t)) case Entry => r::Entry
-      error "key not in table"
-
-   elt(t, k, e) ==
-      (r := search(k, t)) case Entry => r::Entry
-      e
-
-   map_!(f, t) ==
-      for k in keys t repeat t.k := f t.k
-      t
-
-   map(f:(Entry, Entry) -> Entry, s:%, t:%) ==
-      z := table()
-      for k in keys s | key?(k, t) repeat z.k := f(s.k, t.k)
-      z
-
--- map(f, s, t, x) ==
---    z := table()
---    for k in keys s repeat z.k := f(s.k, t(k, x))
---    for k in keys t | not key?(k, s) repeat z.k := f(t.k, x)
---    z
-
-   if % has finiteAggregate then
-     parts(t:%):List Record(key:Key,entry:Entry) == [[k, t.k] for k in keys t]
-     parts(t:%):List Entry   == [t.k for k in keys t]
-     entries(t:%):List Entry == parts(t)
-
-     s:% = t:% ==
-       eq?(s,t) => true
-       #s ^= #t => false
-       for k in keys s repeat
-	 (e := search(k, t)) case "failed" or (e::Entry) ^= s.k => return false
-       true
-
-     map(f: Record(key:Key,entry:Entry)->Record(key:Key,entry:Entry),t:%):%==
-       z := table()
-       for k in keys t repeat
-	 ke: Record(key:Key,entry:Entry) := f [k, t.k]
-	 z ke.key := ke.entry
-       z
-     map_!(f: Record(key:Key,entry:Entry)->Record(key:Key,entry:Entry),t:%):%_
-      ==
-       lke: List Record(key:Key,entry:Entry) := nil()
-       for k in keys t repeat
-	 lke := cons(f [k, remove_!(k,t)::Entry], lke)
-       for ke in lke repeat
-	 t ke.key := ke.entry
-       t
-
-     inspect(t: %): Record(key:Key,entry:Entry) ==
-       ks := keys t
-       empty? ks => error "Cannot extract from an empty aggregate"
-       [first ks, t first ks]
-
-     find(f: Record(key:Key,entry:Entry)->Boolean, t:%):_
-           Union(Record(key:Key,entry:Entry), "failed") ==
-       for ke in parts(t)@List(Record(key:Key,entry:Entry)) _
-          repeat if f ke then return ke
-       "failed"
-
-     index?(k: Key, t: %): Boolean ==
-       search(k,t) case Entry
-
-     remove_!(x:Record(key:Key,entry:Entry), t:%) ==
-       if member?(x, t) then remove_!(x.key, t)
-       t
-     extract_!(t: %): Record(key:Key,entry:Entry) ==
-       k: Record(key:Key,entry:Entry) := inspect t
-       remove_!(k.key, t)
-       k
-
-     any?(f: Entry->Boolean, t: %): Boolean ==
-       for k in keys t | f t k repeat return true
-       false
-     every?(f: Entry->Boolean, t: %): Boolean ==
-       for k in keys t | not f t k repeat return false
-       true
-     count(f: Entry->Boolean, t: %): NonNegativeInteger ==
-       tally: NonNegativeInteger := 0
-       for k in keys t | f t k repeat tally := tally + 1
-       tally
-
-@
-<<TBAGG.dotabb>>=
-"TBAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"TBAGG" -> "KDAGG"
-"TBAGG" -> "IXAGG"
-
-@
-<<TBAGG.dotfull>>=
-"TableAggregate(a:SetCategory,b:SetCategory)"
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"TableAggregate(a:SetCategory,b:SetCategory)" -> 
-    "KeyedDictionary(a:SetCategory,b:SetCategory)"
-"TableAggregate(a:SetCategory,b:SetCategory)" -> 
-    "IndexedAggregate(a:SetCategory,b:SetCategory)"
-
-@
-\section{category URAGG UnaryRecursiveAggregate}
-<<category URAGG UnaryRecursiveAggregate>>=
-)abbrev category URAGG UnaryRecursiveAggregate
-++ Author: Michael Monagan; revised by Manuel Bronstein and Richard Jenks
-++ Date Created: August 87 through August 88
-++ Date Last Updated: April 1991
-++ Basic Operations:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A unary-recursive aggregate is a one where nodes may have either
-++ 0 or 1 children.
-++ This aggregate models, though not precisely, a linked
-++ list possibly with a single cycle.
-++ A node with one children models a non-empty list, with the
-++ \spadfun{value} of the list designating the head, or \spadfun{first}, of the
-++ list, and the child designating the tail, or \spadfun{rest}, of the list.
-++ A node with no child then designates the empty list.
-++ Since these aggregates are recursive aggregates, they may be cyclic.
-UnaryRecursiveAggregate(S:Type): Category == RecursiveAggregate S with
-   concat: (%,%) -> %
-      ++ concat(u,v) returns an aggregate w consisting of the elements of u
-      ++ followed by the elements of v.
-      ++ Note: \axiom{v = rest(w,#a)}.
-   concat: (S,%) -> %
-      ++ concat(x,u) returns aggregate consisting of x followed by
-      ++ the elements of u.
-      ++ Note: if \axiom{v = concat(x,u)} then \axiom{x = first v}
-      ++ and \axiom{u = rest v}.
-   first: % -> S
-      ++ first(u) returns the first element of u
-      ++ (equivalently, the value at the current node).
-   elt: (%,"first") -> S
-      ++ elt(u,"first") (also written: \axiom{u . first}) 
-      ++ is equivalent to first u.
-   first: (%,NonNegativeInteger) -> %
-      ++ first(u,n) returns a copy of the first n (\axiom{n >= 0}) 
-      ++ elements of u.
-   rest: % -> %
-      ++ rest(u) returns an aggregate consisting of all but the first
-      ++ element of u
-      ++ (equivalently, the next node of u).
-   elt: (%,"rest") -> %
-      ++ elt(%,"rest") (also written: \axiom{u.rest}) is
-      ++ equivalent to \axiom{rest u}.
-   rest: (%,NonNegativeInteger) -> %
-      ++ rest(u,n) returns the \axiom{n}th (n >= 0) node of u.
-      ++ Note: \axiom{rest(u,0) = u}.
-   last: % -> S
-      ++ last(u) resturn the last element of u.
-      ++ Note: for lists, \axiom{last(u) = u . (maxIndex u) = u . (# u - 1)}.
-   elt: (%,"last") -> S
-      ++ elt(u,"last") (also written: \axiom{u . last}) is equivalent 
-      ++ to last u.
-   last: (%,NonNegativeInteger) -> %
-      ++ last(u,n) returns a copy of the last n (\axiom{n >= 0}) nodes of u.
-      ++ Note: \axiom{last(u,n)} is a list of n elements.
-   tail: % -> %
-      ++ tail(u) returns the last node of u.
-      ++ Note: if u is \axiom{shallowlyMutable},
-      ++ \axiom{setrest(tail(u),v) = concat(u,v)}.
-   second: % -> S
-      ++ second(u) returns the second element of u.
-      ++ Note: \axiom{second(u) = first(rest(u))}.
-   third: % -> S
-      ++ third(u) returns the third element of u.
-      ++ Note: \axiom{third(u) = first(rest(rest(u)))}.
-   cycleEntry: % -> %
-      ++ cycleEntry(u) returns the head of a top-level cycle contained in
-      ++ aggregate u, or \axiom{empty()} if none exists.
-   cycleLength: % -> NonNegativeInteger
-      ++ cycleLength(u) returns the length of a top-level cycle
-      ++ contained  in aggregate u, or 0 is u has no such cycle.
-   cycleTail: % -> %
-      ++ cycleTail(u) returns the last node in the cycle, or
-      ++ empty if none exists.
-   if % has shallowlyMutable then
-      concat_!: (%,%) -> %
-	++ concat!(u,v) destructively concatenates v to the end of u.
-	++ Note: \axiom{concat!(u,v) = setlast_!(u,v)}.
-      concat_!: (%,S) -> %
-	++ concat!(u,x) destructively adds element x to the end of u.
-	++ Note: \axiom{concat!(a,x) = setlast!(a,[x])}.
-      cycleSplit_!: % -> %
-	++ cycleSplit!(u) splits the aggregate by dropping off the cycle.
-	++ The value returned is the cycle entry, or nil if none exists.
-	++ For example, if \axiom{w = concat(u,v)} is the cyclic list where 
-	++ v is the head of the cycle, \axiom{cycleSplit!(w)} will drop v 
-	++ off w thus destructively changing w to u, and returning v.
-      setfirst_!: (%,S) -> S
-	++ setfirst!(u,x) destructively changes the first element of a to x.
-      setelt: (%,"first",S) -> S
-	++ setelt(u,"first",x) (also written: \axiom{u.first := x}) is
-	++ equivalent to \axiom{setfirst!(u,x)}.
-      setrest_!: (%,%) -> %
-	++ setrest!(u,v) destructively changes the rest of u to v.
-      setelt: (%,"rest",%) -> %
-	++ setelt(u,"rest",v) (also written: \axiom{u.rest := v}) is 
-	++ equivalent to \axiom{setrest!(u,v)}.
-      setlast_!: (%,S) -> S
-	++ setlast!(u,x) destructively changes the last element of u to x.
-      setelt: (%,"last",S) -> S
-	++ setelt(u,"last",x) (also written: \axiom{u.last := b})
-	++ is equivalent to \axiom{setlast!(u,v)}.
-      split_!: (%,Integer) -> %
-	 ++ split!(u,n) splits u into two aggregates: \axiom{v = rest(u,n)}
-	 ++ and \axiom{w = first(u,n)}, returning \axiom{v}.
-	 ++ Note: afterwards \axiom{rest(u,n)} returns \axiom{empty()}.
- add
-  cycleMax ==> 1000
-
-  findCycle: % -> %
-
-  elt(x, "first") == first x
-  elt(x,  "last") == last x
-  elt(x,  "rest") == rest x
-  second x	  == first rest x
-  third x	  == first rest rest x
-  cyclic? x	  == not empty? x and not empty? findCycle x
-  last x	  == first tail x
-
-  nodes x ==
-    l := empty()$List(%)
-    while not empty? x repeat
-      l := concat(x, l)
-      x := rest x
-    reverse_! l
-
-  children x ==
-    l := empty()$List(%)
-    empty? x => l
-    concat(rest x,l)
-
-  leaf? x == empty? x
-
-  value x ==
-    empty? x => error "value of empty object"
-    first x
-
-  less?(l, n) ==
-    i := n::Integer
-    while i > 0 and not empty? l repeat (l := rest l; i := i - 1)
-    i > 0
-
-  more?(l, n) ==
-    i := n::Integer
-    while i > 0 and not empty? l repeat (l := rest l; i := i - 1)
-    zero?(i) and not empty? l
-
-  size?(l, n) ==
-    i := n::Integer
-    while not empty? l and i > 0 repeat (l := rest l; i := i - 1)
-    empty? l and zero? i
-
-  #x ==
-    for k in 0.. while not empty? x repeat
-      k = cycleMax and cyclic? x => error "cyclic list"
-      x := rest x
-    k
-
-  tail x ==
-    empty? x => error "empty list"
-    y := rest x
-    for k in 0.. while not empty? y repeat
-      k = cycleMax and cyclic? x => error "cyclic list"
-      y := rest(x := y)
-    x
-
-  findCycle x ==
-    y := rest x
-    while not empty? y repeat
-      if eq?(x, y) then return x
-      x := rest x
-      y := rest y
-      if empty? y then return y
-      if eq?(x, y) then return y
-      y := rest y
-    y
-
-  cycleTail x ==
-    empty?(y := x := cycleEntry x) => x
-    z := rest x
-    while not eq?(x,z) repeat (y := z; z := rest z)
-    y
-
-  cycleEntry x ==
-    empty? x => x
-    empty?(y := findCycle x) => y
-    z := rest y
-    for l in 1.. while not eq?(y,z) repeat z := rest z
-    y := x
-    for k in 1..l repeat y := rest y
-    while not eq?(x,y) repeat (x := rest x; y := rest y)
-    x
-
-  cycleLength x ==
-    empty? x => 0
-    empty?(x := findCycle x) => 0
-    y := rest x
-    for k in 1.. while not eq?(x,y) repeat y := rest y
-    k
-
-  rest(x, n) ==
-    for i in 1..n repeat
-      empty? x => error "Index out of range"
-      x := rest x
-    x
-
-  if % has finiteAggregate then
-    last(x, n) ==
-      n > (m := #x) => error "index out of range"
-      copy rest(x, (m - n)::NonNegativeInteger)
-
-  if S has SetCategory then
-    x = y ==
-      eq?(x, y) => true
-      for k in 0.. while not empty? x and not empty? y repeat
-	k = cycleMax and cyclic? x => error "cyclic list"
-	first x ^= first y => return false
-	x := rest x
-	y := rest y
-      empty? x and empty? y
-
-    node?(u, v) ==
-      for k in 0.. while not empty? v repeat
-	u = v => return true
-	k = cycleMax and cyclic? v => error "cyclic list"
-	v := rest v
-      u=v
-
-  if % has shallowlyMutable then
-    setelt(x, "first", a) == setfirst_!(x, a)
-    setelt(x,  "last", a) == setlast_!(x, a)
-    setelt(x,  "rest", a) == setrest_!(x, a)
-    concat(x:%, y:%)	  == concat_!(copy x, y)
-
-    setlast_!(x, s) ==
-      empty? x => error "setlast: empty list"
-      setfirst_!(tail x, s)
-      s
-
-    setchildren_!(u,lv) ==
-      #lv=1 => setrest_!(u, first lv)
-      error "wrong number of children specified"
-
-    setvalue_!(u,s) == setfirst_!(u,s)
-
-    split_!(p, n) ==
-      n < 1 => error "index out of range"
-      p := rest(p, (n - 1)::NonNegativeInteger)
-      q := rest p
-      setrest_!(p, empty())
-      q
-
-    cycleSplit_! x ==
-      empty?(y := cycleEntry x) or eq?(x, y) => y
-      z := rest x
-      while not eq?(z, y) repeat (x := z; z := rest z)
-      setrest_!(x, empty())
-      y
-
-@
-<<URAGG.dotabb>>=
-"URAGG" [color=lightblue,href="books/bookvol10.pamphlet"];
-"URAGG" -> "RCAGG"
-
-@
-<<URAGG.dotfull>>=
-"UnaryRecursiveAggregate(a:Type)" 
-    [color=lightblue,href="books/bookvol10.pamphlet"];
-"UnaryRecursiveAggregate(a:Type)" -> "RecursiveAggregate(a:Type)"
-
-@
 \section{URAGG.lsp BOOTSTRAP}
 {\bf URAGG} depends on a chain of files. We need to break this cycle to build
 the algebra. So we keep a cached copy of the translated {\bf URAGG}
@@ -8220,6 +8682,7 @@ Note that this code is not included in the generated catdef.spad file.
        0 26 2 0 19 0 0 47 1 0 29 0 34))))))
   (QUOTE |lookupComplete|))) 
 @
+\chapter{Chunk collections}
 <<algebra>>=
 <<category AGG Aggregate>>
 <<category ALAGG AssociationListAggregate>>
@@ -8240,6 +8703,8 @@ Note that this code is not included in the generated catdef.spad file.
 <<category HOAGG HomogeneousAggregate>>
 <<category IXAGG IndexedAggregate>>
 <<category KDAGG KeyedDictionary>>
+<<category KOERCE CoercibleTo>>
+<<category KONVERT ConvertibleTo>>
 <<category LNAGG LinearAggregate>>
 <<category LSAGG ListAggregate>>
 <<category MDAGG MultiDictionary>>
@@ -8248,17 +8713,19 @@ Note that this code is not included in the generated catdef.spad file.
 <<category PRQAGG PriorityQueueAggregate>>
 <<category QUAGG QueueAggregate>>
 <<category RCAGG RecursiveAggregate>>
+<<category RETRACT RetractableTo>>
 <<category SETAGG SetAggregate>>
 <<category SKAGG StackAggregate>>
 <<category SRAGG StringAggregate>>
 <<category STAGG StreamAggregate>>
+<<category TYPE Type>>
 <<category TBAGG TableAggregate>>
 <<category URAGG UnaryRecursiveAggregate>>
 @
 <<dotabb>>=
 digraph dotabb {
  ranksep=1.25;
- bgcolor="#FFFF66"
+ bgcolor="#FFFF66";
  node [shape=box, color=white, style=filled];
 
 "CATEGORY" [color=lightblue,href="books/bookvol10.pamphlet"];
@@ -8282,6 +8749,8 @@ digraph dotabb {
 <<HOAGG.dotabb>>
 <<IXAGG.dotabb>>
 <<KDAGG.dotabb>>
+<<KOERCE.dotabb>>
+<<KONVERT.dotabb>>
 <<LNAGG.dotabb>>
 <<LSAGG.dotabb>>
 <<MDAGG.dotabb>>
@@ -8290,10 +8759,12 @@ digraph dotabb {
 <<PRQAGG.dotabb>>
 <<QUAGG.dotabb>>
 <<RCAGG.dotabb>>
+<<RETRACT.dotabb>>
 <<SETAGG.dotabb>>
 <<SKAGG.dotabb>>
 <<SRAGG.dotabb>>
 <<STAGG.dotabb>>
+<<TYPE.dotabb>>
 <<TBAGG.dotabb>>
 <<URAGG.dotabb>>
 }
@@ -8303,7 +8774,7 @@ digraph dotfull {
  ranksep=1.25;
  nodesep=1.5;
  fontsize=10;
- bgcolor="#FFFF66"
+ bgcolor="#FFFF66";
  node [shape=box, color=white, style=filled];
 
 "Category" [color=lightblue,href="books/bookvol10.pamphlet"];
@@ -8327,6 +8798,8 @@ digraph dotfull {
 <<HOAGG.dotfull>>
 <<IXAGG.dotfull>>
 <<KDAGG.dotfull>>
+<<KOERCE.dotfull>>
+<<KONVERT.dotfull>>
 <<LNAGG.dotfull>>
 <<LSAGG.dotfull>>
 <<MDAGG.dotfull>>
@@ -8335,10 +8808,12 @@ digraph dotfull {
 <<PRQAGG.dotfull>>
 <<QUAGG.dotfull>>
 <<RCAGG.dotfull>>
+<<RETRACT.dotfull>>
 <<SETAGG.dotfull>>
 <<SKAGG.dotfull>>
 <<SRAGG.dotfull>>
 <<STAGG.dotfull>>
+<<TYPE.dotfull>>
 <<TBAGG.dotfull>>
 <<URAGG.dotfull>>
 }
diff --git a/books/ps/v10agg.ps b/books/ps/v10agg.ps
new file mode 100644
index 0000000..b435416
--- /dev/null
+++ b/books/ps/v10agg.ps
@@ -0,0 +1,350 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 128 224
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 128 224
+%%PageOrientation: Portrait
+gsave
+36 36 92 188 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 186 lineto
+90 186 lineto
+90 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 186 lineto
+90 186 lineto
+90 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Aggregate()
+[ /Rect [ 0 144 84 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 180 moveto
+0 180 lineto
+0 144 lineto
+84 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 180 moveto
+0 180 lineto
+0 144 lineto
+84 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Type()
+[ /Rect [ 15 72 69 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 69 108 moveto
+15 108 lineto
+15 72 lineto
+69 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 69 108 moveto
+15 108 lineto
+15 72 lineto
+69 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+23 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 42 144 moveto
+42 136 42 127 42 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 46 118 moveto
+42 108 lineto
+39 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 46 118 moveto
+42 108 lineto
+39 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 8 0 76 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 76 36 moveto
+8 36 lineto
+8 0 lineto
+76 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 76 36 moveto
+8 36 lineto
+8 0 lineto
+76 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+16 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 42 72 moveto
+42 64 42 55 42 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 46 46 moveto
+42 36 lineto
+39 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 46 46 moveto
+42 36 lineto
+39 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10associationlistaggregate.ps b/books/ps/v10associationlistaggregate.ps
new file mode 100644
index 0000000..db58d87
--- /dev/null
+++ b/books/ps/v10associationlistaggregate.ps
@@ -0,0 +1,778 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 971 368
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 971 368
+%%PageOrientation: Portrait
+gsave
+36 36 935 332 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+933 330 lineto
+933 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+933 330 lineto
+933 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% AssociationListAggregate(a:SetCategory,b:SetCategory)
+[ /Rect [ 268 288 602 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 602 324 moveto
+268 324 lineto
+268 288 lineto
+602 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 602 324 moveto
+268 324 lineto
+268 288 lineto
+602 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+276 301 moveto
+(AssociationListAggregate\(a:SetCategory,b:SetCategory\))
+[10.08 5.52 5.52 6.96 6.24 3.84 6.24 3.84 3.84 6.96 6.96 8.64 3.84 5.28 3.84 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% TableAggregate(a:SetCategory,b:SetCategory)
+[ /Rect [ 101 216 377 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 377 252 moveto
+101 252 lineto
+101 216 lineto
+377 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 377 252 moveto
+101 252 lineto
+101 216 lineto
+377 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+108 229 moveto
+(TableAggregate\(a:SetCategory,b:SetCategory\))
+[7.68 6.24 6.96 3.84 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% AssociationListAggregate(a:SetCategory,b:SetCategory)->TableAggregate(a:SetCategory,b:SetCategory)
+newpath 386 288 moveto
+359 278 326 266 298 256 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 299 252 moveto
+288 252 lineto
+296 259 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 299 252 moveto
+288 252 lineto
+296 259 lineto
+closepath
+stroke
+end grestore
+% ListAggregate(Record(a:SetCategory,b:SetCategory))
+[ /Rect [ 473 216 789 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 789 252 moveto
+473 252 lineto
+473 216 lineto
+789 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 789 252 moveto
+473 252 lineto
+473 216 lineto
+789 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+481 229 moveto
+(ListAggregate\(Record\(a:SetCategory,b:SetCategory\)\))
+[8.64 3.84 5.28 3.84 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 9.12 6.24 6.24 6.96 4.56 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AssociationListAggregate(a:SetCategory,b:SetCategory)->ListAggregate(Record(a:SetCategory,b:SetCategory))
+newpath 484 288 moveto
+511 278 544 266 572 256 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 574 259 moveto
+582 252 lineto
+571 252 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 574 259 moveto
+582 252 lineto
+571 252 lineto
+closepath
+stroke
+end grestore
+% KDAGG...
+[ /Rect [ 0 144 76 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 76 180 moveto
+0 180 lineto
+0 144 lineto
+76 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 76 180 moveto
+0 180 lineto
+0 144 lineto
+76 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(KDAGG...)
+[9.84 9.12 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% TableAggregate(a:SetCategory,b:SetCategory)->KDAGG...
+newpath 188 216 moveto
+160 207 125 194 86 180 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 87 177 moveto
+76 177 lineto
+85 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 87 177 moveto
+76 177 lineto
+85 183 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:SetCategory)
+[ /Rect [ 94 144 384 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 384 180 moveto
+94 180 lineto
+94 144 lineto
+384 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 384 180 moveto
+94 180 lineto
+94 144 lineto
+384 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+101 157 moveto
+(IndexedAggregate\(a:SetCategory,b:SetCategory\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% TableAggregate(a:SetCategory,b:SetCategory)->IndexedAggregate(a:SetCategory,b:SetCategory)
+newpath 239 216 moveto
+239 208 239 199 239 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 190 moveto
+239 180 lineto
+236 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 190 moveto
+239 180 lineto
+236 190 lineto
+closepath
+stroke
+end grestore
+% ListAggregate(a:Type)
+[ /Rect [ 638 144 780 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 780 180 moveto
+638 180 lineto
+638 144 lineto
+780 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 780 180 moveto
+638 180 lineto
+638 144 lineto
+780 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+645 157 moveto
+(ListAggregate\(a:Type\))
+[8.64 3.84 5.28 3.84 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% ListAggregate(Record(a:SetCategory,b:SetCategory))->ListAggregate(a:Type)
+newpath 651 216 moveto
+661 207 672 197 682 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 685 189 moveto
+690 180 lineto
+680 184 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 685 189 moveto
+690 180 lineto
+680 184 lineto
+closepath
+stroke
+end grestore
+% IXAGG...
+[ /Rect [ 308 72 380 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 380 108 moveto
+308 108 lineto
+308 72 lineto
+380 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 380 108 moveto
+308 108 lineto
+308 72 lineto
+380 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+315 85 moveto
+(IXAGG...)
+[4.56 10.08 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(a:SetCategory,b:SetCategory)->IXAGG...
+newpath 265 144 moveto
+278 135 295 124 309 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 312 116 moveto
+318 108 lineto
+308 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 312 116 moveto
+318 108 lineto
+308 111 lineto
+closepath
+stroke
+end grestore
+% FiniteLinearAggregate(a:Type)
+[ /Rect [ 503 72 693 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 693 108 moveto
+503 108 lineto
+503 72 lineto
+693 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 693 108 moveto
+503 108 lineto
+503 72 lineto
+693 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+511 85 moveto
+(FiniteLinearAggregate\(a:Type\))
+[7.44 3.84 6.96 3.84 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% ListAggregate(a:Type)->FiniteLinearAggregate(a:Type)
+newpath 681 144 moveto
+667 135 649 124 634 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 636 111 moveto
+626 108 lineto
+632 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 636 111 moveto
+626 108 lineto
+632 117 lineto
+closepath
+stroke
+end grestore
+% ExtensibleLinearAggregate(a:Type)
+[ /Rect [ 711 72 927 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 927 108 moveto
+711 108 lineto
+711 72 lineto
+927 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 927 108 moveto
+711 108 lineto
+711 72 lineto
+927 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+718 85 moveto
+(ExtensibleLinearAggregate\(a:Type\))
+[8.64 6.96 3.84 6.24 6.96 5.52 3.84 6.96 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% ListAggregate(a:Type)->ExtensibleLinearAggregate(a:Type)
+newpath 737 144 moveto
+751 135 768 124 783 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 786 116 moveto
+792 108 lineto
+782 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 786 116 moveto
+792 108 lineto
+782 111 lineto
+closepath
+stroke
+end grestore
+% LNAGG...
+[ /Rect [ 671 0 745 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 745 36 moveto
+671 36 lineto
+671 0 lineto
+745 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 745 36 moveto
+671 36 lineto
+671 0 lineto
+745 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+678 13 moveto
+(LNAGG...)
+[8.64 9.6 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)->LNAGG...
+newpath 626 72 moveto
+640 63 657 52 672 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 675 44 moveto
+681 36 lineto
+671 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 675 44 moveto
+681 36 lineto
+671 39 lineto
+closepath
+stroke
+end grestore
+% ExtensibleLinearAggregate(a:Type)->LNAGG...
+newpath 791 72 moveto
+777 63 759 52 744 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 746 39 moveto
+736 36 lineto
+742 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 746 39 moveto
+736 36 lineto
+742 45 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 402 144 620 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 620 180 moveto
+402 180 lineto
+402 144 lineto
+620 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 620 180 moveto
+402 180 lineto
+402 144 lineto
+620 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+409 157 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IXAGG...
+newpath 469 144 moveto
+444 133 414 120 389 110 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 391 107 moveto
+380 106 lineto
+388 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 391 107 moveto
+380 106 lineto
+388 113 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10bagaggregate.ps b/books/ps/v10bagaggregate.ps
new file mode 100644
index 0000000..5a65684
--- /dev/null
+++ b/books/ps/v10bagaggregate.ps
@@ -0,0 +1,452 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 368
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 368
+%%PageOrientation: Portrait
+gsave
+36 36 210 332 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+208 330 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+208 330 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% BagAggregate(a:Type)
+[ /Rect [ 29 288 173 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+36 301 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 101 288 moveto
+101 280 101 271 101 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10binaryrecursiveaggregate.ps b/books/ps/v10binaryrecursiveaggregate.ps
new file mode 100644
index 0000000..65aa18e
--- /dev/null
+++ b/books/ps/v10binaryrecursiveaggregate.ps
@@ -0,0 +1,503 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 260 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 260 440
+%%PageOrientation: Portrait
+gsave
+36 36 224 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+222 402 lineto
+222 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+222 402 lineto
+222 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% BinaryRecursiveAggregate(a:Type)
+[ /Rect [ 0 360 216 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 216 396 moveto
+0 396 lineto
+0 360 lineto
+216 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 216 396 moveto
+0 396 lineto
+0 360 lineto
+216 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 373 moveto
+(BinaryRecursiveAggregate\(a:Type\))
+[9.36 3.84 6.96 6.24 5.04 6.96 9.12 6.24 6.24 6.96 4.8 5.52 3.84 6.48 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)
+[ /Rect [ 20 288 196 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 196 324 moveto
+20 324 lineto
+20 288 lineto
+196 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 196 324 moveto
+20 324 lineto
+20 288 lineto
+196 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+27 301 moveto
+(RecursiveAggregate\(a:Type\))
+[9.12 6.24 6.24 6.96 4.8 5.52 3.84 6.48 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BinaryRecursiveAggregate(a:Type)->RecursiveAggregate(a:Type)
+newpath 108 360 moveto
+108 352 108 343 108 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 112 334 moveto
+108 324 lineto
+105 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 112 334 moveto
+108 324 lineto
+105 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 7 216 209 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 209 252 moveto
+7 252 lineto
+7 216 lineto
+209 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 209 252 moveto
+7 252 lineto
+7 216 lineto
+209 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+14 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 108 288 moveto
+108 280 108 271 108 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 112 262 moveto
+108 252 lineto
+105 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 112 262 moveto
+108 252 lineto
+105 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 66 144 150 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 150 180 moveto
+66 180 lineto
+66 144 lineto
+150 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 150 180 moveto
+66 180 lineto
+66 144 lineto
+150 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+73 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 108 216 moveto
+108 208 108 199 108 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 112 190 moveto
+108 180 lineto
+105 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 112 190 moveto
+108 180 lineto
+105 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 81 72 135 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 108 moveto
+81 108 lineto
+81 72 lineto
+135 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 108 moveto
+81 108 lineto
+81 72 lineto
+135 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+89 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 108 144 moveto
+108 136 108 127 108 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 112 118 moveto
+108 108 lineto
+105 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 112 118 moveto
+108 108 lineto
+105 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 74 0 142 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 142 36 moveto
+74 36 lineto
+74 0 lineto
+142 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 142 36 moveto
+74 36 lineto
+74 0 lineto
+142 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 108 72 moveto
+108 64 108 55 108 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 112 46 moveto
+108 36 lineto
+105 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 112 46 moveto
+108 36 lineto
+105 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10collection.ps b/books/ps/v10collection.ps
new file mode 100644
index 0000000..c9c5e27
--- /dev/null
+++ b/books/ps/v10collection.ps
@@ -0,0 +1,452 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 368
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 368
+%%PageOrientation: Portrait
+gsave
+36 36 210 332 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+208 330 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+208 330 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Collection(a:Type)
+[ /Rect [ 41 288 161 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 161 324 moveto
+41 324 lineto
+41 288 lineto
+161 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 161 324 moveto
+41 324 lineto
+41 288 lineto
+161 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+48 301 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 101 288 moveto
+101 280 101 271 101 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10dequeueaggregate.ps b/books/ps/v10dequeueaggregate.ps
new file mode 100644
index 0000000..d67a0a0
--- /dev/null
+++ b/books/ps/v10dequeueaggregate.ps
@@ -0,0 +1,523 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 372 368
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 372 368
+%%PageOrientation: Portrait
+gsave
+36 36 336 332 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+334 330 lineto
+334 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+334 330 lineto
+334 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DequeueAggregate(a:Type)
+[ /Rect [ 76 288 248 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 248 324 moveto
+76 324 lineto
+76 288 lineto
+248 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 248 324 moveto
+76 324 lineto
+76 288 lineto
+248 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+84 301 moveto
+(DequeueAggregate\(a:Type\))
+[10.08 6.24 6.72 6.96 6.24 6.96 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% StackAggregate(a:Type)
+[ /Rect [ 0 216 152 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 152 252 moveto
+0 252 lineto
+0 216 lineto
+152 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 152 252 moveto
+0 252 lineto
+0 216 lineto
+152 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(StackAggregate\(a:Type\))
+[7.44 4.08 6.24 6 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% DequeueAggregate(a:Type)->StackAggregate(a:Type)
+newpath 140 288 moveto
+129 279 116 268 105 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 107 255 moveto
+97 252 lineto
+103 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 107 255 moveto
+97 252 lineto
+103 261 lineto
+closepath
+stroke
+end grestore
+% QueueAggregate(a:Type)
+[ /Rect [ 170 216 328 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 328 252 moveto
+170 252 lineto
+170 216 lineto
+328 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 328 252 moveto
+170 252 lineto
+170 216 lineto
+328 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+178 229 moveto
+(QueueAggregate\(a:Type\))
+[10.08 6.96 6.24 6.96 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% DequeueAggregate(a:Type)->QueueAggregate(a:Type)
+newpath 184 288 moveto
+195 279 208 268 219 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 221 261 moveto
+227 252 lineto
+217 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 221 261 moveto
+227 252 lineto
+217 255 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 90 144 234 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 180 moveto
+90 180 lineto
+90 144 lineto
+234 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 180 moveto
+90 180 lineto
+90 144 lineto
+234 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+97 157 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% StackAggregate(a:Type)->BagAggregate(a:Type)
+newpath 98 216 moveto
+109 207 122 196 133 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 135 189 moveto
+141 180 lineto
+131 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 135 189 moveto
+141 180 lineto
+131 183 lineto
+closepath
+stroke
+end grestore
+% QueueAggregate(a:Type)->BagAggregate(a:Type)
+newpath 227 216 moveto
+216 207 203 196 192 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 194 183 moveto
+184 180 lineto
+190 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 194 183 moveto
+184 180 lineto
+190 189 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 61 72 263 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 263 108 moveto
+61 108 lineto
+61 72 lineto
+263 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 263 108 moveto
+61 108 lineto
+61 72 lineto
+263 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+68 85 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 162 144 moveto
+162 136 162 127 162 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 166 118 moveto
+162 108 lineto
+159 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 166 118 moveto
+162 108 lineto
+159 118 lineto
+closepath
+stroke
+end grestore
+% ...
+[ /Rect [ 135 0 189 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 189 36 moveto
+135 36 lineto
+135 0 lineto
+189 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 189 36 moveto
+135 36 lineto
+135 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 13 moveto
+(...)
+[3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->...
+newpath 162 72 moveto
+162 64 162 55 162 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 166 46 moveto
+162 36 lineto
+159 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 166 46 moveto
+162 36 lineto
+159 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10dictionary.ps b/books/ps/v10dictionary.ps
new file mode 100644
index 0000000..cc12edb
--- /dev/null
+++ b/books/ps/v10dictionary.ps
@@ -0,0 +1,625 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 410 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 410 440
+%%PageOrientation: Portrait
+gsave
+36 36 374 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+372 402 lineto
+372 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+372 402 lineto
+372 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Dictionary(a:SetCategory)
+[ /Rect [ 106 360 272 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 272 396 moveto
+106 396 lineto
+106 360 lineto
+272 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 272 396 moveto
+106 396 lineto
+106 360 lineto
+272 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+114 373 moveto
+(Dictionary\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)
+[ /Rect [ 76 288 302 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 302 324 moveto
+76 324 lineto
+76 288 lineto
+302 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 302 324 moveto
+76 324 lineto
+76 288 lineto
+302 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+83 301 moveto
+(DictionaryOperations\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 10.08 6.96 6.24 4.8 6.24 3.84 3.84 6.96 6.96 5.52 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Dictionary(a:SetCategory)->DictionaryOperations(a:SetCategory)
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:SetCategory)
+[ /Rect [ 0 216 186 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 186 252 moveto
+0 252 lineto
+0 216 lineto
+186 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 186 252 moveto
+0 252 lineto
+0 216 lineto
+186 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(BagAggregate\(a:SetCategory\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BagAggregate(a:SetCategory)
+newpath 165 288 moveto
+153 279 138 268 125 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 127 255 moveto
+117 252 lineto
+123 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 127 255 moveto
+117 252 lineto
+123 261 lineto
+closepath
+stroke
+end grestore
+% Collection(a:SetCategory)
+[ /Rect [ 204 216 366 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 366 252 moveto
+204 252 lineto
+204 216 lineto
+366 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 366 252 moveto
+204 252 lineto
+204 216 lineto
+366 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+211 229 moveto
+(Collection\(a:SetCategory\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->Collection(a:SetCategory)
+newpath 213 288 moveto
+225 279 240 268 253 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 255 261 moveto
+261 252 lineto
+251 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 255 261 moveto
+261 252 lineto
+251 255 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 31 144 175 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 175 180 moveto
+31 180 lineto
+31 144 lineto
+175 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 175 180 moveto
+31 180 lineto
+31 144 lineto
+175 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 157 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:SetCategory)->BagAggregate(a:Type)
+newpath 96 216 moveto
+97 208 98 199 99 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 102 190 moveto
+100 180 lineto
+96 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 102 190 moveto
+100 180 lineto
+96 190 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 214 144 334 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 334 180 moveto
+214 180 lineto
+214 144 lineto
+334 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 334 180 moveto
+214 180 lineto
+214 144 lineto
+334 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 157 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:SetCategory)->Collection(a:Type)
+newpath 282 216 moveto
+281 208 279 199 278 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 281 190 moveto
+277 180 lineto
+275 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 281 190 moveto
+277 180 lineto
+275 190 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 87 72 289 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 289 108 moveto
+87 108 lineto
+87 72 lineto
+289 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 289 108 moveto
+87 108 lineto
+87 72 lineto
+289 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+94 85 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 124 144 moveto
+135 135 148 124 159 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 161 117 moveto
+167 108 lineto
+157 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 161 117 moveto
+167 108 lineto
+157 111 lineto
+closepath
+stroke
+end grestore
+% ...
+[ /Rect [ 161 0 215 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+161 36 lineto
+161 0 lineto
+215 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+161 36 lineto
+161 0 lineto
+215 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+182 13 moveto
+(...)
+[3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->...
+newpath 188 72 moveto
+188 64 188 55 188 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 192 46 moveto
+188 36 lineto
+185 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 192 46 moveto
+188 36 lineto
+185 46 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 252 144 moveto
+241 135 228 124 217 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 219 111 moveto
+209 108 lineto
+215 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 219 111 moveto
+209 108 lineto
+215 117 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10dictionaryoperations.ps b/books/ps/v10dictionaryoperations.ps
new file mode 100644
index 0000000..77258d3
--- /dev/null
+++ b/books/ps/v10dictionaryoperations.ps
@@ -0,0 +1,676 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 410 512
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 410 512
+%%PageOrientation: Portrait
+gsave
+36 36 374 476 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+372 474 lineto
+372 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+372 474 lineto
+372 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DictionaryOperations(a:SetCategory)
+[ /Rect [ 76 432 302 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 302 468 moveto
+76 468 lineto
+76 432 lineto
+302 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 302 468 moveto
+76 468 lineto
+76 432 lineto
+302 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+83 445 moveto
+(DictionaryOperations\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 10.08 6.96 6.24 4.8 6.24 3.84 3.84 6.96 6.96 5.52 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:SetCategory)
+[ /Rect [ 0 360 186 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 186 396 moveto
+0 396 lineto
+0 360 lineto
+186 360 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 186 396 moveto
+0 396 lineto
+0 360 lineto
+186 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 373 moveto
+(BagAggregate\(a:SetCategory\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BagAggregate(a:SetCategory)
+newpath 165 432 moveto
+153 423 138 412 125 402 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 127 399 moveto
+117 396 lineto
+123 405 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 127 399 moveto
+117 396 lineto
+123 405 lineto
+closepath
+stroke
+end grestore
+% Collection(a:SetCategory)
+[ /Rect [ 204 360 366 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 366 396 moveto
+204 396 lineto
+204 360 lineto
+366 360 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 366 396 moveto
+204 396 lineto
+204 360 lineto
+366 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+211 373 moveto
+(Collection\(a:SetCategory\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->Collection(a:SetCategory)
+newpath 213 432 moveto
+225 423 240 412 253 402 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 255 405 moveto
+261 396 lineto
+251 399 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 255 405 moveto
+261 396 lineto
+251 399 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 31 288 175 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 175 324 moveto
+31 324 lineto
+31 288 lineto
+175 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 175 324 moveto
+31 324 lineto
+31 288 lineto
+175 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 301 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:SetCategory)->BagAggregate(a:Type)
+newpath 96 360 moveto
+97 352 98 343 99 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 102 334 moveto
+100 324 lineto
+96 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 102 334 moveto
+100 324 lineto
+96 334 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 214 288 334 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 334 324 moveto
+214 324 lineto
+214 288 lineto
+334 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 334 324 moveto
+214 324 lineto
+214 288 lineto
+334 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 301 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:SetCategory)->Collection(a:Type)
+newpath 282 360 moveto
+281 352 279 343 278 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 281 334 moveto
+277 324 lineto
+275 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 281 334 moveto
+277 324 lineto
+275 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 87 216 289 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 289 252 moveto
+87 252 lineto
+87 216 lineto
+289 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 289 252 moveto
+87 252 lineto
+87 216 lineto
+289 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+94 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 124 288 moveto
+135 279 148 268 159 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 161 261 moveto
+167 252 lineto
+157 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 161 261 moveto
+167 252 lineto
+157 255 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 146 144 230 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 230 180 moveto
+146 180 lineto
+146 144 lineto
+230 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 230 180 moveto
+146 180 lineto
+146 144 lineto
+230 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 188 216 moveto
+188 208 188 199 188 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 192 190 moveto
+188 180 lineto
+185 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 192 190 moveto
+188 180 lineto
+185 190 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 252 288 moveto
+241 279 228 268 217 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 219 255 moveto
+209 252 lineto
+215 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 219 255 moveto
+209 252 lineto
+215 261 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 161 72 215 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 215 108 moveto
+161 108 lineto
+161 72 lineto
+215 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 215 108 moveto
+161 108 lineto
+161 72 lineto
+215 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+169 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 188 144 moveto
+188 136 188 127 188 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 192 118 moveto
+188 108 lineto
+185 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 192 118 moveto
+188 108 lineto
+185 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 154 0 222 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 222 36 moveto
+154 36 lineto
+154 0 lineto
+222 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 222 36 moveto
+154 36 lineto
+154 0 lineto
+222 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+162 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 188 72 moveto
+188 64 188 55 188 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 192 46 moveto
+188 36 lineto
+185 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 192 46 moveto
+188 36 lineto
+185 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10doublylinkedaggregate.ps b/books/ps/v10doublylinkedaggregate.ps
new file mode 100644
index 0000000..4e20549
--- /dev/null
+++ b/books/ps/v10doublylinkedaggregate.ps
@@ -0,0 +1,503 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 440
+%%PageOrientation: Portrait
+gsave
+36 36 210 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% DoublyLinkedAggregate(a:Type)
+[ /Rect [ 0 360 202 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 396 moveto
+0 396 lineto
+0 360 lineto
+202 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 396 moveto
+0 396 lineto
+0 360 lineto
+202 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 373 moveto
+(DoublyLinkedAggregate\(a:Type\))
+[10.08 6.96 6.96 6.96 3.6 6.96 8.64 3.84 6.96 6.72 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)
+[ /Rect [ 13 288 189 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 189 324 moveto
+13 324 lineto
+13 288 lineto
+189 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 189 324 moveto
+13 324 lineto
+13 288 lineto
+189 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+20 301 moveto
+(RecursiveAggregate\(a:Type\))
+[9.12 6.24 6.24 6.96 4.8 5.52 3.84 6.48 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% DoublyLinkedAggregate(a:Type)->RecursiveAggregate(a:Type)
+newpath 101 360 moveto
+101 352 101 343 101 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 101 288 moveto
+101 280 101 271 101 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10eltab.ps b/books/ps/v10eltab.ps
new file mode 100644
index 0000000..9902751
--- /dev/null
+++ b/books/ps/v10eltab.ps
@@ -0,0 +1,299 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 230 152
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 230 152
+%%PageOrientation: Portrait
+gsave
+36 36 194 116 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+192 114 lineto
+192 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+192 114 lineto
+192 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Eltable(a:SetCategory,b:Type)
+[ /Rect [ 0 72 186 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 186 108 moveto
+0 108 lineto
+0 72 lineto
+186 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 186 108 moveto
+0 108 lineto
+0 72 lineto
+186 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 85 moveto
+(Eltable\(a:SetCategory,b:Type\))
+[8.64 3.84 4.08 6.24 6.96 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Category
+[ /Rect [ 59 0 127 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 127 36 moveto
+59 36 lineto
+59 0 lineto
+127 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 127 36 moveto
+59 36 lineto
+59 0 lineto
+127 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+67 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Eltable(a:SetCategory,b:Type)->Category
+newpath 93 72 moveto
+93 64 93 55 93 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 97 46 moveto
+93 36 lineto
+90 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 97 46 moveto
+93 36 lineto
+90 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10eltableaggregate.ps b/books/ps/v10eltableaggregate.ps
new file mode 100644
index 0000000..9cdd304
--- /dev/null
+++ b/books/ps/v10eltableaggregate.ps
@@ -0,0 +1,350 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 288 224
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 288 224
+%%PageOrientation: Portrait
+gsave
+36 36 252 188 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 186 lineto
+250 186 lineto
+250 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 186 lineto
+250 186 lineto
+250 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% EltableAggregate(a:SetCategory,b:Type)
+[ /Rect [ 0 144 244 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 244 180 moveto
+0 180 lineto
+0 144 lineto
+244 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 244 180 moveto
+0 180 lineto
+0 144 lineto
+244 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 157 moveto
+(EltableAggregate\(a:SetCategory,b:Type\))
+[8.64 3.84 4.08 6.24 6.96 3.84 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Eltable(a:SetCategory,b:Type)
+[ /Rect [ 29 72 215 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 215 108 moveto
+29 108 lineto
+29 72 lineto
+215 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 215 108 moveto
+29 108 lineto
+29 72 lineto
+215 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+37 85 moveto
+(Eltable\(a:SetCategory,b:Type\))
+[8.64 3.84 4.08 6.24 6.96 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% EltableAggregate(a:SetCategory,b:Type)->Eltable(a:SetCategory,b:Type)
+newpath 122 144 moveto
+122 136 122 127 122 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 118 moveto
+122 108 lineto
+119 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 118 moveto
+122 108 lineto
+119 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 88 0 156 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 156 36 moveto
+88 36 lineto
+88 0 lineto
+156 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 156 36 moveto
+88 36 lineto
+88 0 lineto
+156 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+96 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Eltable(a:SetCategory,b:Type)->Category
+newpath 122 72 moveto
+122 64 122 55 122 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 46 moveto
+122 36 lineto
+119 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 46 moveto
+122 36 lineto
+119 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10extensiblelinearaggregate.ps b/books/ps/v10extensiblelinearaggregate.ps
new file mode 100644
index 0000000..4906b76
--- /dev/null
+++ b/books/ps/v10extensiblelinearaggregate.ps
@@ -0,0 +1,574 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 430 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 430 440
+%%PageOrientation: Portrait
+gsave
+36 36 394 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+392 402 lineto
+392 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+392 402 lineto
+392 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% ExtensibleLinearAggregate(a:Type)
+[ /Rect [ 116 360 332 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 332 396 moveto
+116 396 lineto
+116 360 lineto
+332 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 332 396 moveto
+116 396 lineto
+116 360 lineto
+332 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+123 373 moveto
+(ExtensibleLinearAggregate\(a:Type\))
+[8.64 6.96 3.84 6.24 6.96 5.52 3.84 6.96 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)
+[ /Rect [ 145 288 303 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 303 324 moveto
+145 324 lineto
+145 288 lineto
+303 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 303 324 moveto
+145 324 lineto
+145 288 lineto
+303 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 301 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% ExtensibleLinearAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 224 360 moveto
+224 352 224 343 224 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 228 334 moveto
+224 324 lineto
+221 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 228 334 moveto
+224 324 lineto
+221 334 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 31 216 249 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 249 252 moveto
+31 252 lineto
+31 216 lineto
+249 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 249 252 moveto
+31 252 lineto
+31 216 lineto
+249 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 229 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IndexedAggregate(b:Integer,a:Type)
+newpath 203 288 moveto
+193 279 180 268 169 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 171 256 moveto
+161 252 lineto
+166 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 171 256 moveto
+161 252 lineto
+166 261 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 266 144 386 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 386 180 moveto
+266 180 lineto
+266 144 lineto
+386 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 386 180 moveto
+266 180 lineto
+266 144 lineto
+386 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+273 157 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->Collection(a:Type)
+newpath 237 288 moveto
+254 263 286 218 307 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 310 190 moveto
+313 180 lineto
+304 186 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 310 190 moveto
+313 180 lineto
+304 186 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)
+[ /Rect [ 0 144 248 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 248 180 moveto
+0 180 lineto
+0 144 lineto
+248 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 248 180 moveto
+0 180 lineto
+0 144 lineto
+248 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(IndexedAggregate\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IndexedAggregate(a:SetCategory,b:Type)
+newpath 136 216 moveto
+134 208 132 199 130 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 133 189 moveto
+128 180 lineto
+127 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 133 189 moveto
+128 180 lineto
+127 190 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 124 72 326 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 326 108 moveto
+124 108 lineto
+124 72 lineto
+326 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 326 108 moveto
+124 108 lineto
+124 72 lineto
+326 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+131 85 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 301 144 moveto
+289 135 273 124 259 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 260 111 moveto
+250 108 lineto
+256 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 260 111 moveto
+250 108 lineto
+256 116 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->HomogeneousAggregate(a:Type)
+newpath 149 144 moveto
+161 135 177 124 191 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 194 116 moveto
+200 108 lineto
+190 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 194 116 moveto
+200 108 lineto
+190 111 lineto
+closepath
+stroke
+end grestore
+% ...
+[ /Rect [ 198 0 252 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 252 36 moveto
+198 36 lineto
+198 0 lineto
+252 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 252 36 moveto
+198 36 lineto
+198 0 lineto
+252 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+219 13 moveto
+(...)
+[3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->...
+newpath 225 72 moveto
+225 64 225 55 225 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 229 46 moveto
+225 36 lineto
+222 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 229 46 moveto
+225 36 lineto
+222 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10finitelinearaggregate.ps b/books/ps/v10finitelinearaggregate.ps
new file mode 100644
index 0000000..525dca5
--- /dev/null
+++ b/books/ps/v10finitelinearaggregate.ps
@@ -0,0 +1,574 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 430 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 430 440
+%%PageOrientation: Portrait
+gsave
+36 36 394 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+392 402 lineto
+392 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+392 402 lineto
+392 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% FiniteLinearAggregate(a:Type)
+[ /Rect [ 129 360 319 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 319 396 moveto
+129 396 lineto
+129 360 lineto
+319 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 319 396 moveto
+129 396 lineto
+129 360 lineto
+319 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+137 373 moveto
+(FiniteLinearAggregate\(a:Type\))
+[7.44 3.84 6.96 3.84 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)
+[ /Rect [ 145 288 303 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 303 324 moveto
+145 324 lineto
+145 288 lineto
+303 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 303 324 moveto
+145 324 lineto
+145 288 lineto
+303 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 301 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 224 360 moveto
+224 352 224 343 224 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 228 334 moveto
+224 324 lineto
+221 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 228 334 moveto
+224 324 lineto
+221 334 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 31 216 249 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 249 252 moveto
+31 252 lineto
+31 216 lineto
+249 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 249 252 moveto
+31 252 lineto
+31 216 lineto
+249 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 229 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IndexedAggregate(b:Integer,a:Type)
+newpath 203 288 moveto
+193 279 180 268 169 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 171 256 moveto
+161 252 lineto
+166 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 171 256 moveto
+161 252 lineto
+166 261 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 266 144 386 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 386 180 moveto
+266 180 lineto
+266 144 lineto
+386 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 386 180 moveto
+266 180 lineto
+266 144 lineto
+386 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+273 157 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->Collection(a:Type)
+newpath 237 288 moveto
+254 263 286 218 307 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 310 190 moveto
+313 180 lineto
+304 186 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 310 190 moveto
+313 180 lineto
+304 186 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)
+[ /Rect [ 0 144 248 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 248 180 moveto
+0 180 lineto
+0 144 lineto
+248 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 248 180 moveto
+0 180 lineto
+0 144 lineto
+248 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(IndexedAggregate\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IndexedAggregate(a:SetCategory,b:Type)
+newpath 136 216 moveto
+134 208 132 199 130 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 133 189 moveto
+128 180 lineto
+127 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 133 189 moveto
+128 180 lineto
+127 190 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 124 72 326 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 326 108 moveto
+124 108 lineto
+124 72 lineto
+326 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 326 108 moveto
+124 108 lineto
+124 72 lineto
+326 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+131 85 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 301 144 moveto
+289 135 273 124 259 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 260 111 moveto
+250 108 lineto
+256 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 260 111 moveto
+250 108 lineto
+256 116 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->HomogeneousAggregate(a:Type)
+newpath 149 144 moveto
+161 135 177 124 191 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 194 116 moveto
+200 108 lineto
+190 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 194 116 moveto
+200 108 lineto
+190 111 lineto
+closepath
+stroke
+end grestore
+% ...
+[ /Rect [ 198 0 252 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 252 36 moveto
+198 36 lineto
+198 0 lineto
+252 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 252 36 moveto
+198 36 lineto
+198 0 lineto
+252 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+219 13 moveto
+(...)
+[3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->...
+newpath 225 72 moveto
+225 64 225 55 225 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 229 46 moveto
+225 36 lineto
+222 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 229 46 moveto
+225 36 lineto
+222 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10homogeneousaggregate.ps b/books/ps/v10homogeneousaggregate.ps
new file mode 100644
index 0000000..98515fc
--- /dev/null
+++ b/books/ps/v10homogeneousaggregate.ps
@@ -0,0 +1,401 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 296
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 296
+%%PageOrientation: Portrait
+gsave
+36 36 210 260 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+208 258 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+208 258 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10indexedaggregate.ps b/books/ps/v10indexedaggregate.ps
new file mode 100644
index 0000000..8dce4c2
--- /dev/null
+++ b/books/ps/v10indexedaggregate.ps
@@ -0,0 +1,574 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 436 368
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 436 368
+%%PageOrientation: Portrait
+gsave
+36 36 400 332 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+398 330 lineto
+398 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+398 330 lineto
+398 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% IndexedAggregate(a:SetCategory,b:Type)
+[ /Rect [ 54 288 302 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 302 324 moveto
+54 324 lineto
+54 288 lineto
+302 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 302 324 moveto
+54 324 lineto
+54 288 lineto
+302 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+61 301 moveto
+(IndexedAggregate\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->HomogeneousAggregate(a:Type)
+newpath 159 288 moveto
+149 279 138 269 128 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 256 moveto
+120 252 lineto
+125 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 256 moveto
+120 252 lineto
+125 261 lineto
+closepath
+stroke
+end grestore
+% EltableAggregate(a:SetCategory,b:Type)
+[ /Rect [ 148 144 392 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 392 180 moveto
+148 180 lineto
+148 144 lineto
+392 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 392 180 moveto
+148 180 lineto
+148 144 lineto
+392 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 157 moveto
+(EltableAggregate\(a:SetCategory,b:Type\))
+[8.64 3.84 4.08 6.24 6.96 3.84 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->EltableAggregate(a:SetCategory,b:Type)
+newpath 190 288 moveto
+205 263 235 218 253 189 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+258 180 lineto
+250 187 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+258 180 lineto
+250 187 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 46 144 130 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 130 180 moveto
+46 180 lineto
+46 144 lineto
+130 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 130 180 moveto
+46 180 lineto
+46 144 lineto
+130 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+53 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 98 216 moveto
+97 208 95 199 93 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 96 189 moveto
+91 180 lineto
+90 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 96 189 moveto
+91 180 lineto
+90 190 lineto
+closepath
+stroke
+end grestore
+% Eltable(a:SetCategory,b:Type)
+[ /Rect [ 166 72 352 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 352 108 moveto
+166 108 lineto
+166 72 lineto
+352 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 352 108 moveto
+166 108 lineto
+166 72 lineto
+352 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+174 85 moveto
+(Eltable\(a:SetCategory,b:Type\))
+[8.64 3.84 4.08 6.24 6.96 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% EltableAggregate(a:SetCategory,b:Type)->Eltable(a:SetCategory,b:Type)
+newpath 267 144 moveto
+266 136 264 127 263 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 266 118 moveto
+262 108 lineto
+260 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 266 118 moveto
+262 108 lineto
+260 118 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 83 72 137 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 137 108 moveto
+83 108 lineto
+83 72 lineto
+137 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 137 108 moveto
+83 108 lineto
+83 72 lineto
+137 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+91 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 94 144 moveto
+96 136 99 126 102 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 119 moveto
+105 108 lineto
+99 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 119 moveto
+105 108 lineto
+99 117 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 150 0 218 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 218 36 moveto
+150 36 lineto
+150 0 lineto
+218 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 218 36 moveto
+150 36 lineto
+150 0 lineto
+218 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 129 72 moveto
+138 63 149 53 159 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 161 46 moveto
+166 36 lineto
+156 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 161 46 moveto
+166 36 lineto
+156 41 lineto
+closepath
+stroke
+end grestore
+% Eltable(a:SetCategory,b:Type)->Category
+newpath 240 72 moveto
+231 63 220 53 210 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 41 moveto
+203 36 lineto
+208 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 41 moveto
+203 36 lineto
+208 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10keyeddictionary.ps b/books/ps/v10keyeddictionary.ps
new file mode 100644
index 0000000..02ee4d3
--- /dev/null
+++ b/books/ps/v10keyeddictionary.ps
@@ -0,0 +1,676 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 410 512
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 410 512
+%%PageOrientation: Portrait
+gsave
+36 36 374 476 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+372 474 lineto
+372 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+372 474 lineto
+372 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% KeyedDictionary(a:SetCategory,b:SetCategory)
+[ /Rect [ 47 432 331 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 331 468 moveto
+47 468 lineto
+47 432 lineto
+331 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 331 468 moveto
+47 468 lineto
+47 432 lineto
+331 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+55 445 moveto
+(KeyedDictionary\(a:SetCategory,b:SetCategory\))
+[9.6 5.76 6.48 6.24 6.96 10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Dictionary(Record(a:SetCategory,b:SetCategory))
+[ /Rect [ 40 360 338 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 338 396 moveto
+40 396 lineto
+40 360 lineto
+338 360 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 338 396 moveto
+40 396 lineto
+40 360 lineto
+338 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+48 373 moveto
+(Dictionary\(Record\(a:SetCategory,b:SetCategory\)\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 9.12 6.24 6.24 6.96 4.56 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% KeyedDictionary(a:SetCategory,b:SetCategory)->Dictionary(Record(a:SetCategory,b:SetCategory))
+newpath 189 432 moveto
+189 424 189 415 189 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 406 moveto
+189 396 lineto
+186 406 lineto
+closepath
+stroke
+end grestore
+% Dictionary(a:SetCategory)
+[ /Rect [ 106 288 272 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 272 324 moveto
+106 324 lineto
+106 288 lineto
+272 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 272 324 moveto
+106 324 lineto
+106 288 lineto
+272 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+114 301 moveto
+(Dictionary\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Dictionary(Record(a:SetCategory,b:SetCategory))->Dictionary(a:SetCategory)
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)
+[ /Rect [ 76 216 302 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 302 252 moveto
+76 252 lineto
+76 216 lineto
+302 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 302 252 moveto
+76 252 lineto
+76 216 lineto
+302 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+83 229 moveto
+(DictionaryOperations\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 10.08 6.96 6.24 4.8 6.24 3.84 3.84 6.96 6.96 5.52 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Dictionary(a:SetCategory)->DictionaryOperations(a:SetCategory)
+newpath 189 288 moveto
+189 280 189 271 189 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 262 moveto
+189 252 lineto
+186 262 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:SetCategory)
+[ /Rect [ 0 144 186 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 186 180 moveto
+0 180 lineto
+0 144 lineto
+186 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 186 180 moveto
+0 180 lineto
+0 144 lineto
+186 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(BagAggregate\(a:SetCategory\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BagAggregate(a:SetCategory)
+newpath 165 216 moveto
+153 207 138 196 125 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 127 183 moveto
+117 180 lineto
+123 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 127 183 moveto
+117 180 lineto
+123 189 lineto
+closepath
+stroke
+end grestore
+% Collection(a:SetCategory)
+[ /Rect [ 204 144 366 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 366 180 moveto
+204 180 lineto
+204 144 lineto
+366 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 366 180 moveto
+204 180 lineto
+204 144 lineto
+366 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+211 157 moveto
+(Collection\(a:SetCategory\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->Collection(a:SetCategory)
+newpath 213 216 moveto
+225 207 240 196 253 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 255 189 moveto
+261 180 lineto
+251 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 255 189 moveto
+261 180 lineto
+251 183 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 31 72 175 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 175 108 moveto
+31 108 lineto
+31 72 lineto
+175 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 175 108 moveto
+31 108 lineto
+31 72 lineto
+175 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 85 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:SetCategory)->BagAggregate(a:Type)
+newpath 96 144 moveto
+97 136 98 127 99 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 102 118 moveto
+100 108 lineto
+96 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 102 118 moveto
+100 108 lineto
+96 118 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 214 72 334 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 334 108 moveto
+214 108 lineto
+214 72 lineto
+334 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 334 108 moveto
+214 108 lineto
+214 72 lineto
+334 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 85 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:SetCategory)->Collection(a:Type)
+newpath 282 144 moveto
+281 136 279 127 278 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 281 118 moveto
+277 108 lineto
+275 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 281 118 moveto
+277 108 lineto
+275 118 lineto
+closepath
+stroke
+end grestore
+% ...
+[ /Rect [ 161 0 215 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+161 36 lineto
+161 0 lineto
+215 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+161 36 lineto
+161 0 lineto
+215 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+182 13 moveto
+(...)
+[3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% Collection(a:Type)->...
+newpath 252 72 moveto
+241 63 228 52 217 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 219 39 moveto
+209 36 lineto
+215 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 219 39 moveto
+209 36 lineto
+215 45 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)->...
+newpath 124 72 moveto
+135 63 148 52 159 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 161 45 moveto
+167 36 lineto
+157 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 161 45 moveto
+167 36 lineto
+157 39 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10koerce.ps b/books/ps/v10koerce.ps
new file mode 100644
index 0000000..dc41712
--- /dev/null
+++ b/books/ps/v10koerce.ps
@@ -0,0 +1,299 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 176 152
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 176 152
+%%PageOrientation: Portrait
+gsave
+36 36 140 116 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+138 114 lineto
+138 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+138 114 lineto
+138 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% CoercibleTo(a:Type)
+[ /Rect [ 0 72 132 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 132 108 moveto
+0 108 lineto
+0 72 lineto
+132 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 132 108 moveto
+0 108 lineto
+0 72 lineto
+132 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 85 moveto
+(CoercibleTo\(a:Type\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Category
+[ /Rect [ 32 0 100 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 100 36 moveto
+32 36 lineto
+32 0 lineto
+100 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 100 36 moveto
+32 36 lineto
+32 0 lineto
+100 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+40 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 66 72 moveto
+66 64 66 55 66 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 70 46 moveto
+66 36 lineto
+63 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 70 46 moveto
+66 36 lineto
+63 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10konvert.ps b/books/ps/v10konvert.ps
new file mode 100644
index 0000000..aedf31c
--- /dev/null
+++ b/books/ps/v10konvert.ps
@@ -0,0 +1,299 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 186 152
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 186 152
+%%PageOrientation: Portrait
+gsave
+36 36 150 116 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+148 114 lineto
+148 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+148 114 lineto
+148 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% ConvertibleTo(a:Type)
+[ /Rect [ 0 72 142 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 142 108 moveto
+0 108 lineto
+0 72 lineto
+142 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 142 108 moveto
+0 108 lineto
+0 72 lineto
+142 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(ConvertibleTo\(a:Type\))
+[9.36 6.96 6.48 6.48 6.24 5.04 3.84 3.84 6.96 3.84 6.24 7.44 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Category
+[ /Rect [ 37 0 105 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 105 36 moveto
+37 36 lineto
+37 0 lineto
+105 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 105 36 moveto
+37 36 lineto
+37 0 lineto
+105 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+45 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% ConvertibleTo(a:Type)->Category
+newpath 71 72 moveto
+71 64 71 55 71 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 75 46 moveto
+71 36 lineto
+68 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 75 46 moveto
+71 36 lineto
+68 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10linearaggregate.ps b/books/ps/v10linearaggregate.ps
new file mode 100644
index 0000000..65d310e
--- /dev/null
+++ b/books/ps/v10linearaggregate.ps
@@ -0,0 +1,625 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 430 512
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 430 512
+%%PageOrientation: Portrait
+gsave
+36 36 394 476 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+392 474 lineto
+392 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+392 474 lineto
+392 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% LinearAggregate(a:Type)
+[ /Rect [ 145 432 303 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 303 468 moveto
+145 468 lineto
+145 432 lineto
+303 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 303 468 moveto
+145 468 lineto
+145 432 lineto
+303 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+153 445 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 31 360 249 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 249 396 moveto
+31 396 lineto
+31 360 lineto
+249 360 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 249 396 moveto
+31 396 lineto
+31 360 lineto
+249 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 373 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IndexedAggregate(b:Integer,a:Type)
+newpath 203 432 moveto
+193 423 180 412 169 403 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 171 400 moveto
+161 396 lineto
+166 405 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 171 400 moveto
+161 396 lineto
+166 405 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 266 288 386 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 386 324 moveto
+266 324 lineto
+266 288 lineto
+386 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 386 324 moveto
+266 324 lineto
+266 288 lineto
+386 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+273 301 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->Collection(a:Type)
+newpath 237 432 moveto
+254 407 286 362 307 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 310 334 moveto
+313 324 lineto
+304 330 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 310 334 moveto
+313 324 lineto
+304 330 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)
+[ /Rect [ 0 288 248 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 248 324 moveto
+0 324 lineto
+0 288 lineto
+248 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 248 324 moveto
+0 324 lineto
+0 288 lineto
+248 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 301 moveto
+(IndexedAggregate\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IndexedAggregate(a:SetCategory,b:Type)
+newpath 136 360 moveto
+134 352 132 343 130 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 133 333 moveto
+128 324 lineto
+127 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 133 333 moveto
+128 324 lineto
+127 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 124 216 326 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 326 252 moveto
+124 252 lineto
+124 216 lineto
+326 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 326 252 moveto
+124 252 lineto
+124 216 lineto
+326 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+131 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 301 288 moveto
+289 279 273 268 259 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 260 255 moveto
+250 252 lineto
+256 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 260 255 moveto
+250 252 lineto
+256 260 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->HomogeneousAggregate(a:Type)
+newpath 149 288 moveto
+161 279 177 268 191 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 194 260 moveto
+200 252 lineto
+190 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 194 260 moveto
+200 252 lineto
+190 255 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 183 144 267 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 267 180 moveto
+183 180 lineto
+183 144 lineto
+267 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 267 180 moveto
+183 180 lineto
+183 144 lineto
+267 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+190 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 225 216 moveto
+225 208 225 199 225 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 229 190 moveto
+225 180 lineto
+222 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 229 190 moveto
+225 180 lineto
+222 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 198 72 252 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 252 108 moveto
+198 108 lineto
+198 72 lineto
+252 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 252 108 moveto
+198 108 lineto
+198 72 lineto
+252 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+206 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 225 144 moveto
+225 136 225 127 225 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 229 118 moveto
+225 108 lineto
+222 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 229 118 moveto
+225 108 lineto
+222 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 191 0 259 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 259 36 moveto
+191 36 lineto
+191 0 lineto
+259 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 259 36 moveto
+191 36 lineto
+191 0 lineto
+259 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+199 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 225 72 moveto
+225 64 225 55 225 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 229 46 moveto
+225 36 lineto
+222 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 229 46 moveto
+225 36 lineto
+222 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10listaggregate.ps b/books/ps/v10listaggregate.ps
new file mode 100644
index 0000000..17e72f0
--- /dev/null
+++ b/books/ps/v10listaggregate.ps
@@ -0,0 +1,697 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 471 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 471 440
+%%PageOrientation: Portrait
+gsave
+36 36 435 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+433 402 lineto
+433 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+433 402 lineto
+433 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% ListAggregate(a:Type)
+[ /Rect [ 137 360 279 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 279 396 moveto
+137 396 lineto
+137 360 lineto
+279 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 279 396 moveto
+137 396 lineto
+137 360 lineto
+279 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+144 373 moveto
+(ListAggregate\(a:Type\))
+[8.64 3.84 5.28 3.84 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)
+[ /Rect [ 3 288 193 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 193 324 moveto
+3 324 lineto
+3 288 lineto
+193 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 193 324 moveto
+3 324 lineto
+3 288 lineto
+193 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+11 301 moveto
+(FiniteLinearAggregate\(a:Type\))
+[7.44 3.84 6.96 3.84 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% ListAggregate(a:Type)->FiniteLinearAggregate(a:Type)
+newpath 180 360 moveto
+166 351 149 340 134 330 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 135 327 moveto
+125 324 lineto
+131 332 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 135 327 moveto
+125 324 lineto
+131 332 lineto
+closepath
+stroke
+end grestore
+% ExtensibleLinearAggregate(a:Type)
+[ /Rect [ 211 288 427 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 427 324 moveto
+211 324 lineto
+211 288 lineto
+427 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 427 324 moveto
+211 324 lineto
+211 288 lineto
+427 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+218 301 moveto
+(ExtensibleLinearAggregate\(a:Type\))
+[8.64 6.96 3.84 6.24 6.96 5.52 3.84 6.96 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% ListAggregate(a:Type)->ExtensibleLinearAggregate(a:Type)
+newpath 236 360 moveto
+250 351 268 340 283 330 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 285 333 moveto
+291 324 lineto
+281 327 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 285 333 moveto
+291 324 lineto
+281 327 lineto
+closepath
+stroke
+end grestore
+% LinearAggregate(a:Type)
+[ /Rect [ 129 216 287 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 287 252 moveto
+129 252 lineto
+129 216 lineto
+287 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 287 252 moveto
+129 252 lineto
+129 216 lineto
+287 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+137 229 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 126 288 moveto
+139 279 157 268 172 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 175 260 moveto
+181 252 lineto
+171 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 175 260 moveto
+181 252 lineto
+171 255 lineto
+closepath
+stroke
+end grestore
+% ExtensibleLinearAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 291 288 moveto
+277 279 259 268 244 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 246 255 moveto
+236 252 lineto
+242 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 246 255 moveto
+236 252 lineto
+242 261 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 31 144 249 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 249 180 moveto
+31 180 lineto
+31 144 lineto
+249 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 249 180 moveto
+31 180 lineto
+31 144 lineto
+249 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 157 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IndexedAggregate(b:Integer,a:Type)
+newpath 191 216 moveto
+183 207 173 197 164 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 166 185 moveto
+157 180 lineto
+161 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 166 185 moveto
+157 180 lineto
+161 190 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 266 72 386 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 386 108 moveto
+266 108 lineto
+266 72 lineto
+386 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 386 108 moveto
+266 108 lineto
+266 72 lineto
+386 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+273 85 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->Collection(a:Type)
+newpath 226 216 moveto
+235 206 248 192 258 180 curveto
+275 159 294 135 307 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 310 118 moveto
+313 108 lineto
+304 114 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 310 118 moveto
+313 108 lineto
+304 114 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)
+[ /Rect [ 0 72 248 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 248 108 moveto
+0 108 lineto
+0 72 lineto
+248 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 248 108 moveto
+0 108 lineto
+0 72 lineto
+248 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(IndexedAggregate\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IndexedAggregate(a:SetCategory,b:Type)
+newpath 136 144 moveto
+134 136 132 127 130 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 133 117 moveto
+128 108 lineto
+127 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 133 117 moveto
+128 108 lineto
+127 118 lineto
+closepath
+stroke
+end grestore
+% HOAGG...
+[ /Rect [ 235 0 311 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 311 36 moveto
+235 36 lineto
+235 0 lineto
+311 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 311 36 moveto
+235 36 lineto
+235 0 lineto
+311 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+242 13 moveto
+(HOAGG...)
+[10.08 9.36 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% Collection(a:Type)->HOAGG...
+newpath 313 72 moveto
+307 64 299 53 292 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 295 42 moveto
+286 36 lineto
+289 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 295 42 moveto
+286 36 lineto
+289 46 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->HOAGG...
+newpath 162 72 moveto
+182 62 206 51 227 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 228 43 moveto
+236 36 lineto
+225 37 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 228 43 moveto
+236 36 lineto
+225 37 lineto
+closepath
+stroke
+end grestore
+% ELTAGG...
+[ /Rect [ 84 0 164 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 164 36 moveto
+84 36 lineto
+84 0 lineto
+164 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 164 36 moveto
+84 36 lineto
+84 0 lineto
+164 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+91 13 moveto
+(ELTAGG...)
+[8.64 7.68 7.92 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->ELTAGG...
+newpath 124 72 moveto
+124 64 124 55 124 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 128 46 moveto
+124 36 lineto
+121 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 128 46 moveto
+124 36 lineto
+121 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10multidictionary.ps b/books/ps/v10multidictionary.ps
new file mode 100644
index 0000000..bba3e41
--- /dev/null
+++ b/books/ps/v10multidictionary.ps
@@ -0,0 +1,625 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 410 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 410 440
+%%PageOrientation: Portrait
+gsave
+36 36 374 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+372 402 lineto
+372 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+372 402 lineto
+372 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% MultiDictionary(a:SetCategory)
+[ /Rect [ 91 360 287 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 287 396 moveto
+91 396 lineto
+91 360 lineto
+287 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 287 396 moveto
+91 396 lineto
+91 360 lineto
+287 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+98 373 moveto
+(MultiDictionary\(a:SetCategory\))
+[12.48 6.96 3.84 3.84 3.84 10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)
+[ /Rect [ 76 288 302 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 302 324 moveto
+76 324 lineto
+76 288 lineto
+302 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 302 324 moveto
+76 324 lineto
+76 288 lineto
+302 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+83 301 moveto
+(DictionaryOperations\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 10.08 6.96 6.24 4.8 6.24 3.84 3.84 6.96 6.96 5.52 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% MultiDictionary(a:SetCategory)->DictionaryOperations(a:SetCategory)
+newpath 189 360 moveto
+189 352 189 343 189 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 193 334 moveto
+189 324 lineto
+186 334 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:SetCategory)
+[ /Rect [ 0 216 186 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 186 252 moveto
+0 252 lineto
+0 216 lineto
+186 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 186 252 moveto
+0 252 lineto
+0 216 lineto
+186 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(BagAggregate\(a:SetCategory\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BagAggregate(a:SetCategory)
+newpath 165 288 moveto
+153 279 138 268 125 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 127 255 moveto
+117 252 lineto
+123 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 127 255 moveto
+117 252 lineto
+123 261 lineto
+closepath
+stroke
+end grestore
+% Collection(a:SetCategory)
+[ /Rect [ 204 216 366 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 366 252 moveto
+204 252 lineto
+204 216 lineto
+366 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 366 252 moveto
+204 252 lineto
+204 216 lineto
+366 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+211 229 moveto
+(Collection\(a:SetCategory\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->Collection(a:SetCategory)
+newpath 213 288 moveto
+225 279 240 268 253 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 255 261 moveto
+261 252 lineto
+251 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 255 261 moveto
+261 252 lineto
+251 255 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 31 144 175 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 175 180 moveto
+31 180 lineto
+31 144 lineto
+175 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 175 180 moveto
+31 180 lineto
+31 144 lineto
+175 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 157 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:SetCategory)->BagAggregate(a:Type)
+newpath 96 216 moveto
+97 208 98 199 99 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 102 190 moveto
+100 180 lineto
+96 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 102 190 moveto
+100 180 lineto
+96 190 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 214 144 334 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 334 180 moveto
+214 180 lineto
+214 144 lineto
+334 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 334 180 moveto
+214 180 lineto
+214 144 lineto
+334 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 157 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:SetCategory)->Collection(a:Type)
+newpath 282 216 moveto
+281 208 279 199 278 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 281 190 moveto
+277 180 lineto
+275 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 281 190 moveto
+277 180 lineto
+275 190 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 87 72 289 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 289 108 moveto
+87 108 lineto
+87 72 lineto
+289 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 289 108 moveto
+87 108 lineto
+87 72 lineto
+289 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+94 85 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 124 144 moveto
+135 135 148 124 159 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 161 117 moveto
+167 108 lineto
+157 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 161 117 moveto
+167 108 lineto
+157 111 lineto
+closepath
+stroke
+end grestore
+% ...
+[ /Rect [ 161 0 215 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+161 36 lineto
+161 0 lineto
+215 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+161 36 lineto
+161 0 lineto
+215 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+182 13 moveto
+(...)
+[3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->...
+newpath 188 72 moveto
+188 64 188 55 188 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 192 46 moveto
+188 36 lineto
+185 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 192 46 moveto
+188 36 lineto
+185 46 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 252 144 moveto
+241 135 228 124 217 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 219 111 moveto
+209 108 lineto
+215 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 219 111 moveto
+209 108 lineto
+215 117 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10onedimensionalarrayaggregate.ps b/books/ps/v10onedimensionalarrayaggregate.ps
new file mode 100644
index 0000000..0bdc3d2
--- /dev/null
+++ b/books/ps/v10onedimensionalarrayaggregate.ps
@@ -0,0 +1,503 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 359 368
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 359 368
+%%PageOrientation: Portrait
+gsave
+36 36 323 332 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+321 330 lineto
+321 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+321 330 lineto
+321 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OneDimensionalArrayAggregate(a:Type)
+[ /Rect [ 67 288 315 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 315 324 moveto
+67 324 lineto
+67 288 lineto
+315 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 315 324 moveto
+67 324 lineto
+67 288 lineto
+315 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+74 301 moveto
+(OneDimensionalArrayAggregate\(a:Type\))
+[10.08 6.96 6.24 10.08 3.84 10.8 6.24 6.96 5.52 3.84 6.96 6.96 6.24 3.84 10.08 5.28 4.8 5.76 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)
+[ /Rect [ 96 216 286 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 286 252 moveto
+96 252 lineto
+96 216 lineto
+286 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 286 252 moveto
+96 252 lineto
+96 216 lineto
+286 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+104 229 moveto
+(FiniteLinearAggregate\(a:Type\))
+[7.44 3.84 6.96 3.84 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% OneDimensionalArrayAggregate(a:Type)->FiniteLinearAggregate(a:Type)
+newpath 191 288 moveto
+191 280 191 271 191 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 195 262 moveto
+191 252 lineto
+188 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 195 262 moveto
+191 252 lineto
+188 262 lineto
+closepath
+stroke
+end grestore
+% LinearAggregate(a:Type)
+[ /Rect [ 112 144 270 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 270 180 moveto
+112 180 lineto
+112 144 lineto
+270 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 270 180 moveto
+112 180 lineto
+112 144 lineto
+270 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+120 157 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 191 216 moveto
+191 208 191 199 191 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 195 190 moveto
+191 180 lineto
+188 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 195 190 moveto
+191 180 lineto
+188 190 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 0 72 218 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 218 108 moveto
+0 108 lineto
+0 72 lineto
+218 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 218 108 moveto
+0 108 lineto
+0 72 lineto
+218 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IndexedAggregate(b:Integer,a:Type)
+newpath 170 144 moveto
+160 135 148 124 137 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 139 112 moveto
+129 108 lineto
+134 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 139 112 moveto
+129 108 lineto
+134 117 lineto
+closepath
+stroke
+end grestore
+% CLAGG...
+[ /Rect [ 236 72 310 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 310 108 moveto
+236 108 lineto
+236 72 lineto
+310 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 310 108 moveto
+236 108 lineto
+236 72 lineto
+310 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+243 85 moveto
+(CLAGG...)
+[9.36 8.64 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->CLAGG...
+newpath 212 144 moveto
+222 135 234 124 245 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 248 117 moveto
+253 108 lineto
+243 112 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 248 117 moveto
+253 108 lineto
+243 112 lineto
+closepath
+stroke
+end grestore
+% IXAGG...
+[ /Rect [ 73 0 145 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 145 36 moveto
+73 36 lineto
+73 0 lineto
+145 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 145 36 moveto
+73 36 lineto
+73 0 lineto
+145 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+80 13 moveto
+(IXAGG...)
+[4.56 10.08 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IXAGG...
+newpath 109 72 moveto
+109 64 109 55 109 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 113 46 moveto
+109 36 lineto
+106 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 113 46 moveto
+109 36 lineto
+106 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10priorityqueueaggregate.ps b/books/ps/v10priorityqueueaggregate.ps
new file mode 100644
index 0000000..8f048a4
--- /dev/null
+++ b/books/ps/v10priorityqueueaggregate.ps
@@ -0,0 +1,503 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 440
+%%PageOrientation: Portrait
+gsave
+36 36 210 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% PriorityQueueAggregate(a:Type)
+[ /Rect [ 0 360 202 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 396 moveto
+0 396 lineto
+0 360 lineto
+202 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 396 moveto
+0 396 lineto
+0 360 lineto
+202 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 373 moveto
+(PriorityQueueAggregate\(a:Type\))
+[7.68 5.04 3.84 6.96 5.04 3.84 3.84 6.96 10.08 6.96 6.24 6.96 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 29 288 173 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+36 301 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% PriorityQueueAggregate(a:Type)->BagAggregate(a:Type)
+newpath 101 360 moveto
+101 352 101 343 101 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 101 288 moveto
+101 280 101 271 101 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10queueaggregate.ps b/books/ps/v10queueaggregate.ps
new file mode 100644
index 0000000..8983ad4
--- /dev/null
+++ b/books/ps/v10queueaggregate.ps
@@ -0,0 +1,503 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 440
+%%PageOrientation: Portrait
+gsave
+36 36 210 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% QueueAggregate(a:Type)
+[ /Rect [ 22 360 180 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 180 396 moveto
+22 396 lineto
+22 360 lineto
+180 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 180 396 moveto
+22 396 lineto
+22 360 lineto
+180 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+30 373 moveto
+(QueueAggregate\(a:Type\))
+[10.08 6.96 6.24 6.96 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 29 288 173 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+36 301 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% QueueAggregate(a:Type)->BagAggregate(a:Type)
+newpath 101 360 moveto
+101 352 101 343 101 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 101 288 moveto
+101 280 101 271 101 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10recursiveaggregate.ps b/books/ps/v10recursiveaggregate.ps
new file mode 100644
index 0000000..444ef05
--- /dev/null
+++ b/books/ps/v10recursiveaggregate.ps
@@ -0,0 +1,452 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 368
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 368
+%%PageOrientation: Portrait
+gsave
+36 36 210 332 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+208 330 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+208 330 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% RecursiveAggregate(a:Type)
+[ /Rect [ 13 288 189 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 189 324 moveto
+13 324 lineto
+13 288 lineto
+189 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 189 324 moveto
+13 324 lineto
+13 288 lineto
+189 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+20 301 moveto
+(RecursiveAggregate\(a:Type\))
+[9.12 6.24 6.24 6.96 4.8 5.52 3.84 6.48 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 101 288 moveto
+101 280 101 271 101 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10retractableto.ps b/books/ps/v10retractableto.ps
new file mode 100644
index 0000000..dd4dde1
--- /dev/null
+++ b/books/ps/v10retractableto.ps
@@ -0,0 +1,299 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 184 152
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 184 152
+%%PageOrientation: Portrait
+gsave
+36 36 148 116 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+146 114 lineto
+146 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+146 114 lineto
+146 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% RetractableTo(a:Type)
+[ /Rect [ 0 72 140 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 140 108 moveto
+0 108 lineto
+0 72 lineto
+140 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 140 108 moveto
+0 108 lineto
+0 72 lineto
+140 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(RetractableTo\(a:Type\))
+[9.12 6 3.84 4.8 6.24 6.24 4.08 6.24 6.96 3.84 6.24 7.44 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Category
+[ /Rect [ 36 0 104 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 104 36 moveto
+36 36 lineto
+36 0 lineto
+104 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 104 36 moveto
+36 36 lineto
+36 0 lineto
+104 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+44 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% RetractableTo(a:Type)->Category
+newpath 70 72 moveto
+70 64 70 55 70 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 74 46 moveto
+70 36 lineto
+67 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 74 46 moveto
+70 36 lineto
+67 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10stackaggregate.ps b/books/ps/v10stackaggregate.ps
new file mode 100644
index 0000000..bd14037
--- /dev/null
+++ b/books/ps/v10stackaggregate.ps
@@ -0,0 +1,503 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 246 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 246 440
+%%PageOrientation: Portrait
+gsave
+36 36 210 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+208 402 lineto
+208 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% StackAggregate(a:Type)
+[ /Rect [ 25 360 177 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 177 396 moveto
+25 396 lineto
+25 360 lineto
+177 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 177 396 moveto
+25 396 lineto
+25 360 lineto
+177 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+33 373 moveto
+(StackAggregate\(a:Type\))
+[7.44 4.08 6.24 6 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 29 288 173 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 173 324 moveto
+29 324 lineto
+29 288 lineto
+173 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+36 301 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% StackAggregate(a:Type)->BagAggregate(a:Type)
+newpath 101 360 moveto
+101 352 101 343 101 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 334 moveto
+101 324 lineto
+98 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 0 216 202 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+0 252 lineto
+0 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 101 288 moveto
+101 280 101 271 101 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 262 moveto
+101 252 lineto
+98 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 59 144 143 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 143 180 moveto
+59 180 lineto
+59 144 lineto
+143 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 101 216 moveto
+101 208 101 199 101 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 190 moveto
+101 180 lineto
+98 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 74 72 128 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 128 108 moveto
+74 108 lineto
+74 72 lineto
+128 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 101 144 moveto
+101 136 101 127 101 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 118 moveto
+101 108 lineto
+98 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 67 0 135 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 135 36 moveto
+67 36 lineto
+67 0 lineto
+135 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+75 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 101 72 moveto
+101 64 101 55 101 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 46 moveto
+101 36 lineto
+98 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10streamaggregate.ps b/books/ps/v10streamaggregate.ps
new file mode 100644
index 0000000..a8979e9
--- /dev/null
+++ b/books/ps/v10streamaggregate.ps
@@ -0,0 +1,646 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 574 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 574 440
+%%PageOrientation: Portrait
+gsave
+36 36 538 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+536 402 lineto
+536 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+536 402 lineto
+536 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% StreamAggregate(a:Type)
+[ /Rect [ 120 360 280 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 280 396 moveto
+120 396 lineto
+120 360 lineto
+280 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 280 396 moveto
+120 396 lineto
+120 360 lineto
+280 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+127 373 moveto
+(StreamAggregate\(a:Type\))
+[7.44 3.84 4.8 6.24 6.24 10.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)
+[ /Rect [ 0 144 176 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 176 180 moveto
+0 180 lineto
+0 144 lineto
+176 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 176 180 moveto
+0 180 lineto
+0 144 lineto
+176 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(RecursiveAggregate\(a:Type\))
+[9.12 6.24 6.24 6.96 4.8 5.52 3.84 6.48 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% StreamAggregate(a:Type)->RecursiveAggregate(a:Type)
+newpath 191 360 moveto
+171 322 126 234 102 189 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 105 187 moveto
+97 180 lineto
+99 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 105 187 moveto
+97 180 lineto
+99 190 lineto
+closepath
+stroke
+end grestore
+% LinearAggregate(a:Type)
+[ /Rect [ 204 288 362 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 362 324 moveto
+204 324 lineto
+204 288 lineto
+362 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 362 324 moveto
+204 324 lineto
+204 288 lineto
+362 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+212 301 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% StreamAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 221 360 moveto
+231 351 244 340 255 331 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 258 333 moveto
+263 324 lineto
+253 328 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 258 333 moveto
+263 324 lineto
+253 328 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 217 72 419 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 419 108 moveto
+217 108 lineto
+217 72 lineto
+419 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 419 108 moveto
+217 108 lineto
+217 72 lineto
+419 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+224 85 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 146 144 moveto
+178 134 218 121 251 111 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 252 114 moveto
+261 108 lineto
+250 108 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 252 114 moveto
+261 108 lineto
+250 108 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 174 216 392 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 392 252 moveto
+174 252 lineto
+174 216 lineto
+392 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 392 252 moveto
+174 252 lineto
+174 216 lineto
+392 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+181 229 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IndexedAggregate(b:Integer,a:Type)
+newpath 283 288 moveto
+283 280 283 271 283 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 287 262 moveto
+283 252 lineto
+280 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 287 262 moveto
+283 252 lineto
+280 262 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 410 216 530 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 530 252 moveto
+410 252 lineto
+410 216 lineto
+530 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 530 252 moveto
+410 252 lineto
+410 216 lineto
+530 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+417 229 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->Collection(a:Type)
+newpath 330 288 moveto
+356 278 387 266 415 256 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 416 259 moveto
+424 252 lineto
+413 253 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 416 259 moveto
+424 252 lineto
+413 253 lineto
+closepath
+stroke
+end grestore
+% ...
+[ /Rect [ 291 0 345 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 345 36 moveto
+291 36 lineto
+291 0 lineto
+345 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 345 36 moveto
+291 36 lineto
+291 0 lineto
+345 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+312 13 moveto
+(...)
+[3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->...
+newpath 318 72 moveto
+318 64 318 55 318 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 322 46 moveto
+318 36 lineto
+315 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 322 46 moveto
+318 36 lineto
+315 46 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)
+[ /Rect [ 194 144 442 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 442 180 moveto
+194 180 lineto
+194 144 lineto
+442 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 442 180 moveto
+194 180 lineto
+194 144 lineto
+442 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 157 moveto
+(IndexedAggregate\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IndexedAggregate(a:SetCategory,b:Type)
+newpath 292 216 moveto
+296 208 300 198 305 189 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 308 191 moveto
+309 180 lineto
+302 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 308 191 moveto
+309 180 lineto
+302 188 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)->HomogeneousAggregate(a:Type)
+newpath 471 216 moveto
+471 196 468 164 451 144 curveto
+439 131 424 120 407 112 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 409 109 moveto
+398 108 lineto
+406 115 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 409 109 moveto
+398 108 lineto
+406 115 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->HomogeneousAggregate(a:Type)
+newpath 318 144 moveto
+318 136 318 127 318 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 322 118 moveto
+318 108 lineto
+315 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 322 118 moveto
+318 108 lineto
+315 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10stringaggregate.ps b/books/ps/v10stringaggregate.ps
new file mode 100644
index 0000000..245702f
--- /dev/null
+++ b/books/ps/v10stringaggregate.ps
@@ -0,0 +1,605 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 368 512
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 368 512
+%%PageOrientation: Portrait
+gsave
+36 36 332 476 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+330 474 lineto
+330 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+330 474 lineto
+330 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% StringAggregate()
+[ /Rect [ 132 432 250 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 250 468 moveto
+132 468 lineto
+132 432 lineto
+250 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 250 468 moveto
+132 468 lineto
+132 432 lineto
+250 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+140 445 moveto
+(StringAggregate\(\))
+[7.44 3.84 5.04 3.84 6.96 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OneDimensionalArrayAggregate(Character)
+[ /Rect [ 58 360 324 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 324 396 moveto
+58 396 lineto
+58 360 lineto
+324 360 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 324 396 moveto
+58 396 lineto
+58 360 lineto
+324 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+66 373 moveto
+(OneDimensionalArrayAggregate\(Character\))
+[10.08 6.96 6.24 10.08 3.84 10.8 6.24 6.96 5.52 3.84 6.96 6.96 6.24 3.84 10.08 5.28 4.8 5.76 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 9.36 6.96 6.24 4.8 6.24 6.24 3.84 6.24 4.8 4.56]
+xshow
+end grestore
+end grestore
+% StringAggregate()->OneDimensionalArrayAggregate(Character)
+newpath 191 432 moveto
+191 424 191 415 191 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 195 406 moveto
+191 396 lineto
+188 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 195 406 moveto
+191 396 lineto
+188 406 lineto
+closepath
+stroke
+end grestore
+% OneDimensionalArrayAggregate(a:Type)
+[ /Rect [ 67 288 315 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 315 324 moveto
+67 324 lineto
+67 288 lineto
+315 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 315 324 moveto
+67 324 lineto
+67 288 lineto
+315 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+74 301 moveto
+(OneDimensionalArrayAggregate\(a:Type\))
+[10.08 6.96 6.24 10.08 3.84 10.8 6.24 6.96 5.52 3.84 6.96 6.96 6.24 3.84 10.08 5.28 4.8 5.76 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% OneDimensionalArrayAggregate(Character)->OneDimensionalArrayAggregate(a:Type)
+newpath 191 360 moveto
+191 352 191 343 191 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 195 334 moveto
+191 324 lineto
+188 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 195 334 moveto
+191 324 lineto
+188 334 lineto
+closepath
+stroke
+end grestore
+% FiniteLinearAggregate(a:Type)
+[ /Rect [ 96 216 286 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 286 252 moveto
+96 252 lineto
+96 216 lineto
+286 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 286 252 moveto
+96 252 lineto
+96 216 lineto
+286 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+104 229 moveto
+(FiniteLinearAggregate\(a:Type\))
+[7.44 3.84 6.96 3.84 3.84 6.24 8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% OneDimensionalArrayAggregate(a:Type)->FiniteLinearAggregate(a:Type)
+newpath 191 288 moveto
+191 280 191 271 191 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 195 262 moveto
+191 252 lineto
+188 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 195 262 moveto
+191 252 lineto
+188 262 lineto
+closepath
+stroke
+end grestore
+% LinearAggregate(a:Type)
+[ /Rect [ 112 144 270 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 270 180 moveto
+112 180 lineto
+112 144 lineto
+270 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 270 180 moveto
+112 180 lineto
+112 144 lineto
+270 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+120 157 moveto
+(LinearAggregate\(a:Type\))
+[8.64 3.84 6.96 6.24 6.24 4.8 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% FiniteLinearAggregate(a:Type)->LinearAggregate(a:Type)
+newpath 191 216 moveto
+191 208 191 199 191 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 195 190 moveto
+191 180 lineto
+188 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 195 190 moveto
+191 180 lineto
+188 190 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(b:Integer,a:Type)
+[ /Rect [ 0 72 218 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 218 108 moveto
+0 108 lineto
+0 72 lineto
+218 72 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 218 108 moveto
+0 108 lineto
+0 72 lineto
+218 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(IndexedAggregate\(b:Integer,a:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.96 3.84 4.56 6.96 3.84 6.24 6.72 6.24 4.32 3.6 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->IndexedAggregate(b:Integer,a:Type)
+newpath 170 144 moveto
+160 135 148 124 137 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 139 112 moveto
+129 108 lineto
+134 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 139 112 moveto
+129 108 lineto
+134 117 lineto
+closepath
+stroke
+end grestore
+% CLAGG...
+[ /Rect [ 236 72 310 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 310 108 moveto
+236 108 lineto
+236 72 lineto
+310 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 310 108 moveto
+236 108 lineto
+236 72 lineto
+310 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+243 85 moveto
+(CLAGG...)
+[9.36 8.64 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% LinearAggregate(a:Type)->CLAGG...
+newpath 212 144 moveto
+222 135 234 124 245 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 248 117 moveto
+253 108 lineto
+243 112 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 248 117 moveto
+253 108 lineto
+243 112 lineto
+closepath
+stroke
+end grestore
+% IXAGG...
+[ /Rect [ 73 0 145 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 145 36 moveto
+73 36 lineto
+73 0 lineto
+145 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 145 36 moveto
+73 36 lineto
+73 0 lineto
+145 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+80 13 moveto
+(IXAGG...)
+[4.56 10.08 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(b:Integer,a:Type)->IXAGG...
+newpath 109 72 moveto
+109 64 109 55 109 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 113 46 moveto
+109 36 lineto
+106 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 113 46 moveto
+109 36 lineto
+106 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10tableaggregate.ps b/books/ps/v10tableaggregate.ps
new file mode 100644
index 0000000..f9d4be9
--- /dev/null
+++ b/books/ps/v10tableaggregate.ps
@@ -0,0 +1,903 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 643 584
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 643 584
+%%PageOrientation: Portrait
+gsave
+36 36 607 548 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 546 lineto
+605 546 lineto
+605 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 546 lineto
+605 546 lineto
+605 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% TableAggregate(a:SetCategory,b:SetCategory)
+[ /Rect [ 163 504 439 540 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 439 540 moveto
+163 540 lineto
+163 504 lineto
+439 504 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 439 540 moveto
+163 540 lineto
+163 504 lineto
+439 504 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+170 517 moveto
+(TableAggregate\(a:SetCategory,b:SetCategory\))
+[7.68 6.24 6.96 3.84 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% KeyedDictionary(a:SetCategory,b:SetCategory)
+[ /Rect [ 7 432 291 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 291 468 moveto
+7 468 lineto
+7 432 lineto
+291 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 291 468 moveto
+7 468 lineto
+7 432 lineto
+291 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+15 445 moveto
+(KeyedDictionary\(a:SetCategory,b:SetCategory\))
+[9.6 5.76 6.48 6.24 6.96 10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% TableAggregate(a:SetCategory,b:SetCategory)->KeyedDictionary(a:SetCategory,b:SetCategory)
+newpath 263 504 moveto
+243 494 218 483 196 472 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 198 469 moveto
+187 468 lineto
+195 475 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 198 469 moveto
+187 468 lineto
+195 475 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:SetCategory)
+[ /Rect [ 309 432 599 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 599 468 moveto
+309 468 lineto
+309 432 lineto
+599 432 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 599 468 moveto
+309 468 lineto
+309 432 lineto
+599 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+316 445 moveto
+(IndexedAggregate\(a:SetCategory,b:SetCategory\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% TableAggregate(a:SetCategory,b:SetCategory)->IndexedAggregate(a:SetCategory,b:SetCategory)
+newpath 340 504 moveto
+360 494 385 483 407 472 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 408 475 moveto
+416 468 lineto
+405 469 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 408 475 moveto
+416 468 lineto
+405 469 lineto
+closepath
+stroke
+end grestore
+% Dictionary(Record(a:SetCategory,b:SetCategory))
+[ /Rect [ 0 360 298 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 298 396 moveto
+0 396 lineto
+0 360 lineto
+298 360 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 298 396 moveto
+0 396 lineto
+0 360 lineto
+298 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 373 moveto
+(Dictionary\(Record\(a:SetCategory,b:SetCategory\)\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 9.12 6.24 6.24 6.96 4.56 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% KeyedDictionary(a:SetCategory,b:SetCategory)->Dictionary(Record(a:SetCategory,b:SetCategory))
+newpath 149 432 moveto
+149 424 149 415 149 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 153 406 moveto
+149 396 lineto
+146 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 153 406 moveto
+149 396 lineto
+146 406 lineto
+closepath
+stroke
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)
+[ /Rect [ 330 360 578 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 578 396 moveto
+330 396 lineto
+330 360 lineto
+578 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 578 396 moveto
+330 396 lineto
+330 360 lineto
+578 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+337 373 moveto
+(IndexedAggregate\(a:SetCategory,b:Type\))
+[4.56 6.96 6.96 5.76 6.48 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6 3.6 6.96 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(a:SetCategory,b:SetCategory)->IndexedAggregate(a:SetCategory,b:Type)
+newpath 454 432 moveto
+454 424 454 415 454 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 458 406 moveto
+454 396 lineto
+451 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 458 406 moveto
+454 396 lineto
+451 406 lineto
+closepath
+stroke
+end grestore
+% HOAGG...
+[ /Rect [ 271 0 347 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 347 36 moveto
+271 36 lineto
+271 0 lineto
+347 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 347 36 moveto
+271 36 lineto
+271 0 lineto
+347 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+278 13 moveto
+(HOAGG...)
+[10.08 9.36 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->HOAGG...
+newpath 447 360 moveto
+436 333 418 280 418 234 curveto
+418 234 418 234 418 162 curveto
+418 118 404 106 378 72 curveto
+369 61 358 51 347 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 349 39 moveto
+339 36 lineto
+345 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 349 39 moveto
+339 36 lineto
+345 45 lineto
+closepath
+stroke
+end grestore
+% ELTAGG...
+[ /Rect [ 446 288 526 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 526 324 moveto
+446 324 lineto
+446 288 lineto
+526 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 526 324 moveto
+446 324 lineto
+446 288 lineto
+526 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+453 301 moveto
+(ELTAGG...)
+[8.64 7.68 7.92 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% IndexedAggregate(a:SetCategory,b:Type)->ELTAGG...
+newpath 462 360 moveto
+466 352 470 342 474 333 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 477 335 moveto
+478 324 lineto
+471 332 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 477 335 moveto
+478 324 lineto
+471 332 lineto
+closepath
+stroke
+end grestore
+% Dictionary(a:SetCategory)
+[ /Rect [ 66 288 232 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 324 moveto
+66 324 lineto
+66 288 lineto
+232 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 324 moveto
+66 324 lineto
+66 288 lineto
+232 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+74 301 moveto
+(Dictionary\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Dictionary(Record(a:SetCategory,b:SetCategory))->Dictionary(a:SetCategory)
+newpath 149 360 moveto
+149 352 149 343 149 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 153 334 moveto
+149 324 lineto
+146 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 153 334 moveto
+149 324 lineto
+146 334 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)
+[ /Rect [ 36 216 262 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 262 252 moveto
+36 252 lineto
+36 216 lineto
+262 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 262 252 moveto
+36 252 lineto
+36 216 lineto
+262 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+43 229 moveto
+(DictionaryOperations\(a:SetCategory\))
+[10.08 3.84 6.24 3.84 3.84 6.96 6.96 6.24 5.04 6.96 10.08 6.96 6.24 4.8 6.24 3.84 3.84 6.96 6.96 5.52 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Dictionary(a:SetCategory)->DictionaryOperations(a:SetCategory)
+newpath 149 288 moveto
+149 280 149 271 149 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 153 262 moveto
+149 252 lineto
+146 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 153 262 moveto
+149 252 lineto
+146 262 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:SetCategory)
+[ /Rect [ 24 144 210 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 210 180 moveto
+24 180 lineto
+24 144 lineto
+210 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 210 180 moveto
+24 180 lineto
+24 144 lineto
+210 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+31 157 moveto
+(BagAggregate\(a:SetCategory\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BagAggregate(a:SetCategory)
+newpath 141 216 moveto
+137 208 133 198 129 189 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 132 188 moveto
+125 180 lineto
+126 191 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 132 188 moveto
+125 180 lineto
+126 191 lineto
+closepath
+stroke
+end grestore
+% Collection(a:SetCategory)
+[ /Rect [ 228 144 390 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 390 180 moveto
+228 180 lineto
+228 144 lineto
+390 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 390 180 moveto
+228 180 lineto
+228 144 lineto
+390 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+235 157 moveto
+(Collection\(a:SetCategory\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.68 6 3.84 9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96 4.56]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->Collection(a:SetCategory)
+newpath 189 216 moveto
+211 206 237 194 260 184 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 261 187 moveto
+269 180 lineto
+258 181 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 261 187 moveto
+269 180 lineto
+258 181 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)
+[ /Rect [ 66 72 210 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 210 108 moveto
+66 108 lineto
+66 72 lineto
+210 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 210 108 moveto
+66 108 lineto
+66 72 lineto
+210 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+73 85 moveto
+(BagAggregate\(a:Type\))
+[9.36 6.24 6.96 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% BagAggregate(a:SetCategory)->BagAggregate(a:Type)
+newpath 122 144 moveto
+125 136 128 127 130 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 133 119 moveto
+133 108 lineto
+127 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 133 119 moveto
+133 108 lineto
+127 117 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+[ /Rect [ 249 72 369 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 369 108 moveto
+249 108 lineto
+249 72 lineto
+369 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 369 108 moveto
+249 108 lineto
+249 72 lineto
+369 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+256 85 moveto
+(Collection\(a:Type\))
+[9.36 6.96 3.84 3.84 6.24 6.24 3.84 3.84 6.96 6.96 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% Collection(a:SetCategory)->Collection(a:Type)
+newpath 309 144 moveto
+309 136 309 127 309 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 313 118 moveto
+309 108 lineto
+306 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 313 118 moveto
+309 108 lineto
+306 118 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)->HOAGG...
+newpath 309 72 moveto
+309 64 309 55 309 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 313 46 moveto
+309 36 lineto
+306 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 313 46 moveto
+309 36 lineto
+306 46 lineto
+closepath
+stroke
+end grestore
+% BagAggregate(a:Type)->HOAGG...
+newpath 181 72 moveto
+206 62 236 49 262 38 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 263 41 moveto
+271 34 lineto
+260 35 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 263 41 moveto
+271 34 lineto
+260 35 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10type.ps b/books/ps/v10type.ps
new file mode 100644
index 0000000..dc94925
--- /dev/null
+++ b/books/ps/v10type.ps
@@ -0,0 +1,299 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 112 152
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 112 152
+%%PageOrientation: Portrait
+gsave
+36 36 76 116 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+74 114 lineto
+74 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 114 lineto
+74 114 lineto
+74 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Type()
+[ /Rect [ 7 72 61 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 61 108 moveto
+7 108 lineto
+7 72 lineto
+61 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 61 108 moveto
+7 108 lineto
+7 72 lineto
+61 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+15 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Category
+[ /Rect [ 0 0 68 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 68 36 moveto
+0 36 lineto
+0 0 lineto
+68 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 68 36 moveto
+0 36 lineto
+0 0 lineto
+68 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 34 72 moveto
+34 64 34 55 34 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 38 46 moveto
+34 36 lineto
+31 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 38 46 moveto
+34 36 lineto
+31 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v10unaryrecursiveaggregate.ps b/books/ps/v10unaryrecursiveaggregate.ps
new file mode 100644
index 0000000..af2b2d4
--- /dev/null
+++ b/books/ps/v10unaryrecursiveaggregate.ps
@@ -0,0 +1,503 @@
+%!PS-Adobe-2.0
+%%Creator: dot version 2.8 (Thu Sep 14 20:34:11 UTC 2006)
+%%For: (root) root
+%%Title: pic
+%%Pages: (atend)
+%%BoundingBox: 36 36 256 440
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 256 440
+%%PageOrientation: Portrait
+gsave
+36 36 220 404 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+218 402 lineto
+218 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+218 402 lineto
+218 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% UnaryRecursiveAggregate(a:Type)
+[ /Rect [ 0 360 212 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 212 396 moveto
+0 396 lineto
+0 360 lineto
+212 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 212 396 moveto
+0 396 lineto
+0 360 lineto
+212 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 373 moveto
+(UnaryRecursiveAggregate\(a:Type\))
+[9.6 6.96 6.24 5.04 6.96 9.12 6.24 6.24 6.96 4.8 5.52 3.84 6.48 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)
+[ /Rect [ 18 288 194 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 194 324 moveto
+18 324 lineto
+18 288 lineto
+194 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 194 324 moveto
+18 324 lineto
+18 288 lineto
+194 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+25 301 moveto
+(RecursiveAggregate\(a:Type\))
+[9.12 6.24 6.24 6.96 4.8 5.52 3.84 6.48 6.24 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% UnaryRecursiveAggregate(a:Type)->RecursiveAggregate(a:Type)
+newpath 106 360 moveto
+106 352 106 343 106 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 110 334 moveto
+106 324 lineto
+103 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 110 334 moveto
+106 324 lineto
+103 334 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+[ /Rect [ 5 216 207 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 207 252 moveto
+5 252 lineto
+5 216 lineto
+207 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 207 252 moveto
+5 252 lineto
+5 216 lineto
+207 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+12 229 moveto
+(HomogeneousAggregate\(a:Type\))
+[10.08 6.96 10.8 6.96 6.72 6.24 6.96 6.24 6.96 6.96 5.52 9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 6.24 3.84 7.2 6.96 6.96 6.24 4.56]
+xshow
+end grestore
+end grestore
+% RecursiveAggregate(a:Type)->HomogeneousAggregate(a:Type)
+newpath 106 288 moveto
+106 280 106 271 106 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 110 262 moveto
+106 252 lineto
+103 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 110 262 moveto
+106 252 lineto
+103 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+[ /Rect [ 64 144 148 180 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 148 180 moveto
+64 180 lineto
+64 144 lineto
+148 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 148 180 moveto
+64 180 lineto
+64 144 lineto
+148 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+71 157 moveto
+(Aggregate\(\))
+[9.84 6.96 7.2 4.8 6.24 6.72 6.24 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% HomogeneousAggregate(a:Type)->Aggregate()
+newpath 106 216 moveto
+106 208 106 199 106 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 110 190 moveto
+106 180 lineto
+103 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 110 190 moveto
+106 180 lineto
+103 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+[ /Rect [ 79 72 133 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 133 108 moveto
+79 108 lineto
+79 72 lineto
+133 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 133 108 moveto
+79 108 lineto
+79 72 lineto
+133 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+87 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 106 144 moveto
+106 136 106 127 106 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 110 118 moveto
+106 108 lineto
+103 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 110 118 moveto
+106 108 lineto
+103 118 lineto
+closepath
+stroke
+end grestore
+% Category
+[ /Rect [ 72 0 140 36 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.pamphlet) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 140 36 moveto
+72 36 lineto
+72 0 lineto
+140 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 140 36 moveto
+72 36 lineto
+72 0 lineto
+140 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+80 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% Type()->Category
+newpath 106 72 moveto
+106 64 106 55 106 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 110 46 moveto
+106 36 lineto
+103 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 110 46 moveto
+106 36 lineto
+103 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/changelog b/changelog
index a9d52fa..a9fc94f 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,38 @@
+20080911 tpd src/algebra/Makefile remove coerce.spad
+20080911 tpd books/ps/v10unaryrecursiveaggregate.ps add image
+20080911 tpd books/ps/v10type.ps add image
+20080911 tpd books/ps/v10tableaggregate.ps add image
+20080911 tpd books/ps/v10stringaggregate.ps add image
+20080911 tpd books/ps/v10streamaggregate.ps add image
+20080911 tpd books/ps/v10stackaggregate.ps add image
+20080911 tpd books/ps/v10retractableto.ps add image
+20080911 tpd books/ps/v10recursiveaggregate.ps add image
+20080911 tpd books/ps/v10queueaggregate.ps add image
+20080911 tpd books/ps/v10priorityqueueaggregate.ps add image
+20080911 tpd books/ps/v10onedimensionalarrayaggregate.ps add image
+20080911 tpd books/ps/v10multidictionary.ps add image
+20080911 tpd books/ps/v10listaggregate.ps add image
+20080911 tpd books/ps/v10linearaggregate.ps add image
+20080911 tpd books/ps/v10konvert.ps add image
+20080911 tpd books/ps/v10koerce.ps add image
+20080911 tpd books/ps/v10keyeddictionary.ps add image
+20080911 tpd books/ps/v10indexedaggregate.ps add image
+20080911 tpd books/ps/v10homogeneousaggregate.ps add image
+20080911 tpd books/ps/v10finitelinearaggregate.ps add image
+20080911 tpd books/ps/v10extensiblelinearaggregate.ps add image
+20080911 tpd books/ps/v10eltableaggregate.ps add image
+20080911 tpd books/ps/v10eltab.ps add image
+20080911 tpd books/ps/v10doublylinkedaggregate.ps add image
+20080911 tpd books/ps/v10dictionaryoperations.ps add image
+20080911 tpd books/ps/v10dictionary.ps add image
+20080911 tpd books/ps/v10dequeueaggregate.ps add image
+20080911 tpd books/ps/v10collection.ps add image
+20080911 tpd books/ps/v10binaryrecursiveaggregate.ps add image
+20080911 tpd books/ps/v10bagaggregate.ps add image
+20080911 tpd books/ps/v10associationlistaggregate.ps add image
+20080911 tpd books/ps/v10agg.ps add image
+20080911 tpd src/algebra/coerce.spad merge into bookvol10
+20080911 tpd books/bookvol10 document aggcat, coerce layers
 20080911 tpd books/bookvol11 fix background image
 20080909 tpd books/bookvol0 change \over to \frac
 20080908 tpd books/bookvol10 latex cleanup
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 7ac4e51..59f9a08 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -197,7 +197,6 @@ LAYER0=\
 ituple.spad.pamphlet   (ITFUN2 ITFUN3 ITUPLE)
 mkrecord.spad.pamphlet (MKRECORD)
 pcurve.spad.pamphlet   (PPCURVE PSCURVE)
-coerce.spad.pamphlet   (TYPE KOERCE KONVERT RETRACT)
 \end{verbatim}
 
 <<layer1>>=
@@ -727,10 +726,6 @@ LAYER16=\
 \subsubsection{Completed spad files}
 \begin{verbatim}
 algext.spad.pamphlet (SAE)
-aggcat.spad.pamphlet (AGG HOAGG CLAGG BGAGG SKAGG QUAGG DQAGG PRQAGG DIOPS
-                      DIAGG MDAGG SETAGG FSAGG MSETAGG OMSAGG KDAGG ELTAB
-                      ELTAGG ISAGG TBAGG RCAGG BRAGG DLAGG URAGG STAGG LNAGG
-                      FLAGG A1AGG ELAGG LSAGG ALAGG SRAGG BTAGG ITAGG) 
 aggcat2.spad.pamphlet (FLAGG2 FSAGG2)
 galfact.spad.pamphlet (GALFACT)
 intfact.spad.pamphlet (PRIMES IROOT INTFACT)
@@ -1201,7 +1196,7 @@ SPADFILES= \
  ${OUTSRC}/c02.spad ${OUTSRC}/c05.spad ${OUTSRC}/c06.spad \
  ${OUTSRC}/card.spad ${OUTSRC}/carten.spad ${OUTSRC}/catdef.spad \
  ${OUTSRC}/cden.spad ${OUTSRC}/clifford.spad ${OUTSRC}/clip.spad \
- ${OUTSRC}/cmplxrt.spad ${OUTSRC}/coerce.spad ${OUTSRC}/color.spad \
+ ${OUTSRC}/cmplxrt.spad ${OUTSRC}/color.spad \
  ${OUTSRC}/combfunc.spad ${OUTSRC}/combinat.spad ${OUTSRC}/complet.spad \
  ${OUTSRC}/constant.spad ${OUTSRC}/contfrac.spad ${OUTSRC}/cont.spad \
  ${OUTSRC}/coordsys.spad ${OUTSRC}/cra.spad ${OUTSRC}/crfp.spad \
@@ -1361,7 +1356,7 @@ DOCFILES= \
  ${DOC}/c02.spad.dvi ${DOC}/c05.spad.dvi ${DOC}/c06.spad.dvi \
  ${DOC}/card.spad.dvi ${DOC}/carten.spad.dvi ${DOC}/catdef.spad.dvi \
  ${DOC}/cden.spad.dvi ${DOC}/clifford.spad.dvi ${DOC}/clip.spad.dvi \
- ${DOC}/cmplxrt.spad.dvi ${DOC}/coerce.spad.dvi ${DOC}/color.spad.dvi \
+ ${DOC}/cmplxrt.spad.dvi ${DOC}/color.spad.dvi \
  ${DOC}/combfunc.spad.dvi ${DOC}/combinat.spad.dvi ${DOC}/complet.spad.dvi \
  ${DOC}/constant.spad.dvi ${DOC}/contfrac.spad.dvi ${DOC}/cont.spad.dvi \
  ${DOC}/coordsys.spad.dvi ${DOC}/cra.spad.dvi ${DOC}/crfp.spad.dvi \
diff --git a/src/algebra/coerce.spad.pamphlet b/src/algebra/coerce.spad.pamphlet
deleted file mode 100644
index ad24e99..0000000
--- a/src/algebra/coerce.spad.pamphlet
+++ /dev/null
@@ -1,167 +0,0 @@
-\documentclass{article}
-\usepackage{axiom}
-\begin{document}
-\title{\$SPAD/src/algebra coerce.spad}
-\author{Richard Jenks, Manuel Bronstein}
-\maketitle
-\begin{abstract}
-\end{abstract}
-\eject
-\tableofcontents
-\eject
-\section{category TYPE Type}
-<<dot>>=
-"TYPE" -> "CATEGORY"
-"Type()" -> "Category"
-@
-<<category TYPE Type>>=
-)abbrev category TYPE Type
-++ The new fundamental Type (keeping Object for 1.5 as well)
-++ Author: Richard Jenks
-++ Date Created: 14 May 1992
-++ Date Last Updated: 14 May 1992
-++ Description: The fundamental Type;
-Type(): Category == with nil
-
-@
-\section{category KOERCE CoercibleTo}
-<<dot>>=
-"KOERCE" -> "CATEGORY"
-"CoercibleTo(a:Type)" -> "Category"
-"CoercibleTo(OutputForm)" ->
-    "CoercibleTo(a:Type)"
-@
-<<category KOERCE CoercibleTo>>=
-)abbrev category KOERCE CoercibleTo
-++ Category for coerce
-++ Author: Manuel Bronstein
-++ Date Created: ???
-++ Date Last Updated: 14 May 1991
-++ Description:
-++ A is coercible to B means any element of A can automatically be
-++ converted into an element of B by the interpreter.
-CoercibleTo(S:Type): Category == with
-    coerce: % -> S
-      ++ coerce(a) transforms a into an element of S.
-
-@
-\section{category KONVERT ConvertibleTo}
-<<dot>>=
-"KONVERT" -> "CATEGORY"
-"ConvertibleTo(a:Type)" -> "Category"
-"ConvertibleTo(DoubleFloat)" -> "ConvertibleTo(a:Type)"
-"ConvertibleTo(Float)" -> "ConvertibleTo(a:Type)"
-"ConvertibleTo(InputForm)" -> "ConvertibleTo(a:Type)"
-"ConvertibleTo(Integer)" -> "ConvertibleTo(a:Type)"
-"ConvertibleTo(Pattern(Integer))" -> "ConvertibleTo(a:Type)"
-"ConvertibleTo(Pattern(Float))" -> "ConvertibleTo(a:Type)"
-"ConvertibleTo(Complex(Float))" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(Complex(DoubleFloat))" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(String)" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(Symbol)" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(SExpression)" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(Pattern(Base))" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(List(Integer))" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(List(Character))" ->  "ConvertibleTo(a:Type)"
-"ConvertibleTo(UnivariatePolynomialCategory(CommutativeRing))" ->
-    "ConvertibleTo(a:Type)"
-@
-<<category KONVERT ConvertibleTo>>=
-)abbrev category KONVERT ConvertibleTo
-++ Category for convert
-++ Author: Manuel Bronstein
-++ Date Created: ???
-++ Date Last Updated: 14 May 1991
-++ Description:
-++ A is convertible to B means any element of A
-++ can be converted into an element of B,
-++ but not automatically by the interpreter.
-ConvertibleTo(S:Type): Category == with
-    convert: % -> S
-      ++ convert(a) transforms a into an element of S.
-
-@
-\section{category RETRACT RetractableTo}
-<<dot>>=
-"RETRACT" -> "CATEGORY"
-"RetractableTo(a:Type)" -> "Category"
-"RetractableTo(SetCategory)" -> "RetractableTo(a:Type)"
-"RetractableTo(Symbol)" -> "RetractableTo(a:Type)"
-"RetractableTo(Integer)" -> "RetractableTo(a:Type)"
-"RetractableTo(NonNegativeInteger)" -> "RetractableTo(a:Type)"
-"RetractableTo(Fraction(Integer))" -> "RetractableTo(a:Type)"
-"RetractableTo(Float)" -> "RetractableTo(a:Type)"
-"RetractableTo(Kernel(ExpressionSpace))" -> "RetractableTo(a:Type)"
-"RetractableTo(CommutativeRing)" -> "RetractableTo(a:Type)"
-@
-<<category RETRACT RetractableTo>>=
-)abbrev category RETRACT RetractableTo
-++ Category for retract
-++ Author: ???
-++ Date Created: ???
-++ Date Last Updated: 14 May 1991
-++ Description:
-++ A is retractable to B means that some elementsif A can be converted
-++ into elements of B and any element of B can be converted into an
-++ element of A.
-RetractableTo(S: Type): Category == with
-    coerce:       S -> %
-      ++ coerce(a) transforms a into an element of %.
-    retractIfCan: % -> Union(S,"failed")
-      ++ retractIfCan(a) transforms a into an element of S if possible.
-      ++ Returns "failed" if a cannot be made into an element of S.
-    retract:      % -> S
-      ++ retract(a) transforms a into an element of S if possible.
-      ++ Error: if a cannot be made into an element of S.
-  add
-    retract(s) ==
-      (u:=retractIfCan s) case "failed" => error "not retractable"
-      u
-
-@
-\section{License}
-<<license>>=
---Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
---All rights reserved.
---
---Redistribution and use in source and binary forms, with or without
---modification, are permitted provided that the following conditions are
---met:
---
---    - Redistributions of source code must retain the above copyright
---      notice, this list of conditions and the following disclaimer.
---
---    - Redistributions in binary form must reproduce the above copyright
---      notice, this list of conditions and the following disclaimer in
---      the documentation and/or other materials provided with the
---      distribution.
---
---    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
---      names of its contributors may be used to endorse or promote products
---      derived from this software without specific prior written permission.
---
---THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
---IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
---TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
---PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
---OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
---EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
---PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
---PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
---LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
---NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
---SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-@
-<<*>>=
-<<license>>
-
-<<category TYPE Type>>
-<<category KOERCE CoercibleTo>>
-<<category KONVERT ConvertibleTo>>
-<<category RETRACT RetractableTo>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}
