diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 2e31015..96d8704 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -37,8 +37,8 @@
 %%
 %% pagepic adds an image and an index entry
 %%
-\newcommand{\pagepic}[2]{% e.g. \pagepic{pathandfile}{abb}
-\includegraphics{#1}%
+\newcommand{\pagepic}[3]{% e.g. \pagepic{pathandfile}{abb}{scale}
+\includegraphics[scale=#3]{#1}%
 \index{images!#2}}
 %%
 %% pageto is a forward link to a referenced page
@@ -290,9 +290,10 @@ This is the root of the category hierarchy and is not represented by code.
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{BasicType}{BASTYPE}
-\pagepic{ps/v102basictype.ps}{BASTYPE}
+\pagepic{ps/v102basictype.ps}{BASTYPE}{1.00}
 
 {\bf See:}\\
+\pageto{SetCategory}{SETCAT}
 \pagefrom{Category}{CATEGORY}
 
 {\bf Exports:}\\
@@ -359,9 +360,10 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{CoercibleTo}{KOERCE}
-\pagepic{ps/v102koerce.ps}{KOERCE}
+\pagepic{ps/v102koerce.ps}{KOERCE}{1.00}
 
 {\bf See:}\\
+\pageto{SetCategory}{SETCAT}
 \pagefrom{Category}{CATEGORY}
 
 {\bf Exports:}
@@ -422,7 +424,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{ConvertibleTo}{KONVERT}
-\pagepic{ps/v102konvert.ps}{KONVERT}
+\pagepic{ps/v102konvert.ps}{KONVERT}{1.00}
 
 {\bf See:}\\
 \pageto{Collection}{CLAGG}
@@ -542,9 +544,10 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{Eltable}{ELTAB}
-\pagepic{ps/v102eltab.ps}{ELTAB}
+\pagepic{ps/v102eltab.ps}{ELTAB}{1.00}
 
 {\bf See:}\\
+\pageto{EltableAggregate}{ELTAGG}
 \pagefrom{Category}{CATEGORY}
 
 {\bf Exports:}
@@ -610,7 +613,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{RetractableTo}{RETRACT}
-\pagepic{ps/v102retractableto.ps}{RETRACT}
+\pagepic{ps/v102retractableto.ps}{RETRACT}{1.00}
 
 {\bf See:}\\
 \pagefrom{Category}{CATEGORY}
@@ -718,7 +721,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{Type}{TYPE}
-\pagepic{ps/v102type.ps}{TYPE}
+\pagepic{ps/v102type.ps}{TYPE}{1.00}
 
 {\bf See:}\\
 \pageto{Aggregate}{AGG}
@@ -759,7 +762,7 @@ digraph pic {
 \chapter{Category Layer 2}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{Aggregate}{AGG}
-\pagepic{ps/v102agg.ps}{AGG}
+\pagepic{ps/v102agg.ps}{AGG}{1.00}
 
 {\bf See:}\\
 \pageto{HomogeneousAggregate}{HOAGG}
@@ -871,9 +874,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{EltableAggregate}{ELTAGG}
-%\pagepic{ps/v102eltableaggregate.ps}{ELTAGG}
-\includegraphics[scale=0.75]{ps/v102eltableaggregate.ps}
-\index{images!STAGG}
+\pagepic{ps/v102eltableaggregate.ps}{ELTAGG}{0.75}
 
 {\bf See:}\\
 \pageto{IndexedAggregate}{IXAGG}
@@ -987,7 +988,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{SetCategory}{SETCAT}
-\pagepic{ps/v102setcategory.ps}{SETCAT}
+\pagepic{ps/v102setcategory.ps}{SETCAT}{1.00}
 
 {\bf See:}\\
 \pageto{AbelianSemiGroup}{ABELSG}
@@ -995,6 +996,10 @@ digraph pic {
 \pageto{HomogeneousAggregate}{HOAGG}
 \pageto{OrderedSet}{ORDSET}
 \pageto{SemiGroup}{SGROUP}
+\pageto{SetAggregate}{SETAGG}
+\pageto{StepThrough}{STEP}
+\pagefrom{BasicType}{BASTYPE}
+\pagefrom{CoercibleTo}{KOERCE}
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
@@ -1094,9 +1099,10 @@ digraph pic {
 \chapter{Category Layer 3}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{AbelianSemiGroup}{ABELSG}
-\pagepic{ps/v102abeliansemigroup.ps}{ABELSG}
+\pagepic{ps/v102abeliansemigroup.ps}{ABELSG}{1.00}
 
 {\bf See:}\\
+\pageto{AbelianMonoid}{ABELMON}
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
@@ -1212,9 +1218,10 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{Finite}{FINITE}
-\pagepic{ps/v102finite.ps}{FINITE}
+\pagepic{ps/v102finite.ps}{FINITE}{1.00}
 
 {\bf See:}\\
+\pageto{OrderedFinite}{ORDFIN}
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
@@ -1328,7 +1335,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{HomogeneousAggregate}{HOAGG}
-\pagepic{ps/v102homogeneousaggregate.ps}{HOAGG}
+\pagepic{ps/v102homogeneousaggregate.ps}{HOAGG}{1.00}
 
 {\bf See:}\\
 \pageto{BagAggregate}{BGAGG}
@@ -1420,7 +1427,7 @@ These exports come from Evalable(a:Type):
           if S has EVALAB S and S has SETCAT
 \end{verbatim}
 
-These exports come from SetCategory:
+These exports come from SetCategory():
 \begin{verbatim}
  hash : % -> SingleInteger if S has SETCAT
  ?~=? : (%,%) -> Boolean if S has SETCAT
@@ -1554,15 +1561,18 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{OrderedSet}{ORDSET}
-\pagepic{ps/v102orderedset.ps}{ORDSET}
+\pagepic{ps/v102orderedset.ps}{ORDSET}{1.00}
 
 {\bf See:}\\
+\pageto{OrderedAbelianSemiGroup}{OASGP}
+\pageto{OrderedFinite}{ORDFIN}
+\pageto{OrderedMonoid}{ORDMON}
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
 \begin{tabular}{llllll}
- coerce & hash & latex & max & min & ?<?\\
- ?<=? & ?=? & ?>? & ?>=? & ?\~{}=? &\\
+ coerce & hash & latex & max & min & ?$<$?\\
+ ?$<=$? & ?=? & ?$>$? & ?$>=$? & ?\~{}=? &\\
 \end{tabular}
 
 \cross{ORDSET}{coerce}
@@ -1570,11 +1580,11 @@ digraph pic {
 \cross{ORDSET}{latex}
 \cross{ORDSET}{max}
 \cross{ORDSET}{min}
-\cross{ORDSET}{?<?}
-\cross{ORDSET}{?<=?}
+\cross{ORDSET}{?$<$?}
+\cross{ORDSET}{?$<=$?}
 \cross{ORDSET}{?=?}
-\cross{ORDSET}{?>?}
-\cross{ORDSET}{?>=?}
+\cross{ORDSET}{?$>$?}
+\cross{ORDSET}{?$>=$?}
 \cross{ORDSET}{?\~{}=?}
 
 These are directly exported but not implemented:
@@ -1616,7 +1626,6 @@ These exports come from SetCategory():
 ++ pair of elements \spad{(a,b)}
 ++ exactly one of the following relations holds \spad{a<b or a=b or b<a}
 ++ and the relation is transitive, i.e.  \spad{a<b and b<c => a<c}.
-
 OrderedSet(): Category == SetCategory with
   --operations
     "<": (%,%) -> Boolean
@@ -1688,9 +1697,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{SemiGroup}{SGROUP}
-%\pagepic{ps/v102semigroup.ps}{SGROUP}
-\includegraphics[scale=0.75]{ps/v102semigroup.ps}
-\index{images!SGROUP}
+\pagepic{ps/v102semigroup.ps}{SGROUP}{0.75}
 
 A Semigroup is defined as a set $S$ with a binary multiplicative
 operator ``*''. A Semigroup $G(S,*)$ is:
@@ -1701,6 +1708,8 @@ operator ``*''. A Semigroup $G(S,*)$ is:
 \end{itemize}
 
 {\bf See:}\\
+\pageto{Monoid}{MONOID}
+\pageto{Rng}{RNG}
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
@@ -1820,10 +1829,256 @@ digraph pic {
 }
 
 @
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{StepThrough}{STEP}
+\pagepic{ps/v102stepthrough.ps}{STEP}{1.00}
+
+{\bf See:}\\
+\pagefrom{SetCategory}{SETCAT}
+
+{\bf Exports:}\\
+\begin{tabular}{lllllll}
+ coerce & hash & init & latex & nextItem & ?=? & ?\~{}=?
+\end{tabular}
+
+\cross{STEP}{coerce}
+\cross{STEP}{hash}
+\cross{STEP}{init}
+\cross{STEP}{latex}
+\cross{STEP}{?=?}
+\cross{STEP}{?~=?}
+\cross{STEP}{nextItem}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ init : () -> %
+ nextItem : % -> Union(%,"failed")
+\end{verbatim}
+
+These exports come from SetCategory():
+\begin{verbatim}
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String                  
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category STEP StepThrough>>=
+)abbrev category STEP StepThrough
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A class of objects which can be 'stepped through'.
+++ Repeated applications of \spadfun{nextItem} is guaranteed never to
+++ return duplicate items and only return "failed" after exhausting
+++ all elements of the domain.
+++ This assumes that the sequence starts with \spad{init()}.
+++ For infinite domains, repeated application
+++ of \spadfun{nextItem} is not required to reach all possible domain elements
+++ starting from any initial element.
+++
+++ Conditional attributes:
+++   infinite\tab{15}repeated \spad{nextItem}'s are never "failed".
+StepThrough(): Category == SetCategory with
+    --operations
+      init: constant -> %
+        ++ init() chooses an initial object for stepping.
+      nextItem: % -> Union(%,"failed")
+        ++ nextItem(x) returns the next item, or "failed" if domain is exhausted.
+
+@
+<<STEP.dotabb>>=
+"STEP" [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=STEP"];
+"STEP" -> "SETCAT"
+
+@
+<<STEP.dotfull>>=
+"StepThrough()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=STEP"];
+"StepThrough()" -> "SetCategory()"
+
+@
+<<STEP.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"StepThrough()" [color=lightblue];
+"StepThrough()" -> "SetCategory()"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"Category" [color=lightblue];
+
+}
+
+@
 \chapter{Category Layer 4}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{AbelianMonoid}{ABELMON}
+\pagepic{ps/v102abelianmonoid.ps}{ABELMON}{0.75}
+
+{\bf See:}\\
+\pageto{CancellationAbelianMonoid}{CABMON}
+\pageto{OrderedAbelianMonoid}{OAMON}
+\pageto{OrderedAbelianSemiGroup}{OASGP}
+\pagefrom{AbelianSemiGroup}{ABELSG}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ 0     &  coerce & hash & latex & sample\\
+ zero? & ?*?     & ?+?  & ?=?   & ?\~{}=?
+\end{tabular}
+
+\cross{ABELMON}{0}
+\cross{ABELMON}{coerce}
+\cross{ABELMON}{hash}
+\cross{ABELMON}{latex}
+\cross{ABELMON}{sample}
+\cross{ABELMON}{zero?}
+\cross{ABELMON}{?*?}
+\cross{ABELMON}{?+?}
+\cross{ABELMON}{?=?}
+\cross{ABELMON}{?\~{}=?}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ 0 : () -> %
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ sample : () -> %
+ zero? : % -> Boolean                 
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+\end{verbatim}
+
+These exports come from AbelianSemiGroup():
+\begin{verbatim}
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean
+ ?+? : (%,%) -> %
+\end{verbatim}
+
+<<category ABELMON AbelianMonoid>>=
+)abbrev category ABELMON AbelianMonoid
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The class of multiplicative monoids, i.e. semigroups with an
+++ additive identity element.
+++
+++ Axioms:
+++   \spad{leftIdentity("+":(%,%)->%,0)}\tab{30}\spad{ 0+x=x }
+++   \spad{rightIdentity("+":(%,%)->%,0)}\tab{30}\spad{ x+0=x }
+-- following domain must be compiled with subsumption disabled
+-- define SourceLevelSubset to be EQUAL
+AbelianMonoid(): Category == AbelianSemiGroup with
+    --operations
+      0: constant -> % 
+	++ 0 is the additive identity element.
+      sample: constant -> %
+	++ sample yields a value of type %
+      zero?: % -> Boolean
+	++ zero?(x) tests if x is equal to 0.
+      "*": (NonNegativeInteger,%) -> %
+        ++ n * x is left-multiplication by a non negative integer
+    add
+      import RepeatedDoubling(%)
+      zero? x == x = 0
+      n:PositiveInteger * x:% == (n::NonNegativeInteger) * x
+      sample() == 0
+      if not (% has Ring) then
+        n:NonNegativeInteger * x:% ==
+          zero? n => 0
+          double(n pretend PositiveInteger,x)
+
+@
+<<ABELMON.dotabb>>=
+"ABELMON"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ABELMON"];
+"ABELMON" -> "ABELSG"
+
+@
+<<ABELMON.dotfull>>=
+"AbelianMonoid()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ABELMON"];
+"AbelianMonoid()" -> "AbelianSemiGroup()"
+
+@
+<<ABELMON.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "AbelianSemiGroup()"
+
+"AbelianSemiGroup()" [color=lightblue];
+"AbelianSemiGroup()" -> "SetCategory()"
+"AbelianSemiGroup()" -> "RepeatedDoubling(AbelianSemiGroup)"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" ->
+    "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"RepeatedDoubling(AbelianSemiGroup)" [color="#00EE00"];
+"RepeatedDoubling(AbelianSemiGroup)" -> "RepeatedDoubling(a:SetCategory)"
+
+"RepeatedDoubling(a:SetCategory)" [color="#00EE00"];
+"RepeatedDoubling(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"Category" [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{BagAggregate}{BGAGG}
-\pagepic{ps/v102bagaggregate.ps}{BGAGG}
+\pagepic{ps/v102bagaggregate.ps}{BGAGG}{1.00}
 
 {\bf See:}\\
 \pageto{DictionaryOperations}{DIOPS}
@@ -1880,7 +2135,7 @@ These are implemented by this category:
  bag : List S -> %
 \end{verbatim}
 
-These exports come from HomogeneousAggregate:
+These exports come from HomogeneousAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -1993,11 +2248,12 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{Collection}{CLAGG}
-\pagepic{ps/v102collection.ps}{CLAGG}
+\pagepic{ps/v102collection.ps}{CLAGG}{1.00}
 
 {\bf See:}\\
 \pageto{DictionaryOperations}{DIOPS}
 \pageto{LinearAggregate}{LNAGG}
+\pageto{SetAggregate}{SETAGG}
 \pagefrom{ConvertibleTo}{KONVERT}
 \pagefrom{HomogeneousAggregate}{HOAGG}
 
@@ -2066,7 +2322,7 @@ These are implemented by this category:
  #? : % -> NonNegativeInteger if $ has finiteAggregate
 \end{verbatim}
 
-These exports come from HomogeneousAggregate(a:Type):
+These exports come from HomogeneousAggregate(S:Type):
 \begin{verbatim}
  coerce : % -> OutputForm if S has SETCAT
  copy : % -> %
@@ -2091,16 +2347,16 @@ These exports come from HomogeneousAggregate(a:Type):
  map! : ((S -> S),%) -> % if $ has shallowlyMutable
  member? : (S,%) -> Boolean 
           if S has SETCAT and $ has finiteAggregate
- sample : () -> %                     
  members : % -> List S if $ has finiteAggregate
  more? : (%,NonNegativeInteger) -> Boolean
  parts : % -> List S if $ has finiteAggregate
+ sample : () -> %                     
  size? : (%,NonNegativeInteger) -> Boolean
  ?=? : (%,%) -> Boolean if S has SETCAT
  ?~=? : (%,%) -> Boolean if S has SETCAT
 \end{verbatim}
 
-These exports come from ConvertibleTo(a:Type):
+These exports come from ConvertibleTo(S:Type):
 \begin{verbatim}
  convert : % -> InputForm if S has KONVERT INFORM
 \end{verbatim}
@@ -2241,7 +2497,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{IndexedAggregate}{IXAGG}
-\pagepic{ps/v102indexedaggregate.ps}{IXAGG}
+\pagepic{ps/v102indexedaggregate.ps}{IXAGG}{1.00}
 
 {\bf See:}\\
 \pageto{LinearAggregate}{LNAGG}
@@ -2318,7 +2574,7 @@ These are implemented by this category:
  swap! : (%,Index,Index) -> Void if $ has shallowlyMutable
 \end{verbatim}
 
-These exports come from HomogeneousAggregate(a:Type):
+These exports come from HomogeneousAggregate(Entry:Type):
 \begin{verbatim}
  any? : ((Entry -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -2356,7 +2612,7 @@ These exports come from HomogeneousAggregate(a:Type):
  ?=? : (%,%) -> Boolean if Entry has SETCAT
 \end{verbatim}
 
-These exports come from EltableAggregate(a:SetCategory,b:Type):
+These exports come from EltableAggregate(Index:SetCategory,Entry:Type):
 \begin{verbatim}
  qelt : (%,Index) -> Entry
  qsetelt! : (%,Index,Entry) -> Entry if $ has shallowlyMutable
@@ -2510,8 +2766,282 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Monoid}{MONOID}
+\pagepic{ps/v102monoid.ps}{MONOID}{0.75}
+
+{\bf See:}\\
+\pageto{OrderedMonoid}{ORDMON}
+\pagefrom{SemiGroup}{SGROUP}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ 1     & coerce & hash & latex & one?\\
+ recip & sample & ?*?  & ?=?   & ?\~{}=?\\
+ ?**?  & ?\^{}? & ?\^{}?   &&\\
+\end{tabular}
+
+\cross{MONOID}{1}
+\cross{MONOID}{coerce}
+\cross{MONOID}{hash}
+\cross{MONOID}{latex}
+\cross{MONOID}{one?}
+\cross{MONOID}{recip}
+\cross{MONOID}{sample}
+\cross{MONOID}{?*?}
+\cross{MONOID}{?=?}
+\cross{MONOID}{?\~{}=?}
+\cross{MONOID}{?**?}
+\cross{MONOID}{?\^{}?}
+
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ 1 : () -> %
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ one? : % -> Boolean                  
+ recip : % -> Union(%,"failed")
+ sample : () -> %                     
+ ?^? : (%,NonNegativeInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+These exports come from SemiGroup():
+\begin{verbatim}
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ ?*? : (%,%) -> %                     
+ ?**? : (%,PositiveInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category MONOID Monoid>>=
+)abbrev category MONOID Monoid
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The class of multiplicative monoids, i.e. semigroups with a
+++ multiplicative identity element.
+++
+++ Axioms:
+++    \spad{leftIdentity("*":(%,%)->%,1)}\tab{30}\spad{1*x=x}
+++    \spad{rightIdentity("*":(%,%)->%,1)}\tab{30}\spad{x*1=x}
+++
+++ Conditional attributes:
+++    unitsKnown\tab{15}\spadfun{recip} only returns "failed" on non-units
+Monoid(): Category == SemiGroup with
+      1: constant ->  %
+        ++ 1 is the multiplicative identity.
+      sample: constant -> %
+        ++ sample yields a value of type %
+      one?: % -> Boolean
+        ++ one?(x) tests if x is equal to 1.
+      "**": (%,NonNegativeInteger) -> %
+        ++ x**n returns the repeated product
+        ++ of x n times, i.e. exponentiation.
+      "^" : (%,NonNegativeInteger) -> %   
+        ++ x^n returns the repeated product
+        ++ of x n times, i.e. exponentiation.
+      recip: % -> Union(%,"failed")
+        ++ recip(x) tries to compute the multiplicative inverse for x
+        ++ or "failed" if it cannot find the inverse (see unitsKnown).
+    add
+      import RepeatedSquaring(%)
+      _^(x:%, n:NonNegativeInteger):% == x ** n
+      one? x == x = 1
+      sample() == 1
+      recip x ==
+        (x = 1) => x
+        "failed"
+      x:% ** n:NonNegativeInteger ==
+         zero? n => 1
+         expt(x,n pretend PositiveInteger)
+
+@
+<<MONOID.dotabb>>=
+"MONOID"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=MONOID"];
+"MONOID" -> "SGROUP"
+
+@
+<<MONOID.dotfull>>=
+"Monoid()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=MONOID"];
+"Monoid()" -> "SemiGroup()"
+
+@
+<<MONOID.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SetCategory()"
+"SemiGroup()" -> "RepeatedSquaring(SemiGroup)"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"RepeatedSquaring(SemiGroup)" [color="#00EE00"];
+"RepeatedSquaring(SemiGroup)" -> "RepeatedSquaring(a:SetCategory)"
+
+"RepeatedSquaring(a:SetCategory)" [color="#00EE00"];
+"RepeatedSquaring(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"Category" [color=lightblue];
+
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedFinite}{ORDFIN}
+\pagepic{ps/v102orderedfinite.ps}{ORDFIN}{1.00}
+
+{\bf See:}\\
+\pagefrom{Finite}{FINITE}
+\pagefrom{OrderedSet}{ORDSET}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ coerce & hash   & index  & latex & lookup  \\
+ max    & min    & random & size  & ?\~{}=? \\
+ ?$<$?  & ?$<=$? & ?=?    & ?$>$? & ?$>=$?  \\
+\end{tabular}
+
+\cross{ORDFIN}{coerce}
+\cross{ORDFIN}{hash}
+\cross{ORDFIN}{index}
+\cross{ORDFIN}{latex}
+\cross{ORDFIN}{lookup}
+\cross{ORDFIN}{max}
+\cross{ORDFIN}{min}
+\cross{ORDFIN}{random}
+\cross{ORDFIN}{size}
+\cross{ORDFIN}{?\~{}=?}
+\cross{ORDFIN}{?$<$?}
+\cross{ORDFIN}{?$<=$?}
+\cross{ORDFIN}{?=?}
+\cross{ORDFIN}{?$>$?}
+\cross{ORDFIN}{?$>=$?}
+
+These exports come from OrderedSet():
+\begin{verbatim}
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String                  
+ max : (%,%) -> %                     
+ min : (%,%) -> %
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean              
+ ?<? : (%,%) -> Boolean               
+ ?<=? : (%,%) -> Boolean
+ ?>? : (%,%) -> Boolean
+ ?>=? : (%,%) -> Boolean              
+\end{verbatim}
+
+These exports come from Finite():
+\begin{verbatim}
+ index : PositiveInteger -> %
+ lookup : % -> PositiveInteger
+ random : () -> %                     
+ size : () -> NonNegativeInteger
+\end{verbatim}
+
+<<category ORDFIN OrderedFinite>>=
+)abbrev category ORDFIN OrderedFinite
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Ordered finite sets.
+
+OrderedFinite(): Category == Join(OrderedSet, Finite)
+
+@
+<<ORDFIN.dotabb>>=
+"ORDFIN"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDFIN"];
+"ORDFIN" -> "ORDSET"
+"ORDFIN" -> "FINITE"
+
+@
+<<ORDFIN.dotfull>>=
+"OrderedFinite()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDFIN"];
+"OrderedFinite()" -> "OrderedSet()"
+"OrderedFinite()" -> "Finite()"
+
+@
+<<ORDFIN.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedFinite()" [color=lightblue];
+"OrderedFinite()" -> "OrderedSet()"
+"OrderedFinite()" -> "Finite()"
+
+"Finite()" [color=lightblue];
+"Finite()" -> "SetCategory()"
+
+"OrderedSet()" [color=lightblue];
+"OrderedSet()" -> "SetCategory()"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"Category" [color=lightblue];
+
+}
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{RecursiveAggregate}{RCAGG}
-\pagepic{ps/v102recursiveaggregate.ps}{RCAGG}
+\pagepic{ps/v102recursiveaggregate.ps}{RCAGG}{1.00}
 
 {\bf See:}\\
 \pageto{BinaryRecursiveAggregate}{BRAGG}
@@ -2587,7 +3117,7 @@ These are implemented by this category:
  ?.value : (%,value) -> S
 \end{verbatim}
 
-These exports come from HomogeneousAggregate(a:Type):
+These exports come from HomogeneousAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -2726,7 +3256,7 @@ digraph pic {
 \chapter{Category Layer 5}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{BinaryRecursiveAggregate}{BRAGG}
-\pagepic{ps/v102binaryrecursiveaggregate.ps}{BRAGG}
+\pagepic{ps/v102binaryrecursiveaggregate.ps}{BRAGG}{1.00}
 
 {\bf See:}\\
 \pagefrom{RecursiveAggregate}{RCAGG}
@@ -2819,7 +3349,7 @@ These are implemented by this category:
  ?.left : (%,left) -> %
 \end{verbatim}
 
-These exports come from RecursiveAggregate(a:Type)
+These exports come from RecursiveAggregate(S:Type)
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -3011,8 +3541,134 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{CancellationAbelianMonoid}{CABMON}
+\pagepic{ps/v102cancellationabelianmonoid.ps}{CABMON}{0.75}
+
+{\bf See:}\\
+\pageto{AbelianGroup}{ABELGRP}
+\pagefrom{AbelianMonoid}{ABELMON}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ 0             & coerce & hash    & latex & sample\\
+ subtractIfCan & zero?  & ?\~{}=? & ?*?   & ?+?\\
+ ?=?&&&&
+\end{tabular}
+
+\cross{CABMON}{0}
+\cross{CABMON}{coerce}
+\cross{CABMON}{hash}
+\cross{CABMON}{latex}
+\cross{CABMON}{sample}
+\cross{CABMON}{subtractIfCan}
+\cross{CABMON}{zero?}
+\cross{CABMON}{?\~{}=?}
+\cross{CABMON}{?*?}
+\cross{CABMON}{?+?}
+\cross{CABMON}{?=?}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ subtractIfCan : (%,%) -> Union(%,"failed")
+\end{verbatim}
+
+These exports come from AbelianMonoid():
+\begin{verbatim}
+ 0 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ sample : () -> %
+ zero? : % -> Boolean                 
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?~=? : (%,%) -> Boolean
+ ?+? : (%,%) -> %
+ ?=? : (%,%) -> Boolean               
+\end{verbatim}
+
+<<category CABMON CancellationAbelianMonoid>>=
+)abbrev category CABMON CancellationAbelianMonoid
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References: Davenport & Trager I
+++ Description:
+++ This is an \spadtype{AbelianMonoid} with the cancellation property, i.e.
+++ \spad{ a+b = a+c => b=c }.
+++ This is formalised by the partial subtraction operator,
+++ which satisfies the axioms listed below:
+++
+++ Axioms:
+++   \spad{c = a+b <=> c-b = a}
+CancellationAbelianMonoid(): Category == AbelianMonoid with
+      subtractIfCan: (%,%) -> Union(%,"failed")
+         ++ subtractIfCan(x, y) returns an element z such that \spad{z+y=x}
+         ++ or "failed" if no such element exists.
+
+@
+<<CABMON.dotabb>>=
+"CABMON"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=CABMON"];
+"CABMON" -> "ABELMON"
+
+@
+<<CABMON.dotfull>>=
+"CancellationAbelianMonoid()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=CABMON"];
+"CancellationAbelianMonoid()" -> "AbelianMonoid()"
+
+@
+<<CABMON.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "AbelianMonoid()"
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "AbelianSemiGroup()"
+
+"AbelianSemiGroup()" [color=lightblue];
+"AbelianSemiGroup()" -> "SetCategory()"
+"AbelianSemiGroup()" -> "RepeatedDoubling(AbelianSemiGroup)"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" ->
+    "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"RepeatedDoubling(AbelianSemiGroup)" [color="#00EE00"];
+"RepeatedDoubling(AbelianSemiGroup)" -> "RepeatedDoubling(a:SetCategory)"
+
+"RepeatedDoubling(a:SetCategory)" [color="#00EE00"];
+"RepeatedDoubling(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"Category" [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{DictionaryOperations}{DIOPS}
-\pagepic{ps/v102dictionaryoperations.ps}{DIOPS}
+\pagepic{ps/v102dictionaryoperations.ps}{DIOPS}{1.00}
 
 {\bf See:}\\
 \pageto{Dictionary}{DIAGG}
@@ -3085,7 +3741,7 @@ These are implemented by this category:
  dictionary : () -> %
 \end{verbatim}
 
-These exports come from BagAggregate(a:SetCategory):
+These exports come from BagAggregate(S:SetCategory):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -3126,7 +3782,7 @@ These exports come from BagAggregate(a:SetCategory):
  ?~=? : (%,%) -> Boolean if S has SETCAT
 \end{verbatim}
 
-These exports come from Collection(a:SetCategory)
+These exports come from Collection(S:SetCategory)
 \begin{verbatim}
  convert : % -> InputForm if S has KONVERT INFORM
  find : ((S -> Boolean),%) -> Union(S,"failed")
@@ -3240,7 +3896,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{DoublyLinkedAggregate}{DLAGG}
-\pagepic{ps/v102doublylinkedaggregate.ps}{DLAGG}
+\pagepic{ps/v102doublylinkedaggregate.ps}{DLAGG}{1.00}
 
 {\bf See:}\\
 \pagefrom{RecursiveAggregate}{RCAGG}
@@ -3318,7 +3974,7 @@ These are directly exported but not implemented:
  tail : % -> %
 \end{verbatim}
 
-These exports come from RecursiveAggregate(a:Type):
+These exports come from RecursiveAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -3456,7 +4112,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{LinearAggregate}{LNAGG}
-\pagepic{ps/v102linearaggregate.ps}{LNAGG}
+\pagepic{ps/v102linearaggregate.ps}{LNAGG}{1.00}
 
 {\bf See:}\\
 \pageto{ExtensibleLinearAggregate}{ELAGG}
@@ -3557,7 +4213,7 @@ These are implemented by this category:
  maxIndex : % -> Integer if Integer has ORDSET
 \end{verbatim}
 
-These exports come from IndexedAggregate(a:SetCategory,b:Type)
+These exports come from IndexedAggregate(Integer,S:Type)
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -3608,7 +4264,7 @@ These exports come from IndexedAggregate(a:SetCategory,b:Type)
  ?=? : (%,%) -> Boolean if S has SETCAT
 \end{verbatim}
 
-These exports come from Collection(a:Type):
+These exports come from Collection(S:Type):
 \begin{verbatim}
  construct : List S -> %              
  convert : % -> InputForm if S has KONVERT INFORM
@@ -3759,11 +4415,292 @@ digraph pic {
 
 }
 @
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedAbelianSemiGroup}{OASGP}
+\pagepic{ps/v102orderedabeliansemigroup.ps}{OASGP}{0.75}
+
+{\bf See:}\\
+\pageto{OrderedAbelianMonoid}{OAMON}
+\pagefrom{AbelianMonoid}{ABELMON}
+\pagefrom{OrderedSet}{ORDSET}
+
+{\bf Exports:}\\
+\begin{tabular}{llllllll}
+ 0       & coerce & hash & latex & max    & min & sample & zero?\\
+ ?\~{}=? & ?*?    & ?+?  & ?$<$? & ?$<=$? & ?=? & ?$>$?  & ?$>=$?
+\end{tabular}
+
+\cross{OASGP}{0}
+\cross{OASGP}{coerce}
+\cross{OASGP}{hash}
+\cross{OASGP}{latex}
+\cross{OASGP}{max}
+\cross{OASGP}{min}
+\cross{OASGP}{sample}
+\cross{OASGP}{zero?}
+\cross{OASGP}{?\~{}=?}
+\cross{OASGP}{?*?}
+\cross{OASGP}{?+?}
+\cross{OASGP}{?$<$?}
+\cross{OASGP}{?$<=$?}
+\cross{OASGP}{?=?}
+\cross{OASGP}{?$>$?}
+\cross{OASGP}{?$>=$?}
+
+These exports come from OrderedSet():
+\begin{verbatim}
+ coerce : % -> OutputForm              
+ hash : % -> SingleInteger
+ latex : % -> String                   
+ max : (%,%) -> %
+ min : (%,%) -> %                      
+ ?<? : (%,%) -> Boolean                
+ ?>? : (%,%) -> Boolean
+ ?<=? : (%,%) -> Boolean
+ ?>=? : (%,%) -> Boolean               
+ ?=? : (%,%) -> Boolean                
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+These exports come from AbelianMonoid():
+\begin{verbatim}
+ 0 : () -> %
+ sample : () -> %
+ zero? : % -> Boolean                  
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %        
+ ?+? : (%,%) -> %
+\end{verbatim}
+
+<<category OASGP OrderedAbelianSemiGroup>>=
+)abbrev category OASGP OrderedAbelianSemiGroup
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Ordered sets which are also abelian semigroups, such that the addition
+++ preserves the ordering.
+++   \spad{ x < y => x+z < y+z}
+OrderedAbelianSemiGroup(): Category == Join(OrderedSet, AbelianMonoid)
+
+@
+<<OASGP.dotabb>>=
+"OASGP"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OASGP"];
+"OASGP" -> "ORDSET"
+"OASGP" -> "ABELMON"
+
+@
+<<OASGP.dotfull>>=
+"OrderedAbelianSemiGroup()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OASGP"];
+"OrderedAbelianSemiGroup()" -> "OrderedSet()"
+"OrderedAbelianSemiGroup()" -> "AbelianMonoid()"
+
+@
+<<OASGP.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedAbelianSemiGroup()" [color=lightblue];
+"OrderedAbelianSemiGroup()" -> "OrderedSet()"
+"OrderedAbelianSemiGroup()" -> "AbelianMonoid()"
+
+"OrderedSet()" [color=lightblue];
+"OrderedSet()" -> "SetCategory()"
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "AbelianSemiGroup()"
+
+"AbelianSemiGroup()" [color=lightblue];
+"AbelianSemiGroup()" -> "SetCategory()"
+"AbelianSemiGroup()" -> "RepeatedDoubling(AbelianSemiGroup)"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" ->
+    "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"RepeatedDoubling(AbelianSemiGroup)" [color="#00EE00"];
+"RepeatedDoubling(AbelianSemiGroup)" -> "RepeatedDoubling(a:SetCategory)"
+
+"RepeatedDoubling(a:SetCategory)" [color="#00EE00"];
+"RepeatedDoubling(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"Category" [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedMonoid}{ORDMON}
+\pagepic{ps/v102orderedmonoid.ps}{ORDMON}{0.75}
+
+{\bf See:}\\
+\pagefrom{Monoid}{MONOID}
+\pagefrom{OrderedSet}{ORDSET}
+
+{\bf Exports:}\\
+\begin{tabular}{llllll}
+ 1      & coerce & hash   & latex  & max     & min\\
+ one?   & recip  & sample & ?*?    & ?**?    & ?$<$?\\
+ ?$<=$? & ?=?    & ?$>$?  & ?$>=$? & ?\~{}=? & ?\^{}?\\
+\end{tabular}
+
+\cross{ORDMON}{1}
+\cross{ORDMON}{coerce}
+\cross{ORDMON}{hash}
+\cross{ORDMON}{latex}
+\cross{ORDMON}{max}
+\cross{ORDMON}{min}
+\cross{ORDMON}{one?}
+\cross{ORDMON}{recip}
+\cross{ORDMON}{sample}
+\cross{ORDMON}{?*?}
+\cross{ORDMON}{?**?}
+\cross{ORDMON}{?$<$?}
+\cross{ORDMON}{?$<=$?}
+\cross{ORDMON}{?=?}
+\cross{ORDMON}{?$>$?}
+\cross{ORDMON}{?$>=$?}
+\cross{ORDMON}{?\~{}=?}
+\cross{ORDMON}{?\^{}?}
+
+These exports come from Monoid():
+\begin{verbatim}
+ 1 : () -> %
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ one? : % -> Boolean                  
+ recip : % -> Union(%,"failed")
+ sample : () -> %                     
+ ?*? : (%,%) -> %                     
+ ?^? : (%,PositiveInteger) -> %       
+ ?^? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+These exports come from OrderedSet():
+\begin{verbatim}
+ max : (%,%) -> %                     
+ min : (%,%) -> %
+ ?<? : (%,%) -> Boolean               
+ ?<=? : (%,%) -> Boolean
+ ?>? : (%,%) -> Boolean
+ ?>=? : (%,%) -> Boolean              
+\end{verbatim}
+
+<<category ORDMON OrderedMonoid>>=
+)abbrev category ORDMON OrderedMonoid
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Ordered sets which are also monoids, such that multiplication
+++ preserves the ordering.
+++
+++ Axioms:
+++   \spad{x < y => x*z < y*z}
+++   \spad{x < y => z*x < z*y}
+
+OrderedMonoid(): Category == Join(OrderedSet, Monoid)
+
+@
+<<ORDMON.dotabb>>=
+"ORDMON"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDMON"];
+"ORDMON" -> "ORDSET"
+"ORDMON" -> "MONOID"
+
+@
+<<ORDMON.dotfull>>=
+"OrderedMonoid()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDMON"];
+"OrderedMonoid()" -> "OrderedSet()"
+"OrderedMonoid()" -> "Monoid()"
+@
+<<ORDMON.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedMonoid()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDMON"];
+"OrderedMonoid()" -> "OrderedSet()"
+"OrderedMonoid()" -> "Monoid()"
+
+"OrderedSet()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDSET"];
+"OrderedSet()" -> "SetCategory()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SetCategory()"
+"SemiGroup()" -> "RepeatedSquaring(SemiGroup)"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"RepeatedSquaring(SemiGroup)" [color="#00EE00"];
+"RepeatedSquaring(SemiGroup)" -> "RepeatedSquaring(a:SetCategory)"
+
+"RepeatedSquaring(a:SetCategory)" [color="#00EE00"];
+"RepeatedSquaring(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"Category" [color=lightblue];
+
+}
+
+@
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{PriorityQueueAggregate}{PRQAGG}
-\pagepic{ps/v102priorityqueueaggregate.ps}{PRQAGG}
+\pagepic{ps/v102priorityqueueaggregate.ps}{PRQAGG}{1.00}
 
 {\bf See:}\\
+\pageto{OrderedMultisetAggregate}{OMSAGG}
 \pagefrom{BagAggregate}{BGAGG}
 
 {\bf Exports:}\\
@@ -3813,7 +4750,7 @@ These are directly exported but not implemented:
  merge! : (%,%) -> %
 \end{verbatim}
 
-These exports come from PriorityQueueAggregate(a:Type):
+These exports come from BagAggregate(S:OrderedSet):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -3930,7 +4867,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{QueueAggregate}{QUAGG}
-\pagepic{ps/v102queueaggregate.ps}{QUAGG}
+\pagepic{ps/v102queueaggregate.ps}{QUAGG}{1.00}
 
 {\bf See:}\\
 \pageto{DequeueAggregate}{DQAGG}
@@ -3989,7 +4926,7 @@ These are implemented by this category:
  rotate! : % -> %                     
 \end{verbatim}
 
-These exports come from BagAggregate(a:Type):
+These exports come from BagAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -4112,8 +5049,296 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{SetAggregate}{SETAGG}
+\pagepic{ps/v102setaggregate.ps}{SETAGG}{1.00}
+
+{\bf See:}\\
+\pageto{FiniteSetAggregate}{FSAGG}
+\pageto{MultisetAggregate}{MSETAGG}
+\pagefrom{Collection}{CLAGG}
+\pagefrom{SetCategory}{SETCAT}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ any?      & brace   & coerce     & construct & convert\\
+ copy      & count   & difference & empty     & empty?\\
+ eq?       & eval    & every?     & find      & hash\\
+ intersect & latex   & less?      & map       & map!\\
+ member?   & members & more?      & parts     & reduce\\
+ remove    & removeDuplicates     & sample    & select & set\\
+ size?     & subset? & symmetricDifference    & union & \#?\\
+ ?$<$?       & ?=?     & ?\~{}=?    &&
+\end{tabular}
+
+\cross{SETAGG}{any?}
+\cross{SETAGG}{brace}
+\cross{SETAGG}{coerce}
+\cross{SETAGG}{construct}
+\cross{SETAGG}{convert}
+\cross{SETAGG}{copy}
+\cross{SETAGG}{count}
+\cross{SETAGG}{difference}
+\cross{SETAGG}{empty}
+\cross{SETAGG}{empty?}
+\cross{SETAGG}{eq?}
+\cross{SETAGG}{eval}
+\cross{SETAGG}{every?}
+\cross{SETAGG}{find}
+\cross{SETAGG}{hash}
+\cross{SETAGG}{intersect}
+\cross{SETAGG}{latex}
+\cross{SETAGG}{less?}
+\cross{SETAGG}{map}
+\cross{SETAGG}{map!}
+\cross{SETAGG}{member?}
+\cross{SETAGG}{members}
+\cross{SETAGG}{more?}
+\cross{SETAGG}{parts}
+\cross{SETAGG}{reduce}
+\cross{SETAGG}{remove}
+\cross{SETAGG}{removeDuplicates}
+\cross{SETAGG}{sample}
+\cross{SETAGG}{select}
+\cross{SETAGG}{set}
+\cross{SETAGG}{size?}
+\cross{SETAGG}{subset?}
+\cross{SETAGG}{symmetricDifference}
+\cross{SETAGG}{union}
+\cross{SETAGG}{\#?}
+\cross{SETAGG}{?$<$?}
+\cross{SETAGG}{?=?}
+\cross{SETAGG}{?\~{}=?}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ brace : List S -> %
+ brace : () -> %
+ difference : (%,%) -> %      
+ intersect : (%,%) -> %
+ set : List S -> %
+ set : () -> %                        
+ subset? : (%,%) -> Boolean
+ union : (%,%) -> %
+ ?<? : (%,%) -> Boolean
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ difference : (%,S) -> %
+ symmetricDifference : (%,%) -> %
+ union : (S,%) -> %
+ union : (%,S) -> %
+\end{verbatim}
+
+These exports come from SetCategory():
+\begin{verbatim}
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger
+ latex : % -> String
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+These exports come from Collection(S:SetCategory):
+\begin{verbatim}
+ any? : ((S -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
+ construct : List S -> %
+ convert : % -> InputForm if S has KONVERT INFORM
+ copy : % -> %                        
+ count : ((S -> Boolean),%) -> NonNegativeInteger 
+     if $ has finiteAggregate
+ count : (S,%) -> NonNegativeInteger 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ empty : () -> %
+ empty? : % -> Boolean
+ eq? : (%,%) -> Boolean
+ eval : (%,List Equation S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ eval : (%,Equation S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ eval : (%,S,S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ eval : (%,List S,List S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ every? : ((S -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
+ find : ((S -> Boolean),%) -> Union(S,"failed")
+ less? : (%,NonNegativeInteger) -> Boolean
+ map : ((S -> S),%) -> %
+ map! : ((S -> S),%) -> % if $ has shallowlyMutable
+ members : % -> List S if $ has finiteAggregate
+ member? : (S,%) -> Boolean 
+     if S has SETCAT and $ has finiteAggregate
+ more? : (%,NonNegativeInteger) -> Boolean
+ parts : % -> List S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S,S) -> S 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S) -> S 
+     if $ has finiteAggregate
+ reduce : (((S,S) -> S),%) -> S 
+     if $ has finiteAggregate
+ remove : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ remove : (S,%) -> % 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ removeDuplicates : % -> % 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ sample : () -> %                     
+ select : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ size? : (%,NonNegativeInteger) -> Boolean
+ #? : % -> NonNegativeInteger 
+     if $ has finiteAggregate
+\end{verbatim}
+
+<<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.2.pamphlet#nameddest=SETAGG"];
+"SETAGG" -> "SETCAT"
+"SETAGG" -> "CLAGG"
+
+@
+<<SETAGG.dotfull>>=
+"SetAggregate(a:SetCategory)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=SETAGG"];
+"SetAggregate(a:SetCategory)" -> "SetCategory()"
+"SetAggregate(a:SetCategory)" -> "Collection(a:SetCategory)"
+
+@
+<<SETAGG.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"SetAggregate(a:SetCategory)" [color=lightblue];
+"SetAggregate(a:SetCategory)" -> "SetCategory()"
+"SetAggregate(a:SetCategory)" -> "Collection(a:SetCategory)"
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BasicType()"
+"SetCategory()" -> "CoercibleTo(OutputForm)"
+
+"BasicType()" [color=lightblue];
+"BasicType()" -> "Category"
+
+"CoercibleTo(OutputForm)" [color=seagreen];
+"CoercibleTo(OutputForm)" -> "CoercibleTo(a:Type)"
+
+"CoercibleTo(a:Type)" [color=lightblue];
+"CoercibleTo(a:Type)" -> "Category"
+
+"Collection(a:SetCategory)"
+ [color=seagreen,href="books/bookvol10.2.pamphlet#nameddest=CLAGG"];
+"Collection(a:SetCategory)" -> "Collection(a:Type)"
+
+"Collection(a:Type)" [color=lightblue];
+"Collection(a:Type)" -> "HomogeneousAggregate(a:Type)"
+
+"HomogeneousAggregate(a:Type)" [color=lightblue];
+"HomogeneousAggregate(a:Type)" -> "Aggregate()"
+
+"Aggregate()" [color=lightblue];
+"Aggregate()" -> "Type()"
+
+"Type()" [color=lightblue];
+"Type()" -> "Category"
+
+"Category" [color=lightblue];
+
+}
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{StackAggregate}{SKAGG}
-\pagepic{ps/v102stackaggregate.ps}{SKAGG}
+\pagepic{ps/v102stackaggregate.ps}{SKAGG}{1.00}
 
 {\bf See:}\\
 \pageto{DequeueAggregate}{DQAGG}
@@ -4168,7 +5393,7 @@ These are directly exported but not implemented:
  top : % -> S
 \end{verbatim}
 
-These exports come from BagAggregate(a:Type):
+These exports come from BagAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -4285,7 +5510,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{UnaryRecursiveAggregate}{URAGG}
-\pagepic{ps/v102unaryrecursiveaggregate.ps}{URAGG}
+\pagepic{ps/v102unaryrecursiveaggregate.ps}{URAGG}{1.00}
 
 {\bf See:}\\
 \pageto{StreamAggregate}{STAGG}
@@ -4409,7 +5634,7 @@ These are implemented by this category:
  ?.rest : (%,rest) -> %
 \end{verbatim}
 
-These exports come from RecursiveAggregate(a:Type):
+These exports come from RecursiveAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -4751,10 +5976,154 @@ digraph pic {
 @
 \chapter{Category Layer 6}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{AbelianGroup}{ABELGRP}
+\pagepic{ps/v102abeliangroup.ps}{ABELGRP}{0.75}
+
+{\bf See:}\\
+\pageto{Rng}{RNG}
+\pagefrom{CancellationAbelianMonoid}{CABMON}
+
+{\bf Exports:}\\
+\begin{tabular}{lllllll}
+ 0       & coerce & hash & latex & sample & subtractIfCan & zero?\\
+ ?\~{}=? & ?*?    & ?+?   & ?-?  & -?     & ?=?           &
+\end{tabular}
+
+\cross{ABELGRP}{0}
+\cross{ABELGRP}{coerce}
+\cross{ABELGRP}{hash}
+\cross{ABELGRP}{latex}
+\cross{ABELGRP}{sample}
+\cross{ABELGRP}{subtractIfCan}
+\cross{ABELGRP}{zero?}
+\cross{ABELGRP}{?\~{}=?}
+\cross{ABELGRP}{?*?}
+\cross{ABELGRP}{?+?}
+\cross{ABELGRP}{?-?}
+\cross{ABELGRP}{-?}
+\cross{ABELGRP}{?=?}
+
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ -? : % -> %                          
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ ?*? : (Integer,%) -> %               
+ ?*? : (NonNegativeInteger,%) -> %
+ ?-? : (%,%) -> %
+\end{verbatim}
+
+These exports come from CancellationAbelianMonoid():
+\begin{verbatim}
+ 0 : () -> %                          
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ sample : () -> %                     
+ zero? : % -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (PositiveInteger,%) -> %
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category ABELGRP AbelianGroup>>=
+)abbrev category ABELGRP AbelianGroup
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The class of abelian groups, i.e. additive monoids where
+++ each element has an additive inverse.
+++
+++ Axioms:
+++   \spad{-(-x) = x}
+++   \spad{x+(-x) = 0}
+-- following domain must be compiled with subsumption disabled
+AbelianGroup(): Category == CancellationAbelianMonoid with
+      "-": % -> %                      
+        ++ -x is the additive inverse of x.
+      "-": (%,%) -> %                  
+        ++ x-y is the difference of x and y
+        ++ i.e. \spad{x + (-y)}.
+        -- subsumes the partial subtraction from previous
+      "*": (Integer,%) -> %            
+        ++ n*x is the product of x by the integer n.
+    add
+      (x:% - y:%):% == x+(-y)
+      subtractIfCan(x:%, y:%):Union(%, "failed") == (x-y)::Union(%,"failed")
+      n:NonNegativeInteger * x:% == (n::Integer) * x
+      import RepeatedDoubling(%)
+      if not (% has Ring) then
+        n:Integer * x:% ==
+          zero? n => 0
+          n>0 => double(n pretend PositiveInteger,x)
+          double((-n) pretend PositiveInteger,-x)
+
+@
+<<ABELGRP.dotabb>>=
+"ABELGRP"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ABELGRP"];
+"ABELGRP" -> "CABMON"
+
+@
+<<ABELGRP.dotfull>>=
+"AbelianGroup()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ABELGRP"];
+"AbelianGroup()" -> "CancellationAbelianMonoid()"
+
+@
+<<ABELGRP.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CancellationAbelianMonoid()"
+"AbelianGroup()" -> "RepeatedDoubling(AbelianGroup)"
+
+"RepeatedDoubling(AbelianGroup)" [color="#00EE00"];
+"RepeatedDoubling(AbelianGroup)" -> "RepeatedDoubling(a:SetCategory)"
+
+"RepeatedDoubling(AbelianSemiGroup)" [color="#00EE00"];
+"RepeatedDoubling(AbelianSemiGroup)" -> "RepeatedDoubling(a:SetCategory)"
+
+"RepeatedDoubling(a:SetCategory)" [color="#00EE00"];
+"RepeatedDoubling(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "AbelianMonoid()"
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "AbelianSemiGroup()"
+
+"AbelianSemiGroup()" [color=lightblue];
+"AbelianSemiGroup()" -> "SETCAT..."
+"AbelianSemiGroup()" -> "RepeatedDoubling(AbelianSemiGroup)"
+
+"SETCAT..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{Dictionary}{DIAGG}
-\pagepic{ps/v102dictionary.ps}{DIAGG}
+\pagepic{ps/v102dictionary.ps}{DIAGG}{1.00}
 
 {\bf See:}\\
+\pageto{FiniteSetAggregate}{FSAGG}
 \pageto{KeyedDictionary}{KDAGG}
 \pagefrom{DictionaryOperations}{DIOPS}
 
@@ -4816,7 +6185,7 @@ These are implemented by this category:
  remove! : ((S -> Boolean),%) -> % if $ has finiteAggregate
 \end{verbatim}
 
-These exports come from DictionaryOperations(a:SetCategory):
+These exports come from DictionaryOperations(S:SetCategory):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -4972,7 +6341,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{DequeueAggregate}{DQAGG}
-\pagepic{ps/v102dequeueaggregate.ps}{DQAGG}
+\pagepic{ps/v102dequeueaggregate.ps}{DQAGG}{1.00}
 
 {\bf See:}\\
 \pagefrom{QueueAggregate}{QUAGG}
@@ -5053,7 +6422,7 @@ These are directly exported but not implemented:
  top! : % -> S
 \end{verbatim}
 
-These exports come from StackAggregate(a:Type):
+These exports come from StackAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -5100,7 +6469,7 @@ These exports come from StackAggregate(a:Type):
  ?~=? : (%,%) -> Boolean if S has SETCAT
 \end{verbatim}
 
-These exports come from QueueAggregate(a:Type):
+These exports come from QueueAggregate(S:Type):
 \begin{verbatim}
  back : % -> S                        
  dequeue! : % -> S
@@ -5205,7 +6574,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{ExtensibleLinearAggregate}{ELAGG}
-\pagepic{ps/v102extensiblelinearaggregate.ps}{ELAGG}
+\pagepic{ps/v102extensiblelinearaggregate.ps}{ELAGG}{1.00}
 
 {\bf See:}\\
 \pageto{ListAggregate}{LSAGG}
@@ -5313,7 +6682,7 @@ These are implemented by this category:
  select : ((S -> Boolean),%) -> % if $ has finiteAggregate
 \end{verbatim}
 
-These exports come from LinearAggregate(a:Type):
+These exports come from LinearAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -5503,7 +6872,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{FiniteLinearAggregate}{FLAGG}
-\pagepic{ps/v102finitelinearaggregate.ps}{FLAGG}
+\pagepic{ps/v102finitelinearaggregate.ps}{FLAGG}{1.00}
 
 {\bf See:}\\
 \pageto{OneDimensionalArrayAggregate}{A1AGG}
@@ -5583,11 +6952,11 @@ digraph pic {
 \cross{FLAGG}{\#?}
 \cross{FLAGG}{?.?}
 \cross{FLAGG}{?.?}
-\cross{FLAGG}{?<?}
-\cross{FLAGG}{?<=?}
+\cross{FLAGG}{?$<$?}
+\cross{FLAGG}{?$<=$?}
 \cross{FLAGG}{?=?}
-\cross{FLAGG}{?>?}
-\cross{FLAGG}{?>=?}
+\cross{FLAGG}{?$>$?}
+\cross{FLAGG}{?$>=$?}
 \cross{FLAGG}{?\~{}=?}
 
 These are directly exported but not implemented:
@@ -5615,7 +6984,7 @@ These are implemented by this category:
           if S has ORDSET and $ has shallowlyMutable
 \end{verbatim}
 
-These exports come from LinearAggregate(a:Type):
+These exports come from LinearAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -5846,9 +7215,10 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{MultiDictionary}{MDAGG}
-\pagepic{ps/v102multidictionary.ps}{MDAGG}
+\pagepic{ps/v102multidictionary.ps}{MDAGG}{1.00}
 
 {\bf See:}\\
+\pageto{MultisetAggregate}{MSETAGG}
 \pagefrom{DictionaryOperations}{DIOPS}
 
 {\bf Exports:}\\
@@ -5857,10 +7227,10 @@ digraph pic {
  copy             & count  & dictionary & duplicates & empty\\
  empty?           & eq?    & eval       & every?     & extract!\\
  find             & hash   & insert!    & inspect    & latex\\
- less?            & map    & map!       & member?    &  members\\
+ less?            & map    & map!       & member?    & members\\
  more?            & parts  & reduce     & remove     & remove! \\
- removeDuplicates & sample & select     & select!    & size? \\
- \#?              &  ?=?   & ?\~{}=?    &&\\
+ removeDuplicates & removeDuplicates!   & sample & select & select!\\
+ size?            & \#?    &  ?=?       & ?\~{}=?    &\\
 \end{tabular}
 
 \cross{MDAGG}{any?}
@@ -5894,6 +7264,7 @@ digraph pic {
 \cross{MDAGG}{remove}
 \cross{MDAGG}{remove!}
 \cross{MDAGG}{removeDuplicates}
+\cross{MDAGG}{removeDuplicates!}
 \cross{MDAGG}{sample}
 \cross{MDAGG}{select}
 \cross{MDAGG}{select!}
@@ -5906,10 +7277,10 @@ These are directly exported but not implemented:
 \begin{verbatim}
  insert! : (S,%,NonNegativeInteger) -> %
  removeDuplicates! : % -> %           
- duplicates : % -> List Record(entry: S,count: NonNegativeInteger)
+ duplicates : % -> List Record(entry:S,count:NonNegativeInteger)
 \end{verbatim}
 
-These exports come from DictionaryOperations(a:SetCategory):
+These exports come from DictionaryOperations(S:SetCategory):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -6047,10 +7418,122 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedAbelianMonoid}{OAMON}
+\pagepic{ps/v102orderedabelianmonoid.ps}{OAMON}{1.00}
+
+{\bf See:}\\
+\pagefrom{AbelianMonoid}{ABELMON}
+\pagefrom{OrderedAbelianSemiGroup}{OASGP}
+
+{\bf Exports:}\\
+\begin{tabular}{lllllll}
+ 0      & coerce  & hash & latex & max    & min & sample \\
+ zero?  & ?*?     & ?+?  & ?$<$? & ?$<=$? & ?=? & ?$>$? \\
+ ?$>=$? & ?\~{}=? & ?*? &&&&
+\end{tabular}
+
+\cross{OAMON}{0}
+\cross{OAMON}{coerce}
+\cross{OAMON}{hash}
+\cross{OAMON}{latex}
+\cross{OAMON}{max}
+\cross{OAMON}{min}
+\cross{OAMON}{sample}
+\cross{OAMON}{zero?}
+\cross{OAMON}{?*?}
+\cross{OAMON}{?+?}
+\cross{OAMON}{?$<$?}
+\cross{OAMON}{?$<=$?}
+\cross{OAMON}{?=?}
+\cross{OAMON}{?$>$?}
+\cross{OAMON}{?$>=$?}
+\cross{OAMON}{?\~{}=?}
+\cross{OAMON}{?*?}
+
+These exports come from OrderedAbelianSemiGroup():
+\begin{verbatim}
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ max : (%,%) -> %
+ min : (%,%) -> %                     
+ ?<? : (%,%) -> Boolean               
+ ?<=? : (%,%) -> Boolean
+ ?=? : (%,%) -> Boolean               
+ ?>? : (%,%) -> Boolean
+ ?>=? : (%,%) -> Boolean              
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+These exports come from AbelianMonoid():
+\begin{verbatim}
+ 0 : () -> %
+ sample : () -> %
+ zero? : % -> Boolean                 
+ ?*? : (PositiveInteger,%) -> %       
+ ?+? : (%,%) -> %
+ ?*? : (NonNegativeInteger,%) -> %
+\end{verbatim}
+
+<<category OAMON OrderedAbelianMonoid>>=
+)abbrev category OAMON OrderedAbelianMonoid
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Ordered sets which are also abelian monoids, such that the addition
+++ preserves the ordering.
+OrderedAbelianMonoid(): Category ==
+        Join(OrderedAbelianSemiGroup, AbelianMonoid)
+
+@
+<<OAMON.dotabb>>=
+"OAMON" [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OAMON"];
+"OAMON" -> "OASGP"
+"OAMON" -> "ABELMON"
+
+@
+<<OAMON.dotfull>>=
+"OrderedAbelianMonoid()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OAMON"];
+"OrderedAbelianMonoid()" -> "OrderedAbelianSemiGroup()"
+"OrderedAbelianMonoid()" -> "AbelianMonoid()"
+
+@
+<<OAMON.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedAbelianMonoid()" [color=lightblue];
+"OrderedAbelianMonoid()" -> "OrderedAbelianSemiGroup()"
+"OrderedAbelianMonoid()" -> "AbelianMonoid()"
+
+"OrderedAbelianSemiGroup()" [color=lightblue];
+"OrderedAbelianSemiGroup()" -> "OrderedSet()"
+"OrderedAbelianSemiGroup()" -> "AbelianMonoid()"
+
+"OrderedSet()" [color=lightblue];
+"OrderedSet()" -> "SETCAT..."
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "ABELSG..."
+
+"SETCAT..." [color=lightblue];
+"ABELSG..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{StreamAggregate}{STAGG}
-%\pagepic{ps/v102streamaggregate.ps}{STAGG}
-\includegraphics[scale=0.75]{ps/v102streamaggregate.ps}
-\index{images!STAGG}
+\pagepic{ps/v102streamaggregate.ps}{STAGG}{0.50}
 
 {\bf See:}\\
 \pagefrom{LinearAggregate}{LNAGG}
@@ -6173,7 +7656,7 @@ These are implemented by this category:
  ?.? : (%,UniversalSegment Integer) -> %
 \end{verbatim}
 
-These exports come from UnaryRecursiveAggregate(a:Type):
+These exports come from UnaryRecursiveAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -6256,7 +7739,7 @@ These exports come from UnaryRecursiveAggregate(a:Type):
  ?.value : (%,value) -> S
 \end{verbatim}
 
-These exports come from LinearAggregate(a:Type):
+These exports come from LinearAggregate(S:Type):
 \begin{verbatim}
  construct : List S -> %
  delete : (%,Integer) -> %            
@@ -6448,7 +7931,7 @@ digraph pic {
 \chapter{Category Layer 7}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{OneDimensionalArrayAggregate}{A1AGG}
-\pagepic{ps/v102onedimensionalarrayaggregate.ps}{A1AGG}
+\pagepic{ps/v102onedimensionalarrayaggregate.ps}{A1AGG}{1.00}
 
 {\bf See:}\\
 \pageto{StringAggregate}{SRAGG}
@@ -6576,7 +8059,7 @@ These are implemented by this category:
  ?<? : (%,%) -> Boolean if S has ORDSET
 \end{verbatim}
 
-These exports come from FiniteLinearAggregate(a:Type):
+These exports come from FiniteLinearAggregate(S:Type):
 \begin{verbatim}
  concat : (S,%) -> %                   
  concat : (%,S) -> %
@@ -6942,8 +8425,333 @@ digraph pic {
 }
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{FiniteSetAggregate}{FSAGG}
+\pagepic{ps/v102finitesetaggregate.ps}{FSAGG}{0.75}
+
+{\bf See:}\\
+\pagefrom{Dictionary}{DIAGG}
+\pagefrom{SetAggregate}{SETAGG}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ any?       & bag        & brace      & cardinality & coerce\\
+ complement & construct  & convert    & copy        & count\\
+ count      & dictionary & difference & empty       & empty?\\
+ eq?        & eval       & every?     & extract!    & find\\
+ hash       & index      & insert!    & inspect     & intersect\\
+ latex      & less?      & lookup     & map         & map!\\
+ max        & member?    & members    & min         & more?\\
+ parts      & random     & reduce     & remove      & remove!\\
+ removeDuplicates & sample & select   & select!     & set\\
+ size       & size?      & subset?    & symmetricDifference & union\\
+ universe   & \#?        & ?$<$?      & ?=?         & ?\~{}=?\\
+\end{tabular}
+
+\cross{FSAGG}{any?}
+\cross{FSAGG}{bag}
+\cross{FSAGG}{brace}
+\cross{FSAGG}{cardinality}
+\cross{FSAGG}{coerce}
+\cross{FSAGG}{complement}
+\cross{FSAGG}{construct}
+\cross{FSAGG}{convert}
+\cross{FSAGG}{copy}
+\cross{FSAGG}{count}
+\cross{FSAGG}{count}
+\cross{FSAGG}{dictionary}
+\cross{FSAGG}{difference}
+\cross{FSAGG}{empty}
+\cross{FSAGG}{empty?}
+\cross{FSAGG}{eq?}
+\cross{FSAGG}{eval}
+\cross{FSAGG}{every?}
+\cross{FSAGG}{extract!}
+\cross{FSAGG}{find}
+\cross{FSAGG}{hash}
+\cross{FSAGG}{index}
+\cross{FSAGG}{insert!}
+\cross{FSAGG}{inspect}
+\cross{FSAGG}{intersect}
+\cross{FSAGG}{latex}
+\cross{FSAGG}{less?}
+\cross{FSAGG}{lookup}
+\cross{FSAGG}{map}
+\cross{FSAGG}{map!}
+\cross{FSAGG}{max}
+\cross{FSAGG}{member?}
+\cross{FSAGG}{members}
+\cross{FSAGG}{min}
+\cross{FSAGG}{more?}
+\cross{FSAGG}{parts}
+\cross{FSAGG}{random}
+\cross{FSAGG}{reduce}
+\cross{FSAGG}{remove}
+\cross{FSAGG}{remove!}
+\cross{FSAGG}{removeDuplicates}
+\cross{FSAGG}{sample}
+\cross{FSAGG}{select}
+\cross{FSAGG}{select!}
+\cross{FSAGG}{set}
+\cross{FSAGG}{size}
+\cross{FSAGG}{size?}
+\cross{FSAGG}{subset?}
+\cross{FSAGG}{symmetricDifference}
+\cross{FSAGG}{union}
+\cross{FSAGG}{universe}
+\cross{FSAGG}{\#?}
+\cross{FSAGG}{?$<$?}
+\cross{FSAGG}{?=?}
+\cross{FSAGG}{?\~{}=?}
+
+These are implemented by this category:
+\begin{verbatim}
+ brace : List S -> %                  
+ cardinality : % -> NonNegativeInteger
+ coerce : % -> OutputForm
+ complement : % -> % if S has FINITE
+ construct : List S -> %              
+ count : (S,%) -> NonNegativeInteger 
+     if S has SETCAT and $ has finiteAggregate
+ difference : (%,%) -> %              
+ index : PositiveInteger -> % if S has FINITE
+ intersect : (%,%) -> %
+ lookup : % -> PositiveInteger if S has FINITE
+ max : % -> S if S has ORDSET         
+ min : % -> S if S has ORDSET
+ random : () -> % if S has FINITE
+ set : List S -> %                    
+ size : () -> NonNegativeInteger if S has FINITE
+ subset? : (%,%) -> Boolean
+ symmetricDifference : (%,%) -> %
+ union : (%,%) -> %                   
+ universe : () -> % if S has FINITE
+ ?<? : (%,%) -> Boolean               
+ ?=? : (%,%) -> Boolean
+\end{verbatim}
+
+These exports come from Dictionary(S:SetCategory):
+\begin{verbatim}
+ any? : ((S -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
+ bag : List S -> %                    
+ convert : % -> InputForm if S has KONVERT INFORM
+ copy : % -> %
+ count : ((S -> Boolean),%) -> NonNegativeInteger 
+     if $ has finiteAggregate
+ dictionary : () -> %
+ dictionary : List S -> %             
+ empty : () -> %                      
+ empty? : % -> Boolean
+ eq? : (%,%) -> Boolean               
+ eval : (%,List S,List S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ eval : (%,S,S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ eval : (%,Equation S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ eval : (%,List Equation S) -> % 
+     if S has EVALAB S 
+     and S has SETCAT
+ every? : ((S -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
+ extract! : % -> S
+ find : ((S -> Boolean),%) -> Union(S,"failed")
+ hash : % -> SingleInteger            
+ insert! : (S,%) -> %
+ inspect : % -> S                     
+ latex : % -> String                  
+ less? : (%,NonNegativeInteger) -> Boolean
+ select! : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ map : ((S -> S),%) -> %
+ map! : ((S -> S),%) -> % 
+     if $ has shallowlyMutable
+ member? : (S,%) -> Boolean 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ members : % -> List S if $ has finiteAggregate
+ more? : (%,NonNegativeInteger) -> Boolean
+ parts : % -> List S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%) -> S 
+     if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S) -> S 
+     if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S,S) -> S 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ remove : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ remove : (S,%) -> % 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ remove! : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ remove! : (S,%) -> % if $ has finiteAggregate
+ removeDuplicates : % -> % 
+     if S has SETCAT 
+     and $ has finiteAggregate
+ sample : () -> %                     
+ select : ((S -> Boolean),%) -> % 
+     if $ has finiteAggregate
+ size? : (%,NonNegativeInteger) -> Boolean
+ #? : % -> NonNegativeInteger if $ has finiteAggregate
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+These exports come from SetAggregate(S:SetCategory):
+\begin{verbatim}
+ brace : () -> %
+ difference : (%,S) -> %
+ set : () -> %
+ union : (%,S) -> %
+ union : (S,%) -> %                   
+\end{verbatim}
+
+<<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.2.pamphlet#nameddest=FSAGG"];
+"FSAGG" -> "DIAGG"
+"FSAGG" -> "SETAGG"
+
+@
+<<FSAGG.dotfull>>=
+"FiniteSetAggregate(a:SetCategory)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=FSAGG"];
+"FiniteSetAggregate(a:SetCategory)" -> "Dictionary(a:SetCategory)"
+"FiniteSetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
+
+@
+<<FSAGG.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"FiniteSetAggregate(a:SetCategory)" [color=lightblue];
+"FiniteSetAggregate(a:SetCategory)" -> "Dictionary(a:SetCategory)"
+"FiniteSetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
+
+"SetAggregate(a:SetCategory)" [color=lightblue];
+"SetAggregate(a:SetCategory)" -> "SetCategory()"
+"SetAggregate(a:SetCategory)" -> "CLAGG..."
+
+"SetCategory()" [color=lightblue];
+"SetCategory()" -> "BASTYPE..."
+"SetCategory()" -> "KOERCE..."
+
+"Dictionary(a:SetCategory)" [color=lightblue];
+"Dictionary(a:SetCategory)" -> "DictionaryOperations(a:SetCategory)"
+
+"DictionaryOperations(a:SetCategory)" [color=lightblue];
+"DictionaryOperations(a:SetCategory)" -> "BGAGG..."
+"DictionaryOperations(a:SetCategory)" -> "CLAGG..."
+
+"BGAGG..." [color=lightblue];
+"CLAGG..." [color=lightblue];
+"BASTYPE..." [color=lightblue];
+"KOERCE..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{KeyedDictionary}{KDAGG}
-\pagepic{ps/v102keyeddictionary.ps}{KDAGG}
+\pagepic{ps/v102keyeddictionary.ps}{KDAGG}{1.00}
 
 {\bf See:}\\
 \pageto{TableAggregate}{TBAGG}
@@ -7018,7 +8826,7 @@ These are implemented by this category:
 \end{verbatim}
 
 These exports come from Dictionary(R) \\
-where R=Record(a:SetCategory,b:SetCategory)):
+where R=Record(a:SetCategory,b:SetCategory))\\
 and S=Record(key: Key,entry: Entry)
 \begin{verbatim}
  any? : ((S) -> Boolean),%) -> Boolean 
@@ -7174,12 +8982,11 @@ digraph pic {
 
 "HOAGG..." [color=lightblue];
 }
+
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{ListAggregate}{LSAGG}
-%\pagepic{ps/v102listaggregate.ps}{LSAGG}
-\includegraphics[scale=0.75]{ps/v102listaggregate.ps}
-\index{images!LSAGG}
+\pagepic{ps/v102listaggregate.ps}{LSAGG}{0.50}
 
 {\bf See:}\\
 \pageto{AssociationListAggregate}{ALAGG}
@@ -7349,7 +9156,7 @@ These are implemented by this category:
  ?<? : (%,%) -> Boolean if S has ORDSET
 \end{verbatim}
 
-These exports come from StreamAggregate(a:Type):
+These exports come from StreamAggregate(S:Type):
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
@@ -7469,7 +9276,7 @@ These exports come from StreamAggregate(a:Type):
  ?~=? : (%,%) -> Boolean if S has SETCAT
 \end{verbatim}
 
-These exports come from FiniteLinearAggregate(a:Type)
+These exports come from FiniteLinearAggregate(S:Type)
 \begin{verbatim}
  max : (%,%) -> % if S has ORDSET
  merge : (%,%) -> % if S has ORDSET
@@ -7485,7 +9292,7 @@ These exports come from FiniteLinearAggregate(a:Type)
  ?>=? : (%,%) -> Boolean if S has ORDSET
 \end{verbatim}
 
-These exports come from ExtensibleLinearAggregate(a:Type):
+These exports come from ExtensibleLinearAggregate(S:Type):
 \begin{verbatim}
  merge! : (%,%) -> % if S has ORDSET
  remove! : (S,%) -> % if S has SETCAT
@@ -7766,8 +9573,335 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{MultisetAggregate}{MSETAGG}
+\pagepic{ps/v102multisetaggregate.ps}{MSETAGG}{0.75}
+
+{\bf See:}\\
+\pageto{OrderedMultisetAggregate}{OMSAGG}
+\pagefrom{MultiDictionary}{MDAGG}
+\pagefrom{SetAggregate}{SETAGG}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ any?       & bag       & brace   & coerce     & construct\\
+ convert    & copy      & count   & dictionary & difference\\
+ duplicates & empty     & empty?  & eq?        & eval\\
+ every?     & extract!  & find    & hash       & insert!\\
+ inspect    & intersect & latex   & less?      & map\\
+ map!       & member?   & members & more?      & parts\\
+ reduce     & remove    & remove! & removeDuplicates & removeDuplicates!\\
+ sample     & select    & select! & set        & size?\\
+ subset?    & symmetricDifference & union      & \#? & ?\~{}=?\\
+ ?$<$?      &  ?=? &&&
+\end{tabular}
+
+\cross{MSETAGG}{any?}
+\cross{MSETAGG}{bag}
+\cross{MSETAGG}{brace}
+\cross{MSETAGG}{coerce}
+\cross{MSETAGG}{construct}
+\cross{MSETAGG}{convert}
+\cross{MSETAGG}{copy}
+\cross{MSETAGG}{count}
+\cross{MSETAGG}{dictionary}
+\cross{MSETAGG}{difference}
+\cross{MSETAGG}{duplicates}
+\cross{MSETAGG}{empty}
+\cross{MSETAGG}{empty?}
+\cross{MSETAGG}{eq?}
+\cross{MSETAGG}{eval}
+\cross{MSETAGG}{every?}
+\cross{MSETAGG}{extract!}
+\cross{MSETAGG}{find}
+\cross{MSETAGG}{hash}
+\cross{MSETAGG}{insert!}
+\cross{MSETAGG}{inspect}
+\cross{MSETAGG}{intersect}
+\cross{MSETAGG}{latex}
+\cross{MSETAGG}{less?}
+\cross{MSETAGG}{map}
+\cross{MSETAGG}{map!}
+\cross{MSETAGG}{member?}
+\cross{MSETAGG}{members}
+\cross{MSETAGG}{more?}
+\cross{MSETAGG}{parts}
+\cross{MSETAGG}{reduce}
+\cross{MSETAGG}{remove}
+\cross{MSETAGG}{remove!}
+\cross{MSETAGG}{removeDuplicates}
+\cross{MSETAGG}{removeDuplicates!}
+\cross{MSETAGG}{sample}
+\cross{MSETAGG}{select}
+\cross{MSETAGG}{select!}
+\cross{MSETAGG}{set}
+\cross{MSETAGG}{size?}
+\cross{MSETAGG}{subset?}
+\cross{MSETAGG}{symmetricDifference}
+\cross{MSETAGG}{union}
+\cross{MSETAGG}{\#?}
+\cross{MSETAGG}{?\~{}=?}
+\cross{MSETAGG}{?$<$?}
+\cross{MSETAGG}{?=?}
+
+These exports come from MultiDictionary(S:SetCategory):
+\begin{verbatim}
+ any? : ((S -> Boolean),%) -> Boolean if $ has finiteAggregate
+ bag : List S -> %                    
+ coerce : % -> OutputForm
+ construct : List S -> %              
+ convert : % -> InputForm if S has KONVERT INFORM
+ copy : % -> %
+ count : (S,%) -> NonNegativeInteger if S has SETCAT and $ has finiteAggregate
+ count : ((S -> Boolean),%) -> NonNegativeInteger if $ has finiteAggregate
+ dictionary : List S -> %             
+ dictionary : () -> %
+ duplicates : % -> List Record(entry: S,count: NonNegativeInteger)
+ empty : () -> %                      
+ empty? : % -> Boolean
+ eq? : (%,%) -> Boolean               
+ eval : (%,List S,List S) -> % if S has EVALAB S and S has SETCAT
+ eval : (%,S,S) -> % if S has EVALAB S and S has SETCAT
+ eval : (%,Equation S) -> % if S has EVALAB S and S has SETCAT
+ eval : (%,List Equation S) -> % if S has EVALAB S and S has SETCAT
+ every? : ((S -> Boolean),%) -> Boolean if $ has finiteAggregate
+ extract! : % -> S
+ find : ((S -> Boolean),%) -> Union(S,"failed")
+ hash : % -> SingleInteger            
+ insert! : (S,%) -> %
+ insert! : (S,%,NonNegativeInteger) -> %
+ inspect : % -> S                     
+ latex : % -> String                  
+ less? : (%,NonNegativeInteger) -> Boolean
+ map : ((S -> S),%) -> %
+ map! : ((S -> S),%) -> % if $ has shallowlyMutable
+ member? : (S,%) -> Boolean if S has SETCAT and $ has finiteAggregate
+ members : % -> List S if $ has finiteAggregate
+ more? : (%,NonNegativeInteger) -> Boolean
+ parts : % -> List S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%) -> S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S) -> S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S,S) -> S if S has SETCAT and $ has finiteAggregate
+ remove : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ remove : (S,%) -> % if S has SETCAT and $ has finiteAggregate
+ removeDuplicates : % -> % if S has SETCAT and $ has finiteAggregate
+ removeDuplicates! : % -> %           
+ remove! : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ remove! : (S,%) -> % if $ has finiteAggregate
+ select : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ select! : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ size? : (%,NonNegativeInteger) -> Boolean
+ #? : % -> NonNegativeInteger if $ has finiteAggregate
+ ?~=? : (%,%) -> Boolean              
+ ?=? : (%,%) -> Boolean
+\end{verbatim}
+
+These exports come from SetAggregate(S:SetCategory):
+\begin{verbatim}
+ brace : () -> %
+ brace : List S -> %                  
+ difference : (%,S) -> %
+ intersect : (%,%) -> %
+ sample : () -> %
+ set : () -> %                        
+ set : List S -> %
+ subset? : (%,%) -> Boolean           
+ symmetricDifference : (%,%) -> %
+ union : (%,S) -> %                   
+ union : (S,%) -> %
+ union : (%,%) -> %
+ ?<? : (%,%) -> Boolean               
+\end{verbatim}
+
+<<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.2.pamphlet#nameddest=MSETAGG"];
+"MSETAGG" -> "MDAGG"
+"MSETAGG" -> "SETAGG"
+
+@
+<<MSETAGG.dotfull>>=
+"MultisetAggregate(a:SetCategory)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=MSETAGG"];
+"MultisetAggregate(a:SetCategory)" -> "MultiDictionary(a:SetCategory)"
+"MultisetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
+
+@
+<<MSETAGG.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"MultisetAggregate(a:SetCategory)" [color=lightblue];
+"MultisetAggregate(a:SetCategory)" -> "MultiDictionary(a:SetCategory)"
+"MultisetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
+
+"MultiDictionary(a:SetCategory)" [color=lightblue];
+"MultiDictionary(a:SetCategory)" -> "DictionaryOperations(a:SetCategory)"
+
+"SetAggregate(a:SetCategory)" [color=lightblue];
+"SetAggregate(a:SetCategory)" -> "SETAGG..."
+"SetAggregate(a:SetCategory)" -> "CLAGG..."
+
+"DictionaryOperations(a:SetCategory)" [color=lightblue];
+"DictionaryOperations(a:SetCategory)" -> "BGAGG..."
+"DictionaryOperations(a:SetCategory)" -> "CLAGG..."
+
+"BGAGG..." [color=lightblue];
+"CLAGG..." [color=lightblue];
+"SETAGG..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Rng}{RNG}
+\pagepic{ps/v102rng.ps}{RNG}{1.00}
+
+{\bf See:}\\
+\pagefrom{AbelianGroup}{ABELGRP}
+\pagefrom{SemiGroup}{SGROUP}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ 0     & coerce        & hash & latex   & sample \\
+ zero? & subtractIfCan & ?*?  & ?**?    & ?+?    \\
+ ?-?   & -?            & ?=?  & ?\~{}=? & ?\^{}? \\
+\end{tabular}
+
+\cross{RNG}{0}
+\cross{RNG}{coerce}
+\cross{RNG}{hash}
+\cross{RNG}{latex}
+\cross{RNG}{sample}
+\cross{RNG}{zero?}
+\cross{RNG}{subtractIfCan}
+\cross{RNG}{?*?}
+\cross{RNG}{?**?}
+\cross{RNG}{?+?}
+\cross{RNG}{?-?}
+\cross{RNG}{-?}
+\cross{RNG}{?=?}
+\cross{RNG}{?\~{}=?}
+\cross{RNG}{?\^{}?}
+
+These exports come from AbelianGroup():
+\begin{verbatim}
+ 0 : () -> %                          
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (Integer,%) -> %
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+\end{verbatim}
+
+These exports come from SemiGroup():
+\begin{verbatim}
+ ?*? : (%,%) -> %                     
+ ?**? : (%,PositiveInteger) -> %
+ ?^? : (%,PositiveInteger) -> %
+\end{verbatim}
+
+<<category RNG Rng>>=
+)abbrev category RNG Rng
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of associative rings, not necessarily commutative, and not
+++ necessarily with a 1. This is a combination of an abelian group
+++ and a semigroup, with multiplication distributing over addition.
+++
+++ Axioms:
+++   \spad{ x*(y+z) = x*y + x*z}
+++   \spad{ (x+y)*z = x*z + y*z }
+++
+++ Conditional attributes:
+++   \spadnoZeroDivisors\tab{25}\spad{  ab = 0 => a=0 or b=0}
+Rng(): Category == Join(AbelianGroup,SemiGroup)
+
+@ 
+<<RNG.dotabb>>=
+"RNG" [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=RNG"];
+"RNG" -> "ABELGRP"
+"RNG" -> "SGROUP"
+
+@
+<<RNG.dotfull>>=
+"Rng()" [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=RNG"];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+@
+<<RNG.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CancellationAbelianMonoid()"
+"AbelianGroup()" -> "REPDB..."
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "AbelianMonoid()"
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "AbelianSemiGroup()"
+
+"AbelianSemiGroup()" [color=lightblue];
+"AbelianSemiGroup()" -> "SETCAT..."
+"AbelianSemiGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{StringAggregate}{SRAGG}
-\pagepic{ps/v102stringaggregate.ps}{SRAGG}
+\pagepic{ps/v102stringaggregate.ps}{SRAGG}{1.00}
 
 {\bf See:}\\
 \pagefrom{OneDimensionalArrayAggregate}{A1AGG}
@@ -8187,9 +10321,7 @@ digraph pic {
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{TableAggregate}{TBAGG}
-%\pagepic{ps/v102tableaggregate.ps}{TBAGG}
-\includegraphics[scale=0.60]{ps/v102tableaggregate.ps}
-\index{images!TBAGG}
+\pagepic{ps/v102tableaggregate.ps}{TBAGG}{0.60}
 
 {\bf See:}\\
 \pageto{AssociationListAggregate}{ALAGG}
@@ -8274,7 +10406,8 @@ These are directly exported but not implemented:
 
 These are implemented by this category:
 \begin{verbatim}
- any? : ((Entry -> Boolean),%) -> Boolean if $ has finiteAggregate
+ any? : ((Entry -> Boolean),%) -> Boolean 
+     if $ has finiteAggregate
  coerce : % -> OutputForm 
           if Entry has SETCAT 
           or Record(key: Key,entry: Entry) has SETCAT
@@ -8314,92 +10447,92 @@ These are implemented by this category:
 
 These exports come from KeyedDictionary(Key,Entry)\\
 where Key:SetCategory and Entry:SetCategory\\
-and RECKEYENTRY=Record(key: Key,entry: Entry):
+and RecKE=Record(key: Key,entry: Entry):
 \begin{verbatim}
- any? : ((RECKEYENTRY -> Boolean),%) -> Boolean 
+ any? : ((RecKE -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
- bag : List RECKEYENTRY -> %
- construct : List RECKEYENTRY -> %
- convert : % -> InputForm if RECKEYENTRY has KONVERT INFORM
+ bag : List RecKE -> %
+ construct : List RecKE -> %
+ convert : % -> InputForm if RecKE has KONVERT INFORM
  copy : % -> %                        
  count : (Entry,%) -> NonNegativeInteger 
           if Entry has SETCAT 
           and $ has finiteAggregate
- count : ((RECKEYENTRY -> Boolean),%) -> NonNegativeInteger 
+ count : ((RecKE -> Boolean),%) -> NonNegativeInteger 
           if $ has finiteAggregate
  dictionary : () -> %
- dictionary : List RECKEYENTRY -> %
+ dictionary : List RecKE -> %
  empty : () -> %                      
  empty? : % -> Boolean
  eq? : (%,%) -> Boolean
- eval : (%,List RECKEYENTRY,List RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,RECKEYENTRY,RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,Equation RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,List Equation RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- every? : ((RECKEYENTRY -> Boolean),%) -> Boolean 
+ eval : (%,List RecKE,List RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,RecKE,RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,Equation RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,List Equation RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ every? : ((RecKE -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
  key? : (Key,%) -> Boolean            
  keys : % -> List Key
  hash : % -> SingleInteger 
           if Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
+          or RecKE has SETCAT
  latex : % -> String 
           if Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
+          or RecKE has SETCAT
  less? : (%,NonNegativeInteger) -> Boolean
- member? : (RECKEYENTRY,%) -> Boolean 
-     if RECKEYENTRY has SETCAT 
+ member? : (RecKE,%) -> Boolean 
+     if RecKE has SETCAT 
       and $ has finiteAggregate
- members : % -> List RECKEYENTRY if $ has finiteAggregate
+ members : % -> List RecKE if $ has finiteAggregate
  more? : (%,NonNegativeInteger) -> Boolean
  reduce : 
-  (((RECKEYENTRY,RECKEYENTRY) -> RECKEYENTRY),%) -> RECKEYENTRY 
+  (((RecKE,RecKE) -> RecKE),%) -> RecKE 
           if $ has finiteAggregate
  reduce : 
-  (((RECKEYENTRY,RECKEYENTRY)->RECKEYENTRY),%,RECKEYENTRY) -> RECKEYENTRY 
+  (((RecKE,RecKE)->RecKE),%,RecKE) -> RecKE 
           if $ has finiteAggregate
  reduce : 
-  (((RECKEYENTRY,RECKEYENTRY)->RECKEYENTRY),%,RECKEYENTRY,RECKEYENTRY)
-    -> RECKEYENTRY 
-          if RECKEYENTRY has SETCAT 
+  (((RecKE,RecKE)->RecKE),%,RecKE,RecKE)
+    -> RecKE 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
- remove : ((RECKEYENTRY -> Boolean),%) -> % 
+ remove : ((RecKE -> Boolean),%) -> % 
           if $ has finiteAggregate
- remove : (RECKEYENTRY,%) -> % 
-          if RECKEYENTRY has SETCAT 
+ remove : (RecKE,%) -> % 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
- remove! : ((RECKEYENTRY -> Boolean),%) -> % 
+ remove! : ((RecKE -> Boolean),%) -> % 
           if $ has finiteAggregate
- remove! : (RECKEYENTRY,%) -> % if $ has finiteAggregate
+ remove! : (RecKE,%) -> % if $ has finiteAggregate
  removeDuplicates : % -> % 
-          if RECKEYENTRY has SETCAT 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
  sample : () -> %                     
  search : (Key,%) -> Union(Entry,"failed")
- select : ((RECKEYENTRY -> Boolean),%) -> % 
+ select : ((RecKE -> Boolean),%) -> % 
           if $ has finiteAggregate
- select! : ((RECKEYENTRY -> Boolean),%) -> % 
+ select! : ((RecKE -> Boolean),%) -> % 
           if $ has finiteAggregate
  #? : % -> NonNegativeInteger if $ has finiteAggregate
  ?~=? : (%,%) -> Boolean 
           if Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
+          or RecKE has SETCAT
 \end{verbatim}
 
 These exports come from IndexedAggregate(Key,Entry))\\
 where Key:SetCategory and Entry:SetCategory\\
-and RECKEYENTRY=Record(key: Key,entry: Entry):
+and RecKE=Record(key: Key,entry: Entry):
 \begin{verbatim}
- count : (RECKEYENTRY,%) -> NonNegativeInteger 
-          if RECKEYENTRY has SETCAT 
+ count : (RecKE,%) -> NonNegativeInteger 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
  entry? : (Entry,%) -> Boolean 
           if $ has finiteAggregate 
@@ -8633,9 +10766,7 @@ digraph pic {
 \chapter{Category Layer 8}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{AssociationListAggregate}{ALAGG}
-%\pagepic{ps/v102associationlistaggregate.ps}{ALAGG}
-\includegraphics[scale=0.50]{ps/v102associationlistaggregate.ps}
-\index{images!ALAGG}
+\pagepic{ps/v102associationlistaggregate.ps}{ALAGG}{0.50}
 
 {\bf See:}\\
 \pagefrom{ListAggregate}{LSAGG}
@@ -8784,41 +10915,41 @@ These are directly exported but not implemented:
 
 These exports come from TableAggregate(Key, Entry)\\
 where Key:SetCategory and Entry:SetCategory\\
-and RECKEYENTRY = Record(key: Key,entry: Entry)
+and RecKE = Record(key: Key,entry: Entry)
 \begin{verbatim}
- any? : ((RECKEYENTRY -> Boolean),%) -> Boolean 
+ any? : ((RecKE -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
  any? : ((Entry -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
- any? : ((RECKEYENTRY -> Boolean),%) -> Boolean 
+ any? : ((RecKE -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
- bag : List RECKEYENTRY -> %
- construct : List RECKEYENTRY -> %
+ bag : List RecKE -> %
+ construct : List RecKE -> %
  convert : % -> InputForm 
-          if RECKEYENTRY has KONVERT INFORM 
-          or RECKEYENTRY has KONVERT INFORM
+          if RecKE has KONVERT INFORM 
+          or RecKE has KONVERT INFORM
  copy : % -> %                        
  count : 
-  ((RECKEYENTRY -> Boolean),%) -> NonNegativeInteger 
+  ((RecKE -> Boolean),%) -> NonNegativeInteger 
           if $ has finiteAggregate
- count : (RECKEYENTRY,%) -> NonNegativeInteger 
-          if RECKEYENTRY has SETCAT 
+ count : (RecKE,%) -> NonNegativeInteger 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
  count : ((Entry -> Boolean),%) -> NonNegativeInteger 
           if $ has finiteAggregate
  count : (Entry,%) -> NonNegativeInteger 
           if Entry has SETCAT 
           and $ has finiteAggregate
- count : (RECKEYENTRY,%) -> NonNegativeInteger 
-          if RECKEYENTRY has SETCAT 
+ count : (RecKE,%) -> NonNegativeInteger 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
  count : 
-  ((RECKEYENTRY -> Boolean),%) -> NonNegativeInteger 
+  ((RecKE -> Boolean),%) -> NonNegativeInteger 
           if $ has finiteAggregate
  dictionary : () -> %                 
- dictionary : List RECKEYENTRY -> %
+ dictionary : List RecKE -> %
  elt : (%,Key,Entry) -> Entry
- elt : (%,Integer,RECKEYENTRY) -> RECKEYENTRY
+ elt : (%,Integer,RecKE) -> RecKE
  empty : () -> %
  empty? : % -> Boolean                
  entries : % -> List Entry
@@ -8826,18 +10957,18 @@ and RECKEYENTRY = Record(key: Key,entry: Entry)
           if $ has finiteAggregate 
           and Entry has SETCAT
  eq? : (%,%) -> Boolean               
- eval : (%,List Equation RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,Equation RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,RECKEYENTRY,RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,List RECKEYENTRY,List RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
+ eval : (%,List Equation RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,Equation RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,RecKE,RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,List RecKE,List RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
  eval : (%,List Equation Entry) -> % 
           if Entry has EVALAB Entry 
           and Entry has SETCAT
@@ -8850,124 +10981,124 @@ and RECKEYENTRY = Record(key: Key,entry: Entry)
  eval : (%,List Entry,List Entry) -> % 
           if Entry has EVALAB Entry 
           and Entry has SETCAT
- eval : (%,List RECKEYENTRY,List RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,RECKEYENTRY,RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,Equation RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- eval : (%,List Equation RECKEYENTRY) -> % 
-          if RECKEYENTRY has EVALAB RECKEYENTRY 
-          and RECKEYENTRY has SETCAT
- every? : ((RECKEYENTRY -> Boolean),%) -> Boolean 
+ eval : (%,List RecKE,List RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,RecKE,RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,Equation RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ eval : (%,List Equation RecKE) -> % 
+          if RecKE has EVALAB RecKE 
+          and RecKE has SETCAT
+ every? : ((RecKE -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
  every? : ((Entry -> Boolean),%) -> Boolean 
           if $ has finiteAggregate
- extract! : % -> RECKEYENTRY
+ extract! : % -> RecKE
  fill! : (%,Entry) -> % if $ has shallowlyMutable
- find : ((RECKEYENTRY -> Boolean),%) -> Union(RECKEYENTRY,"failed")
+ find : ((RecKE -> Boolean),%) -> Union(RecKE,"failed")
  first : % -> Entry if Key has ORDSET
  hash : % -> SingleInteger 
-          if RECKEYENTRY has SETCAT 
+          if RecKE has SETCAT 
           or Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
+          or RecKE has SETCAT
  index? : (Key,%) -> Boolean
  indices : % -> List Key
- insert! : (RECKEYENTRY,%) -> %
- inspect : % -> RECKEYENTRY
+ insert! : (RecKE,%) -> %
+ inspect : % -> RecKE
  key? : (Key,%) -> Boolean            
  keys : % -> List Key
  latex : % -> String 
-          if RECKEYENTRY has SETCAT 
+          if RecKE has SETCAT 
           or Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
+          or RecKE has SETCAT
  less? : (%,NonNegativeInteger) -> Boolean
  map : ((Entry -> Entry),%) -> %
- map : ((RECKEYENTRY -> RECKEYENTRY),%) -> %
+ map : ((RecKE -> RecKE),%) -> %
  map : (((Entry,Entry) -> Entry),%,%) -> %
- map! : ((RECKEYENTRY -> RECKEYENTRY),%) -> % 
+ map! : ((RecKE -> RecKE),%) -> % 
           if $ has shallowlyMutable
  map! : ((Entry -> Entry),%) -> % if $ has shallowlyMutable
- map! : ((RECKEYENTRY -> RECKEYENTRY),%) -> % 
+ map! : ((RecKE -> RecKE),%) -> % 
           if $ has shallowlyMutable
  maxIndex : % -> Key if Key has ORDSET
- member? : (RECKEYENTRY,%) -> Boolean 
-          if RECKEYENTRY has SETCAT 
+ member? : (RecKE,%) -> Boolean 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
  member? : (Entry,%) -> Boolean 
           if Entry has SETCAT 
           and $ has finiteAggregate
- members : % -> List RECKEYENTRY if $ has finiteAggregate
+ members : % -> List RecKE if $ has finiteAggregate
  members : % -> List Entry if $ has finiteAggregate
- members : % -> List RECKEYENTRY if $ has finiteAggregate
+ members : % -> List RecKE if $ has finiteAggregate
  minIndex : % -> Key if Key has ORDSET
  more? : (%,NonNegativeInteger) -> Boolean
  parts : % -> List Entry if $ has finiteAggregate
- parts : % -> List RECKEYENTRY if $ has finiteAggregate
+ parts : % -> List RecKE if $ has finiteAggregate
  qelt : (%,Key) -> Entry              
  qsetelt! : (%,Key,Entry) -> Entry if $ has shallowlyMutable
  reduce : 
-  (((RECKEYENTRY,RECKEYENTRY) -> RECKEYENTRY),%)
-    -> RECKEYENTRY 
+  (((RecKE,RecKE) -> RecKE),%)
+    -> RecKE 
           if $ has finiteAggregate
  reduce : 
-  (((RECKEYENTRY,RECKEYENTRY) -> RECKEYENTRY),%,RECKEYENTRY)
-    -> RECKEYENTRY 
+  (((RecKE,RecKE) -> RecKE),%,RecKE)
+    -> RecKE 
           if $ has finiteAggregate
  reduce : 
-  (((RECKEYENTRY,RECKEYENTRY) -> RECKEYENTRY),%,RECKEYENTRY,RECKEYENTRY)
-    -> RECKEYENTRY 
-          if RECKEYENTRY has SETCAT 
+  (((RecKE,RecKE) -> RecKE),%,RecKE,RecKE)
+    -> RecKE 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
- remove : ((RECKEYENTRY -> Boolean),%) -> % if $ has finiteAggregate
- remove : (RECKEYENTRY,%) -> % 
-          if RECKEYENTRY has SETCAT 
+ remove : ((RecKE -> Boolean),%) -> % if $ has finiteAggregate
+ remove : (RecKE,%) -> % 
+          if RecKE has SETCAT 
           and $ has finiteAggregate
  remove! : (Key,%) -> Union(Entry,"failed")
- remove! : (RECKEYENTRY,%) -> % if RECKEYENTRY has SETCAT
- remove! : (RECKEYENTRY,%) -> % if $ has finiteAggregate
+ remove! : (RecKE,%) -> % if RecKE has SETCAT
+ remove! : (RecKE,%) -> % if $ has finiteAggregate
  removeDuplicates : % -> % 
-          if RECKEYENTRY has SETCAT 
+          if RecKE has SETCAT 
           and $ has finiteAggregate 
-          or RECKEYENTRY has SETCAT 
+          or RecKE has SETCAT 
           and $ has finiteAggregate
  sample : () -> %
  search : (Key,%) -> Union(Entry,"failed")
- select : ((RECKEYENTRY -> Boolean),%) -> % 
+ select : ((RecKE -> Boolean),%) -> % 
           if $ has finiteAggregate
- select! : ((RECKEYENTRY -> Boolean),%) -> % 
+ select! : ((RecKE -> Boolean),%) -> % 
           if $ has finiteAggregate
  setelt : (%,Key,Entry) -> Entry      
  size? : (%,NonNegativeInteger) -> Boolean
  swap! : (%,Key,Key) -> Void if $ has shallowlyMutable
  table : () -> %
- table : List RECKEYENTRY -> %
+ table : List RecKE -> %
  ?~=? : (%,%) -> Boolean 
-          if RECKEYENTRY has SETCAT 
+          if RecKE has SETCAT 
           or Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
+          or RecKE has SETCAT
  ?.? : (%,Key) -> Entry               
 \end{verbatim}
 
-These exports come from ListAggregate(a:Type)\\
+These exports come from ListAggregate(a)\\
 where a is  Record(key:Key,entry:Entry)\\
-and RECKEYENTRY=Record(key: Key,entry: Entry)
+and RecKE=Record(key: Key,entry: Entry)
 \begin{verbatim}
  children : % -> List %               
- child? : (%,%) -> Boolean if RECKEYENTRY has SETCAT
+ child? : (%,%) -> Boolean if RecKE has SETCAT
  coerce : % -> OutputForm 
-          if RECKEYENTRY has SETCAT 
+          if RecKE has SETCAT 
           or Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
+          or RecKE has SETCAT
  concat : (%,%) -> %
  concat : List % -> %                 
- concat : (RECKEYENTRY,%) -> %
- concat : (%,RECKEYENTRY) -> %
+ concat : (RecKE,%) -> %
+ concat : (%,RecKE) -> %
  concat! : (%,%) -> %
- concat! : (%,RECKEYENTRY) -> %
+ concat! : (%,RecKE) -> %
  copyInto! : (%,%,Integer) -> % if $ has shallowlyMutable
  cycleEntry : % -> %
  cycleLength : % -> NonNegativeInteger
@@ -8979,108 +11110,108 @@ and RECKEYENTRY=Record(key: Key,entry: Entry)
  delete : (%,UniversalSegment Integer) -> %
  delete! : (%,UniversalSegment Integer) -> %
  distance : (%,%) -> Integer
- entries : % -> List RECKEYENTRY
- entry? : (RECKEYENTRY,%) -> Boolean 
+ entries : % -> List RecKE
+ entry? : (RecKE,%) -> Boolean 
           if $ has finiteAggregate 
-          and RECKEYENTRY has SETCAT
+          and RecKE has SETCAT
  explicitlyFinite? : % -> Boolean
- fill! : (%,RECKEYENTRY) -> % if $ has shallowlyMutable
- first : % -> RECKEYENTRY
+ fill! : (%,RecKE) -> % if $ has shallowlyMutable
+ first : % -> RecKE
  first : (%,NonNegativeInteger) -> %
  index? : (Integer,%) -> Boolean      
  indices : % -> List Integer          
  insert : (%,%,Integer) -> %          
- insert : (RECKEYENTRY,%,Integer) -> %
+ insert : (RecKE,%,Integer) -> %
  insert! : (%,%,Integer) -> %
- insert! : (RECKEYENTRY,%,Integer) -> %
- last : % -> RECKEYENTRY
+ insert! : (RecKE,%,Integer) -> %
+ last : % -> RecKE
  last : (%,NonNegativeInteger) -> %
  leaf? : % -> Boolean                 
- leaves : % -> List RECKEYENTRY
- list : RECKEYENTRY -> %
- map : (((RECKEYENTRY,RECKEYENTRY) -> RECKEYENTRY),%,%) -> %
- max : (%,%) -> % if RECKEYENTRY has ORDSET
+ leaves : % -> List RecKE
+ list : RecKE -> %
+ map : (((RecKE,RecKE) -> RecKE),%,%) -> %
+ max : (%,%) -> % if RecKE has ORDSET
  maxIndex : % -> Integer if Integer has ORDSET
- merge : (%,%) -> % if RECKEYENTRY has ORDSET
- merge : (((RECKEYENTRY,RECKEYENTRY) -> Boolean),%,%) -> %
- merge! : (%,%) -> % if RECKEYENTRY has ORDSET
- merge! : (((RECKEYENTRY,RECKEYENTRY) -> Boolean),%,%) -> %
- min : (%,%) -> % if RECKEYENTRY has ORDSET
+ merge : (%,%) -> % if RecKE has ORDSET
+ merge : (((RecKE,RecKE) -> Boolean),%,%) -> %
+ merge! : (%,%) -> % if RecKE has ORDSET
+ merge! : (((RecKE,RecKE) -> Boolean),%,%) -> %
+ min : (%,%) -> % if RecKE has ORDSET
  minIndex : % -> Integer if Integer has ORDSET
- new : (NonNegativeInteger,RECKEYENTRY) -> %
+ new : (NonNegativeInteger,RecKE) -> %
  nodes : % -> List %                  
- node? : (%,%) -> Boolean if RECKEYENTRY has SETCAT
- position : (RECKEYENTRY,%,Integer) -> Integer 
-          if RECKEYENTRY has SETCAT
- position : (RECKEYENTRY,%) -> Integer 
-          if RECKEYENTRY has SETCAT
- position : ((RECKEYENTRY -> Boolean),%) -> Integer
+ node? : (%,%) -> Boolean if RecKE has SETCAT
+ position : (RecKE,%,Integer) -> Integer 
+          if RecKE has SETCAT
+ position : (RecKE,%) -> Integer 
+          if RecKE has SETCAT
+ position : ((RecKE -> Boolean),%) -> Integer
  possiblyInfinite? : % -> Boolean
- qelt : (%,Integer) -> RECKEYENTRY
- qsetelt! : (%,Integer,RECKEYENTRY) -> RECKEYENTRY 
+ qelt : (%,Integer) -> RecKE
+ qsetelt! : (%,Integer,RecKE) -> RecKE 
           if $ has shallowlyMutable
- remove! : ((RECKEYENTRY -> Boolean),%) -> %
- remove! : ((RECKEYENTRY -> Boolean),%) -> % 
+ remove! : ((RecKE -> Boolean),%) -> %
+ remove! : ((RecKE -> Boolean),%) -> % 
           if $ has finiteAggregate
- removeDuplicates! : % -> % if RECKEYENTRY has SETCAT
+ removeDuplicates! : % -> % if RecKE has SETCAT
  rest : % -> %
  rest : (%,NonNegativeInteger) -> %
  reverse : % -> %                     
  reverse! : % -> % if $ has shallowlyMutable
- second : % -> RECKEYENTRY
- select! : ((RECKEYENTRY -> Boolean),%) -> %
+ second : % -> RecKE
+ select! : ((RecKE -> Boolean),%) -> %
  setchildren! : (%,List %) -> % if $ has shallowlyMutable
- setelt : (%,value,RECKEYENTRY) -> RECKEYENTRY 
+ setelt : (%,value,RecKE) -> RecKE 
           if $ has shallowlyMutable
- setelt : (%,first,RECKEYENTRY) -> RECKEYENTRY 
+ setelt : (%,first,RecKE) -> RecKE 
           if $ has shallowlyMutable
  setelt : (%,rest,%) -> % if $ has shallowlyMutable
- setelt : (%,last,RECKEYENTRY) -> RECKEYENTRY 
+ setelt : (%,last,RecKE) -> RecKE 
           if $ has shallowlyMutable
- setelt : (%,UniversalSegment Integer,RECKEYENTRY) -> RECKEYENTRY 
+ setelt : (%,UniversalSegment Integer,RecKE) -> RecKE 
           if $ has shallowlyMutable
- setelt : (%,Integer,RECKEYENTRY) -> RECKEYENTRY 
+ setelt : (%,Integer,RecKE) -> RecKE 
           if $ has shallowlyMutable
- setfirst! : (%,RECKEYENTRY) -> RECKEYENTRY 
+ setfirst! : (%,RecKE) -> RecKE 
           if $ has shallowlyMutable
- setlast! : (%,RECKEYENTRY) -> RECKEYENTRY 
+ setlast! : (%,RecKE) -> RecKE 
           if $ has shallowlyMutable
  setrest! : (%,%) -> % if $ has shallowlyMutable
- setvalue! : (%,RECKEYENTRY) -> RECKEYENTRY 
+ setvalue! : (%,RecKE) -> RecKE 
           if $ has shallowlyMutable
- sort : % -> % if RECKEYENTRY has ORDSET
- sort : (((RECKEYENTRY,RECKEYENTRY) -> Boolean),%) -> %
+ sort : % -> % if RecKE has ORDSET
+ sort : (((RecKE,RecKE) -> Boolean),%) -> %
  sort! : % -> % 
-          if RECKEYENTRY has ORDSET 
+          if RecKE has ORDSET 
           and $ has shallowlyMutable
- sort! : (((RECKEYENTRY,RECKEYENTRY) -> Boolean),%) -> % 
+ sort! : (((RecKE,RecKE) -> Boolean),%) -> % 
           if $ has shallowlyMutable
- sorted? : % -> Boolean if RECKEYENTRY has ORDSET
- sorted? : (((RECKEYENTRY,RECKEYENTRY) -> Boolean),%) -> Boolean
+ sorted? : % -> Boolean if RecKE has ORDSET
+ sorted? : (((RecKE,RecKE) -> Boolean),%) -> Boolean
  split! : (%,Integer) -> % if $ has shallowlyMutable
  swap! : (%,Integer,Integer) -> Void 
           if $ has shallowlyMutable
  tail : % -> %                        
- third : % -> RECKEYENTRY
- value : % -> RECKEYENTRY
+ third : % -> RecKE
+ value : % -> RecKE
  #? : % -> NonNegativeInteger if $ has finiteAggregate
- ?<? : (%,%) -> Boolean if RECKEYENTRY has ORDSET
- ?<=? : (%,%) -> Boolean if RECKEYENTRY has ORDSET
+ ?<? : (%,%) -> Boolean if RecKE has ORDSET
+ ?<=? : (%,%) -> Boolean if RecKE has ORDSET
  ?=? : (%,%) -> Boolean 
-          if RECKEYENTRY has SETCAT 
+          if RecKE has SETCAT 
           or Entry has SETCAT 
-          or RECKEYENTRY has SETCAT
- ?>? : (%,%) -> Boolean if RECKEYENTRY has ORDSET
- ?>=? : (%,%) -> Boolean if RECKEYENTRY has ORDSET
- ?.value : (%,value) -> RECKEYENTRY
- ?.first : (%,first) -> RECKEYENTRY
- ?.last : (%,last) -> RECKEYENTRY
+          or RecKE has SETCAT
+ ?>? : (%,%) -> Boolean if RecKE has ORDSET
+ ?>=? : (%,%) -> Boolean if RecKE has ORDSET
+ ?.value : (%,value) -> RecKE
+ ?.first : (%,first) -> RecKE
+ ?.last : (%,last) -> RecKE
  ?.rest : (%,rest) -> %               
  ?.? : (%,UniversalSegment Integer) -> %
- ?.? : (%,Integer) -> RECKEYENTRY
+ ?.? : (%,Integer) -> RecKE
 \end{verbatim}
 
-These exports come from SetCategory:
+These exports come from SetCategory():
 \begin{verbatim}
 \end{verbatim}
 
@@ -9163,17 +11294,163 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chapter{Category Layers}
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\pagehead{FiniteSetAggregate}{FSAGG}
-%%%%%%%%\pagepic{ps/v102finitesetaggregate.ps}{FSAGG}
+\pagehead{OrderedMultisetAggregate}{OMSAGG}
+\pagepic{ps/v102orderedmultisetaggregate.ps}{OMSAGG}{0.65}
 
 {\bf See:}\\
-<<category FSAGG FiniteSetAggregate>>=
-)abbrev category FSAGG FiniteSetAggregate
+\pagefrom{MultisetAggregate}{MSETAGG}
+\pagefrom{PriorityQueueAggregate}{PRQAGG}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+ any?    & bag       & brace   & coerce     & construct\\
+ convert & copy      & count   & dictionary & difference\\
+ empty   & empty?    & eq?     & duplicates & eval\\
+ every?  & extract!  & find    & hash       & insert!\\
+ inspect & intersect & latex   & less?      & map\\
+ map!    & max       & member? & members    & merge\\
+ merge!  & min       & more?   & parts      & reduce\\
+ remove  & remove!   & removeDuplicates & removeDuplicates! & sample\\
+ select  & select!   & set     & size?      & subset?\\
+ symmetricDifference & union   & \#?        & ?$<$? & ?=?\\
+ ?\~{}=? &&&&
+\end{tabular}
+
+\cross{OMSAGG}{any?}
+\cross{OMSAGG}{bag}
+\cross{OMSAGG}{brace}
+\cross{OMSAGG}{coerce}
+\cross{OMSAGG}{construct}
+\cross{OMSAGG}{convert}
+\cross{OMSAGG}{copy}
+\cross{OMSAGG}{count}
+\cross{OMSAGG}{dictionary}
+\cross{OMSAGG}{difference}
+\cross{OMSAGG}{empty}
+\cross{OMSAGG}{empty?}
+\cross{OMSAGG}{eq?}
+\cross{OMSAGG}{duplicates}
+\cross{OMSAGG}{eval}
+\cross{OMSAGG}{every?}
+\cross{OMSAGG}{extract!}
+\cross{OMSAGG}{find}
+\cross{OMSAGG}{hash}
+\cross{OMSAGG}{insert!}
+\cross{OMSAGG}{inspect}
+\cross{OMSAGG}{intersect}
+\cross{OMSAGG}{latex}
+\cross{OMSAGG}{less?}
+\cross{OMSAGG}{map}
+\cross{OMSAGG}{map!}
+\cross{OMSAGG}{max}
+\cross{OMSAGG}{member?}
+\cross{OMSAGG}{members}
+\cross{OMSAGG}{merge}
+\cross{OMSAGG}{merge!}
+\cross{OMSAGG}{min}
+\cross{OMSAGG}{more?}
+\cross{OMSAGG}{parts}
+\cross{OMSAGG}{reduce}
+\cross{OMSAGG}{remove}
+\cross{OMSAGG}{remove!}
+\cross{OMSAGG}{removeDuplicates}
+\cross{OMSAGG}{removeDuplicates!}
+\cross{OMSAGG}{sample}
+\cross{OMSAGG}{select}
+\cross{OMSAGG}{select!}
+\cross{OMSAGG}{set}
+\cross{OMSAGG}{size?}
+\cross{OMSAGG}{subset?}
+\cross{OMSAGG}{symmetricDifference}
+\cross{OMSAGG}{union}
+\cross{OMSAGG}{\#?}
+\cross{OMSAGG}{?$<$?}
+\cross{OMSAGG}{?=?}
+\cross{OMSAGG}{?\~{}=?}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ min : % -> S
+\end{verbatim}
+
+These exports come from MultisetAggregate(S:OrderedSet):
+\begin{verbatim}
+ any? : ((S -> Boolean),%) -> Boolean if $ has finiteAggregate
+ bag : List S -> %                    
+ brace : () -> %
+ brace : List S -> %                  
+ coerce : % -> OutputForm
+ construct : List S -> %              
+ convert : % -> InputForm if S has KONVERT INFORM
+ copy : % -> %
+ count : (S,%) -> NonNegativeInteger if S has SETCAT and $ has finiteAggregate
+ count : ((S -> Boolean),%) -> NonNegativeInteger if $ has finiteAggregate
+ dictionary : List S -> %             
+ dictionary : () -> %
+ difference : (%,S) -> %
+ difference : (%,%) -> %              
+ duplicates : % -> List Record(entry: S,count: NonNegativeInteger)
+ empty : () -> %                      
+ empty? : % -> Boolean
+ eq? : (%,%) -> Boolean               
+ eval : (%,List S,List S) -> % if S has EVALAB S and S has SETCAT
+ eval : (%,S,S) -> % if S has EVALAB S and S has SETCAT
+ eval : (%,Equation S) -> % if S has EVALAB S and S has SETCAT
+ eval : (%,List Equation S) -> % if S has EVALAB S and S has SETCAT
+ every? : ((S -> Boolean),%) -> Boolean if $ has finiteAggregate
+ extract! : % -> S
+ find : ((S -> Boolean),%) -> Union(S,"failed")
+ hash : % -> SingleInteger            
+ insert! : (S,%) -> %
+ insert! : (S,%,NonNegativeInteger) -> %
+ inspect : % -> S                     
+ intersect : (%,%) -> %
+ latex : % -> String                  
+ less? : (%,NonNegativeInteger) -> Boolean
+ map : ((S -> S),%) -> %
+ map! : ((S -> S),%) -> % if $ has shallowlyMutable
+ member? : (S,%) -> Boolean if S has SETCAT and $ has finiteAggregate
+ members : % -> List S if $ has finiteAggregate
+ more? : (%,NonNegativeInteger) -> Boolean
+ parts : % -> List S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%) -> S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S) -> S if $ has finiteAggregate
+ reduce : (((S,S) -> S),%,S,S) -> S if S has SETCAT and $ has finiteAggregate
+ remove : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ remove : (S,%) -> % if S has SETCAT and $ has finiteAggregate
+ remove! : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ remove! : (S,%) -> % if $ has finiteAggregate
+ removeDuplicates : % -> % if S has SETCAT and $ has finiteAggregate
+ removeDuplicates! : % -> %           
+ sample : () -> %
+ select : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ select! : ((S -> Boolean),%) -> % if $ has finiteAggregate
+ set : () -> %                        
+ set : List S -> %
+ size? : (%,NonNegativeInteger) -> Boolean
+ subset? : (%,%) -> Boolean           
+ symmetricDifference : (%,%) -> %
+ union : (%,%) -> %
+ union : (%,S) -> %                   
+ union : (S,%) -> %
+ #? : % -> NonNegativeInteger if $ has finiteAggregate
+ ?~=? : (%,%) -> Boolean              
+ ?=? : (%,%) -> Boolean
+ ?<? : (%,%) -> Boolean               
+\end{verbatim}
+
+These exports come from PriorityQueueAggregate(S:OrderedSet):
+\begin{verbatim}
+ max : % -> S                         
+ merge : (%,%) -> %
+ merge! : (%,%) -> %                  
+\end{verbatim}
+
+<<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: 14 Oct, 1993 by RSS
+++ Date Last Updated: April 1991
 ++ Basic Operations:
 ++ Related Constructors:
 ++ Also See:
@@ -9181,101 +11458,78 @@ digraph pic {
 ++ 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.
+++ 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 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]
+	++ min(u) returns the smallest entry in the multiset aggregate u.
 
-   coerce(s:%):OutputForm ==
-     brace [x::OutputForm for x in parts s]$List(OutputForm)
+@
+<<OMSAGG.dotabb>>=
+"OMSAGG"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OMSAGG"];
+"OMSAGG" -> "MSETAGG"
+"OMSAGG" -> "PRQAGG"
 
-   intersect(s, t) ==
-     i := {}
-     for x in parts s | member?(x, t) repeat insert_!(x, i)
-     i
+@
+<<OMSAGG.dotfull>>=
+"OrderedMultisetAggregate(a:SetCategory)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OMSAGG"];
+"OrderedMultisetAggregate(a:SetCategory)" ->
+    "MultisetAggregate(a:SetCategory)"
+"OrderedMultisetAggregate(a:SetCategory)" -> 
+   "PriorityQueueAggregate(a:SetCategory)"
 
-   difference(s:%, t:%) ==
-     m := copy s
-     for x in parts t repeat remove_!(x, m)
-     m
+@
+<<OMSAGG.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
 
-   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
+"OrderedMultisetAggregate(a:SetCategory)" [color=lightblue];
+"OrderedMultisetAggregate(a:SetCategory)" ->
+    "MultisetAggregate(a:SetCategory)"
+"OrderedMultisetAggregate(a:SetCategory)" -> 
+   "PriorityQueueAggregate(a:SetCategory)"
 
-   union(s:%, t:%) ==
-      u := copy s
-      for x in parts t repeat insert_!(x, u)
-      u
+"MultisetAggregate(a:SetCategory)" [color=lightblue];
+"MultisetAggregate(a:SetCategory)" -> "MultiDictionary(a:SetCategory)"
+"MultisetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
 
-   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)
+"MultiDictionary(a:SetCategory)" [color=lightblue];
+"MultiDictionary(a:SetCategory)" -> "DictionaryOperations(a:SetCategory)"
 
-     lookup s ==
-       n:PositiveInteger := 1
-       for x in parts s repeat _
-         n := n + 2 ** ((lookup(x) - 1)::NonNegativeInteger)
-       n
+"SetAggregate(a:SetCategory)" [color=lightblue];
+"SetAggregate(a:SetCategory)" -> "SETAGG..."
+"SetAggregate(a:SetCategory)" -> "CLAGG..."
 
-   if S has OrderedSet then
-     max s ==
-       empty?(l := parts s) => error "Empty set"
-       reduce("max", l)
+"DictionaryOperations(a:SetCategory)" [color=lightblue];
+"DictionaryOperations(a:SetCategory)" -> "BGAGG..."
+"DictionaryOperations(a:SetCategory)" -> "CLAGG..."
 
-     min s ==
-       empty?(l := parts s) => error "Empty set"
-       reduce("min", l)
+"PriorityQueueAggregate(a:SetCategory)"
+ [color=seagreen,href="books/bookvol10.2.pamphlet#nameddest=PRQAGG"];
+"PriorityQueueAggregate(a:SetCategory)" -> "PriorityQueueAggregate(a:Type)"
 
-@
-<<FSAGG.dotabb>>=
-"FSAGG" [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=FSAGG"];
-"FSAGG" -> "DIAGG"
-"FSAGG" -> "SETAGG"
+"PriorityQueueAggregate(a:Type)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=PRQAGG"];
+"PriorityQueueAggregate(a:Type)" -> "BGAGG..."
 
-@
-<<FSAGG.dotfull>>=
-"FiniteSetAggregate(a:SetCategory)"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=FSAGG"];
-"FiniteSetAggregate(a:SetCategory)" -> "Dictionary(a:SetCategory)"
-"FiniteSetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
+"BGAGG..." [color=lightblue];
+"CLAGG..." [color=lightblue];
+"SETAGG..." [color=lightblue];
+}
 
 @
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Category Layers}
 \section{category BTAGG BitAggregate}
 <<category BTAGG BitAggregate>>=
 )abbrev category BTAGG BitAggregate
@@ -9340,184 +11594,291 @@ BitAggregate(): Category ==
 "BitAggregate()" -> "OneDimensionalArrayAggregate(Boolean)"
 
 @
-\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)
-
+\chapter{Temporary Placeholders}
+\pagehead{Evalable}{EVALAB}
+\pageto{HomogeneousAggregate}{HOAGG}
+<<EVALAB.dotfull>>=
+"Evalable(a:Type)"
+ [color="#00EE00",href="books/bookvol10.2.pamphlet#nameddest=EVALAB"];
 @
-<<MSETAGG.dotabb>>=
-"MSETAGG"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=MSETAGG"];
-"MSETAGG" -> "MDAGG"
-"MSETAGG" -> "SETAGG"
 
-@
-<<MSETAGG.dotfull>>=
-"MultisetAggregate(a:SetCategory)"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=MSETAGG"];
-"MultisetAggregate(a:SetCategory)" -> "MultiDictionary(a:SetCategory)"
-"MultisetAggregate(a:SetCategory)" -> "SetAggregate(a:SetCategory)"
+\chapter{The bootstrap code}
+\section{ABELGRP.lsp BOOTSTRAP} 
+{\bf ABELGRP} 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 ABELGRP} category which we can write
+into the {\bf MID} directory. We compile the lisp code and copy the
+{\bf ABELGRP.o} file to the {\bf OUT} directory.  This is eventually
+forcibly replaced by a recompiled version.
 
-@
-\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.
+Note that this code is not included in the generated catdef.spad file.
 
-@
-<<OMSAGG.dotabb>>=
-"OMSAGG"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OMSAGG"];
-"OMSAGG" -> "MSETAGG"
-"OMSAGG" -> "PRQAGG"
+<<ABELGRP.lsp BOOTSTRAP>>=
 
-@
-<<OMSAGG.dotfull>>=
-"OrderedMultisetAggregate(a:SetCategory)"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OMSAGG"];
-"OrderedMultisetAggregate(a:SetCategory)" ->
-    "MultisetAggregate(a:SetCategory)"
-"OrderedMultisetAggregate(a:SetCategory)" -> 
-   "PriorityQueueAggregate(a:SetCategory)"
+(|/VERSIONCHECK| 2) 
 
-@
-\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})
+(SETQ |AbelianGroup;AL| (QUOTE NIL)) 
 
-@
-<<SETAGG.dotabb>>=
-"SETAGG"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=SETAGG"];
-"SETAGG" -> "SETCAT"
-"SETAGG" -> "CLAGG"
+(DEFUN |AbelianGroup| NIL 
+  (LET (#:G82664) 
+    (COND 
+      (|AbelianGroup;AL|) 
+      (T (SETQ |AbelianGroup;AL| (|AbelianGroup;|)))))) 
+
+(DEFUN |AbelianGroup;| NIL 
+  (PROG (#1=#:G82662) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|CancellationAbelianMonoid|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|-| (|$| |$|)) T)
+                ((|-| (|$| |$| |$|)) T)
+                ((|*| (|$| (|Integer|) |$|)) T)))
+              NIL
+              (QUOTE ((|Integer|)))
+              NIL))
+          |AbelianGroup|)
+        (SETELT #1# 0 (QUOTE (|AbelianGroup|))))))) 
+
+(MAKEPROP (QUOTE |AbelianGroup|) (QUOTE NILADIC) T) 
 
 @
-<<SETAGG.dotfull>>=
-"SetAggregate(a:SetCategory)"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=SETAGG"];
-"SetAggregate(a:SetCategory)" -> "SetCategory()"
-"SetAggregate(a:SetCategory)" -> "Collection(a:SetCategory)"
+\section{ABELGRP-.lsp BOOTSTRAP}
+{\bf ABELGRP-} 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 ABELGRP-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf ABELGRP-.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<ABELGRP-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |ABELGRP-;-;3S;1| (|x| |y| |$|) 
+  (SPADCALL |x| (SPADCALL |y| (QREFELT |$| 7)) (QREFELT |$| 8))) 
+
+(DEFUN |ABELGRP-;subtractIfCan;2SU;2| (|x| |y| |$|) 
+  (CONS 0 (SPADCALL |x| |y| (QREFELT |$| 10)))) 
+
+(DEFUN |ABELGRP-;*;Nni2S;3| (|n| |x| |$|) 
+  (SPADCALL |n| |x| (QREFELT |$| 14))) 
+
+(DEFUN |ABELGRP-;*;I2S;4| (|n| |x| |$|) 
+  (COND 
+    ((ZEROP |n|) (|spadConstant| |$| 17))
+    ((|<| 0 |n|) (SPADCALL |n| |x| (QREFELT |$| 20)))
+    ((QUOTE T) 
+      (SPADCALL (|-| |n|) (SPADCALL |x| (QREFELT |$| 7)) (QREFELT |$| 20))))) 
+
+(DEFUN |AbelianGroup&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|AbelianGroup&|))
+        (LETT |dv$| (LIST (QUOTE |AbelianGroup&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 22) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        (COND 
+          ((|HasCategory| |#1| (QUOTE (|Ring|))))
+          ((QUOTE T) 
+            (QSETREFV |$| 21 
+              (CONS (|dispatchFunction| |ABELGRP-;*;I2S;4|) |$|))))
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |AbelianGroup&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (0 . |-|)
+        (5 . |+|)
+        |ABELGRP-;-;3S;1|
+        (11 . |-|)
+        (|Union| |$| (QUOTE "failed"))
+        |ABELGRP-;subtractIfCan;2SU;2|
+        (|Integer|)
+        (17 . |*|)
+        (|NonNegativeInteger|)
+        |ABELGRP-;*;Nni2S;3|
+        (23 . |Zero|)
+        (|PositiveInteger|)
+        (|RepeatedDoubling| 6)
+        (27 . |double|)
+        (33 . |*|))) 
+    (QUOTE #(|subtractIfCan| 39 |-| 45 |*| 51))
+    (QUOTE NIL)
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #())
+          (|makeByteWordVec2| 21 
+            (QUOTE (1 6 0 0 7 2 6 0 0 0 8 2 6 0 0 0 10 2 6 0 13 0 14 0 6 0 17
+                    2 19 6 18 6 20 2 0 0 13 0 21 2 0 11 0 0 12 2 0 0 0 0 9 2
+                    0 0 13 0 21 2 0 0 15 0 16))))))
+    (QUOTE |lookupComplete|))) 
 
 @
-\chapter{Temporary Placeholders}
-\pagehead{Evalable}{EVALAB}
-\pageto{HomogeneousAggregate}{HOAGG}
-<<EVALAB.dotfull>>=
-"Evalable(a:Type)"
- [color="#00EE00",href="books/bookvol10.2.pamphlet#nameddest=EVALAB"];
+\section{ABELMON.lsp BOOTSTRAP}
+{\bf ABELMON} which needs
+{\bf ABELSG} which needs
+{\bf SETCAT} which needs 
+{\bf SINT} which needs 
+{\bf UFD} which needs
+{\bf GCDDOM} which needs
+{\bf COMRING} which needs
+{\bf RING} which needs
+{\bf RNG} which needs
+{\bf ABELGRP} which needs
+{\bf CABMON} which needs
+{\bf ABELMON}. 
+We break this chain with {\bf ABELMON.lsp} which we
+cache here. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf ABELMON}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf ABELMON.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<ABELMON.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |AbelianMonoid;AL| (QUOTE NIL)) 
+
+(DEFUN |AbelianMonoid| NIL 
+  (LET (#:G82597) 
+    (COND 
+      (|AbelianMonoid;AL|) 
+      (T (SETQ |AbelianMonoid;AL| (|AbelianMonoid;|)))))) 
+
+(DEFUN |AbelianMonoid;| NIL 
+  (PROG (#1=#:G82595) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|AbelianSemiGroup|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|Zero| (|$|) |constant|) T)
+                ((|sample| (|$|) |constant|) T)
+                ((|zero?| ((|Boolean|) |$|)) T)
+                ((|*| (|$| (|NonNegativeInteger|) |$|)) T)))
+              NIL
+              (QUOTE ((|NonNegativeInteger|) (|Boolean|)))
+              NIL))
+            |AbelianMonoid|)
+        (SETELT #1# 0 (QUOTE (|AbelianMonoid|))))))) 
+
+(MAKEPROP (QUOTE |AbelianMonoid|) (QUOTE NILADIC) T) 
+
 @
+\section{ABELMON-.lsp BOOTSTRAP}
+{\bf ABELMON-} which needs
+{\bf ABELSG} which needs
+{\bf SETCAT} which needs 
+{\bf SINT} which needs 
+{\bf UFD} which needs
+{\bf GCDDOM} which needs
+{\bf COMRING} which needs
+{\bf RING} which needs
+{\bf RNG} which needs
+{\bf ABELGRP} which needs
+{\bf CABMON} which needs
+{\bf ABELMON-}. 
+We break this chain with {\bf ABELMON-.lsp} which we
+cache here. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf ABELMON-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf ABELMON-.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version.
 
-\chapter{The bootstrap code}
+Note that this code is not included in the generated catdef.spad file.
+
+<<ABELMON-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |ABELMON-;zero?;SB;1| (|x| |$|) 
+  (SPADCALL |x| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
+
+(DEFUN |ABELMON-;*;Pi2S;2| (|n| |x| |$|) 
+  (SPADCALL |n| |x| (QREFELT |$| 12))) 
+
+(DEFUN |ABELMON-;sample;S;3| (|$|) 
+  (|spadConstant| |$| 7)) 
+
+(DEFUN |ABELMON-;*;Nni2S;4| (|n| |x| |$|) 
+  (COND 
+    ((ZEROP |n|) (|spadConstant| |$| 7))
+    ((QUOTE T) (SPADCALL |n| |x| (QREFELT |$| 17))))) 
+
+(DEFUN |AbelianMonoid&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|AbelianMonoid&|))
+        (LETT |dv$| (LIST (QUOTE |AbelianMonoid&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 19) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        (COND 
+          ((|HasCategory| |#1| (QUOTE (|Ring|))))
+          ((QUOTE T) 
+            (QSETREFV |$| 18 
+              (CONS (|dispatchFunction| |ABELMON-;*;Nni2S;4|) |$|)))) |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |AbelianMonoid&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (0 . |Zero|)
+        (|Boolean|)
+        (4 . |=|)
+        |ABELMON-;zero?;SB;1|
+        (|NonNegativeInteger|)
+        (10 . |*|)
+        (|PositiveInteger|)
+        |ABELMON-;*;Pi2S;2|
+        |ABELMON-;sample;S;3|
+        (|RepeatedDoubling| 6)
+        (16 . |double|)
+        (22 . |*|))) 
+    (QUOTE #(|zero?| 28 |sample| 33 |*| 37))
+    (QUOTE NIL)
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #())
+          (|makeByteWordVec2| 18 
+            (QUOTE (0 6 0 7 2 6 8 0 0 9 2 6 0 11 0 12 2 16 6 13 6 17 2 0 0 11
+                    0 18 1 0 8 0 10 0 0 0 15 2 0 0 11 0 18 2 0 0 13 0 14))))))
+   (QUOTE |lookupComplete|))) 
+
+@
 \section{ABELSG.lsp BOOTSTRAP}
 {\bf ABELSG} needs
 {\bf SETCAT} which needs
@@ -9709,6 +12070,63 @@ Note that this code is not included in the generated catdef.spad file.
       (|devaluate| |t#1|)
       (|devaluate| |t#2|))))))) 
 @
+\section{CABMON.lsp BOOTSTRAP}
+{\bf CABMON} which needs
+{\bf ABELMON} which needs
+{\bf ABELSG} which needs
+{\bf SETCAT} which needs 
+{\bf SINT} which needs 
+{\bf UFD} which needs
+{\bf GCDDOM} which needs
+{\bf COMRING} which needs
+{\bf RING} which needs
+{\bf RNG} which needs
+{\bf ABELGRP} which needs
+{\bf CABMON}.
+We break this chain with {\bf CABMON.lsp} which we
+cache here. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf CABMON}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf CABMON.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<CABMON.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |CancellationAbelianMonoid;AL| (QUOTE NIL)) 
+
+(DEFUN |CancellationAbelianMonoid| NIL 
+  (LET (#:G82646) 
+    (COND 
+      (|CancellationAbelianMonoid;AL|) 
+      (T 
+        (SETQ 
+          |CancellationAbelianMonoid;AL| 
+          (|CancellationAbelianMonoid;|)))))) 
+
+(DEFUN |CancellationAbelianMonoid;| NIL 
+  (PROG (#1=#:G82644) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|AbelianMonoid|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE 
+               (((|subtractIfCan| ((|Union| |$| "failed") |$| |$|)) T)))
+              NIL
+             (QUOTE NIL)
+             NIL))
+           |CancellationAbelianMonoid|)
+        (SETELT #1# 0 (QUOTE (|CancellationAbelianMonoid|))))))) 
+
+(MAKEPROP (QUOTE |CancellationAbelianMonoid|) (QUOTE NILADIC) T) 
+
+@
 \section{CLAGG.lsp BOOTSTRAP}
 {\bf CLAGG} 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 CLAGG}
@@ -11466,6 +13884,134 @@ 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{MONOID.lsp BOOTSTRAP}
+{\bf MONOID} depends on itself. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf MONOID}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf MONOID.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<MONOID.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |Monoid;AL| (QUOTE NIL)) 
+
+(DEFUN |Monoid| NIL 
+  (LET (#:G82434) 
+    (COND 
+      (|Monoid;AL|)
+      (T (SETQ |Monoid;AL| (|Monoid;|)))))) 
+
+(DEFUN |Monoid;| NIL 
+  (PROG (#1=#:G82432) 
+    (RETURN 
+      (PROG1
+        (LETT #1# 
+          (|Join|
+            (|SemiGroup|)
+            (|mkCategory|
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|One| (|$|) |constant|) T)
+                ((|sample| (|$|) |constant|) T)
+                ((|one?| ((|Boolean|) |$|)) T)
+                ((|**| (|$| |$| (|NonNegativeInteger|))) T)
+                ((|^| (|$| |$| (|NonNegativeInteger|))) T)
+                ((|recip| ((|Union| |$| "failed") |$|)) T)))
+              NIL
+              (QUOTE ((|NonNegativeInteger|) (|Boolean|)))
+              NIL))
+            |Monoid|)
+         (SETELT #1# 0 (QUOTE (|Monoid|))))))) 
+
+(MAKEPROP (QUOTE |Monoid|) (QUOTE NILADIC) T) 
+
+@
+\section{MONOID-.lsp BOOTSTRAP}
+{\bf MONOID-} depends on {\bf MONOID}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf MONOID-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf MONOID-.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<MONOID-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |MONOID-;^;SNniS;1| (|x| |n| |$|) 
+  (SPADCALL |x| |n| (QREFELT |$| 8))) 
+
+(DEFUN |MONOID-;one?;SB;2| (|x| |$|) 
+  (SPADCALL |x| (|spadConstant| |$| 10) (QREFELT |$| 12))) 
+
+(DEFUN |MONOID-;sample;S;3| (|$|) 
+  (|spadConstant| |$| 10)) 
+
+(DEFUN |MONOID-;recip;SU;4| (|x| |$|) 
+  (COND 
+    ((SPADCALL |x| (QREFELT |$| 15)) (CONS 0 |x|))
+    ((QUOTE T) (CONS 1 "failed")))) 
+
+(DEFUN |MONOID-;**;SNniS;5| (|x| |n| |$|) 
+  (COND 
+    ((ZEROP |n|) (|spadConstant| |$| 10))
+    ((QUOTE T) (SPADCALL |x| |n| (QREFELT |$| 20))))) 
+
+(DEFUN |Monoid&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|Monoid&|))
+        (LETT |dv$| (LIST (QUOTE |Monoid&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 22) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |Monoid&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (|NonNegativeInteger|)
+        (0 . |**|)
+        |MONOID-;^;SNniS;1|
+        (6 . |One|)
+        (|Boolean|)
+        (10 . |=|)
+        |MONOID-;one?;SB;2|
+        |MONOID-;sample;S;3|
+        (16 . |one?|)
+        (|Union| |$| (QUOTE "failed"))
+        |MONOID-;recip;SU;4|
+        (|PositiveInteger|)
+        (|RepeatedSquaring| 6)
+        (21 . |expt|)
+        |MONOID-;**;SNniS;5|)) 
+    (QUOTE #(|sample| 27 |recip| 31 |one?| 36 |^| 41 |**| 47))
+    (QUOTE NIL)
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #())
+          (|makeByteWordVec2| 21 
+            (QUOTE 
+              (2 6 0 0 7 8 0 6 0 10 2 6 11 0 0 12 1 6 11 0 15 2 19 6 6 18 20
+              0 0 0 14 1 0 16 0 17 1 0 11 0 13 2 0 0 0 7 9 2 0 0 0 7 21))))))
+  (QUOTE |lookupComplete|))) 
+
+@
 \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}
@@ -11603,6 +14149,38 @@ Note that this code is not included in the generated catdef.spad file.
      10 2 0 15 0 0 18))))))
   (QUOTE |lookupComplete|))) 
 @
+\section{RNG.lsp BOOTSTRAP} 
+{\bf RNG} 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 RNG} category which we can write
+into the {\bf MID} directory. We compile the lisp code and copy the
+{\bf RNG.o} file to the {\bf OUT} directory.  This is eventually
+forcibly replaced by a recompiled version.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<RNG.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |Rng;AL| (QUOTE NIL)) 
+
+(DEFUN |Rng| NIL 
+  (LET (#:G82722) 
+    (COND 
+      (|Rng;AL|) 
+      (T (SETQ |Rng;AL| (|Rng;|)))))) 
+
+(DEFUN |Rng;| NIL 
+  (PROG (#1=#:G82720) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# (|Join| (|AbelianGroup|) (|SemiGroup|)) |Rng|)
+        (SETELT #1# 0 (QUOTE (|Rng|))))))) 
+
+(MAKEPROP (QUOTE |Rng|) (QUOTE NILADIC) T) 
+
+@
 \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}
@@ -13005,6 +15583,8 @@ Note that this code is not included in the generated catdef.spad file.
 @
 \chapter{Chunk collections}
 <<algebra>>=
+<<category ABELGRP AbelianGroup>>
+<<category ABELMON AbelianMonoid>>
 <<category ABELSG AbelianSemiGroup>>
 <<category AGG Aggregate>>
 <<category ALAGG AssociationListAggregate>>
@@ -13013,6 +15593,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category BGAGG BagAggregate>>
 <<category BRAGG BinaryRecursiveAggregate>>
 <<category BTAGG BitAggregate>>
+<<category CABMON CancellationAbelianMonoid>>
 <<category CLAGG Collection>>
 <<category DIAGG Dictionary>>
 <<category DIOPS DictionaryOperations>>
@@ -13031,20 +15612,27 @@ Note that this code is not included in the generated catdef.spad file.
 <<category KONVERT ConvertibleTo>>
 <<category LNAGG LinearAggregate>>
 <<category LSAGG ListAggregate>>
+<<category MONOID Monoid>>
 <<category MDAGG MultiDictionary>>
 <<category MSETAGG MultisetAggregate>>
+<<category OAMON OrderedAbelianMonoid>>
+<<category OASGP OrderedAbelianSemiGroup>>
 <<category OMSAGG OrderedMultisetAggregate>>
+<<category ORDFIN OrderedFinite>>
+<<category ORDMON OrderedMonoid>>
 <<category ORDSET OrderedSet>>
 <<category PRQAGG PriorityQueueAggregate>>
 <<category QUAGG QueueAggregate>>
 <<category RCAGG RecursiveAggregate>>
 <<category RETRACT RetractableTo>>
+<<category RNG Rng>>
 <<category SETAGG SetAggregate>>
 <<category SETCAT SetCategory>>
 <<category SGROUP SemiGroup>>
 <<category SKAGG StackAggregate>>
 <<category SRAGG StringAggregate>>
 <<category STAGG StreamAggregate>>
+<<category STEP StepThrough>>
 <<category TYPE Type>>
 <<category TBAGG TableAggregate>>
 <<category URAGG UnaryRecursiveAggregate>>
@@ -13058,6 +15646,8 @@ digraph dotabb {
 "CATEGORY"
  [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=CATEGORY"];
 
+<<ABELGRP.dotabb>>
+<<ABELMON.dotabb>>
 <<ABELSG.dotabb>>
 <<AGG.dotabb>>
 <<ALAGG.dotabb>>
@@ -13066,6 +15656,7 @@ digraph dotabb {
 <<BGAGG.dotabb>>
 <<BRAGG.dotabb>>
 <<BTAGG.dotabb>>
+<<CABMON.dotabb>>
 <<CLAGG.dotabb>>
 <<DIAGG.dotabb>>
 <<DIOPS.dotabb>>
@@ -13085,19 +15676,26 @@ digraph dotabb {
 <<LNAGG.dotabb>>
 <<LSAGG.dotabb>>
 <<MDAGG.dotabb>>
+<<MONOID.dotabb>>
 <<MSETAGG.dotabb>>
+<<OAMON.dotabb>>
+<<OASGP.dotabb>>
 <<OMSAGG.dotabb>>
+<<ORDFIN.dotabb>>
+<<ORDMON.dotabb>>
 <<ORDSET.dotabb>>
 <<PRQAGG.dotabb>>
 <<QUAGG.dotabb>>
 <<RCAGG.dotabb>>
 <<RETRACT.dotabb>>
+<<RNG.dotabb>>
 <<SETAGG.dotabb>>
 <<SETCAT.dotabb>>
 <<SGROUP.dotabb>>
 <<SKAGG.dotabb>>
 <<SRAGG.dotabb>>
 <<STAGG.dotabb>>
+<<STEP.dotabb>>
 <<TYPE.dotabb>>
 <<TBAGG.dotabb>>
 <<URAGG.dotabb>>
@@ -13114,6 +15712,8 @@ digraph dotfull {
 "Category"
  [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=CATEGORY"];
 
+<<ABELGRP.dotfull>>
+<<ABELMON.dotfull>>
 <<ABELSG.dotfull>>
 <<AGG.dotfull>>
 <<ALAGG.dotfull>>
@@ -13122,6 +15722,7 @@ digraph dotfull {
 <<BGAGG.dotfull>>
 <<BRAGG.dotfull>>
 <<BTAGG.dotfull>>
+<<CABMON.dotfull>>
 <<CLAGG.dotfull>>
 <<DIAGG.dotfull>>
 <<DIOPS.dotfull>>
@@ -13141,19 +15742,26 @@ digraph dotfull {
 <<LNAGG.dotfull>>
 <<LSAGG.dotfull>>
 <<MDAGG.dotfull>>
+<<MONOID.dotfull>>
 <<MSETAGG.dotfull>>
+<<OAMON.dotfull>>
+<<OASGP.dotfull>>
 <<OMSAGG.dotfull>>
+<<ORDFIN.dotfull>>
+<<ORDMON.dotfull>>
 <<ORDSET.dotfull>>
 <<PRQAGG.dotfull>>
 <<QUAGG.dotfull>>
 <<RCAGG.dotfull>>
 <<RETRACT.dotfull>>
+<<RNG.dotfull>>
 <<SETAGG.dotfull>>
 <<SETCAT.dotfull>>
 <<SGROUP.dotfull>>
 <<SKAGG.dotfull>>
 <<SRAGG.dotfull>>
 <<STAGG.dotfull>>
+<<STEP.dotfull>>
 <<TYPE.dotfull>>
 <<TBAGG.dotfull>>
 <<URAGG.dotfull>>
diff --git a/books/ps/v102abeliangroup.ps b/books/ps/v102abeliangroup.ps
new file mode 100644
index 0000000..1930497
--- /dev/null
+++ b/books/ps/v102abeliangroup.ps
@@ -0,0 +1,632 @@
+%!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 511 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 511 512
+%%PageOrientation: Portrait
+gsave
+36 36 475 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
+473 474 lineto
+473 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+473 474 lineto
+473 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 325 468 moveto
+219 468 lineto
+219 432 lineto
+325 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 325 468 moveto
+219 468 lineto
+219 432 lineto
+325 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 445 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CancellationAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 289 396 moveto
+105 396 lineto
+105 360 lineto
+289 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 289 396 moveto
+105 396 lineto
+105 360 lineto
+289 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+113 373 moveto
+(CancellationAbelianMonoid\(\))
+[9.36 6.24 6.96 6.24 6.24 3.84 3.84 6.24 3.84 3.84 6.96 6.96 9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CancellationAbelianMonoid()
+newpath 253 432 moveto
+244 423 233 413 223 403 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 226 401 moveto
+216 396 lineto
+221 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 226 401 moveto
+216 396 lineto
+221 406 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(AbelianGroup)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 467 324 moveto
+257 324 lineto
+257 288 lineto
+467 288 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 467 324 moveto
+257 324 lineto
+257 288 lineto
+467 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+265 301 moveto
+(RepeatedDoubling\(AbelianGroup\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 3.84 3.84 6.96 6.96 4.56 9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->RepeatedDoubling(AbelianGroup)
+newpath 283 432 moveto
+299 407 328 362 346 333 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 349 334 moveto
+351 324 lineto
+343 331 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 349 334 moveto
+351 324 lineto
+343 331 lineto
+closepath
+stroke
+end grestore
+% AbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 239 324 moveto
+125 324 lineto
+125 288 lineto
+239 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 239 324 moveto
+125 324 lineto
+125 288 lineto
+239 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+132 301 moveto
+(AbelianMonoid\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CancellationAbelianMonoid()->AbelianMonoid()
+newpath 193 360 moveto
+192 352 190 343 188 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 191 333 moveto
+186 324 lineto
+185 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 191 333 moveto
+186 324 lineto
+185 334 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(a:SetCategory)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 344 108 moveto
+136 108 lineto
+136 72 lineto
+344 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 344 108 moveto
+136 108 lineto
+136 72 lineto
+344 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+143 85 moveto
+(RepeatedDoubling\(a:SetCategory\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 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
+% RepeatedDoubling(AbelianGroup)->RepeatedDoubling(a:SetCategory)
+newpath 365 288 moveto
+369 256 373 188 343 144 curveto
+334 131 320 120 306 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 307 110 moveto
+297 108 lineto
+304 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 307 110 moveto
+297 108 lineto
+304 116 lineto
+closepath
+stroke
+end grestore
+% Package
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 271 36 moveto
+209 36 lineto
+209 0 lineto
+271 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 271 36 moveto
+209 36 lineto
+209 0 lineto
+271 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+216 13 moveto
+(Package)
+[7.44 6.24 6 6.96 6.24 6.72 6.24]
+xshow
+end grestore
+end grestore
+% RepeatedDoubling(a:SetCategory)->Package
+newpath 240 72 moveto
+240 64 240 55 240 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 244 46 moveto
+240 36 lineto
+237 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 244 46 moveto
+240 36 lineto
+237 46 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(AbelianSemiGroup)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 238 180 moveto
+0 180 lineto
+0 144 lineto
+238 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 238 180 moveto
+0 180 lineto
+0 144 lineto
+238 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 157 moveto
+(RepeatedDoubling\(AbelianSemiGroup\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 3.84 3.84 6.96 6.96 4.56 9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RepeatedDoubling(AbelianSemiGroup)->RepeatedDoubling(a:SetCategory)
+newpath 150 144 moveto
+165 135 184 123 201 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 203 116 moveto
+210 108 lineto
+200 110 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 203 116 moveto
+210 108 lineto
+200 110 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 249 252 moveto
+115 252 lineto
+115 216 lineto
+249 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 249 252 moveto
+115 252 lineto
+115 216 lineto
+249 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+122 229 moveto
+(AbelianSemiGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianMonoid()->AbelianSemiGroup()
+newpath 182 288 moveto
+182 280 182 271 182 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 186 262 moveto
+182 252 lineto
+179 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 186 262 moveto
+182 252 lineto
+179 262 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()->RepeatedDoubling(AbelianSemiGroup)
+newpath 166 216 moveto
+158 207 149 197 142 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 144 185 moveto
+135 180 lineto
+139 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 144 185 moveto
+135 180 lineto
+139 190 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 334 180 moveto
+256 180 lineto
+256 144 lineto
+334 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 334 180 moveto
+256 180 lineto
+256 144 lineto
+334 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+264 157 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianSemiGroup()->SETCAT...
+newpath 211 216 moveto
+225 207 243 196 258 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 261 188 moveto
+267 180 lineto
+257 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 261 188 moveto
+267 180 lineto
+257 183 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102abelianmonoid.ps b/books/ps/v102abelianmonoid.ps
new file mode 100644
index 0000000..79c12f1
--- /dev/null
+++ b/books/ps/v102abelianmonoid.ps
@@ -0,0 +1,678 @@
+%!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 521 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 521 440
+%%PageOrientation: Portrait
+gsave
+36 36 485 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
+483 402 lineto
+483 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+483 402 lineto
+483 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% AbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 318 396 moveto
+204 396 lineto
+204 360 lineto
+318 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 318 396 moveto
+204 396 lineto
+204 360 lineto
+318 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+211 373 moveto
+(AbelianMonoid\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianSemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 328 324 moveto
+194 324 lineto
+194 288 lineto
+328 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 328 324 moveto
+194 324 lineto
+194 288 lineto
+328 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 301 moveto
+(AbelianSemiGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianMonoid()->AbelianSemiGroup()
+newpath 261 360 moveto
+261 352 261 343 261 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 265 334 moveto
+261 324 lineto
+258 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 265 334 moveto
+261 324 lineto
+258 334 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 229 moveto
+(SetCategory\(\))
+[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
+% AbelianSemiGroup()->SetCategory()
+newpath 237 288 moveto
+225 279 210 268 196 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 198 255 moveto
+188 252 lineto
+194 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 198 255 moveto
+188 252 lineto
+194 261 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(AbelianSemiGroup)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 477 252 moveto
+239 252 lineto
+239 216 lineto
+477 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 477 252 moveto
+239 252 lineto
+239 216 lineto
+477 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+247 229 moveto
+(RepeatedDoubling\(AbelianSemiGroup\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 3.84 3.84 6.96 6.96 4.56 9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% AbelianSemiGroup()->RepeatedDoubling(AbelianSemiGroup)
+newpath 285 288 moveto
+297 279 312 268 326 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 328 261 moveto
+334 252 lineto
+324 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 328 261 moveto
+334 252 lineto
+324 255 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 121 216 moveto
+104 207 86 195 73 180 curveto
+59 162 51 137 47 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 164 216 moveto
+164 208 164 199 164 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(a:SetCategory)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 472 180 moveto
+264 180 lineto
+264 144 lineto
+472 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 472 180 moveto
+264 180 lineto
+264 144 lineto
+472 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+271 157 moveto
+(RepeatedDoubling\(a:SetCategory\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 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
+% RepeatedDoubling(AbelianSemiGroup)->RepeatedDoubling(a:SetCategory)
+newpath 361 216 moveto
+362 208 363 199 364 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 367 190 moveto
+365 180 lineto
+361 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 367 190 moveto
+365 180 lineto
+361 190 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+79 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 58 72 moveto
+66 63 75 53 82 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 165 144 moveto
+166 136 166 127 166 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 152 72 moveto
+144 63 135 53 128 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+stroke
+end grestore
+% Package
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 399 108 moveto
+337 108 lineto
+337 72 lineto
+399 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 399 108 moveto
+337 108 lineto
+337 72 lineto
+399 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+344 85 moveto
+(Package)
+[7.44 6.24 6 6.96 6.24 6.72 6.24]
+xshow
+end grestore
+end grestore
+% RepeatedDoubling(a:SetCategory)->Package
+newpath 368 144 moveto
+368 136 368 127 368 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 372 118 moveto
+368 108 lineto
+365 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 372 118 moveto
+368 108 lineto
+365 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102cancellationabelianmonoid.ps b/books/ps/v102cancellationabelianmonoid.ps
new file mode 100644
index 0000000..3ad5745
--- /dev/null
+++ b/books/ps/v102cancellationabelianmonoid.ps
@@ -0,0 +1,729 @@
+%!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 521 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 521 512
+%%PageOrientation: Portrait
+gsave
+36 36 485 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
+483 474 lineto
+483 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+483 474 lineto
+483 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% CancellationAbelianMonoid()
+[ /Rect [ 169 432 353 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=CABMON) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 353 468 moveto
+169 468 lineto
+169 432 lineto
+353 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 353 468 moveto
+169 468 lineto
+169 432 lineto
+353 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+177 445 moveto
+(CancellationAbelianMonoid\(\))
+[9.36 6.24 6.96 6.24 6.24 3.84 3.84 6.24 3.84 3.84 6.96 6.96 9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 318 396 moveto
+204 396 lineto
+204 360 lineto
+318 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 318 396 moveto
+204 396 lineto
+204 360 lineto
+318 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+211 373 moveto
+(AbelianMonoid\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CancellationAbelianMonoid()->AbelianMonoid()
+newpath 261 432 moveto
+261 424 261 415 261 406 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 265 406 moveto
+261 396 lineto
+258 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 265 406 moveto
+261 396 lineto
+258 406 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 328 324 moveto
+194 324 lineto
+194 288 lineto
+328 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 328 324 moveto
+194 324 lineto
+194 288 lineto
+328 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 301 moveto
+(AbelianSemiGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianMonoid()->AbelianSemiGroup()
+newpath 261 360 moveto
+261 352 261 343 261 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 265 334 moveto
+261 324 lineto
+258 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 265 334 moveto
+261 324 lineto
+258 334 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 229 moveto
+(SetCategory\(\))
+[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
+% AbelianSemiGroup()->SetCategory()
+newpath 237 288 moveto
+225 279 210 268 196 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 198 255 moveto
+188 252 lineto
+194 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 198 255 moveto
+188 252 lineto
+194 261 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(AbelianSemiGroup)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 477 252 moveto
+239 252 lineto
+239 216 lineto
+477 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 477 252 moveto
+239 252 lineto
+239 216 lineto
+477 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+247 229 moveto
+(RepeatedDoubling\(AbelianSemiGroup\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 3.84 3.84 6.96 6.96 4.56 9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% AbelianSemiGroup()->RepeatedDoubling(AbelianSemiGroup)
+newpath 285 288 moveto
+297 279 312 268 326 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 328 261 moveto
+334 252 lineto
+324 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 328 261 moveto
+334 252 lineto
+324 255 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 121 216 moveto
+104 207 86 195 73 180 curveto
+59 162 51 137 47 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 164 216 moveto
+164 208 164 199 164 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(a:SetCategory)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 472 180 moveto
+264 180 lineto
+264 144 lineto
+472 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 472 180 moveto
+264 180 lineto
+264 144 lineto
+472 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+271 157 moveto
+(RepeatedDoubling\(a:SetCategory\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 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
+% RepeatedDoubling(AbelianSemiGroup)->RepeatedDoubling(a:SetCategory)
+newpath 361 216 moveto
+362 208 363 199 364 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 367 190 moveto
+365 180 lineto
+361 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 367 190 moveto
+365 180 lineto
+361 190 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+79 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 58 72 moveto
+66 63 75 53 82 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 165 144 moveto
+166 136 166 127 166 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 152 72 moveto
+144 63 135 53 128 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+stroke
+end grestore
+% Package
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 399 108 moveto
+337 108 lineto
+337 72 lineto
+399 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 399 108 moveto
+337 108 lineto
+337 72 lineto
+399 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+344 85 moveto
+(Package)
+[7.44 6.24 6 6.96 6.24 6.72 6.24]
+xshow
+end grestore
+end grestore
+% RepeatedDoubling(a:SetCategory)->Package
+newpath 368 144 moveto
+368 136 368 127 368 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 372 118 moveto
+368 108 lineto
+365 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 372 118 moveto
+368 108 lineto
+365 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102finitesetaggregate.ps b/books/ps/v102finitesetaggregate.ps
new file mode 100644
index 0000000..07aab67
--- /dev/null
+++ b/books/ps/v102finitesetaggregate.ps
@@ -0,0 +1,636 @@
+%!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 512 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 512 296
+%%PageOrientation: Portrait
+gsave
+36 36 476 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
+474 258 lineto
+474 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+474 258 lineto
+474 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% FiniteSetAggregate(a:SetCategory)
+[ /Rect [ 102 216 314 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=FSAGG) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 314 252 moveto
+102 252 lineto
+102 216 lineto
+314 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 314 252 moveto
+102 252 lineto
+102 216 lineto
+314 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+109 229 moveto
+(FiniteSetAggregate\(a:SetCategory\))
+[7.44 3.84 6.96 3.84 3.84 6.24 7.68 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% Dictionary(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 196 180 moveto
+30 180 lineto
+30 144 lineto
+196 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 196 180 moveto
+30 180 lineto
+30 144 lineto
+196 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+38 157 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
+% FiniteSetAggregate(a:SetCategory)->Dictionary(a:SetCategory)
+newpath 184 216 moveto
+173 207 158 196 145 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 147 183 moveto
+137 180 lineto
+143 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 147 183 moveto
+137 180 lineto
+143 189 lineto
+closepath
+stroke
+end grestore
+% SetAggregate(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 394 180 moveto
+214 180 lineto
+214 144 lineto
+394 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 394 180 moveto
+214 180 lineto
+214 144 lineto
+394 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+221 157 moveto
+(SetAggregate\(a:SetCategory\))
+[7.68 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% FiniteSetAggregate(a:SetCategory)->SetAggregate(a:SetCategory)
+newpath 232 216 moveto
+244 207 259 196 272 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 274 189 moveto
+280 180 lineto
+270 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 274 189 moveto
+280 180 lineto
+270 183 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 226 108 moveto
+0 108 lineto
+0 72 lineto
+226 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 226 108 moveto
+0 108 lineto
+0 72 lineto
+226 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 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 113 144 moveto
+113 136 113 127 113 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 117 118 moveto
+113 108 lineto
+110 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 117 118 moveto
+113 108 lineto
+110 118 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 376 108 moveto
+282 108 lineto
+282 72 lineto
+376 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 376 108 moveto
+282 108 lineto
+282 72 lineto
+376 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+289 85 moveto
+(SetCategory\(\))
+[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
+% SetAggregate(a:SetCategory)->SetCategory()
+newpath 310 144 moveto
+313 136 316 126 320 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 323 119 moveto
+323 108 lineto
+317 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 323 119 moveto
+323 108 lineto
+317 117 lineto
+closepath
+stroke
+end grestore
+% CLAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 254 36 moveto
+180 36 lineto
+180 0 lineto
+254 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 254 36 moveto
+180 36 lineto
+180 0 lineto
+254 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+187 13 moveto
+(CLAGG...)
+[9.36 8.64 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SetAggregate(a:SetCategory)->CLAGG...
+newpath 293 144 moveto
+279 119 251 74 233 45 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 236 43 moveto
+228 36 lineto
+230 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 236 43 moveto
+228 36 lineto
+230 46 lineto
+closepath
+stroke
+end grestore
+% BASTYPE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 368 36 moveto
+278 36 lineto
+278 0 lineto
+368 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 368 36 moveto
+278 36 lineto
+278 0 lineto
+368 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+286 13 moveto
+(BASTYPE...)
+[8.64 10.08 7.44 8.88 10.08 7.68 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SetCategory()->BASTYPE...
+newpath 327 72 moveto
+326 64 326 55 325 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 329 46 moveto
+325 36 lineto
+322 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 329 46 moveto
+325 36 lineto
+322 46 lineto
+closepath
+stroke
+end grestore
+% KOERCE...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 468 36 moveto
+386 36 lineto
+386 0 lineto
+468 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 468 36 moveto
+386 36 lineto
+386 0 lineto
+468 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+393 13 moveto
+(KOERCE...)
+[9.12 10.08 8.64 8.88 9.36 8.64 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SetCategory()->KOERCE...
+newpath 354 72 moveto
+366 63 381 52 395 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 397 45 moveto
+403 36 lineto
+393 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 397 45 moveto
+403 36 lineto
+393 39 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)->CLAGG...
+newpath 139 72 moveto
+152 63 168 52 182 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 185 44 moveto
+191 36 lineto
+181 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 185 44 moveto
+191 36 lineto
+181 39 lineto
+closepath
+stroke
+end grestore
+% BGAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 151 36 moveto
+75 36 lineto
+75 0 lineto
+151 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 151 36 moveto
+75 36 lineto
+75 0 lineto
+151 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 13 moveto
+(BGAGG...)
+[9.36 9.6 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BGAGG...
+newpath 113 72 moveto
+113 64 113 55 113 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 117 46 moveto
+113 36 lineto
+110 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 117 46 moveto
+113 36 lineto
+110 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102monoid.ps b/books/ps/v102monoid.ps
new file mode 100644
index 0000000..e76f312
--- /dev/null
+++ b/books/ps/v102monoid.ps
@@ -0,0 +1,678 @@
+%!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 514 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 514 440
+%%PageOrientation: Portrait
+gsave
+36 36 478 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
+476 402 lineto
+476 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+476 402 lineto
+476 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 290 396 moveto
+220 396 lineto
+220 360 lineto
+290 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 396 moveto
+220 396 lineto
+220 360 lineto
+290 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 373 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 300 324 moveto
+210 324 lineto
+210 288 lineto
+300 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 300 324 moveto
+210 324 lineto
+210 288 lineto
+300 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+218 301 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Monoid()->SemiGroup()
+newpath 255 360 moveto
+255 352 255 343 255 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 259 334 moveto
+255 324 lineto
+252 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 259 334 moveto
+255 324 lineto
+252 334 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 229 moveto
+(SetCategory\(\))
+[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
+% SemiGroup()->SetCategory()
+newpath 232 288 moveto
+221 279 207 268 195 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 197 255 moveto
+187 252 lineto
+193 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 197 255 moveto
+187 252 lineto
+193 261 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(SemiGroup)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 442 252 moveto
+250 252 lineto
+250 216 lineto
+442 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 442 252 moveto
+250 252 lineto
+250 216 lineto
+442 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 229 moveto
+(RepeatedSquaring\(SemiGroup\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 7.68 6.72 6.96 6.24 5.04 3.84 6.96 6.96 4.56 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% SemiGroup()->RepeatedSquaring(SemiGroup)
+newpath 278 288 moveto
+289 279 303 268 315 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 317 261 moveto
+323 252 lineto
+313 255 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 317 261 moveto
+323 252 lineto
+313 255 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 121 216 moveto
+104 207 86 195 73 180 curveto
+59 162 51 137 47 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 164 216 moveto
+164 208 164 199 164 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(a:SetCategory)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 470 180 moveto
+264 180 lineto
+264 144 lineto
+470 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 470 180 moveto
+264 180 lineto
+264 144 lineto
+470 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+271 157 moveto
+(RepeatedSquaring\(a:SetCategory\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 7.68 6.72 6.96 6.24 5.04 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
+% RepeatedSquaring(SemiGroup)->RepeatedSquaring(a:SetCategory)
+newpath 351 216 moveto
+354 208 357 199 359 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 362 191 moveto
+362 180 lineto
+356 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 362 191 moveto
+362 180 lineto
+356 189 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+79 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 58 72 moveto
+66 63 75 53 82 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 165 144 moveto
+166 136 166 127 166 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 152 72 moveto
+144 63 135 53 128 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+stroke
+end grestore
+% Package
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 398 108 moveto
+336 108 lineto
+336 72 lineto
+398 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 398 108 moveto
+336 108 lineto
+336 72 lineto
+398 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+343 85 moveto
+(Package)
+[7.44 6.24 6 6.96 6.24 6.72 6.24]
+xshow
+end grestore
+end grestore
+% RepeatedSquaring(a:SetCategory)->Package
+newpath 367 144 moveto
+367 136 367 127 367 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 371 118 moveto
+367 108 lineto
+364 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 371 118 moveto
+367 108 lineto
+364 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102multisetaggregate.ps b/books/ps/v102multisetaggregate.ps
new file mode 100644
index 0000000..629fc7b
--- /dev/null
+++ b/books/ps/v102multisetaggregate.ps
@@ -0,0 +1,540 @@
+%!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 453 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 453 296
+%%PageOrientation: Portrait
+gsave
+36 36 417 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
+415 258 lineto
+415 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+415 258 lineto
+415 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% MultisetAggregate(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 321 252 moveto
+111 252 lineto
+111 216 lineto
+321 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 321 252 moveto
+111 252 lineto
+111 216 lineto
+321 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+119 229 moveto
+(MultisetAggregate\(a:SetCategory\))
+[12.48 6.96 3.84 3.84 3.84 5.52 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% MultiDictionary(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 211 180 moveto
+15 180 lineto
+15 144 lineto
+211 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 211 180 moveto
+15 180 lineto
+15 144 lineto
+211 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+22 157 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
+% MultisetAggregate(a:SetCategory)->MultiDictionary(a:SetCategory)
+newpath 190 216 moveto
+177 207 161 196 147 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 148 183 moveto
+138 180 lineto
+144 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 148 183 moveto
+138 180 lineto
+144 188 lineto
+closepath
+stroke
+end grestore
+% SetAggregate(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 409 180 moveto
+229 180 lineto
+229 144 lineto
+409 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 409 180 moveto
+229 180 lineto
+229 144 lineto
+409 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+236 157 moveto
+(SetAggregate\(a:SetCategory\))
+[7.68 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% MultisetAggregate(a:SetCategory)->SetAggregate(a:SetCategory)
+newpath 242 216 moveto
+255 207 271 196 285 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 288 188 moveto
+294 180 lineto
+284 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 288 188 moveto
+294 180 lineto
+284 183 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 226 108 moveto
+0 108 lineto
+0 72 lineto
+226 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 226 108 moveto
+0 108 lineto
+0 72 lineto
+226 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 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 113 144 moveto
+113 136 113 127 113 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 117 118 moveto
+113 108 lineto
+110 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 117 118 moveto
+113 108 lineto
+110 118 lineto
+closepath
+stroke
+end grestore
+% CLAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 267 36 moveto
+193 36 lineto
+193 0 lineto
+267 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 267 36 moveto
+193 36 lineto
+193 0 lineto
+267 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+200 13 moveto
+(CLAGG...)
+[9.36 8.64 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SetAggregate(a:SetCategory)->CLAGG...
+newpath 301 144 moveto
+292 134 281 121 273 108 curveto
+260 88 248 64 241 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 244 44 moveto
+237 36 lineto
+237 47 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 244 44 moveto
+237 36 lineto
+237 47 lineto
+closepath
+stroke
+end grestore
+% SETAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 362 108 moveto
+282 108 lineto
+282 72 lineto
+362 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 362 108 moveto
+282 108 lineto
+282 72 lineto
+362 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+289 85 moveto
+(SETAGG...)
+[7.68 8.64 7.92 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SetAggregate(a:SetCategory)->SETAGG...
+newpath 320 144 moveto
+321 136 321 127 321 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 325 118 moveto
+321 108 lineto
+318 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 325 118 moveto
+321 108 lineto
+318 118 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)->CLAGG...
+newpath 143 72 moveto
+158 63 176 51 192 41 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 194 44 moveto
+201 36 lineto
+191 38 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 194 44 moveto
+201 36 lineto
+191 38 lineto
+closepath
+stroke
+end grestore
+% BGAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 151 36 moveto
+75 36 lineto
+75 0 lineto
+151 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 151 36 moveto
+75 36 lineto
+75 0 lineto
+151 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+82 13 moveto
+(BGAGG...)
+[9.36 9.6 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BGAGG...
+newpath 113 72 moveto
+113 64 113 55 113 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 117 46 moveto
+113 36 lineto
+110 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 117 46 moveto
+113 36 lineto
+110 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedabelianmonoid.ps b/books/ps/v102orderedabelianmonoid.ps
new file mode 100644
index 0000000..81557c9
--- /dev/null
+++ b/books/ps/v102orderedabelianmonoid.ps
@@ -0,0 +1,494 @@
+%!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 309 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 309 296
+%%PageOrientation: Portrait
+gsave
+36 36 273 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
+271 258 lineto
+271 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+271 258 lineto
+271 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 196 252 moveto
+36 252 lineto
+36 216 lineto
+196 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 196 252 moveto
+36 252 lineto
+36 216 lineto
+196 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+44 229 moveto
+(OrderedAbelianMonoid\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedAbelianSemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 265 180 moveto
+85 180 lineto
+85 144 lineto
+265 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 265 180 moveto
+85 180 lineto
+85 144 lineto
+265 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+93 157 moveto
+(OrderedAbelianSemiGroup\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedAbelianMonoid()->OrderedAbelianSemiGroup()
+newpath 131 216 moveto
+138 207 146 197 154 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 157 190 moveto
+160 180 lineto
+151 186 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 157 190 moveto
+160 180 lineto
+151 186 lineto
+closepath
+stroke
+end grestore
+% AbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 114 108 moveto
+0 108 lineto
+0 72 lineto
+114 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 114 108 moveto
+0 108 lineto
+0 72 lineto
+114 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(AbelianMonoid\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedAbelianMonoid()->AbelianMonoid()
+newpath 99 216 moveto
+91 206 82 193 76 180 curveto
+68 160 63 136 60 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 63 118 moveto
+59 108 lineto
+57 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 63 118 moveto
+59 108 lineto
+57 118 lineto
+closepath
+stroke
+end grestore
+% OrderedAbelianSemiGroup()->AbelianMonoid()
+newpath 145 144 moveto
+130 135 111 123 95 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 96 110 moveto
+86 108 lineto
+93 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 96 110 moveto
+86 108 lineto
+93 116 lineto
+closepath
+stroke
+end grestore
+% OrderedSet()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 220 108 moveto
+132 108 lineto
+132 72 lineto
+220 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 220 108 moveto
+132 108 lineto
+132 72 lineto
+220 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+139 85 moveto
+(OrderedSet\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 7.68 6 3.84 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedAbelianSemiGroup()->OrderedSet()
+newpath 175 144 moveto
+176 136 176 127 176 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 180 118 moveto
+176 108 lineto
+173 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 180 118 moveto
+176 108 lineto
+173 118 lineto
+closepath
+stroke
+end grestore
+% ABELSG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 98 36 moveto
+16 36 lineto
+16 0 lineto
+98 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 98 36 moveto
+16 36 lineto
+16 0 lineto
+98 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+23 13 moveto
+(ABELSG...)
+[10.08 9.36 8.64 8.64 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianMonoid()->ABELSG...
+newpath 57 72 moveto
+57 64 57 55 57 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 61 46 moveto
+57 36 lineto
+54 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 61 46 moveto
+57 36 lineto
+54 46 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+137 36 lineto
+137 0 lineto
+215 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 215 36 moveto
+137 36 lineto
+137 0 lineto
+215 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+145 13 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedSet()->SETCAT...
+newpath 176 72 moveto
+176 64 176 55 176 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 180 46 moveto
+176 36 lineto
+173 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 180 46 moveto
+176 36 lineto
+173 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedabeliansemigroup.ps b/books/ps/v102orderedabeliansemigroup.ps
new file mode 100644
index 0000000..35945ae
--- /dev/null
+++ b/books/ps/v102orderedabeliansemigroup.ps
@@ -0,0 +1,795 @@
+%!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 521 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 521 512
+%%PageOrientation: Portrait
+gsave
+36 36 485 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
+483 474 lineto
+483 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+483 474 lineto
+483 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedAbelianSemiGroup()
+[ /Rect [ 138 432 318 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=OASGP) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 318 468 moveto
+138 468 lineto
+138 432 lineto
+318 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 318 468 moveto
+138 468 lineto
+138 432 lineto
+318 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+146 445 moveto
+(OrderedAbelianSemiGroup\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedSet()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 208 324 moveto
+120 324 lineto
+120 288 lineto
+208 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 208 324 moveto
+120 324 lineto
+120 288 lineto
+208 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+127 301 moveto
+(OrderedSet\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 7.68 6 3.84 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedAbelianSemiGroup()->OrderedSet()
+newpath 220 432 moveto
+209 407 189 362 176 333 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 332 moveto
+172 324 lineto
+173 335 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 332 moveto
+172 324 lineto
+173 335 lineto
+closepath
+stroke
+end grestore
+% AbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 339 396 moveto
+225 396 lineto
+225 360 lineto
+339 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 339 396 moveto
+225 396 lineto
+225 360 lineto
+339 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+232 373 moveto
+(AbelianMonoid\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedAbelianSemiGroup()->AbelianMonoid()
+newpath 242 432 moveto
+248 424 256 413 263 404 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 266 406 moveto
+269 396 lineto
+260 402 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 266 406 moveto
+269 396 lineto
+260 402 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 229 moveto
+(SetCategory\(\))
+[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
+% OrderedSet()->SetCategory()
+newpath 164 288 moveto
+164 280 164 271 164 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 262 moveto
+164 252 lineto
+161 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 262 moveto
+164 252 lineto
+161 262 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 360 324 moveto
+226 324 lineto
+226 288 lineto
+360 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 360 324 moveto
+226 324 lineto
+226 288 lineto
+360 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+233 301 moveto
+(AbelianSemiGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianMonoid()->AbelianSemiGroup()
+newpath 285 360 moveto
+286 352 288 343 289 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 292 334 moveto
+290 324 lineto
+286 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 292 334 moveto
+290 324 lineto
+286 334 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 121 216 moveto
+104 207 86 195 73 180 curveto
+59 162 51 137 47 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 164 216 moveto
+164 208 164 199 164 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()->SetCategory()
+newpath 260 288 moveto
+243 279 222 267 205 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 206 254 moveto
+196 252 lineto
+203 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 206 254 moveto
+196 252 lineto
+203 260 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(AbelianSemiGroup)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 477 252 moveto
+239 252 lineto
+239 216 lineto
+477 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 477 252 moveto
+239 252 lineto
+239 216 lineto
+477 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+247 229 moveto
+(RepeatedDoubling\(AbelianSemiGroup\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 3.84 3.84 6.96 6.96 4.56 9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% AbelianSemiGroup()->RepeatedDoubling(AbelianSemiGroup)
+newpath 309 288 moveto
+317 279 326 269 335 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 338 262 moveto
+342 252 lineto
+333 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 338 262 moveto
+342 252 lineto
+333 257 lineto
+closepath
+stroke
+end grestore
+% RepeatedDoubling(a:SetCategory)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 472 180 moveto
+264 180 lineto
+264 144 lineto
+472 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 472 180 moveto
+264 180 lineto
+264 144 lineto
+472 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+271 157 moveto
+(RepeatedDoubling\(a:SetCategory\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 10.08 6.96 6.96 6.96 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
+% RepeatedDoubling(AbelianSemiGroup)->RepeatedDoubling(a:SetCategory)
+newpath 361 216 moveto
+362 208 363 199 364 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 367 190 moveto
+365 180 lineto
+361 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 367 190 moveto
+365 180 lineto
+361 190 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+79 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 58 72 moveto
+66 63 75 53 82 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 165 144 moveto
+166 136 166 127 166 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 152 72 moveto
+144 63 135 53 128 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+stroke
+end grestore
+% Package
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 399 108 moveto
+337 108 lineto
+337 72 lineto
+399 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 399 108 moveto
+337 108 lineto
+337 72 lineto
+399 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+344 85 moveto
+(Package)
+[7.44 6.24 6 6.96 6.24 6.72 6.24]
+xshow
+end grestore
+end grestore
+% RepeatedDoubling(a:SetCategory)->Package
+newpath 368 144 moveto
+368 136 368 127 368 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 372 118 moveto
+368 108 lineto
+365 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 372 118 moveto
+368 108 lineto
+365 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedfinite.ps b/books/ps/v102orderedfinite.ps
new file mode 100644
index 0000000..5b606af
--- /dev/null
+++ b/books/ps/v102orderedfinite.ps
@@ -0,0 +1,606 @@
+%!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 290 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 290 440
+%%PageOrientation: Portrait
+gsave
+36 36 254 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
+252 402 lineto
+252 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+252 402 lineto
+252 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedFinite()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 153 396 moveto
+49 396 lineto
+49 360 lineto
+153 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 153 396 moveto
+49 396 lineto
+49 360 lineto
+153 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+57 373 moveto
+(OrderedFinite\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 7.44 3.84 6.96 3.84 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedSet()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 100 324 moveto
+12 324 lineto
+12 288 lineto
+100 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 100 324 moveto
+12 324 lineto
+12 288 lineto
+100 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 301 moveto
+(OrderedSet\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 7.68 6 3.84 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedFinite()->OrderedSet()
+newpath 90 360 moveto
+85 352 78 342 72 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 75 331 moveto
+67 324 lineto
+69 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 75 331 moveto
+67 324 lineto
+69 334 lineto
+closepath
+stroke
+end grestore
+% Finite()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 176 324 moveto
+118 324 lineto
+118 288 lineto
+176 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 176 324 moveto
+118 324 lineto
+118 288 lineto
+176 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+126 301 moveto
+(Finite\(\))
+[7.44 3.84 6.96 3.84 3.84 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedFinite()->Finite()
+newpath 113 360 moveto
+118 352 125 342 131 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 134 334 moveto
+136 324 lineto
+128 331 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 134 334 moveto
+136 324 lineto
+128 331 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 148 252 moveto
+54 252 lineto
+54 216 lineto
+148 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 148 252 moveto
+54 252 lineto
+54 216 lineto
+148 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+61 229 moveto
+(SetCategory\(\))
+[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
+% OrderedSet()->SetCategory()
+newpath 67 288 moveto
+72 280 79 270 85 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 88 262 moveto
+90 252 lineto
+82 259 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 88 262 moveto
+90 252 lineto
+82 259 lineto
+closepath
+stroke
+end grestore
+% Finite()->SetCategory()
+newpath 135 288 moveto
+130 280 123 270 117 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 120 259 moveto
+112 252 lineto
+114 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 120 259 moveto
+112 252 lineto
+114 262 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 91 216 moveto
+85 206 78 192 73 180 curveto
+65 160 56 136 51 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 54 117 moveto
+48 108 lineto
+48 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 54 117 moveto
+48 108 lineto
+48 119 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 117 216 moveto
+125 207 134 197 141 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 144 190 moveto
+148 180 lineto
+139 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 144 190 moveto
+148 180 lineto
+139 185 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+79 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 58 72 moveto
+66 63 75 53 82 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 165 144 moveto
+166 136 166 127 166 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 152 72 moveto
+144 63 135 53 128 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedmonoid.ps b/books/ps/v102orderedmonoid.ps
new file mode 100644
index 0000000..8ce38a2
--- /dev/null
+++ b/books/ps/v102orderedmonoid.ps
@@ -0,0 +1,800 @@
+%!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 514 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 514 512
+%%PageOrientation: Portrait
+gsave
+36 36 478 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
+476 474 lineto
+476 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+476 474 lineto
+476 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedMonoid()
+[ /Rect [ 159 432 275 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=ORDMON) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 275 468 moveto
+159 468 lineto
+159 432 lineto
+275 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 275 468 moveto
+159 468 lineto
+159 432 lineto
+275 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+167 445 moveto
+(OrderedMonoid\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedSet()
+[ /Rect [ 120 288 208 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=ORDSET) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 208 324 moveto
+120 324 lineto
+120 288 lineto
+208 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 208 324 moveto
+120 324 lineto
+120 288 lineto
+208 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+127 301 moveto
+(OrderedSet\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 7.68 6 3.84 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedMonoid()->OrderedSet()
+newpath 210 432 moveto
+201 407 185 363 174 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 177 333 moveto
+171 324 lineto
+171 335 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 177 333 moveto
+171 324 lineto
+171 335 lineto
+closepath
+stroke
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 295 396 moveto
+225 396 lineto
+225 360 lineto
+295 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 295 396 moveto
+225 396 lineto
+225 360 lineto
+295 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+232 373 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedMonoid()->Monoid()
+newpath 228 432 moveto
+233 424 239 414 244 405 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 247 406 moveto
+249 396 lineto
+241 403 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 247 406 moveto
+249 396 lineto
+241 403 lineto
+closepath
+stroke
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 211 252 moveto
+117 252 lineto
+117 216 lineto
+211 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 229 moveto
+(SetCategory\(\))
+[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
+% OrderedSet()->SetCategory()
+newpath 164 288 moveto
+164 280 164 271 164 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 262 moveto
+164 252 lineto
+161 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 262 moveto
+164 252 lineto
+161 262 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 316 324 moveto
+226 324 lineto
+226 288 lineto
+316 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 316 324 moveto
+226 324 lineto
+226 288 lineto
+316 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+234 301 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Monoid()->SemiGroup()
+newpath 263 360 moveto
+264 352 266 343 267 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 270 334 moveto
+268 324 lineto
+264 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 270 334 moveto
+268 324 lineto
+264 334 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 121 216 moveto
+104 207 86 195 73 180 curveto
+59 162 51 137 47 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 50 117 moveto
+45 108 lineto
+44 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 164 216 moveto
+164 208 164 199 164 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 190 moveto
+164 180 lineto
+161 190 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()->SetCategory()
+newpath 244 288 moveto
+231 279 214 268 200 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 201 255 moveto
+191 252 lineto
+197 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 201 255 moveto
+191 252 lineto
+197 260 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(SemiGroup)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 442 252 moveto
+250 252 lineto
+250 216 lineto
+442 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 442 252 moveto
+250 252 lineto
+250 216 lineto
+442 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+258 229 moveto
+(RepeatedSquaring\(SemiGroup\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 7.68 6.72 6.96 6.24 5.04 3.84 6.96 6.96 4.56 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% SemiGroup()->RepeatedSquaring(SemiGroup)
+newpath 290 288 moveto
+299 279 310 269 320 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 322 262 moveto
+327 252 lineto
+317 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 322 262 moveto
+327 252 lineto
+317 257 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(a:SetCategory)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 470 180 moveto
+264 180 lineto
+264 144 lineto
+470 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 470 180 moveto
+264 180 lineto
+264 144 lineto
+470 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+271 157 moveto
+(RepeatedSquaring\(a:SetCategory\))
+[9.12 6.24 6.96 6.24 6.24 3.84 6.24 6.96 7.68 6.72 6.96 6.24 5.04 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
+% RepeatedSquaring(SemiGroup)->RepeatedSquaring(a:SetCategory)
+newpath 351 216 moveto
+354 208 357 199 359 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 362 191 moveto
+362 180 lineto
+356 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 362 191 moveto
+362 180 lineto
+356 189 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+79 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 58 72 moveto
+66 63 75 53 82 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 165 144 moveto
+166 136 166 127 166 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 152 72 moveto
+144 63 135 53 128 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+stroke
+end grestore
+% Package
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 398 108 moveto
+336 108 lineto
+336 72 lineto
+398 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 398 108 moveto
+336 108 lineto
+336 72 lineto
+398 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+343 85 moveto
+(Package)
+[7.44 6.24 6 6.96 6.24 6.72 6.24]
+xshow
+end grestore
+end grestore
+% RepeatedSquaring(a:SetCategory)->Package
+newpath 367 144 moveto
+367 136 367 127 367 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 371 118 moveto
+367 108 lineto
+364 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 371 118 moveto
+367 108 lineto
+364 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedmultisetaggregate.ps b/books/ps/v102orderedmultisetaggregate.ps
new file mode 100644
index 0000000..8ed618a
--- /dev/null
+++ b/books/ps/v102orderedmultisetaggregate.ps
@@ -0,0 +1,708 @@
+%!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 694 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 694 368
+%%PageOrientation: Portrait
+gsave
+36 36 658 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
+656 330 lineto
+656 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+656 330 lineto
+656 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedMultisetAggregate(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 532 324 moveto
+278 324 lineto
+278 288 lineto
+532 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 532 324 moveto
+278 324 lineto
+278 288 lineto
+532 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+285 301 moveto
+(OrderedMultisetAggregate\(a:SetCategory\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 12.48 6.96 3.84 3.84 3.84 5.52 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% MultisetAggregate(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 388 252 moveto
+178 252 lineto
+178 216 lineto
+388 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 388 252 moveto
+178 252 lineto
+178 216 lineto
+388 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+186 229 moveto
+(MultisetAggregate\(a:SetCategory\))
+[12.48 6.96 3.84 3.84 3.84 5.52 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% OrderedMultisetAggregate(a:SetCategory)->MultisetAggregate(a:SetCategory)
+newpath 374 288 moveto
+358 279 339 267 322 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 323 254 moveto
+313 252 lineto
+320 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 323 254 moveto
+313 252 lineto
+320 260 lineto
+closepath
+stroke
+end grestore
+% PriorityQueueAggregate(a:SetCategory)
+[ /Rect [ 406 216 650 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=PRQAGG) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 650 252 moveto
+406 252 lineto
+406 216 lineto
+650 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 650 252 moveto
+406 252 lineto
+406 216 lineto
+650 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+414 229 moveto
+(PriorityQueueAggregate\(a:SetCategory\))
+[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.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
+% OrderedMultisetAggregate(a:SetCategory)->PriorityQueueAggregate(a:SetCategory)
+newpath 436 288 moveto
+452 279 471 267 488 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 490 260 moveto
+497 252 lineto
+487 254 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 490 260 moveto
+497 252 lineto
+487 254 lineto
+closepath
+stroke
+end grestore
+% MultiDictionary(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 394 180 moveto
+198 180 lineto
+198 144 lineto
+394 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 394 180 moveto
+198 180 lineto
+198 144 lineto
+394 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+205 157 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
+% MultisetAggregate(a:SetCategory)->MultiDictionary(a:SetCategory)
+newpath 286 216 moveto
+287 208 289 199 291 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 294 190 moveto
+293 180 lineto
+288 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 294 190 moveto
+293 180 lineto
+288 189 lineto
+closepath
+stroke
+end grestore
+% SetAggregate(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 180 180 moveto
+0 180 lineto
+0 144 lineto
+180 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 180 180 moveto
+0 180 lineto
+0 144 lineto
+180 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(SetAggregate\(a:SetCategory\))
+[7.68 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% MultisetAggregate(a:SetCategory)->SetAggregate(a:SetCategory)
+newpath 234 216 moveto
+208 206 175 194 147 184 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 149 181 moveto
+138 180 lineto
+146 187 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 149 181 moveto
+138 180 lineto
+146 187 lineto
+closepath
+stroke
+end grestore
+% PriorityQueueAggregate(a:Type)
+[ /Rect [ 427 72 629 108 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=PRQAGG) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 629 108 moveto
+427 108 lineto
+427 72 lineto
+629 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 629 108 moveto
+427 108 lineto
+427 72 lineto
+629 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+435 85 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
+% PriorityQueueAggregate(a:SetCategory)->PriorityQueueAggregate(a:Type)
+newpath 528 216 moveto
+528 191 528 147 528 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 532 118 moveto
+528 108 lineto
+525 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 532 118 moveto
+528 108 lineto
+525 118 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 409 108 moveto
+183 108 lineto
+183 72 lineto
+409 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 409 108 moveto
+183 108 lineto
+183 72 lineto
+409 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+190 85 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 296 144 moveto
+296 136 296 127 296 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 300 118 moveto
+296 108 lineto
+293 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 300 118 moveto
+296 108 lineto
+293 118 lineto
+closepath
+stroke
+end grestore
+% SETAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 165 108 moveto
+85 108 lineto
+85 72 lineto
+165 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 165 108 moveto
+85 108 lineto
+85 72 lineto
+165 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+92 85 moveto
+(SETAGG...)
+[7.68 8.64 7.92 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SetAggregate(a:SetCategory)->SETAGG...
+newpath 99 144 moveto
+103 136 107 126 112 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 115 119 moveto
+116 108 lineto
+109 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 115 119 moveto
+116 108 lineto
+109 116 lineto
+closepath
+stroke
+end grestore
+% CLAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 250 36 moveto
+176 36 lineto
+176 0 lineto
+250 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 250 36 moveto
+176 36 lineto
+176 0 lineto
+250 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+183 13 moveto
+(CLAGG...)
+[9.36 8.64 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SetAggregate(a:SetCategory)->CLAGG...
+newpath 80 144 moveto
+72 124 62 93 76 72 curveto
+87 56 131 40 166 30 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 167 33 moveto
+176 27 lineto
+165 27 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 167 33 moveto
+176 27 lineto
+165 27 lineto
+closepath
+stroke
+end grestore
+% DictionaryOperations(a:SetCategory)->CLAGG...
+newpath 275 72 moveto
+265 63 252 52 241 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 40 moveto
+233 36 lineto
+238 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 40 moveto
+233 36 lineto
+238 45 lineto
+closepath
+stroke
+end grestore
+% BGAGG...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 417 36 moveto
+341 36 lineto
+341 0 lineto
+417 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 417 36 moveto
+341 36 lineto
+341 0 lineto
+417 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+348 13 moveto
+(BGAGG...)
+[9.36 9.6 9.36 10.08 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% DictionaryOperations(a:SetCategory)->BGAGG...
+newpath 317 72 moveto
+327 63 340 52 351 43 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 354 45 moveto
+359 36 lineto
+349 40 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 354 45 moveto
+359 36 lineto
+349 40 lineto
+closepath
+stroke
+end grestore
+% PriorityQueueAggregate(a:Type)->BGAGG...
+newpath 490 72 moveto
+470 62 446 51 425 40 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 427 37 moveto
+416 36 lineto
+424 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 427 37 moveto
+416 36 lineto
+424 43 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102rng.ps b/books/ps/v102rng.ps
new file mode 100644
index 0000000..78d0303
--- /dev/null
+++ b/books/ps/v102rng.ps
@@ -0,0 +1,653 @@
+%!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 402 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 402 440
+%%PageOrientation: Portrait
+gsave
+36 36 366 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
+364 402 lineto
+364 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+364 402 lineto
+364 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 227 396 moveto
+173 396 lineto
+173 360 lineto
+227 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 227 396 moveto
+173 396 lineto
+173 360 lineto
+227 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+183 373 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 193 324 moveto
+87 324 lineto
+87 288 lineto
+193 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 193 324 moveto
+87 324 lineto
+87 288 lineto
+193 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+95 301 moveto
+(AbelianGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->AbelianGroup()
+newpath 185 360 moveto
+178 351 169 341 162 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 164 329 moveto
+155 324 lineto
+159 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 164 329 moveto
+155 324 lineto
+159 334 lineto
+closepath
+stroke
+end grestore
+% SemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 305 324 moveto
+215 324 lineto
+215 288 lineto
+305 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 305 324 moveto
+215 324 lineto
+215 288 lineto
+305 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+223 301 moveto
+(SemiGroup\(\))
+[7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()->SemiGroup()
+newpath 215 360 moveto
+222 351 231 341 238 332 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 241 334 moveto
+245 324 lineto
+236 329 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 241 334 moveto
+245 324 lineto
+236 329 lineto
+closepath
+stroke
+end grestore
+% CancellationAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+48 252 lineto
+48 216 lineto
+232 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+48 252 lineto
+48 216 lineto
+232 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+56 229 moveto
+(CancellationAbelianMonoid\(\))
+[9.36 6.24 6.96 6.24 6.24 3.84 3.84 6.24 3.84 3.84 6.96 6.96 9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CancellationAbelianMonoid()
+newpath 140 288 moveto
+140 280 140 271 140 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 144 262 moveto
+140 252 lineto
+137 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 144 262 moveto
+140 252 lineto
+137 262 lineto
+closepath
+stroke
+end grestore
+% REPDB...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 123 36 moveto
+51 36 lineto
+51 0 lineto
+123 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 123 36 moveto
+51 36 lineto
+51 0 lineto
+123 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+58 13 moveto
+(REPDB...)
+[9.36 8.64 7.68 10.08 9.36 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->REPDB...
+newpath 87 290 moveto
+69 282 50 269 39 252 curveto
+0 185 44 90 70 45 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 73 46 moveto
+75 36 lineto
+67 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 73 46 moveto
+75 36 lineto
+67 43 lineto
+closepath
+stroke
+end grestore
+% SETCAT...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 36 moveto
+154 36 lineto
+154 0 lineto
+232 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 36 moveto
+154 36 lineto
+154 0 lineto
+232 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+162 13 moveto
+(SETCAT...)
+[7.68 8.64 8.64 9.12 9.36 7.44 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->SETCAT...
+newpath 258 288 moveto
+253 248 239 150 216 72 curveto
+213 63 209 54 206 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 209 44 moveto
+202 36 lineto
+202 47 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 209 44 moveto
+202 36 lineto
+202 47 lineto
+closepath
+stroke
+end grestore
+% REPSQ...
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 358 252 moveto
+288 252 lineto
+288 216 lineto
+358 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 358 252 moveto
+288 252 lineto
+288 216 lineto
+358 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+295 229 moveto
+(REPSQ...)
+[9.36 8.64 7.68 7.68 10.08 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% SemiGroup()->REPSQ...
+newpath 276 288 moveto
+284 279 293 269 300 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 303 262 moveto
+307 252 lineto
+298 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 303 262 moveto
+307 252 lineto
+298 257 lineto
+closepath
+stroke
+end grestore
+% AbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 197 180 moveto
+83 180 lineto
+83 144 lineto
+197 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 197 180 moveto
+83 180 lineto
+83 144 lineto
+197 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(AbelianMonoid\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% CancellationAbelianMonoid()->AbelianMonoid()
+newpath 140 216 moveto
+140 208 140 199 140 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 144 190 moveto
+140 180 lineto
+137 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 144 190 moveto
+140 180 lineto
+137 190 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 207 108 moveto
+73 108 lineto
+73 72 lineto
+207 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 207 108 moveto
+73 108 lineto
+73 72 lineto
+207 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+80 85 moveto
+(AbelianSemiGroup\(\))
+[9.84 6.96 6.24 3.84 3.84 6.24 6.96 7.68 6.24 10.8 3.84 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% AbelianMonoid()->AbelianSemiGroup()
+newpath 140 144 moveto
+140 136 140 127 140 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 144 118 moveto
+140 108 lineto
+137 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 144 118 moveto
+140 108 lineto
+137 118 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()->REPDB...
+newpath 127 72 moveto
+121 64 113 53 106 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 109 42 moveto
+100 36 lineto
+103 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 109 42 moveto
+100 36 lineto
+103 46 lineto
+closepath
+stroke
+end grestore
+% AbelianSemiGroup()->SETCAT...
+newpath 153 72 moveto
+159 64 167 53 174 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 177 46 moveto
+180 36 lineto
+171 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 177 46 moveto
+180 36 lineto
+171 42 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102setaggregate.ps b/books/ps/v102setaggregate.ps
new file mode 100644
index 0000000..08f2e02
--- /dev/null
+++ b/books/ps/v102setaggregate.ps
@@ -0,0 +1,760 @@
+%!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 439 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 439 512
+%%PageOrientation: Portrait
+gsave
+36 36 403 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
+401 474 lineto
+401 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+401 474 lineto
+401 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% SetAggregate(a:SetCategory)
+[ /Rect [ 106 432 286 468 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=SETAGG) >>
+  /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 468 moveto
+106 468 lineto
+106 432 lineto
+286 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 286 468 moveto
+106 468 lineto
+106 432 lineto
+286 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+113 445 moveto
+(SetAggregate\(a:SetCategory\))
+[7.68 6 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.96 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()
+[ /Rect [ 81 216 175 252 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=SETCAT) >>
+  /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 252 moveto
+81 252 lineto
+81 216 lineto
+175 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 175 252 moveto
+81 252 lineto
+81 216 lineto
+175 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+88 229 moveto
+(SetCategory\(\))
+[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
+% SetAggregate(a:SetCategory)->SetCategory()
+newpath 185 432 moveto
+179 422 172 408 168 396 curveto
+151 350 139 295 133 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 136 261 moveto
+131 252 lineto
+130 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 136 261 moveto
+131 252 lineto
+130 262 lineto
+closepath
+stroke
+end grestore
+% Collection(a:SetCategory)
+[ /Rect [ 177 360 339 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=CLAGG) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 339 396 moveto
+177 396 lineto
+177 360 lineto
+339 360 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 339 396 moveto
+177 396 lineto
+177 360 lineto
+339 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+184 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
+% SetAggregate(a:SetCategory)->Collection(a:SetCategory)
+newpath 212 432 moveto
+219 423 228 413 236 404 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 239 406 moveto
+243 396 lineto
+234 401 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 239 406 moveto
+243 396 lineto
+234 401 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 98 216 moveto
+84 207 70 194 61 180 curveto
+50 162 46 137 43 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 46 118 moveto
+42 108 lineto
+40 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 46 118 moveto
+42 108 lineto
+40 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 234 180 moveto
+70 180 lineto
+70 144 lineto
+234 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 234 180 moveto
+70 180 lineto
+70 144 lineto
+234 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+78 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 134 216 moveto
+137 208 140 198 143 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 146 191 moveto
+146 180 lineto
+140 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 146 191 moveto
+146 180 lineto
+140 189 lineto
+closepath
+stroke
+end grestore
+% Collection(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 346 324 moveto
+226 324 lineto
+226 288 lineto
+346 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 346 324 moveto
+226 324 lineto
+226 288 lineto
+346 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+233 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 265 360 moveto
+268 352 272 342 275 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 279 335 moveto
+279 324 lineto
+272 332 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 279 335 moveto
+279 324 lineto
+272 332 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 36 moveto
+134 36 lineto
+134 0 lineto
+202 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 36 moveto
+134 36 lineto
+134 0 lineto
+202 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+142 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 74 72 moveto
+90 63 110 51 128 41 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 44 moveto
+137 36 lineto
+127 38 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 44 moveto
+137 36 lineto
+127 38 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 156 144 moveto
+158 136 160 127 162 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 165 118 moveto
+164 108 lineto
+159 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 165 118 moveto
+164 108 lineto
+159 117 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 168 72 moveto
+168 64 168 55 168 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 172 46 moveto
+168 36 lineto
+165 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 172 46 moveto
+168 36 lineto
+165 46 lineto
+closepath
+stroke
+end grestore
+% HomogeneousAggregate(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 395 252 moveto
+193 252 lineto
+193 216 lineto
+395 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 395 252 moveto
+193 252 lineto
+193 216 lineto
+395 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+200 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 288 288 moveto
+289 280 290 271 291 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 294 262 moveto
+292 252 lineto
+288 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 294 262 moveto
+292 252 lineto
+288 262 lineto
+closepath
+stroke
+end grestore
+% Aggregate()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 336 180 moveto
+252 180 lineto
+252 144 lineto
+336 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 336 180 moveto
+252 180 lineto
+252 144 lineto
+336 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+259 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 294 216 moveto
+294 208 294 199 294 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 298 190 moveto
+294 180 lineto
+291 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 298 190 moveto
+294 180 lineto
+291 190 lineto
+closepath
+stroke
+end grestore
+% Type()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 313 108 moveto
+259 108 lineto
+259 72 lineto
+313 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 313 108 moveto
+259 108 lineto
+259 72 lineto
+313 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+267 85 moveto
+(Type\(\))
+[7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Aggregate()->Type()
+newpath 292 144 moveto
+291 136 290 127 289 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 292 118 moveto
+288 108 lineto
+286 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 292 118 moveto
+288 108 lineto
+286 118 lineto
+closepath
+stroke
+end grestore
+% Type()->Category
+newpath 259 73 moveto
+244 64 224 51 207 41 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 208 38 moveto
+198 36 lineto
+205 44 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 208 38 moveto
+198 36 lineto
+205 44 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102stepthrough.ps b/books/ps/v102stepthrough.ps
new file mode 100644
index 0000000..b91cee3
--- /dev/null
+++ b/books/ps/v102stepthrough.ps
@@ -0,0 +1,499 @@
+%!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 290 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 290 368
+%%PageOrientation: Portrait
+gsave
+36 36 254 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
+252 330 lineto
+252 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+252 330 lineto
+252 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% StepThrough()
+[ /Rect [ 56 288 154 324 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=STEP) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 154 324 moveto
+56 324 lineto
+56 288 lineto
+154 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 154 324 moveto
+56 324 lineto
+56 288 lineto
+154 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+64 301 moveto
+(StepThrough\(\))
+[7.44 3.84 6.24 6.96 8.64 6.96 4.8 6.96 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 152 252 moveto
+58 252 lineto
+58 216 lineto
+152 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 152 252 moveto
+58 252 lineto
+58 216 lineto
+152 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+65 229 moveto
+(SetCategory\(\))
+[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
+% StepThrough()->SetCategory()
+newpath 105 288 moveto
+105 280 105 271 105 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 109 262 moveto
+105 252 lineto
+102 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 109 262 moveto
+105 252 lineto
+102 262 lineto
+closepath
+stroke
+end grestore
+% BasicType()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 84 108 moveto
+0 108 lineto
+0 72 lineto
+84 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 85 moveto
+(BasicType\(\))
+[9.36 6.24 5.52 3.84 6.24 7.2 6.96 6.96 6.24 4.56 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->BasicType()
+newpath 93 216 moveto
+86 206 78 192 73 180 curveto
+64 160 55 136 50 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 53 117 moveto
+47 108 lineto
+47 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 53 117 moveto
+47 108 lineto
+47 119 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(OutputForm)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 246 180 moveto
+82 180 lineto
+82 144 lineto
+246 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+90 157 moveto
+(CoercibleTo\(OutputForm\))
+[9.36 6.96 6.24 4.8 6.24 3.84 6.96 3.84 6.24 7.44 6.96 4.56 10.08 6.96 3.84 6.96 6.96 3.84 7.44 6.96 5.04 10.8 4.56]
+xshow
+end grestore
+end grestore
+% SetCategory()->CoercibleTo(OutputForm)
+newpath 120 216 moveto
+127 207 135 197 143 188 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 146 190 moveto
+149 180 lineto
+140 186 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 146 190 moveto
+149 180 lineto
+140 186 lineto
+closepath
+stroke
+end grestore
+% Category
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 139 36 moveto
+71 36 lineto
+71 0 lineto
+139 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+79 13 moveto
+(Category)
+[9.36 6.24 3.84 6.24 6.96 6.96 5.04 6.96]
+xshow
+end grestore
+end grestore
+% BasicType()->Category
+newpath 58 72 moveto
+66 63 75 53 82 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 85 46 moveto
+89 36 lineto
+80 41 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 234 108 moveto
+102 108 lineto
+102 72 lineto
+234 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+110 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
+% CoercibleTo(OutputForm)->CoercibleTo(a:Type)
+newpath 165 144 moveto
+166 136 166 127 166 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 118 moveto
+167 108 lineto
+163 118 lineto
+closepath
+stroke
+end grestore
+% CoercibleTo(a:Type)->Category
+newpath 152 72 moveto
+144 63 135 53 128 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 130 41 moveto
+121 36 lineto
+125 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 4671a53..419275b 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,19 @@
+20080919 tpd books/ps/v102stepthrough.ps diagram STEP
+20080919 tpd books/ps/v102setaggregate.ps diagram SETAGG
+20080919 tpd books/ps/v102rng.ps diagram RNG
+20080919 tpd books/ps/v102orderedmultisetaggregate.ps diagram OMSAGG
+20080919 tpd books/ps/v102orderedmonoid.ps diagram ORDMON
+20080919 tpd books/ps/v102orderedfinite.ps diagram ORDFIN
+20080919 tpd books/ps/v102orderedabeliansemigroup.ps diagram OASGP
+20080919 tpd books/ps/v102orderedabelianmonoid.ps diagram OAMON
+20080919 tpd books/ps/v102multisetaggregate.ps diagram MSETAGG
+20080919 tpd books/ps/v102monoid.ps diagram MONOID
+20080919 tpd books/ps/v102finitesetaggregate.ps diagram FINITE
+20080919 tpd books/ps/v102cancellationabelianmonoid.ps diagram CABMON
+20080919 tpd books/ps/v102abelianmonoid.ps diagram ABELMON
+20080919 tpd books/ps/v102abeliangroup.ps diagram ABELSG
+20080919 tpd src/algebra/catdef.spad remove more categories
+20080919 tpd books/bookvol10.2 add more categories
 20080918 tpd books/ps/v102semigroup.ps diagram SGROUP
 20080918 tpd books/ps/v102orderedset.ps diagram ORDSET
 20080918 tpd books/ps/v102finite.ps diagram FINITE
diff --git a/src/algebra/catdef.spad.pamphlet b/src/algebra/catdef.spad.pamphlet
index 6b2ac80..9252bff 100644
--- a/src/algebra/catdef.spad.pamphlet
+++ b/src/algebra/catdef.spad.pamphlet
@@ -9,371 +9,6 @@
 \eject
 \tableofcontents
 \eject
-\section{category ABELGRP AbelianGroup}
-<<dot>>=
-"ABELGRP" -> "CABMON"
-"AbelianGroup()" -> "CancellationAbelianMonoid()"
-@
-<<category ABELGRP AbelianGroup>>=
-)abbrev category ABELGRP AbelianGroup
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The class of abelian groups, i.e. additive monoids where
-++ each element has an additive inverse.
-++
-++ Axioms:
-++   \spad{-(-x) = x}
-++   \spad{x+(-x) = 0}
--- following domain must be compiled with subsumption disabled
-AbelianGroup(): Category == CancellationAbelianMonoid with
-    --operations
-      "-": % -> %                      ++ -x is the additive inverse of x.
-      "-": (%,%) -> %                  ++ x-y is the difference of x and y
-                                       ++ i.e. \spad{x + (-y)}.
-                       -- subsumes the partial subtraction from previous
-      "*": (Integer,%) -> %            ++ n*x is the product of x by the integer n.
-    add
-      (x:% - y:%):% == x+(-y)
-      subtractIfCan(x:%, y:%):Union(%, "failed") == (x-y) :: Union(%,"failed")
-      n:NonNegativeInteger * x:% == (n::Integer) * x
-      import RepeatedDoubling(%)
-      if not (% has Ring) then
-        n:Integer * x:% ==
-          zero? n => 0
-          n>0 => double(n pretend PositiveInteger,x)
-          double((-n) pretend PositiveInteger,-x)
-
-@
-\section{ABELGRP.lsp BOOTSTRAP} 
-{\bf ABELGRP} 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 ABELGRP} category which we can write
-into the {\bf MID} directory. We compile the lisp code and copy the
-{\bf ABELGRP.o} file to the {\bf OUT} directory.  This is eventually
-forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<ABELGRP.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |AbelianGroup;AL| (QUOTE NIL)) 
-
-(DEFUN |AbelianGroup| NIL 
-  (LET (#:G82664) 
-    (COND 
-      (|AbelianGroup;AL|) 
-      (T (SETQ |AbelianGroup;AL| (|AbelianGroup;|)))))) 
-
-(DEFUN |AbelianGroup;| NIL 
-  (PROG (#1=#:G82662) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|CancellationAbelianMonoid|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|-| (|$| |$|)) T)
-                ((|-| (|$| |$| |$|)) T)
-                ((|*| (|$| (|Integer|) |$|)) T)))
-              NIL
-              (QUOTE ((|Integer|)))
-              NIL))
-          |AbelianGroup|)
-        (SETELT #1# 0 (QUOTE (|AbelianGroup|))))))) 
-
-(MAKEPROP (QUOTE |AbelianGroup|) (QUOTE NILADIC) T) 
-
-@
-\section{ABELGRP-.lsp BOOTSTRAP}
-{\bf ABELGRP-} 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 ABELGRP-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf ABELGRP-.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<ABELGRP-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |ABELGRP-;-;3S;1| (|x| |y| |$|) 
-  (SPADCALL |x| (SPADCALL |y| (QREFELT |$| 7)) (QREFELT |$| 8))) 
-
-(DEFUN |ABELGRP-;subtractIfCan;2SU;2| (|x| |y| |$|) 
-  (CONS 0 (SPADCALL |x| |y| (QREFELT |$| 10)))) 
-
-(DEFUN |ABELGRP-;*;Nni2S;3| (|n| |x| |$|) 
-  (SPADCALL |n| |x| (QREFELT |$| 14))) 
-
-(DEFUN |ABELGRP-;*;I2S;4| (|n| |x| |$|) 
-  (COND 
-    ((ZEROP |n|) (|spadConstant| |$| 17))
-    ((|<| 0 |n|) (SPADCALL |n| |x| (QREFELT |$| 20)))
-    ((QUOTE T) 
-      (SPADCALL (|-| |n|) (SPADCALL |x| (QREFELT |$| 7)) (QREFELT |$| 20))))) 
-
-(DEFUN |AbelianGroup&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|AbelianGroup&|))
-        (LETT |dv$| (LIST (QUOTE |AbelianGroup&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 22) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        (COND 
-          ((|HasCategory| |#1| (QUOTE (|Ring|))))
-          ((QUOTE T) 
-            (QSETREFV |$| 21 
-              (CONS (|dispatchFunction| |ABELGRP-;*;I2S;4|) |$|))))
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |AbelianGroup&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (0 . |-|)
-        (5 . |+|)
-        |ABELGRP-;-;3S;1|
-        (11 . |-|)
-        (|Union| |$| (QUOTE "failed"))
-        |ABELGRP-;subtractIfCan;2SU;2|
-        (|Integer|)
-        (17 . |*|)
-        (|NonNegativeInteger|)
-        |ABELGRP-;*;Nni2S;3|
-        (23 . |Zero|)
-        (|PositiveInteger|)
-        (|RepeatedDoubling| 6)
-        (27 . |double|)
-        (33 . |*|))) 
-    (QUOTE #(|subtractIfCan| 39 |-| 45 |*| 51))
-    (QUOTE NIL)
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #())
-          (|makeByteWordVec2| 21 
-            (QUOTE (1 6 0 0 7 2 6 0 0 0 8 2 6 0 0 0 10 2 6 0 13 0 14 0 6 0 17
-                    2 19 6 18 6 20 2 0 0 13 0 21 2 0 11 0 0 12 2 0 0 0 0 9 2
-                    0 0 13 0 21 2 0 0 15 0 16))))))
-    (QUOTE |lookupComplete|))) 
-
-@
-\section{category ABELMON AbelianMonoid}
-<<dot>>=
-"ABELMON" -> "ABELSG"
-"AbelianMonoid()" -> "AbelianSemiGroup()"
-@
-<<category ABELMON AbelianMonoid>>=
-)abbrev category ABELMON AbelianMonoid
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The class of multiplicative monoids, i.e. semigroups with an
-++ additive identity element.
-++
-++ Axioms:
-++   \spad{leftIdentity("+":(%,%)->%,0)}\tab{30}\spad{ 0+x=x }
-++   \spad{rightIdentity("+":(%,%)->%,0)}\tab{30}\spad{ x+0=x }
--- following domain must be compiled with subsumption disabled
--- define SourceLevelSubset to be EQUAL
-AbelianMonoid(): Category == AbelianSemiGroup with
-    --operations
-      0: constant -> % 
-	++ 0 is the additive identity element.
-      sample: constant -> %
-	++ sample yields a value of type %
-      zero?: % -> Boolean
-	++ zero?(x) tests if x is equal to 0.
-      "*": (NonNegativeInteger,%) -> %
-        ++ n * x is left-multiplication by a non negative integer
-    add
-      import RepeatedDoubling(%)
-      zero? x == x = 0
-      n:PositiveInteger * x:% == (n::NonNegativeInteger) * x
-      sample() == 0
-      if not (% has Ring) then
-        n:NonNegativeInteger * x:% ==
-          zero? n => 0
-          double(n pretend PositiveInteger,x)
-
-@
-\section{ABELMON.lsp BOOTSTRAP}
-{\bf ABELMON} which needs
-{\bf ABELSG} which needs
-{\bf SETCAT} which needs 
-{\bf SINT} which needs 
-{\bf UFD} which needs
-{\bf GCDDOM} which needs
-{\bf COMRING} which needs
-{\bf RING} which needs
-{\bf RNG} which needs
-{\bf ABELGRP} which needs
-{\bf CABMON} which needs
-{\bf ABELMON}. 
-We break this chain with {\bf ABELMON.lsp} which we
-cache here. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf ABELMON}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf ABELMON.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<ABELMON.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |AbelianMonoid;AL| (QUOTE NIL)) 
-
-(DEFUN |AbelianMonoid| NIL 
-  (LET (#:G82597) 
-    (COND 
-      (|AbelianMonoid;AL|) 
-      (T (SETQ |AbelianMonoid;AL| (|AbelianMonoid;|)))))) 
-
-(DEFUN |AbelianMonoid;| NIL 
-  (PROG (#1=#:G82595) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|AbelianSemiGroup|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|Zero| (|$|) |constant|) T)
-                ((|sample| (|$|) |constant|) T)
-                ((|zero?| ((|Boolean|) |$|)) T)
-                ((|*| (|$| (|NonNegativeInteger|) |$|)) T)))
-              NIL
-              (QUOTE ((|NonNegativeInteger|) (|Boolean|)))
-              NIL))
-            |AbelianMonoid|)
-        (SETELT #1# 0 (QUOTE (|AbelianMonoid|))))))) 
-
-(MAKEPROP (QUOTE |AbelianMonoid|) (QUOTE NILADIC) T) 
-
-@
-\section{ABELMON-.lsp BOOTSTRAP}
-{\bf ABELMON-} which needs
-{\bf ABELSG} which needs
-{\bf SETCAT} which needs 
-{\bf SINT} which needs 
-{\bf UFD} which needs
-{\bf GCDDOM} which needs
-{\bf COMRING} which needs
-{\bf RING} which needs
-{\bf RNG} which needs
-{\bf ABELGRP} which needs
-{\bf CABMON} which needs
-{\bf ABELMON-}. 
-We break this chain with {\bf ABELMON-.lsp} which we
-cache here. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf ABELMON-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf ABELMON-.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<ABELMON-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |ABELMON-;zero?;SB;1| (|x| |$|) 
-  (SPADCALL |x| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
-
-(DEFUN |ABELMON-;*;Pi2S;2| (|n| |x| |$|) 
-  (SPADCALL |n| |x| (QREFELT |$| 12))) 
-
-(DEFUN |ABELMON-;sample;S;3| (|$|) 
-  (|spadConstant| |$| 7)) 
-
-(DEFUN |ABELMON-;*;Nni2S;4| (|n| |x| |$|) 
-  (COND 
-    ((ZEROP |n|) (|spadConstant| |$| 7))
-    ((QUOTE T) (SPADCALL |n| |x| (QREFELT |$| 17))))) 
-
-(DEFUN |AbelianMonoid&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|AbelianMonoid&|))
-        (LETT |dv$| (LIST (QUOTE |AbelianMonoid&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 19) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        (COND 
-          ((|HasCategory| |#1| (QUOTE (|Ring|))))
-          ((QUOTE T) 
-            (QSETREFV |$| 18 
-              (CONS (|dispatchFunction| |ABELMON-;*;Nni2S;4|) |$|)))) |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |AbelianMonoid&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (0 . |Zero|)
-        (|Boolean|)
-        (4 . |=|)
-        |ABELMON-;zero?;SB;1|
-        (|NonNegativeInteger|)
-        (10 . |*|)
-        (|PositiveInteger|)
-        |ABELMON-;*;Pi2S;2|
-        |ABELMON-;sample;S;3|
-        (|RepeatedDoubling| 6)
-        (16 . |double|)
-        (22 . |*|))) 
-    (QUOTE #(|zero?| 28 |sample| 33 |*| 37))
-    (QUOTE NIL)
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #())
-          (|makeByteWordVec2| 18 
-            (QUOTE (0 6 0 7 2 6 8 0 0 9 2 6 0 11 0 12 2 16 6 13 6 17 2 0 0 11
-                    0 18 1 0 8 0 10 0 0 0 15 2 0 0 11 0 18 2 0 0 13 0 14))))))
-   (QUOTE |lookupComplete|))) 
-
-@
 \section{category ALGEBRA Algebra}
 <<dot>>=
 "ALGEBRA" -> "RING"
@@ -444,93 +79,6 @@ BiModule(R:Ring,S:Ring):Category ==
      rightUnitary ++ \spad{x * 1 = x}
 
 @
-\section{category CABMON CancellationAbelianMonoid}
-<<dot>>=
-"CABMON" -> "ABELMON"
-"CancellationAbelianMonoid()" -> "AbelianMonoid()"
-@
-<<category CABMON CancellationAbelianMonoid>>=
-)abbrev category CABMON CancellationAbelianMonoid
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References: Davenport & Trager I
-++ Description:
-++ This is an \spadtype{AbelianMonoid} with the cancellation property, i.e.
-++ \spad{ a+b = a+c => b=c }.
-++ This is formalised by the partial subtraction operator,
-++ which satisfies the axioms listed below:
-++
-++ Axioms:
-++   \spad{c = a+b <=> c-b = a}
-CancellationAbelianMonoid(): Category == AbelianMonoid with
-    --operations
-      subtractIfCan: (%,%) -> Union(%,"failed")
-         ++ subtractIfCan(x, y) returns an element z such that \spad{z+y=x}
-         ++ or "failed" if no such element exists.
-
-@
-\section{CABMON.lsp BOOTSTRAP}
-{\bf CABMON} which needs
-{\bf ABELMON} which needs
-{\bf ABELSG} which needs
-{\bf SETCAT} which needs 
-{\bf SINT} which needs 
-{\bf UFD} which needs
-{\bf GCDDOM} which needs
-{\bf COMRING} which needs
-{\bf RING} which needs
-{\bf RNG} which needs
-{\bf ABELGRP} which needs
-{\bf CABMON}.
-We break this chain with {\bf CABMON.lsp} which we
-cache here. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf CABMON}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf CABMON.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<CABMON.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |CancellationAbelianMonoid;AL| (QUOTE NIL)) 
-
-(DEFUN |CancellationAbelianMonoid| NIL 
-  (LET (#:G82646) 
-    (COND 
-      (|CancellationAbelianMonoid;AL|) 
-      (T 
-        (SETQ 
-          |CancellationAbelianMonoid;AL| 
-          (|CancellationAbelianMonoid;|)))))) 
-
-(DEFUN |CancellationAbelianMonoid;| NIL 
-  (PROG (#1=#:G82644) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|AbelianMonoid|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (((|subtractIfCan| ((|Union| |$| "failed") |$| |$|)) T)))
-              NIL
-             (QUOTE NIL)
-             NIL))
-           |CancellationAbelianMonoid|)
-        (SETELT #1# 0 (QUOTE (|CancellationAbelianMonoid|))))))) 
-
-(MAKEPROP (QUOTE |CancellationAbelianMonoid|) (QUOTE NILADIC) T) 
-
-@
 \section{category CHARNZ CharacteristicNonZero}
 <<dot>>=
 "CHARNZ" -> "RING"
@@ -2817,186 +2365,6 @@ Module(R:CommutativeRing): Category == BiModule(R,R)
     if not(R is %) then x:%*r:R == r*x
 
 @
-\section{category MONOID Monoid}
-<<dot>>=
-"MONOID" -> "SGROUP"
-"Monoid()" -> "SemiGroup()"
-@
-<<category MONOID Monoid>>=
-)abbrev category MONOID Monoid
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The class of multiplicative monoids, i.e. semigroups with a
-++ multiplicative identity element.
-++
-++ Axioms:
-++    \spad{leftIdentity("*":(%,%)->%,1)}\tab{30}\spad{1*x=x}
-++    \spad{rightIdentity("*":(%,%)->%,1)}\tab{30}\spad{x*1=x}
-++
-++ Conditional attributes:
-++    unitsKnown\tab{15}\spadfun{recip} only returns "failed" on non-units
-Monoid(): Category == SemiGroup with
-    --operations
-      1: constant ->  %                   ++ 1 is the multiplicative identity.
-      sample: constant -> %               ++ sample yields a value of type %
-      one?: % -> Boolean                  ++ one?(x) tests if x is equal to 1.
-      "**": (%,NonNegativeInteger) -> %   ++ x**n returns the repeated product
-                                          ++ of x n times, i.e. exponentiation.
-      "^" : (%,NonNegativeInteger) -> %   ++ x^n returns the repeated product
-                                          ++ of x n times, i.e. exponentiation.
-      recip: % -> Union(%,"failed")
-          ++ recip(x) tries to compute the multiplicative inverse for x
-          ++ or "failed" if it cannot find the inverse (see unitsKnown).
-    add
-      import RepeatedSquaring(%)
-      _^(x:%, n:NonNegativeInteger):% == x ** n
-      one? x == x = 1
-      sample() == 1
-      recip x ==
---       one? x => x
-       (x = 1) => x
-       "failed"
-      x:% ** n:NonNegativeInteger ==
-         zero? n => 1
-         expt(x,n pretend PositiveInteger)
-
-@
-\section{MONOID.lsp BOOTSTRAP}
-{\bf MONOID} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf MONOID}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf MONOID.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<MONOID.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |Monoid;AL| (QUOTE NIL)) 
-
-(DEFUN |Monoid| NIL 
-  (LET (#:G82434) 
-    (COND 
-      (|Monoid;AL|)
-      (T (SETQ |Monoid;AL| (|Monoid;|)))))) 
-
-(DEFUN |Monoid;| NIL 
-  (PROG (#1=#:G82432) 
-    (RETURN 
-      (PROG1
-        (LETT #1# 
-          (|Join|
-            (|SemiGroup|)
-            (|mkCategory|
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|One| (|$|) |constant|) T)
-                ((|sample| (|$|) |constant|) T)
-                ((|one?| ((|Boolean|) |$|)) T)
-                ((|**| (|$| |$| (|NonNegativeInteger|))) T)
-                ((|^| (|$| |$| (|NonNegativeInteger|))) T)
-                ((|recip| ((|Union| |$| "failed") |$|)) T)))
-              NIL
-              (QUOTE ((|NonNegativeInteger|) (|Boolean|)))
-              NIL))
-            |Monoid|)
-         (SETELT #1# 0 (QUOTE (|Monoid|))))))) 
-
-(MAKEPROP (QUOTE |Monoid|) (QUOTE NILADIC) T) 
-
-@
-\section{MONOID-.lsp BOOTSTRAP}
-{\bf MONOID-} depends on {\bf MONOID}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf MONOID-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf MONOID-.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<MONOID-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |MONOID-;^;SNniS;1| (|x| |n| |$|) 
-  (SPADCALL |x| |n| (QREFELT |$| 8))) 
-
-(DEFUN |MONOID-;one?;SB;2| (|x| |$|) 
-  (SPADCALL |x| (|spadConstant| |$| 10) (QREFELT |$| 12))) 
-
-(DEFUN |MONOID-;sample;S;3| (|$|) 
-  (|spadConstant| |$| 10)) 
-
-(DEFUN |MONOID-;recip;SU;4| (|x| |$|) 
-  (COND 
-    ((SPADCALL |x| (QREFELT |$| 15)) (CONS 0 |x|))
-    ((QUOTE T) (CONS 1 "failed")))) 
-
-(DEFUN |MONOID-;**;SNniS;5| (|x| |n| |$|) 
-  (COND 
-    ((ZEROP |n|) (|spadConstant| |$| 10))
-    ((QUOTE T) (SPADCALL |x| |n| (QREFELT |$| 20))))) 
-
-(DEFUN |Monoid&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|Monoid&|))
-        (LETT |dv$| (LIST (QUOTE |Monoid&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 22) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |Monoid&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (|NonNegativeInteger|)
-        (0 . |**|)
-        |MONOID-;^;SNniS;1|
-        (6 . |One|)
-        (|Boolean|)
-        (10 . |=|)
-        |MONOID-;one?;SB;2|
-        |MONOID-;sample;S;3|
-        (16 . |one?|)
-        (|Union| |$| (QUOTE "failed"))
-        |MONOID-;recip;SU;4|
-        (|PositiveInteger|)
-        (|RepeatedSquaring| 6)
-        (21 . |expt|)
-        |MONOID-;**;SNniS;5|)) 
-    (QUOTE #(|sample| 27 |recip| 31 |one?| 36 |^| 41 |**| 47))
-    (QUOTE NIL)
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #())
-          (|makeByteWordVec2| 21 
-            (QUOTE 
-              (2 6 0 0 7 8 0 6 0 10 2 6 11 0 0 12 1 6 11 0 15 2 19 6 6 18 20
-               0 0 0 14 1 0 16 0 17 1 0 11 0 13 2 0 0 0 7 9 2 0 0 0 7 21))))))
-  (QUOTE |lookupComplete|))) 
-
-@
 \section{category OAGROUP OrderedAbelianGroup}
 <<dot>>=
 "OAGROUP" -> "OCAMON"
@@ -3023,32 +2391,6 @@ OrderedAbelianGroup(): Category ==
         Join(OrderedCancellationAbelianMonoid, AbelianGroup)
 
 @
-\section{category OAMON OrderedAbelianMonoid}
-<<dot>>=
-"OAMON" -> "OASGP"
-"OrderedAbelianMonoid()" -> "OrderedAbelianSemiGroup()"
-"OAMON" -> "ABELMON"
-"OrderedAbelianMonoid()" -> "AbelianMonoid()"
-@
-<<category OAMON OrderedAbelianMonoid>>=
-)abbrev category OAMON OrderedAbelianMonoid
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Ordered sets which are also abelian monoids, such that the addition
-++ preserves the ordering.
-
-OrderedAbelianMonoid(): Category ==
-        Join(OrderedAbelianSemiGroup, AbelianMonoid)
-
-@
 \section{category OAMONS OrderedAbelianMonoidSup}
 <<dot>>=
 "OAMONS" -> "OCAMON"
@@ -3083,32 +2425,6 @@ OrderedAbelianMonoidSup(): Category == OrderedCancellationAbelianMonoid with
         ++ x and y can be subtracted.
 
 @
-\section{category OASGP OrderedAbelianSemiGroup}
-<<dot>>=
-"OASGP" -> "ORDSET"
-"OrderedAbelianSemiGroup()" -> "OrderedSet()"
-"OASGP" -> "ABELMON"
-"OrderedAbelianSemiGroup()" -> "AbelianMonoid()"
-@
-<<category OASGP OrderedAbelianSemiGroup>>=
-)abbrev category OASGP OrderedAbelianSemiGroup
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Ordered sets which are also abelian semigroups, such that the addition
-++ preserves the ordering.
-++   \spad{ x < y => x+z < y+z}
-
-OrderedAbelianSemiGroup(): Category == Join(OrderedSet, AbelianMonoid)
-
-@
 \section{category OCAMON OrderedCancellationAbelianMonoid}
 <<dot>>=
 "OCAMON" -> "OAMON"
@@ -3135,30 +2451,6 @@ OrderedCancellationAbelianMonoid(): Category ==
         Join(OrderedAbelianMonoid, CancellationAbelianMonoid)
 
 @
-\section{category ORDFIN OrderedFinite}
-<<dot>>=
-"ORDFIN" -> "ORDSET"
-"OrderedFinite()" -> "OrderedSet()"
-"ORDFIN" -> "FINITE"
-"OrderedFinite()" -> "Finite()"
-@
-<<category ORDFIN OrderedFinite>>=
-)abbrev category ORDFIN OrderedFinite
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Ordered finite sets.
-
-OrderedFinite(): Category == Join(OrderedSet, Finite)
-
-@
 \section{category OINTDOM OrderedIntegralDomain}
 <<dot>>=
 "OINTDOM" -> "INTDOM"
@@ -3217,35 +2509,6 @@ Note that this code is not included in the generated catdef.spad file.
 (MAKEPROP (QUOTE |OrderedIntegralDomain|) (QUOTE NILADIC) T) 
 
 @
-\section{category ORDMON OrderedMonoid}
-<<dot>>=
-"ORDMON" -> "ORDSET"
-"OrderedMonoid()" -> "OrderedSet()"
-"ORDMON" -> "MONOID"
-"OrderedMonoid()" -> "Monoid()"
-@
-<<category ORDMON OrderedMonoid>>=
-)abbrev category ORDMON OrderedMonoid
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Ordered sets which are also monoids, such that multiplication
-++ preserves the ordering.
-++
-++ Axioms:
-++   \spad{x < y => x*z < y*z}
-++   \spad{x < y => z*x < z*y}
-
-OrderedMonoid(): Category == Join(OrderedSet, Monoid)
-
-@
 \section{category ORDRING OrderedRing}
 <<dot>>=
 "ORDRING" -> "OAGROUP"
@@ -3800,106 +3063,6 @@ Note that this code is not included in the generated catdef.spad file.
    (QUOTE |lookupComplete|))) 
 
 @
-\section{category RNG Rng}
-<<dot>>=
-"RNG" -> "ABELGRP"
-"Rng()" -> "AbelianGroup()"
-"RNG" -> "SGROUP"
-"Rng()" -> "SemiGroup()"
-@
-<<category RNG Rng>>=
-)abbrev category RNG Rng
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of associative rings, not necessarily commutative, and not
-++ necessarily with a 1. This is a combination of an abelian group
-++ and a semigroup, with multiplication distributing over addition.
-++
-++ Axioms:
-++   \spad{ x*(y+z) = x*y + x*z}
-++   \spad{ (x+y)*z = x*z + y*z }
-++
-++ Conditional attributes:
-++   \spadnoZeroDivisors\tab{25}\spad{  ab = 0 => a=0 or b=0}
-Rng(): Category == Join(AbelianGroup,SemiGroup)
-
-@ 
-\section{RNG.lsp BOOTSTRAP} 
-{\bf RNG} 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 RNG} category which we can write
-into the {\bf MID} directory. We compile the lisp code and copy the
-{\bf RNG.o} file to the {\bf OUT} directory.  This is eventually
-forcibly replaced by a recompiled version.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<RNG.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |Rng;AL| (QUOTE NIL)) 
-
-(DEFUN |Rng| NIL 
-  (LET (#:G82722) 
-    (COND 
-      (|Rng;AL|) 
-      (T (SETQ |Rng;AL| (|Rng;|)))))) 
-
-(DEFUN |Rng;| NIL 
-  (PROG (#1=#:G82720) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# (|Join| (|AbelianGroup|) (|SemiGroup|)) |Rng|)
-        (SETELT #1# 0 (QUOTE (|Rng|))))))) 
-
-(MAKEPROP (QUOTE |Rng|) (QUOTE NILADIC) T) 
-
-@
-\section{category STEP StepThrough}
-<<dot>>=
-"STEP" -> "SETCAT"
-"StepThrough()" -> "SetCategory()"
-@
-<<category STEP StepThrough>>=
-)abbrev category STEP StepThrough
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A class of objects which can be 'stepped through'.
-++ Repeated applications of \spadfun{nextItem} is guaranteed never to
-++ return duplicate items and only return "failed" after exhausting
-++ all elements of the domain.
-++ This assumes that the sequence starts with \spad{init()}.
-++ For infinite domains, repeated application
-++ of \spadfun{nextItem} is not required to reach all possible domain elements
-++ starting from any initial element.
-++
-++ Conditional attributes:
-++   infinite\tab{15}repeated \spad{nextItem}'s are never "failed".
-StepThrough(): Category == SetCategory with
-    --operations
-      init: constant -> %
-        ++ init() chooses an initial object for stepping.
-      nextItem: % -> Union(%,"failed")
-        ++ nextItem(x) returns the next item, or "failed" if domain is exhausted.
-
-@
 \section{category UFD UniqueFactorizationDomain}
 <<dot>>=
 "UFD" -> "GCDDOM"
@@ -4183,13 +3346,7 @@ VectorSpace(S:Field): Category ==  Module(S) with
 <<*>>=
 <<license>>
 
-<<category STEP StepThrough>>
-<<category MONOID Monoid>>
 <<category GROUP Group>>
-<<category ABELMON AbelianMonoid>>
-<<category CABMON CancellationAbelianMonoid>>
-<<category ABELGRP AbelianGroup>>
-<<category RNG Rng>>
 <<category LMODULE LeftModule>>
 <<category RMODULE RightModule>>
 <<category RING Ring>>
@@ -4211,10 +3368,6 @@ VectorSpace(S:Field): Category ==  Module(S) with
 <<category DIVRING DivisionRing>>
 <<category FIELD Field>>
 <<category VSPACE VectorSpace>>
-<<category ORDFIN OrderedFinite>>
-<<category ORDMON OrderedMonoid>>
-<<category OASGP OrderedAbelianSemiGroup>>
-<<category OAMON OrderedAbelianMonoid>>
 <<category OCAMON OrderedCancellationAbelianMonoid>>
 <<category OAGROUP OrderedAbelianGroup>>
 <<category ORDRING OrderedRing>>
