diff --git a/books/bookvol10.2.pamphlet b/books/bookvol10.2.pamphlet
index 96d8704..9c3ebe5 100644
--- a/books/bookvol10.2.pamphlet
+++ b/books/bookvol10.2.pamphlet
@@ -52,10 +52,12 @@
 \ \\${\bf\Leftarrow{}}${``#1''} (#2) \ref{#1} on page~\pageref{#1}}
 %%
 %% cross will put the category and function in the index
+%% cross will leave the funcname so it can be put inline.
 %%
 \newcommand{\cross}[2]{% e.g. \pagefrom{cat}{funcname}
 \index{#1!#2}%
-\index{#2!#1}}
+\index{#2!#1}%
+#2}
 
 
 % special meanings for math characters
@@ -298,7 +300,8 @@ This is the root of the category hierarchy and is not represented by code.
 
 {\bf Exports:}\\
 \begin{tabular}{ll}
- ?=? &  ?\~{}=?
+\cross{BASTYPE}{?=?} &
+\cross{BASTYPE}{?\~{}=?}
 \end{tabular}
 
 These are directly exported but not implemented:
@@ -366,11 +369,7 @@ digraph pic {
 \pageto{SetCategory}{SETCAT}
 \pagefrom{Category}{CATEGORY}
 
-{\bf Exports:}
-\begin{verbatim}
- coerce
-\end{verbatim}
-
+{\bf Exports:}\\
 \cross{KOERCE}{coerce}
 
 This is directly exported but not implemented:
@@ -430,11 +429,7 @@ digraph pic {
 \pageto{Collection}{CLAGG}
 \pagefrom{Category}{CATEGORY}
 
-{\bf Exports:}
-\begin{verbatim}
- convert
-\end{verbatim}
-
+{\bf Exports:}\\
 \cross{KONVERT}{convert}
 
 This is directly exported but not implemented:
@@ -550,11 +545,7 @@ digraph pic {
 \pageto{EltableAggregate}{ELTAGG}
 \pagefrom{Category}{CATEGORY}
 
-{\bf Exports:}
-\begin{verbatim}
- ?.?
-\end{verbatim}
-
+{\bf Exports:}\\
 \cross{ELTAB}{?.?}
 
 This syntax for elt is supported by the interpreter and compiler.
@@ -620,12 +611,10 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lll}
- coerce & retract & retractIfCan
-\end{tabular}
-
-\cross{RETRACT}{coerce}
-\cross{RETRACT}{retract}
+\cross{RETRACT}{coerce} &
+\cross{RETRACT}{retract} &
 \cross{RETRACT}{retractIfCan}
+\end{tabular}
 
 These are directly exported but not implemented:
 \begin{verbatim}
@@ -770,15 +759,13 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{llllll}
- empty? & eq? & less? & more? & sample & size? 
-\end{tabular}
-
-\cross{AGG}{empty?}
-\cross{AGG}{eq?}
-\cross{AGG}{less?}
-\cross{AGG}{more?}
-\cross{AGG}{sample}
+\cross{AGG}{empty?} &
+\cross{AGG}{eq?} &
+\cross{AGG}{less?} &
+\cross{AGG}{more?} &
+\cross{AGG}{sample} &
 \cross{AGG}{size?}
+\end{tabular}
 
 These are implemented by this category:
 \begin{verbatim}
@@ -882,14 +869,12 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- elt & qelt & qsetelt! & setelt & ?.?
-\end{tabular}
-
-\cross{ELTAGG}{elt}
-\cross{ELTAGG}{qelt}
-\cross{ELTAGG}{qsetelt!}
-\cross{ELTAGG}{setelt}
+\cross{ELTAGG}{elt} &
+\cross{ELTAGG}{qelt} &
+\cross{ELTAGG}{qsetelt!} &
+\cross{ELTAGG}{setelt} &
 \cross{ELTAGG}{?.?}
+\end{tabular}
 
 These are part of this category's direct exports:
 \begin{verbatim}
@@ -1003,14 +988,12 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
-coerce & hash & latex & ?=? & ?\~{}=?
-\end{tabular}
-
-\cross{SETCAT}{coerce}
-\cross{SETCAT}{hash}
-\cross{SETCAT}{latex}
-\cross{SETCAT}{?=?}
+\cross{SETCAT}{coerce} &
+\cross{SETCAT}{hash} &
+\cross{SETCAT}{latex} &
+\cross{SETCAT}{?=?} &
 \cross{SETCAT}{?\~{}=?}
+\end{tabular}
 
 These are implemented by this category:
 \begin{verbatim}
@@ -1106,18 +1089,16 @@ digraph pic {
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- coerce & hash & latex & ?*? & ?+? & ?=? & ?\~{}=? 
+\begin{tabular}{lllll}
+\cross{ABELSG}{coerce} &
+\cross{ABELSG}{hash} &
+\cross{ABELSG}{latex} &
+\cross{ABELSG}{?*?} &
+\cross{ABELSG}{?+?} \\
+\cross{ABELSG}{?=?} &
+\cross{ABELSG}{?\~{}=?} &&&
 \end{tabular}
 
-\cross{ABELSG}{coerce}
-\cross{ABELSG}{hash}
-\cross{ABELSG}{latex}
-\cross{ABELSG}{?*?}
-\cross{ABELSG}{?+?}
-\cross{ABELSG}{?=?}
-\cross{ABELSG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  ?+? : (%,%) -> %
@@ -1225,19 +1206,17 @@ digraph pic {
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllllll}
- coerce & hash & index & latex & lookup & random & size & ?=? & ?\~{}=?
-\end{tabular}
-
+\begin{tabular}{lllll}
 \cross{FINITE}{coerce}
-\cross{FINITE}{hash}
-\cross{FINITE}{index}
-\cross{FINITE}{latex}
-\cross{FINITE}{lookup}
-\cross{FINITE}{random}
-\cross{FINITE}{size}
-\cross{FINITE}{?=?}
-\cross{FINITE}{?\~{}=?}
+\cross{FINITE}{hash} &
+\cross{FINITE}{index} &
+\cross{FINITE}{latex} &
+\cross{FINITE}{lookup} &
+\cross{FINITE}{random} \\
+\cross{FINITE}{size} &
+\cross{FINITE}{?=?} &
+\cross{FINITE}{?\~{}=?} &&
+\end{tabular}
 
 These are directly exported but not implemented:
 \begin{verbatim}
@@ -1346,39 +1325,33 @@ digraph pic {
 \pagefrom{Evalable}{EVALAB}
 \pagefrom{SetCategory}{SETCAT}
 
-
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?    & coerce  & copy  & count & empty  & empty?  & eq?\\
- eval    & every?  & hash  & latex & less?  & map     & map!\\
- members & member? & more? & parts & sample & size?   & \#?\\
- ?=?     & ?\~{}=?    &       &       &        &         &\\ 
+\begin{tabular}{lllll}
+\cross{HOAGG}{any?} &
+\cross{HOAGG}{coerce} &
+\cross{HOAGG}{copy} &
+\cross{HOAGG}{count} &
+\cross{HOAGG}{empty} \\
+\cross{HOAGG}{empty?} &
+\cross{HOAGG}{eq?} &
+\cross{HOAGG}{eval} &
+\cross{HOAGG}{every?} &
+\cross{HOAGG}{hash} \\
+\cross{HOAGG}{latex} &
+\cross{HOAGG}{less?} &
+\cross{HOAGG}{map} &
+\cross{HOAGG}{map!} &
+\cross{HOAGG}{members} \\
+\cross{HOAGG}{member?} &
+\cross{HOAGG}{more?} &
+\cross{HOAGG}{parts} &
+\cross{HOAGG}{sample} &
+\cross{HOAGG}{size?} \\
+\cross{HOAGG}{\#?} &
+\cross{HOAGG}{?=?} &
+\cross{HOAGG}{?\~{}=?} &&
 \end{tabular}
 
-\cross{HOAGG}{any?}
-\cross{HOAGG}{coerce}
-\cross{HOAGG}{copy}
-\cross{HOAGG}{count}
-\cross{HOAGG}{empty}
-\cross{HOAGG}{empty?}
-\cross{HOAGG}{eq?}
-\cross{HOAGG}{eval}
-\cross{HOAGG}{every?}
-\cross{HOAGG}{hash}
-\cross{HOAGG}{latex}
-\cross{HOAGG}{less?}
-\cross{HOAGG}{map}
-\cross{HOAGG}{map!}
-\cross{HOAGG}{members}
-\cross{HOAGG}{member?}
-\cross{HOAGG}{more?}
-\cross{HOAGG}{parts}
-\cross{HOAGG}{sample}
-\cross{HOAGG}{size?}
-\cross{HOAGG}{\#?}
-\cross{HOAGG}{?=?}
-\cross{HOAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  map : ((S -> S),%) -> %              
@@ -1570,23 +1543,20 @@ digraph pic {
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- coerce & hash & latex & max & min & ?$<$?\\
- ?$<=$? & ?=? & ?$>$? & ?$>=$? & ?\~{}=? &\\
+\begin{tabular}{lllll}
+\cross{ORDSET}{coerce} &
+\cross{ORDSET}{hash} &
+\cross{ORDSET}{latex} &
+\cross{ORDSET}{max} &
+\cross{ORDSET}{min} \\
+\cross{ORDSET}{?$<$?} &
+\cross{ORDSET}{?$<=$?} &
+\cross{ORDSET}{?=?} &
+\cross{ORDSET}{?$>$?} &
+\cross{ORDSET}{?$>=$?} \\
+\cross{ORDSET}{?\~{}=?} &&&&
 \end{tabular}
 
-\cross{ORDSET}{coerce}
-\cross{ORDSET}{hash}
-\cross{ORDSET}{latex}
-\cross{ORDSET}{max}
-\cross{ORDSET}{min}
-\cross{ORDSET}{?$<$?}
-\cross{ORDSET}{?$<=$?}
-\cross{ORDSET}{?=?}
-\cross{ORDSET}{?$>$?}
-\cross{ORDSET}{?$>=$?}
-\cross{ORDSET}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  ?<? : (%,%) -> Boolean               
@@ -1713,20 +1683,17 @@ operator ``*''. A Semigroup $G(S,*)$ is:
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
-\begin{tabular}{llll}
- coerce & hash & latex & ?*? \\
- ?**?   & ?=?  & ?\^{}?   & ?\~{}=?
+\begin{tabular}{lllll}
+\cross{SGROUP}{coerce} &
+\cross{SGROUP}{hash} &
+\cross{SGROUP}{latex} &
+\cross{SGROUP}{?*?} &
+\cross{SGROUP}{?**?} \\
+\cross{SGROUP}{?=?} &
+\cross{SGROUP}{?\^{}?} &
+\cross{SGROUP}{?~=?} &&
 \end{tabular}
 
-\cross{SGROUP}{coerce}
-\cross{SGROUP}{hash}
-\cross{SGROUP}{latex}
-\cross{SGROUP}{?*?}
-\cross{SGROUP}{?**?}
-\cross{SGROUP}{?=?}
-\cross{SGROUP}{?\^{}?}
-\cross{SGROUP}{?~=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  ?*? : (%,%) -> %                     
@@ -1837,18 +1804,16 @@ digraph pic {
 \pagefrom{SetCategory}{SETCAT}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- coerce & hash & init & latex & nextItem & ?=? & ?\~{}=?
+\begin{tabular}{lllll}
+\cross{STEP}{coerce} &
+\cross{STEP}{hash} &
+\cross{STEP}{init} &
+\cross{STEP}{latex} &
+\cross{STEP}{?=?} \\
+\cross{STEP}{?~=?} &
+\cross{STEP}{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 : () -> %
@@ -1946,21 +1911,18 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- 0     &  coerce & hash & latex & sample\\
- zero? & ?*?     & ?+?  & ?=?   & ?\~{}=?
+\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}{?\~{}=?} \\
 \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 : () -> %
@@ -2088,41 +2050,36 @@ digraph pic {
 \pagefrom{HomogeneousAggregate}{HOAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?  & bag    & coerce & copy     & count   & empty   & empty?\\
- eq?   & eval   & every? & extract! & hash    & insert! & inspect\\
- latex & less?  & map    & map!     & member? & members & more?\\
- parts & sample & size?  & \#?      & ?=?     & ?\~{}=? &\\
+\begin{tabular}{lllll}
+\cross{BGAGG}{any?} &
+\cross{BGAGG}{bag} &
+\cross{BGAGG}{coerce} &
+\cross{BGAGG}{copy} &
+\cross{BGAGG}{count} \\
+\cross{BGAGG}{empty} &
+\cross{BGAGG}{empty?} &
+\cross{BGAGG}{eq?} &
+\cross{BGAGG}{eval} &
+\cross{BGAGG}{every?} \\
+\cross{BGAGG}{extract!} &
+\cross{BGAGG}{hash} &
+\cross{BGAGG}{insert!} &
+\cross{BGAGG}{inspect} &
+\cross{BGAGG}{latex} \\
+\cross{BGAGG}{less?} &
+\cross{BGAGG}{map} &
+\cross{BGAGG}{map!} &
+\cross{BGAGG}{member?} &
+\cross{BGAGG}{members} \\
+\cross{BGAGG}{more?} &
+\cross{BGAGG}{parts} &
+\cross{BGAGG}{sample} &
+\cross{BGAGG}{size?} &
+\cross{BGAGG}{\#?} \\
+\cross{BGAGG}{?=?} &
+\cross{BGAGG}{?\~{}=?} &&&
 \end{tabular}
 
-\cross{BGAGG}{any?}
-\cross{BGAGG}{bag}
-\cross{BGAGG}{coerce}
-\cross{BGAGG}{copy}
-\cross{BGAGG}{count}
-\cross{BGAGG}{empty}
-\cross{BGAGG}{empty?}
-\cross{BGAGG}{eq?}
-\cross{BGAGG}{eval}
-\cross{BGAGG}{every?}
-\cross{BGAGG}{extract!}
-\cross{BGAGG}{hash}
-\cross{BGAGG}{insert!}
-\cross{BGAGG}{inspect}
-\cross{BGAGG}{latex}
-\cross{BGAGG}{less?}
-\cross{BGAGG}{map}
-\cross{BGAGG}{map!}
-\cross{BGAGG}{member?}
-\cross{BGAGG}{members}
-\cross{BGAGG}{more?}
-\cross{BGAGG}{parts}
-\cross{BGAGG}{sample}
-\cross{BGAGG}{size?}
-\cross{BGAGG}{\#?}
-\cross{BGAGG}{?=?}
-\cross{BGAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  extract! : % -> S
@@ -2258,45 +2215,39 @@ digraph pic {
 \pagefrom{HomogeneousAggregate}{HOAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- any?    & coerce & construct & copy   & convert & count\\
- empty   & empty? & eq?       & eval   & every?  & find\\
- hash    & latex  & less?     & map    & map!    & member?\\
- members & more?  & parts     & reduce & remove  & removeDuplicates\\
- sample  & select & size?     & \#?    & ?=?     & ?\~{}=?
+\begin{tabular}{lllll}
+\cross{CLAGG}{any?} &
+\cross{CLAGG}{coerce} &
+\cross{CLAGG}{construct} &
+\cross{CLAGG}{copy} &
+\cross{CLAGG}{convert} \\
+\cross{CLAGG}{count} &
+\cross{CLAGG}{empty} &
+\cross{CLAGG}{empty?} &
+\cross{CLAGG}{eq?} &
+\cross{CLAGG}{eval} \\
+\cross{CLAGG}{every?} &
+\cross{CLAGG}{find} &
+\cross{CLAGG}{hash} &
+\cross{CLAGG}{latex} &
+\cross{CLAGG}{less?} \\
+\cross{CLAGG}{map} &
+\cross{CLAGG}{map!} &
+\cross{CLAGG}{member?} &
+\cross{CLAGG}{members} &
+\cross{CLAGG}{more?} \\
+\cross{CLAGG}{parts} &
+\cross{CLAGG}{reduce} &
+\cross{CLAGG}{remove} &
+\cross{CLAGG}{removeDuplicates} &
+\cross{CLAGG}{sample} \\
+\cross{CLAGG}{select} &
+\cross{CLAGG}{size?} &
+\cross{CLAGG}{\#?} &
+\cross{CLAGG}{?=?} &
+\cross{CLAGG}{?\~{}=?} \\
 \end{tabular}
 
-\cross{CLAGG}{any?}
-\cross{CLAGG}{coerce}
-\cross{CLAGG}{construct}
-\cross{CLAGG}{copy}
-\cross{CLAGG}{convert}
-\cross{CLAGG}{count}
-\cross{CLAGG}{empty}
-\cross{CLAGG}{empty?}
-\cross{CLAGG}{eq?}
-\cross{CLAGG}{eval}
-\cross{CLAGG}{every?}
-\cross{CLAGG}{find}
-\cross{CLAGG}{hash}
-\cross{CLAGG}{latex}
-\cross{CLAGG}{less?}
-\cross{CLAGG}{map}
-\cross{CLAGG}{map!}
-\cross{CLAGG}{member?}
-\cross{CLAGG}{members}
-\cross{CLAGG}{more?}
-\cross{CLAGG}{parts}
-\cross{CLAGG}{reduce}
-\cross{CLAGG}{remove}
-\cross{CLAGG}{removeDuplicates}
-\cross{CLAGG}{sample}
-\cross{CLAGG}{select}
-\cross{CLAGG}{size?}
-\cross{CLAGG}{\#?}
-\cross{CLAGG}{?=?}
-\cross{CLAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  construct: List S -> %
@@ -2506,53 +2457,46 @@ digraph pic {
 \pagefrom{HomogeneousAggregate}{HOAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?     & coerce  & copy    & count    & elt    & empty  & empty? \\
- entries  & entry?  & eq?     & eval     & every? & fill!  & first  \\
- hash     & index?  & indices & latex    & less?  & map    & map!   \\
- maxIndex & member? & members & minIndex & more?  & parts  & qelt   \\
- qsetelt! & sample  & setelt  & size?    & swap!  & ?.?    & ?\~{}=?\\
- \#?      & ?=?     &         &          &        &        &\\
+\begin{tabular}{lllll}
+\cross{IXAGG}{any?} &
+\cross{IXAGG}{coerce} &
+\cross{IXAGG}{copy} &
+\cross{IXAGG}{count} &
+\cross{IXAGG}{elt} \\
+\cross{IXAGG}{empty} &
+\cross{IXAGG}{empty?} &
+\cross{IXAGG}{entries} &
+\cross{IXAGG}{entry?} &
+\cross{IXAGG}{eq?} \\
+\cross{IXAGG}{eval} &
+\cross{IXAGG}{every?} &
+\cross{IXAGG}{fill!} &
+\cross{IXAGG}{first} &
+\cross{IXAGG}{hash} \\
+\cross{IXAGG}{index?} &
+\cross{IXAGG}{indices} &
+\cross{IXAGG}{latex} &
+\cross{IXAGG}{less?} &
+\cross{IXAGG}{map} \\
+\cross{IXAGG}{map!} &
+\cross{IXAGG}{maxIndex} &
+\cross{IXAGG}{member?} &
+\cross{IXAGG}{members} &
+\cross{IXAGG}{minIndex} \\
+\cross{IXAGG}{more?} &
+\cross{IXAGG}{parts} &
+\cross{IXAGG}{qelt} &
+\cross{IXAGG}{qsetelt!} &
+\cross{IXAGG}{sample} \\
+\cross{IXAGG}{setelt} &
+\cross{IXAGG}{size?} &
+\cross{IXAGG}{swap!} &
+\cross{IXAGG}{?.?} &
+\cross{IXAGG}{?\~{}=?} \\
+\cross{IXAGG}{\#?} &
+\cross{IXAGG}{?=?} &&&
 \end{tabular}
 
-\cross{IXAGG}{any?}
-\cross{IXAGG}{coerce}
-\cross{IXAGG}{copy}
-\cross{IXAGG}{count}
-\cross{IXAGG}{elt}
-\cross{IXAGG}{empty}
-\cross{IXAGG}{empty?}
-\cross{IXAGG}{entries}
-\cross{IXAGG}{entry?}
-\cross{IXAGG}{eq?}
-\cross{IXAGG}{eval}
-\cross{IXAGG}{every?}
-\cross{IXAGG}{fill!}
-\cross{IXAGG}{first}
-\cross{IXAGG}{hash}
-\cross{IXAGG}{index?}
-\cross{IXAGG}{indices}
-\cross{IXAGG}{latex}
-\cross{IXAGG}{less?}
-\cross{IXAGG}{map}
-\cross{IXAGG}{map!}
-\cross{IXAGG}{maxIndex}
-\cross{IXAGG}{member?}
-\cross{IXAGG}{members}
-\cross{IXAGG}{minIndex}
-\cross{IXAGG}{more?}
-\cross{IXAGG}{parts}
-\cross{IXAGG}{qelt}
-\cross{IXAGG}{qsetelt!}
-\cross{IXAGG}{sample}
-\cross{IXAGG}{setelt}
-\cross{IXAGG}{size?}
-\cross{IXAGG}{swap!}
-\cross{IXAGG}{?.?}
-\cross{IXAGG}{?\~{}=?}
-\cross{IXAGG}{\#?}
-\cross{IXAGG}{?=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  index? : (Index,%) -> Boolean
@@ -2770,30 +2714,28 @@ digraph pic {
 \pagepic{ps/v102monoid.ps}{MONOID}{0.75}
 
 {\bf See:}\\
+\pageto{Group}{GROUP}
 \pageto{OrderedMonoid}{ORDMON}
+\pageto{OrderedRing}{ORDRING}
+\pageto{Ring}{RING}
 \pagefrom{SemiGroup}{SGROUP}
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- 1     & coerce & hash & latex & one?\\
- recip & sample & ?*?  & ?=?   & ?\~{}=?\\
- ?**?  & ?\^{}? & ?\^{}?   &&\\
+\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}{?\^{}?} &&&
 \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 : () -> %
@@ -2931,27 +2873,23 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- coerce & hash   & index  & latex & lookup  \\
- max    & min    & random & size  & ?\~{}=? \\
- ?$<$?  & ?$<=$? & ?=?    & ?$>$? & ?$>=$?  \\
+\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}{?$>=$?} \\
 \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
@@ -3050,52 +2988,45 @@ digraph pic {
 \pagefrom{HomogeneousAggregate}{HOAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- any?     & child?   & children & coerce       & copy    & count    \\
- cyclic?  & distance & empty    & empty?       & eq?     & eval     \\
- every?   & hash     & latex    & leaf?        & leaves  & less?    \\
- map      & map!     & member?  & members      & more?   & nodes    \\
- node?    & parts    & sample   & setchildren! & setelt  & setvalue!\\
- size?    & value    & ?.value  & ?\~{}=?      & \#?     & ?=?      \\
+\begin{tabular}{lllll}
+\cross{RCAGG}{any?} &
+\cross{RCAGG}{child?} &
+\cross{RCAGG}{children} &
+\cross{RCAGG}{coerce} &
+\cross{RCAGG}{copy} \\
+\cross{RCAGG}{count} &
+\cross{RCAGG}{cyclic?} &
+\cross{RCAGG}{distance} &
+\cross{RCAGG}{empty} &
+\cross{RCAGG}{empty?} \\
+\cross{RCAGG}{eq?} &
+\cross{RCAGG}{eval} &
+\cross{RCAGG}{every?} &
+\cross{RCAGG}{hash} &
+\cross{RCAGG}{latex} \\
+\cross{RCAGG}{leaf?} &
+\cross{RCAGG}{leaves} &
+\cross{RCAGG}{less?} &
+\cross{RCAGG}{map} &
+\cross{RCAGG}{map!} \\
+\cross{RCAGG}{member?} &
+\cross{RCAGG}{members} &
+\cross{RCAGG}{more?} &
+\cross{RCAGG}{nodes} &
+\cross{RCAGG}{node?} \\
+\cross{RCAGG}{parts} &
+\cross{RCAGG}{sample} &
+\cross{RCAGG}{setchildren!} &
+\cross{RCAGG}{setelt} &
+\cross{RCAGG}{setvalue!} \\
+\cross{RCAGG}{size?} &
+\cross{RCAGG}{value} &
+\cross{RCAGG}{?.value} &
+\cross{RCAGG}{?\~{}=?} &
+\cross{RCAGG}{\#?} \\
+\cross{RCAGG}{?=?} &&&&
 \end{tabular}
 
-\cross{RCAGG}{any?}
-\cross{RCAGG}{child?}
-\cross{RCAGG}{children}
-\cross{RCAGG}{coerce}
-\cross{RCAGG}{copy}
-\cross{RCAGG}{count}
-\cross{RCAGG}{cyclic?}
-\cross{RCAGG}{distance}
-\cross{RCAGG}{empty}
-\cross{RCAGG}{empty?}
-\cross{RCAGG}{eq?}
-\cross{RCAGG}{eval}
-\cross{RCAGG}{every?}
-\cross{RCAGG}{hash}
-\cross{RCAGG}{latex}
-\cross{RCAGG}{leaf?}
-\cross{RCAGG}{leaves}
-\cross{RCAGG}{less?}
-\cross{RCAGG}{map}
-\cross{RCAGG}{map!}
-\cross{RCAGG}{member?}
-\cross{RCAGG}{members}
-\cross{RCAGG}{more?}
-\cross{RCAGG}{nodes}
-\cross{RCAGG}{node?}
-\cross{RCAGG}{parts}
-\cross{RCAGG}{sample}
-\cross{RCAGG}{setchildren!}
-\cross{RCAGG}{setelt}
-\cross{RCAGG}{setvalue!}
-\cross{RCAGG}{size?}
-\cross{RCAGG}{value}
-\cross{RCAGG}{?.value}
-\cross{RCAGG}{?\~{}=?}
-\cross{RCAGG}{\#?}
-\cross{RCAGG}{?=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  children : % -> List %
@@ -3262,66 +3193,51 @@ digraph pic {
 \pagefrom{RecursiveAggregate}{RCAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- any?   & children & child?    & coerce       & copy   & count   \\
- count  & cyclic?  & distance  & empty        & empty? & eq?     \\
- eval   & eval     & eval      & eval         & every? & hash    \\
- latex  & leaf?    & leaves    & left         & less?  & map     \\
- map!   & member?  & members   & more?        & nodes  & node?   \\
- parts  & right    & sample    & setchildren! & setelt & setelt  \\
- setelt & setleft! & setright! & setvalue!    & size?  & value   \\
- \#?    & ?=?      & ?\~{}=?   & ?.right      & ?.left & ?.value \\
+\begin{tabular}{lllll}
+\cross{BRAGG}{any?} &
+\cross{BRAGG}{children} &
+\cross{BRAGG}{child?} &
+\cross{BRAGG}{coerce} &
+\cross{BRAGG}{copy} \\
+\cross{BRAGG}{count} &
+\cross{BRAGG}{cyclic?} &
+\cross{BRAGG}{distance} &
+\cross{BRAGG}{empty} &
+\cross{BRAGG}{empty?} \\
+\cross{BRAGG}{eq?} &
+\cross{BRAGG}{eval} &
+\cross{BRAGG}{every?} &
+\cross{BRAGG}{hash} &
+\cross{BRAGG}{latex} \\
+\cross{BRAGG}{leaf?} &
+\cross{BRAGG}{leaves} &
+\cross{BRAGG}{left} &
+\cross{BRAGG}{less?} &
+\cross{BRAGG}{map} \\
+\cross{BRAGG}{map!} &
+\cross{BRAGG}{member?} &
+\cross{BRAGG}{members} &
+\cross{BRAGG}{more?} &
+\cross{BRAGG}{nodes} \\
+\cross{BRAGG}{node?} &
+\cross{BRAGG}{parts} &
+\cross{BRAGG}{right} &
+\cross{BRAGG}{sample} &
+\cross{BRAGG}{setchildren!} \\
+\cross{BRAGG}{setelt} &
+\cross{BRAGG}{setleft!} &
+\cross{BRAGG}{setright!} &
+\cross{BRAGG}{setvalue!} &
+\cross{BRAGG}{size?} \\
+\cross{BRAGG}{value} &
+\cross{BRAGG}{\#?} &
+\cross{BRAGG}{?=?} &
+\cross{BRAGG}{?\~{}=?} &
+\cross{BRAGG}{?.right} \\
+\cross{BRAGG}{?.left} &
+\cross{BRAGG}{?.value} &&&
 \end{tabular}
 
-\cross{BRAGG}{any?}
-\cross{BRAGG}{children}
-\cross{BRAGG}{child?}
-\cross{BRAGG}{coerce}
-\cross{BRAGG}{copy}
-\cross{BRAGG}{count}
-\cross{BRAGG}{count}
-\cross{BRAGG}{cyclic?}
-\cross{BRAGG}{distance}
-\cross{BRAGG}{empty}
-\cross{BRAGG}{empty?}
-\cross{BRAGG}{eq?}
-\cross{BRAGG}{eval}
-\cross{BRAGG}{eval}
-\cross{BRAGG}{eval}
-\cross{BRAGG}{eval}
-\cross{BRAGG}{every?}
-\cross{BRAGG}{hash}
-\cross{BRAGG}{latex}
-\cross{BRAGG}{leaf?}
-\cross{BRAGG}{leaves}
-\cross{BRAGG}{left}
-\cross{BRAGG}{less?}
-\cross{BRAGG}{map}
-\cross{BRAGG}{map!}
-\cross{BRAGG}{member?}
-\cross{BRAGG}{members}
-\cross{BRAGG}{more?}
-\cross{BRAGG}{nodes}
-\cross{BRAGG}{node?}
-\cross{BRAGG}{parts}
-\cross{BRAGG}{right}
-\cross{BRAGG}{sample}
-\cross{BRAGG}{setchildren!}
-\cross{BRAGG}{setelt}
-\cross{BRAGG}{setelt}
-\cross{BRAGG}{setelt}
-\cross{BRAGG}{setleft!}
-\cross{BRAGG}{setright!}
-\cross{BRAGG}{setvalue!}
-\cross{BRAGG}{size?}
-\cross{BRAGG}{value}
-\cross{BRAGG}{\#?}
-\cross{BRAGG}{?=?}
-\cross{BRAGG}{?\~{}=?}
-\cross{BRAGG}{?.right}
-\cross{BRAGG}{?.left}
-\cross{BRAGG}{?.value}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  left : % -> %             
@@ -3546,27 +3462,24 @@ digraph pic {
 
 {\bf See:}\\
 \pageto{AbelianGroup}{ABELGRP}
+\pageto{OrderedCancellationAbelianMonoid}{OCAMON}
 \pagefrom{AbelianMonoid}{ABELMON}
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- 0             & coerce & hash    & latex & sample\\
- subtractIfCan & zero?  & ?\~{}=? & ?*?   & ?+?\\
- ?=?&&&&
+\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}{?=?} &&&&
 \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")
@@ -3677,54 +3590,46 @@ digraph pic {
 \pagefrom{Collection}{CLAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- any?   & bag        & coerce  & construct & convert & copy             \\
- count  & dictionary & empty   & empty?    & eq?     & eval             \\
- every? & extract!   & find    & hash      & insert! & inspect          \\
- latex  & less?      & map     & map!      & member? & members          \\
- more?  & parts      & reduce  & remove    & remove! & removeDuplicates \\
- sample & select     & select! & size?     & \#?     & ?=?              \\
- ?\~{}=? &&&&&\\
+\begin{tabular}{lllll}
+\cross{DIOPS}{any?} &
+\cross{DIOPS}{bag} &
+\cross{DIOPS}{coerce} &
+\cross{DIOPS}{construct} &
+\cross{DIOPS}{convert} \\
+\cross{DIOPS}{copy} &
+\cross{DIOPS}{count} &
+\cross{DIOPS}{dictionary} &
+\cross{DIOPS}{empty} &
+\cross{DIOPS}{empty?} \\
+\cross{DIOPS}{eq?} &
+\cross{DIOPS}{eval} &
+\cross{DIOPS}{every?} &
+\cross{DIOPS}{extract!} &
+\cross{DIOPS}{find} \\
+\cross{DIOPS}{hash} &
+\cross{DIOPS}{insert!} &
+\cross{DIOPS}{inspect} &
+\cross{DIOPS}{latex} &
+\cross{DIOPS}{less?} \\
+\cross{DIOPS}{map} &
+\cross{DIOPS}{map!} &
+\cross{DIOPS}{member?} &
+\cross{DIOPS}{members} &
+\cross{DIOPS}{more?} \\
+\cross{DIOPS}{parts} &
+\cross{DIOPS}{reduce} &
+\cross{DIOPS}{remove} &
+\cross{DIOPS}{remove!} &
+\cross{DIOPS}{removeDuplicates} \\
+\cross{DIOPS}{sample} &
+\cross{DIOPS}{select} &
+\cross{DIOPS}{select!} &
+\cross{DIOPS}{size?} &
+\cross{DIOPS}{\#?} \\
+\cross{DIOPS}{?=?} &
+\cross{DIOPS}{?\~{}=?} &&&
 \end{tabular}
 
-\cross{DIOPS}{any?}
-\cross{DIOPS}{bag}
-\cross{DIOPS}{coerce}
-\cross{DIOPS}{construct}
-\cross{DIOPS}{convert}
-\cross{DIOPS}{copy}
-\cross{DIOPS}{count}
-\cross{DIOPS}{dictionary}
-\cross{DIOPS}{empty}
-\cross{DIOPS}{empty?}
-\cross{DIOPS}{eq?}
-\cross{DIOPS}{eval}
-\cross{DIOPS}{every?}
-\cross{DIOPS}{extract!}
-\cross{DIOPS}{find}
-\cross{DIOPS}{hash}
-\cross{DIOPS}{insert!}
-\cross{DIOPS}{inspect}
-\cross{DIOPS}{latex}
-\cross{DIOPS}{less?}
-\cross{DIOPS}{map}
-\cross{DIOPS}{map!}
-\cross{DIOPS}{member?}
-\cross{DIOPS}{members}
-\cross{DIOPS}{more?}
-\cross{DIOPS}{parts}
-\cross{DIOPS}{reduce}
-\cross{DIOPS}{remove}
-\cross{DIOPS}{remove!}
-\cross{DIOPS}{removeDuplicates}
-\cross{DIOPS}{sample}
-\cross{DIOPS}{select}
-\cross{DIOPS}{select!}
-\cross{DIOPS}{size?}
-\cross{DIOPS}{\#?}
-\cross{DIOPS}{?=?}
-\cross{DIOPS}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  dictionary : List S -> %
@@ -3902,66 +3807,57 @@ digraph pic {
 \pagefrom{RecursiveAggregate}{RCAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- any?         & children & child?   & coerce      & concat!    & copy    \\
- count        & count    & cyclic?  & distance     & empty     & empty?  \\
- eq?          & eval     & eval     & eval         & eval      & every?  \\
- hash         & head     & last     & latex        & leaf?     & leaves  \\
- less?        & map      & map!     & member?      & members   & more?   \\
- next         & nodes    & node?    & parts        & previous  & sample  \\
- setchildren! & setelt   & setnext! & setprevious! & setvalue! & size?   \\
- tail         & value    & \#?      & ?=?          & ?\~{}=?   & ?.value \\
+\begin{tabular}{lllll}
+\cross{DLAGG}{any?} &
+\cross{DLAGG}{children} &
+\cross{DLAGG}{child?} &
+\cross{DLAGG}{coerce} &
+\cross{DLAGG}{concat!} \\
+\cross{DLAGG}{copy} &
+\cross{DLAGG}{count} &
+\cross{DLAGG}{count} &
+\cross{DLAGG}{cyclic?} &
+\cross{DLAGG}{distance} \\
+\cross{DLAGG}{empty} &
+\cross{DLAGG}{empty?} &
+\cross{DLAGG}{eq?} &
+\cross{DLAGG}{eval} &
+\cross{DLAGG}{eval} \\
+\cross{DLAGG}{eval} &
+\cross{DLAGG}{eval} &
+\cross{DLAGG}{every?} &
+\cross{DLAGG}{hash} &
+\cross{DLAGG}{head} \\
+\cross{DLAGG}{last} &
+\cross{DLAGG}{latex} &
+\cross{DLAGG}{leaf?} &
+\cross{DLAGG}{leaves} &
+\cross{DLAGG}{less?} \\
+\cross{DLAGG}{map} &
+\cross{DLAGG}{map!} &
+\cross{DLAGG}{member?} &
+\cross{DLAGG}{members} &
+\cross{DLAGG}{more?} \\
+\cross{DLAGG}{next} &
+\cross{DLAGG}{nodes} &
+\cross{DLAGG}{node?} &
+\cross{DLAGG}{parts} &
+\cross{DLAGG}{previous} \\
+\cross{DLAGG}{sample} &
+\cross{DLAGG}{setchildren!} &
+\cross{DLAGG}{setelt} &
+\cross{DLAGG}{setnext!} &
+\cross{DLAGG}{setprevious!} \\
+\cross{DLAGG}{setvalue!} &
+\cross{DLAGG}{size?} &
+\cross{DLAGG}{tail} &
+\cross{DLAGG}{value} &
+\cross{DLAGG}{\#?} \\
+\cross{DLAGG}{?=?} &
+\cross{DLAGG}{?\~{}=?} &
+\cross{DLAGG}{?.value} &&
 \end{tabular}
 
-\cross{DLAGG}{any?}
-\cross{DLAGG}{children}
-\cross{DLAGG}{child?}
-\cross{DLAGG}{coerce}
-\cross{DLAGG}{concat!}
-\cross{DLAGG}{copy}
-\cross{DLAGG}{count}
-\cross{DLAGG}{count}
-\cross{DLAGG}{cyclic?}
-\cross{DLAGG}{distance}
-\cross{DLAGG}{empty}
-\cross{DLAGG}{empty?}
-\cross{DLAGG}{eq?}
-\cross{DLAGG}{eval}
-\cross{DLAGG}{eval}
-\cross{DLAGG}{eval}
-\cross{DLAGG}{eval}
-\cross{DLAGG}{every?}
-\cross{DLAGG}{hash}
-\cross{DLAGG}{head}
-\cross{DLAGG}{last}
-\cross{DLAGG}{latex}
-\cross{DLAGG}{leaf?}
-\cross{DLAGG}{leaves}
-\cross{DLAGG}{less?}
-\cross{DLAGG}{map}
-\cross{DLAGG}{map!}
-\cross{DLAGG}{member?}
-\cross{DLAGG}{members}
-\cross{DLAGG}{more?}
-\cross{DLAGG}{next}
-\cross{DLAGG}{nodes}
-\cross{DLAGG}{node?}
-\cross{DLAGG}{parts}
-\cross{DLAGG}{previous}
-\cross{DLAGG}{sample}
-\cross{DLAGG}{setchildren!}
-\cross{DLAGG}{setelt}
-\cross{DLAGG}{setnext!}
-\cross{DLAGG}{setprevious!}
-\cross{DLAGG}{setvalue!}
-\cross{DLAGG}{size?}
-\cross{DLAGG}{tail}
-\cross{DLAGG}{value}
-\cross{DLAGG}{\#?}
-\cross{DLAGG}{?=?}
-\cross{DLAGG}{?\~{}=?}
-\cross{DLAGG}{?.value}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  concat! : (%,%) -> % if $ has shallowlyMutable
@@ -4111,6 +4007,176 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Group}{GROUP}
+\pagepic{ps/v102group.ps}{GROUP}{0.65}
+
+{\bf See:}\\
+\pagefrom{Monoid}{MONOID}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{GROUP}{1} &
+\cross{GROUP}{coerce} &
+\cross{GROUP}{commutator} &
+\cross{GROUP}{conjugate} &
+\cross{GROUP}{hash} \\
+\cross{GROUP}{inv} &
+\cross{GROUP}{latex} &
+\cross{GROUP}{one?} &
+\cross{GROUP}{recip} &
+\cross{GROUP}{sample} \\
+\cross{GROUP}{?\~{}=?} &
+\cross{GROUP}{?*?} &
+\cross{GROUP}{?**?} &
+\cross{GROUP}{?/?} &
+\cross{GROUP}{?=?} \\
+\cross{GROUP}{?\^{}?} &&&&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ inv : % -> %                         
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ commutator : (%,%) -> %
+ conjugate : (%,%) -> %               
+ recip : % -> Union(%,"failed")
+ ?/? : (%,%) -> %
+ ?^? : (%,Integer) -> %               
+ ?**? : (%,Integer) -> %
+\end{verbatim}
+
+These exports come from Aggregate:
+\begin{verbatim}
+\end{verbatim}
+
+These exports come from Monoid():
+\begin{verbatim}
+ 1 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String
+ one? : % -> Boolean                  
+ sample : () -> %                     
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %      
+ ?*? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean               
+ ?~=? : (%,%) -> Boolean
+\end{verbatim}
+
+<<category GROUP Group>>=
+)abbrev category GROUP Group
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The class of multiplicative groups, i.e. monoids with
+++ multiplicative inverses.
+++
+++ Axioms:
+++   \spad{leftInverse("*":(%,%)->%,inv)}\tab{30}\spad{ inv(x)*x = 1 }
+++   \spad{rightInverse("*":(%,%)->%,inv)}\tab{30}\spad{ x*inv(x) = 1 }
+Group(): Category == Monoid with
+      inv: % -> %               
+        ++ inv(x) returns the inverse of x.
+      "/": (%,%) -> %           
+        ++ x/y is the same as x times the inverse of y.
+      "**": (%,Integer) -> %    
+        ++ x**n returns x raised to the integer power n.
+      "^": (%,Integer) -> %     
+        ++ x^n returns x raised to the integer power n.
+      unitsKnown                
+        ++ unitsKnown asserts that recip only returns
+        ++ "failed" for non-units.
+      conjugate: (%,%) -> %
+        ++ conjugate(p,q) computes \spad{inv(q) * p * q}; this is 
+        ++ 'right action by conjugation'.
+      commutator: (%,%) -> %
+        ++ commutator(p,q) computes \spad{inv(p) * inv(q) * p * q}.
+    add
+      import RepeatedSquaring(%)
+      x:% / y:% == x*inv(y)
+      recip(x:%) == inv(x)
+      _^(x:%, n:Integer):% == x ** n
+      x:% ** n:Integer ==
+         zero? n => 1
+         n<0 => expt(inv(x),(-n) pretend PositiveInteger)
+         expt(x,n pretend PositiveInteger)
+      conjugate(p,q) == inv(q) * p * q
+      commutator(p,q) == inv(p) * inv(q) * p * q
+
+@
+<<GROUP.dotabb>>=
+"GROUP"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=GROUP"];
+"GROUP" -> "MONOID"
+
+@
+<<GROUP.dotfull>>=
+"Group()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=GROUP"];
+"Group()" -> "Monoid()"
+
+@
+<<GROUP.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Group()" [color=lightblue];
+"Group()" -> "Monoid()"
+"Group()" -> "RepeatedSquaring(Group)"
+
+"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(Group)" [color="#00EE00"];
+"RepeatedSquaring(Group)" -> "RepeatedSquaring(a:SetCategory)"
+
+"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{LinearAggregate}{LNAGG}
 \pagepic{ps/v102linearaggregate.ps}{LNAGG}{1.00}
 
@@ -4123,72 +4189,60 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?     & coerce           & concat   & construct & convert \\
- copy     & count            & delete   & elt       & empty   \\
- empty?   & entries          & entry?   & eq?       & eval    \\
- every?   & fill!            & find     & first     & hash    \\
- index?   & indices          & insert   & latex     & less?   \\
- map      & map!             & maxIndex & member?   & members \\
- minIndex & more?            & new      & parts     & qelt    \\
- qsetelt! & reduce           & reduce   & reduce    & remove  \\
- remove   & removeDuplicates & sample   & select    & setelt  \\
- setelt   & size?            & swap!    & ?\~{}=?   & \#?     \\
- ?=?      & ?.?              &&&\\
+\cross{LNAGG}{any?} &
+\cross{LNAGG}{coerce} &
+\cross{LNAGG}{concat} &
+\cross{LNAGG}{construct} &
+\cross{LNAGG}{convert} \\
+\cross{LNAGG}{copy} &
+\cross{LNAGG}{count} &
+\cross{LNAGG}{delete} &
+\cross{LNAGG}{elt} &
+\cross{LNAGG}{empty} \\
+\cross{LNAGG}{empty?} &
+\cross{LNAGG}{entries} &
+\cross{LNAGG}{entry?} &
+\cross{LNAGG}{eq?} &
+\cross{LNAGG}{eval} \\
+\cross{LNAGG}{every?} &
+\cross{LNAGG}{fill!} &
+\cross{LNAGG}{find} &
+\cross{LNAGG}{first} &
+\cross{LNAGG}{hash} \\
+\cross{LNAGG}{index?} &
+\cross{LNAGG}{indices} &
+\cross{LNAGG}{insert} &
+\cross{LNAGG}{latex} &
+\cross{LNAGG}{less?} \\
+\cross{LNAGG}{map} &
+\cross{LNAGG}{map!} &
+\cross{LNAGG}{maxIndex} &
+\cross{LNAGG}{member?} &
+\cross{LNAGG}{members} \\
+\cross{LNAGG}{minIndex} &
+\cross{LNAGG}{more?} &
+\cross{LNAGG}{new} &
+\cross{LNAGG}{parts} &
+\cross{LNAGG}{qelt} \\
+\cross{LNAGG}{qsetelt!} &
+\cross{LNAGG}{reduce} &
+\cross{LNAGG}{reduce} &
+\cross{LNAGG}{reduce} &
+\cross{LNAGG}{remove} \\
+\cross{LNAGG}{remove} &
+\cross{LNAGG}{removeDuplicates} &
+\cross{LNAGG}{sample} &
+\cross{LNAGG}{select} &
+\cross{LNAGG}{setelt} \\
+\cross{LNAGG}{setelt} &
+\cross{LNAGG}{size?} &
+\cross{LNAGG}{swap!} &
+\cross{LNAGG}{?\~{}=?} &
+\cross{LNAGG}{\#?} \\
+\cross{LNAGG}{?=?} &
+\cross{LNAGG}{?.?} &&&
 \end{tabular}
 
-\cross{LNAGG}{any?}
-\cross{LNAGG}{coerce}
-\cross{LNAGG}{concat}
-\cross{LNAGG}{construct}
-\cross{LNAGG}{convert}
-\cross{LNAGG}{copy}
-\cross{LNAGG}{count}
-\cross{LNAGG}{delete}
-\cross{LNAGG}{elt}
-\cross{LNAGG}{empty}
-\cross{LNAGG}{empty?}
-\cross{LNAGG}{entries}
-\cross{LNAGG}{entry?}
-\cross{LNAGG}{eq?}
-\cross{LNAGG}{eval}
-\cross{LNAGG}{every?}
-\cross{LNAGG}{fill!}
-\cross{LNAGG}{find}
-\cross{LNAGG}{first}
-\cross{LNAGG}{hash}
-\cross{LNAGG}{index?}
-\cross{LNAGG}{indices}
-\cross{LNAGG}{insert}
-\cross{LNAGG}{latex}
-\cross{LNAGG}{less?}
-\cross{LNAGG}{map}
-\cross{LNAGG}{map!}
-\cross{LNAGG}{maxIndex}
-\cross{LNAGG}{member?}
-\cross{LNAGG}{members}
-\cross{LNAGG}{minIndex}
-\cross{LNAGG}{more?}
-\cross{LNAGG}{new}
-\cross{LNAGG}{parts}
-\cross{LNAGG}{qelt}
-\cross{LNAGG}{qsetelt!}
-\cross{LNAGG}{reduce}
-\cross{LNAGG}{reduce}
-\cross{LNAGG}{reduce}
-\cross{LNAGG}{remove}
-\cross{LNAGG}{remove}
-\cross{LNAGG}{removeDuplicates}
-\cross{LNAGG}{sample}
-\cross{LNAGG}{select}
-\cross{LNAGG}{setelt}
-\cross{LNAGG}{setelt}
-\cross{LNAGG}{size?}
-\cross{LNAGG}{swap!}
-\cross{LNAGG}{?\~{}=?}
-\cross{LNAGG}{\#?}
-\cross{LNAGG}{?=?}
-\cross{LNAGG}{?.?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  concat : (%,%) -> %
@@ -4425,28 +4479,25 @@ digraph pic {
 \pagefrom{OrderedSet}{ORDSET}
 
 {\bf Exports:}\\
-\begin{tabular}{llllllll}
- 0       & coerce & hash & latex & max    & min & sample & zero?\\
- ?\~{}=? & ?*?    & ?+?  & ?$<$? & ?$<=$? & ?=? & ?$>$?  & ?$>=$?
+\begin{tabular}{lllll}
+\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}{?$>=$?} &&&&
 \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              
@@ -4559,31 +4610,27 @@ digraph pic {
 \pagefrom{OrderedSet}{ORDSET}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- 1      & coerce & hash   & latex  & max     & min\\
- one?   & recip  & sample & ?*?    & ?**?    & ?$<$?\\
- ?$<=$? & ?=?    & ?$>$?  & ?$>=$? & ?\~{}=? & ?\^{}?\\
+\begin{tabular}{lllll}
+\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}{?\^{}?} &&
 \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 : () -> %
@@ -4704,45 +4751,39 @@ digraph pic {
 \pagefrom{BagAggregate}{BGAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?  & bag     & copy    & coerce   & count  & empty   & empty? \\
- eq?   & eval    & every?  & extract! & hash   & insert! & inspect \\
- latex & less?   & map     & map!     & max    & member? & members \\
- merge & merge!  & more?   & parts    & sample & size?   & \#?     \\
- ?=?   & ?\~{}=? &\\
+\begin{tabular}{lllll}
+\cross{PRQAGG}{any?} &
+\cross{PRQAGG}{bag} &
+\cross{PRQAGG}{copy} &
+\cross{PRQAGG}{coerce} &
+\cross{PRQAGG}{count} \\
+\cross{PRQAGG}{empty} &
+\cross{PRQAGG}{empty?} &
+\cross{PRQAGG}{eq?} &
+\cross{PRQAGG}{eval} &
+\cross{PRQAGG}{every?} \\
+\cross{PRQAGG}{extract!} &
+\cross{PRQAGG}{hash} &
+\cross{PRQAGG}{insert!} &
+\cross{PRQAGG}{inspect} &
+\cross{PRQAGG}{latex} \\
+\cross{PRQAGG}{less?} &
+\cross{PRQAGG}{map} &
+\cross{PRQAGG}{map!} &
+\cross{PRQAGG}{max} &
+\cross{PRQAGG}{member?} \\
+\cross{PRQAGG}{members} &
+\cross{PRQAGG}{merge} &
+\cross{PRQAGG}{merge!} &
+\cross{PRQAGG}{more?} &
+\cross{PRQAGG}{parts} \\
+\cross{PRQAGG}{sample} &
+\cross{PRQAGG}{size?} &
+\cross{PRQAGG}{\#?} &
+\cross{PRQAGG}{?=?} &
+\cross{PRQAGG}{?\~{}=?} \\
 \end{tabular}
 
-\cross{PRQAGG}{any?}
-\cross{PRQAGG}{bag}
-\cross{PRQAGG}{copy}
-\cross{PRQAGG}{coerce}
-\cross{PRQAGG}{count}
-\cross{PRQAGG}{empty}
-\cross{PRQAGG}{empty?}
-\cross{PRQAGG}{eq?}
-\cross{PRQAGG}{eval}
-\cross{PRQAGG}{every?}
-\cross{PRQAGG}{extract!}
-\cross{PRQAGG}{hash}
-\cross{PRQAGG}{insert!}
-\cross{PRQAGG}{inspect}
-\cross{PRQAGG}{latex}
-\cross{PRQAGG}{less?}
-\cross{PRQAGG}{map}
-\cross{PRQAGG}{map!}
-\cross{PRQAGG}{max}
-\cross{PRQAGG}{member?}
-\cross{PRQAGG}{members}
-\cross{PRQAGG}{merge}
-\cross{PRQAGG}{merge!}
-\cross{PRQAGG}{more?}
-\cross{PRQAGG}{parts}
-\cross{PRQAGG}{sample}
-\cross{PRQAGG}{size?}
-\cross{PRQAGG}{\#?}
-\cross{PRQAGG}{?=?}
-\cross{PRQAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  max : % -> S
@@ -4874,48 +4915,42 @@ digraph pic {
 \pagefrom{BagAggregate}{BGAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?   & bag    & back     & coerce  & copy    & count  & dequeue! \\
- empty  & empty? & enqueue! & eq?     & eval    & every? & extract! \\
- front  & hash   & insert!  & inspect & latex   & length & less?    \\
- map    & map!   & member?  & members & more?   & parts  & rotate!  \\
- sample & size?  & \#?      & ?=?     & ?\~{}=? &&\\
+\begin{tabular}{lllll}
+\cross{QUAGG}{any?} &
+\cross{QUAGG}{bag} &
+\cross{QUAGG}{back} &
+\cross{QUAGG}{coerce} &
+\cross{QUAGG}{copy} \\
+\cross{QUAGG}{count} &
+\cross{QUAGG}{dequeue!} &
+\cross{QUAGG}{empty} &
+\cross{QUAGG}{empty?} &
+\cross{QUAGG}{enqueue!} \\
+\cross{QUAGG}{eq?} &
+\cross{QUAGG}{eval} &
+\cross{QUAGG}{every?} &
+\cross{QUAGG}{extract!} &
+\cross{QUAGG}{front} \\
+\cross{QUAGG}{hash} &
+\cross{QUAGG}{insert!} &
+\cross{QUAGG}{inspect} &
+\cross{QUAGG}{latex} &
+\cross{QUAGG}{length} \\
+\cross{QUAGG}{less?} &
+\cross{QUAGG}{map} &
+\cross{QUAGG}{map!} &
+\cross{QUAGG}{member?} &
+\cross{QUAGG}{members} \\
+\cross{QUAGG}{more?} &
+\cross{QUAGG}{parts} &
+\cross{QUAGG}{rotate!} &
+\cross{QUAGG}{sample} &
+\cross{QUAGG}{size?} \\
+\cross{QUAGG}{\#?} &
+\cross{QUAGG}{?=?} &
+\cross{QUAGG}{?\~{}=?} &&
 \end{tabular}
 
-\cross{QUAGG}{any?}
-\cross{QUAGG}{bag}
-\cross{QUAGG}{back}
-\cross{QUAGG}{coerce}
-\cross{QUAGG}{copy}
-\cross{QUAGG}{count}
-\cross{QUAGG}{dequeue!}
-\cross{QUAGG}{empty}
-\cross{QUAGG}{empty?}
-\cross{QUAGG}{enqueue!}
-\cross{QUAGG}{eq?}
-\cross{QUAGG}{eval}
-\cross{QUAGG}{every?}
-\cross{QUAGG}{extract!}
-\cross{QUAGG}{front}
-\cross{QUAGG}{hash}
-\cross{QUAGG}{insert!}
-\cross{QUAGG}{inspect}
-\cross{QUAGG}{latex}
-\cross{QUAGG}{length}
-\cross{QUAGG}{less?}
-\cross{QUAGG}{map}
-\cross{QUAGG}{map!}
-\cross{QUAGG}{member?}
-\cross{QUAGG}{members}
-\cross{QUAGG}{more?}
-\cross{QUAGG}{parts}
-\cross{QUAGG}{rotate!}
-\cross{QUAGG}{sample}
-\cross{QUAGG}{size?}
-\cross{QUAGG}{\#?}
-\cross{QUAGG}{?=?}
-\cross{QUAGG}{?\~{}=?}
-
 These are implemented by this category:
 \begin{verbatim}
  back : % -> S                        
@@ -5060,55 +5095,46 @@ digraph pic {
 
 {\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 & \#?\\
- ?$<$?       & ?=?     & ?\~{}=?    &&
+\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}{?\~{}=?} &&
 \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 -> %
@@ -5345,46 +5371,40 @@ digraph pic {
 \pagefrom{BagAggregate}{BGAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?    & bag   & coerce  & copy   & count    & depth   & empty \\
- empty?  & eq?   & eval    & every? & extract! & hash    & insert! \\
- inspect & latex & less?   & map    & map!     & member? & members \\
- more?   & parts & pop!    & push!  & sample   & size?   & top \\
- \#?     & ?=?   & ?\~{}=? &&&&\\
+\begin{tabular}{lllll}
+\cross{SKAGG}{any?} &
+\cross{SKAGG}{bag} &
+\cross{SKAGG}{coerce} &
+\cross{SKAGG}{copy} &
+\cross{SKAGG}{count} \\
+\cross{SKAGG}{depth} &
+\cross{SKAGG}{empty} &
+\cross{SKAGG}{empty?} &
+\cross{SKAGG}{eq?} &
+\cross{SKAGG}{eval} \\
+\cross{SKAGG}{every?} &
+\cross{SKAGG}{extract!} &
+\cross{SKAGG}{hash} &
+\cross{SKAGG}{insert!} &
+\cross{SKAGG}{inspect} \\
+\cross{SKAGG}{latex} &
+\cross{SKAGG}{less?} &
+\cross{SKAGG}{map} &
+\cross{SKAGG}{map!} &
+\cross{SKAGG}{member?} \\
+\cross{SKAGG}{members} &
+\cross{SKAGG}{more?} &
+\cross{SKAGG}{parts} &
+\cross{SKAGG}{pop!} &
+\cross{SKAGG}{push!} \\
+\cross{SKAGG}{sample} &
+\cross{SKAGG}{size?} &
+\cross{SKAGG}{top} &
+\cross{SKAGG}{\#?} &
+\cross{SKAGG}{?=?} \\
+\cross{SKAGG}{?\~{}=?} &&&&
 \end{tabular}
 
-\cross{SKAGG}{any?}
-\cross{SKAGG}{bag}
-\cross{SKAGG}{coerce}
-\cross{SKAGG}{copy}
-\cross{SKAGG}{count}
-\cross{SKAGG}{depth}
-\cross{SKAGG}{empty}
-\cross{SKAGG}{empty?}
-\cross{SKAGG}{eq?}
-\cross{SKAGG}{eval}
-\cross{SKAGG}{every?}
-\cross{SKAGG}{extract!}
-\cross{SKAGG}{hash}
-\cross{SKAGG}{insert!}
-\cross{SKAGG}{inspect}
-\cross{SKAGG}{latex}
-\cross{SKAGG}{less?}
-\cross{SKAGG}{map}
-\cross{SKAGG}{map!}
-\cross{SKAGG}{member?}
-\cross{SKAGG}{members}
-\cross{SKAGG}{more?}
-\cross{SKAGG}{parts}
-\cross{SKAGG}{pop!}
-\cross{SKAGG}{push!}
-\cross{SKAGG}{sample}
-\cross{SKAGG}{size?}
-\cross{SKAGG}{top}
-\cross{SKAGG}{\#?}
-\cross{SKAGG}{?=?}
-\cross{SKAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  depth : % -> NonNegativeInteger       
@@ -5518,75 +5538,63 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?        & children  & child?       & coerce     & concat     \\
- concat!     & copy      & count        & cycleEntry & cycleLength\\
- cycleSplit! & cycleTail & cyclic?      & distance   & empty      \\
- empty?      & eq?       & eval         & every?     & first      \\
- hash        & last      & latex        & leaf?      & leaves     \\
- less?       & map       & map!         & member?    & members    \\
- more?       & nodes     & node?        & parts      & rest       \\
- sample      & second    & setchildren! & setelt     & setfirst!  \\
- setlast!    & setrest!  & setvalue!    & size?      & split!     \\
- tail        & third     & value        & \#?        & ?.last     \\
- ?.rest      & ?.first   & ?.value      & ?=?        & ?\~{}=?    \\
+\cross{URAGG}{any?} &
+\cross{URAGG}{children} &
+\cross{URAGG}{child?} &
+\cross{URAGG}{coerce} &
+\cross{URAGG}{concat} \\
+\cross{URAGG}{concat!} &
+\cross{URAGG}{copy} &
+\cross{URAGG}{count} &
+\cross{URAGG}{cycleEntry} &
+\cross{URAGG}{cycleLength} \\
+\cross{URAGG}{cycleSplit!} &
+\cross{URAGG}{cycleTail} &
+\cross{URAGG}{cyclic?} &
+\cross{URAGG}{distance} &
+\cross{URAGG}{empty} \\
+\cross{URAGG}{empty?} &
+\cross{URAGG}{eq?} &
+\cross{URAGG}{eval} &
+\cross{URAGG}{every?} &
+\cross{URAGG}{first} \\
+\cross{URAGG}{hash} &
+\cross{URAGG}{last} &
+\cross{URAGG}{latex} &
+\cross{URAGG}{leaf?} &
+\cross{URAGG}{leaves} \\
+\cross{URAGG}{less?} &
+\cross{URAGG}{map} &
+\cross{URAGG}{map!} &
+\cross{URAGG}{member?} &
+\cross{URAGG}{members} \\
+\cross{URAGG}{more?} &
+\cross{URAGG}{nodes} &
+\cross{URAGG}{node?} &
+\cross{URAGG}{parts} &
+\cross{URAGG}{rest} \\
+\cross{URAGG}{sample} &
+\cross{URAGG}{second} &
+\cross{URAGG}{setchildren!} &
+\cross{URAGG}{setelt} &
+\cross{URAGG}{setfirst!} \\
+\cross{URAGG}{setlast!} &
+\cross{URAGG}{setrest!} &
+\cross{URAGG}{setvalue!} &
+\cross{URAGG}{size?} &
+\cross{URAGG}{split!} \\
+\cross{URAGG}{tail} &
+\cross{URAGG}{third} &
+\cross{URAGG}{value} &
+\cross{URAGG}{\#?} &
+\cross{URAGG}{?.last} \\
+\cross{URAGG}{?.rest} &
+\cross{URAGG}{?.first} &
+\cross{URAGG}{?.value} &
+\cross{URAGG}{?=?} &
+\cross{URAGG}{?\~{}=?} \\
 \end{tabular}
 
-\cross{URAGG}{any?}
-\cross{URAGG}{children}
-\cross{URAGG}{child?}
-\cross{URAGG}{coerce}
-\cross{URAGG}{concat}
-\cross{URAGG}{concat!}
-\cross{URAGG}{copy}
-\cross{URAGG}{count}
-\cross{URAGG}{cycleEntry}
-\cross{URAGG}{cycleLength}
-\cross{URAGG}{cycleSplit!}
-\cross{URAGG}{cycleTail}
-\cross{URAGG}{cyclic?}
-\cross{URAGG}{distance}
-\cross{URAGG}{empty}
-\cross{URAGG}{empty?}
-\cross{URAGG}{eq?}
-\cross{URAGG}{eval}
-\cross{URAGG}{every?}
-\cross{URAGG}{first}
-\cross{URAGG}{hash}
-\cross{URAGG}{last}
-\cross{URAGG}{latex}
-\cross{URAGG}{leaf?}
-\cross{URAGG}{leaves}
-\cross{URAGG}{less?}
-\cross{URAGG}{map}
-\cross{URAGG}{map!}
-\cross{URAGG}{member?}
-\cross{URAGG}{members}
-\cross{URAGG}{more?}
-\cross{URAGG}{nodes}
-\cross{URAGG}{node?}
-\cross{URAGG}{parts}
-\cross{URAGG}{rest}
-\cross{URAGG}{sample}
-\cross{URAGG}{second}
-\cross{URAGG}{setchildren!}
-\cross{URAGG}{setelt}
-\cross{URAGG}{setfirst!}
-\cross{URAGG}{setlast!}
-\cross{URAGG}{setrest!}
-\cross{URAGG}{setvalue!}
-\cross{URAGG}{size?}
-\cross{URAGG}{split!}
-\cross{URAGG}{tail}
-\cross{URAGG}{third}
-\cross{URAGG}{value}
-\cross{URAGG}{\#?}
-\cross{URAGG}{?.last}
-\cross{URAGG}{?.rest}
-\cross{URAGG}{?.first}
-\cross{URAGG}{?.value}
-\cross{URAGG}{?=?}
-\cross{URAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  concat : (S,%) -> %
@@ -5980,30 +5988,29 @@ digraph pic {
 \pagepic{ps/v102abeliangroup.ps}{ABELGRP}{0.75}
 
 {\bf See:}\\
+\pageto{LeftModule}{LMODULE}
+\pageto{OrderedAbelianGroup}{OAGROUP}
+\pageto{RightModule}{RMODULE}
 \pageto{Rng}{RNG}
 \pagefrom{CancellationAbelianMonoid}{CABMON}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- 0       & coerce & hash & latex & sample & subtractIfCan & zero?\\
- ?\~{}=? & ?*?    & ?+?   & ?-?  & -?     & ?=?           &
+\begin{tabular}{lllll}
+\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}{?=?} &&
 \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}
  -? : % -> %                          
@@ -6128,55 +6135,46 @@ digraph pic {
 \pagefrom{DictionaryOperations}{DIOPS}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?   & bag     & coerce     & construct & convert          \\
- copy   & count   & dictionary & empty     & empty?           \\
- eq?    & eval    & every?     & extract!  & find             \\
- hash   & insert! & inspect    & latex     & less?            \\
- map    & map!    & member?    & members   & more?            \\
- parts  & reduce  & remove     & remove!   & removeDuplicates \\
- sample & select  & select!    & size?     & \#?              \\
- ?\~{}=? & ?=?      &&&\\
+\begin{tabular}{lllll}
+\cross{DIAGG}{any?} &
+\cross{DIAGG}{bag} &
+\cross{DIAGG}{coerce} &
+\cross{DIAGG}{construct} &
+\cross{DIAGG}{convert} \\
+\cross{DIAGG}{copy} &
+\cross{DIAGG}{count} &
+\cross{DIAGG}{dictionary} &
+\cross{DIAGG}{empty} &
+\cross{DIAGG}{empty?} \\
+\cross{DIAGG}{eq?} &
+\cross{DIAGG}{eval} &
+\cross{DIAGG}{every?} &
+\cross{DIAGG}{extract!} &
+\cross{DIAGG}{find} \\
+\cross{DIAGG}{hash} &
+\cross{DIAGG}{insert!} &
+\cross{DIAGG}{inspect} &
+\cross{DIAGG}{latex} &
+\cross{DIAGG}{less?} \\
+\cross{DIAGG}{map} &
+\cross{DIAGG}{map!} &
+\cross{DIAGG}{member?} &
+\cross{DIAGG}{members} &
+\cross{DIAGG}{more?} \\
+\cross{DIAGG}{parts} &
+\cross{DIAGG}{reduce} &
+\cross{DIAGG}{remove} &
+\cross{DIAGG}{remove!} &
+\cross{DIAGG}{removeDuplicates} \\
+\cross{DIAGG}{sample} &
+\cross{DIAGG}{select} &
+\cross{DIAGG}{select!} &
+\cross{DIAGG}{size?} &
+\cross{DIAGG}{\#?} \\
+\cross{DIAGG}{?\~{}=?} &
+\cross{DIAGG}{?=?} &&&
 \end{tabular}
 
-\cross{DIAGG}{any?}
-\cross{DIAGG}{bag}
-\cross{DIAGG}{coerce}
-\cross{DIAGG}{construct}
-\cross{DIAGG}{convert}
-\cross{DIAGG}{copy}
-\cross{DIAGG}{count}
-\cross{DIAGG}{dictionary}
-\cross{DIAGG}{empty}
-\cross{DIAGG}{empty?}
-\cross{DIAGG}{eq?}
-\cross{DIAGG}{eval}
-\cross{DIAGG}{every?}
-\cross{DIAGG}{extract!}
-\cross{DIAGG}{find}
-\cross{DIAGG}{hash}
-\cross{DIAGG}{insert!}
-\cross{DIAGG}{inspect}
-\cross{DIAGG}{latex}
-\cross{DIAGG}{less?}
-\cross{DIAGG}{map}
-\cross{DIAGG}{map!}
-\cross{DIAGG}{member?}
-\cross{DIAGG}{members}
-\cross{DIAGG}{more?}
-\cross{DIAGG}{parts}
-\cross{DIAGG}{reduce}
-\cross{DIAGG}{remove}
-\cross{DIAGG}{remove!}
-\cross{DIAGG}{removeDuplicates}
-\cross{DIAGG}{sample}
-\cross{DIAGG}{select}
-\cross{DIAGG}{select!}
-\cross{DIAGG}{size?}
-\cross{DIAGG}{\#?}
-\cross{DIAGG}{?\~{}=?}
-\cross{DIAGG}{?=?}
-
 These are implemented by this category:
 \begin{verbatim}
  dictionary : List S -> %
@@ -6349,65 +6347,54 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?    & back     & bag            & bottom!       & coerce \\
- copy    & count    & depth          & dequeue       & dequeue! \\
- empty   & empty?   & enqueue!       & eq?           & eval \\
- every?  & extract! & extractBottom! & extractTop!   & front \\
- hash    & height   & insert!        & insertBottom! & insertTop! \\
- inspect & latex    & length         & less?         & map \\
- map!    & members  & member?        & more?         & parts \\
- pop!    & push!    & reverse!       & rotate!       & sample \\
- size?   & top      & top!           & \#?           & ?=? \\
- ?\~{}=? &&&&\\
+\cross{DQAGG}{any?} &
+\cross{DQAGG}{back} &
+\cross{DQAGG}{bag} &
+\cross{DQAGG}{bottom!} &
+\cross{DQAGG}{coerce} \\
+\cross{DQAGG}{copy} &
+\cross{DQAGG}{count} &
+\cross{DQAGG}{depth} &
+\cross{DQAGG}{dequeue} &
+\cross{DQAGG}{dequeue!} \\
+\cross{DQAGG}{empty} &
+\cross{DQAGG}{empty?} &
+\cross{DQAGG}{enqueue!} &
+\cross{DQAGG}{eq?} &
+\cross{DQAGG}{eval} \\
+\cross{DQAGG}{every?} &
+\cross{DQAGG}{extract!} &
+\cross{DQAGG}{extractBottom!} &
+\cross{DQAGG}{extractTop!} &
+\cross{DQAGG}{front} \\
+\cross{DQAGG}{hash} &
+\cross{DQAGG}{height} &
+\cross{DQAGG}{insert!} &
+\cross{DQAGG}{insertBottom!} &
+\cross{DQAGG}{insertTop!} \\
+\cross{DQAGG}{inspect} &
+\cross{DQAGG}{latex} &
+\cross{DQAGG}{length} &
+\cross{DQAGG}{less?} &
+\cross{DQAGG}{map} \\
+\cross{DQAGG}{map!} &
+\cross{DQAGG}{members} &
+\cross{DQAGG}{member?} &
+\cross{DQAGG}{more?} &
+\cross{DQAGG}{parts} \\
+\cross{DQAGG}{pop!} &
+\cross{DQAGG}{push!} &
+\cross{DQAGG}{reverse!} &
+\cross{DQAGG}{rotate!} &
+\cross{DQAGG}{sample} \\
+\cross{DQAGG}{size?} &
+\cross{DQAGG}{top} &
+\cross{DQAGG}{top!} &
+\cross{DQAGG}{\#?} &
+\cross{DQAGG}{?=?} \\
+\cross{DQAGG}{?\~{}=?} &&&&
 \end{tabular}
 
-\cross{DQAGG}{any?}
-\cross{DQAGG}{back}
-\cross{DQAGG}{bag}
-\cross{DQAGG}{bottom!}
-\cross{DQAGG}{coerce}
-\cross{DQAGG}{copy}
-\cross{DQAGG}{count}
-\cross{DQAGG}{depth}
-\cross{DQAGG}{dequeue}
-\cross{DQAGG}{dequeue!}
-\cross{DQAGG}{empty}
-\cross{DQAGG}{empty?}
-\cross{DQAGG}{enqueue!}
-\cross{DQAGG}{eq?}
-\cross{DQAGG}{eval}
-\cross{DQAGG}{every?}
-\cross{DQAGG}{extract!}
-\cross{DQAGG}{extractBottom!}
-\cross{DQAGG}{extractTop!}
-\cross{DQAGG}{front}
-\cross{DQAGG}{hash}
-\cross{DQAGG}{height}
-\cross{DQAGG}{insert!}
-\cross{DQAGG}{insertBottom!}
-\cross{DQAGG}{insertTop!}
-\cross{DQAGG}{inspect}
-\cross{DQAGG}{latex}
-\cross{DQAGG}{length}
-\cross{DQAGG}{less?}
-\cross{DQAGG}{map}
-\cross{DQAGG}{map!}
-\cross{DQAGG}{members}
-\cross{DQAGG}{member?}
-\cross{DQAGG}{more?}
-\cross{DQAGG}{parts}
-\cross{DQAGG}{pop!}
-\cross{DQAGG}{push!}
-\cross{DQAGG}{reverse!}
-\cross{DQAGG}{rotate!}
-\cross{DQAGG}{sample}
-\cross{DQAGG}{size?}
-\cross{DQAGG}{top}
-\cross{DQAGG}{top!}
-\cross{DQAGG}{\#?}
-\cross{DQAGG}{?=?}
-\cross{DQAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  bottom! : % -> S                     
@@ -6582,75 +6569,63 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?     & coerce  & concat  & concat!          & construct \\
- copy     & convert & count   & delete           & delete! \\
- elt      & empty   & empty?  & entries          & entry? \\
- eval     & every?  & eq?     & fill!            & find \\
- first    & hash    & index?  & indices          & insert \\
- insert!  & latex   & less?   & map              & map! \\
- maxIndex & member? & members & merge!           & minIndex \\
- more?    & new     & parts   & qelt             & qsetelt! \\
- reduce   & remove  & remove! & removeDuplicates & removeDuplicates! \\
- sample   & select  & select! & setelt           & size? \\
- swap!    & \#?     & ?=?     & ?.?              & ?\~{}=? \\
+\cross{ELAGG}{any?} &
+\cross{ELAGG}{coerce} &
+\cross{ELAGG}{concat} &
+\cross{ELAGG}{concat!} &
+\cross{ELAGG}{construct} \\
+\cross{ELAGG}{copy} &
+\cross{ELAGG}{convert} &
+\cross{ELAGG}{count} &
+\cross{ELAGG}{delete} &
+\cross{ELAGG}{delete!} \\
+\cross{ELAGG}{elt} &
+\cross{ELAGG}{empty} &
+\cross{ELAGG}{empty?} &
+\cross{ELAGG}{entries} &
+\cross{ELAGG}{entry?} \\
+\cross{ELAGG}{eval} &
+\cross{ELAGG}{every?} &
+\cross{ELAGG}{eq?} &
+\cross{ELAGG}{fill!} &
+\cross{ELAGG}{find} \\
+\cross{ELAGG}{first} &
+\cross{ELAGG}{hash} &
+\cross{ELAGG}{index?} &
+\cross{ELAGG}{indices} &
+\cross{ELAGG}{insert} \\
+\cross{ELAGG}{insert!} &
+\cross{ELAGG}{latex} &
+\cross{ELAGG}{less?} &
+\cross{ELAGG}{map} &
+\cross{ELAGG}{map!} \\
+\cross{ELAGG}{maxIndex} &
+\cross{ELAGG}{member?} &
+\cross{ELAGG}{members} &
+\cross{ELAGG}{merge!} &
+\cross{ELAGG}{minIndex} \\
+\cross{ELAGG}{more?} &
+\cross{ELAGG}{new} &
+\cross{ELAGG}{parts} &
+\cross{ELAGG}{qelt} &
+\cross{ELAGG}{qsetelt!} \\
+\cross{ELAGG}{reduce} &
+\cross{ELAGG}{remove} &
+\cross{ELAGG}{remove!} &
+\cross{ELAGG}{removeDuplicates} &
+\cross{ELAGG}{removeDuplicates!} \\
+\cross{ELAGG}{sample} &
+\cross{ELAGG}{select} &
+\cross{ELAGG}{select!} &
+\cross{ELAGG}{setelt} &
+\cross{ELAGG}{size?} \\
+\cross{ELAGG}{swap!} &
+\cross{ELAGG}{\#?} &
+\cross{ELAGG}{?=?} &
+\cross{ELAGG}{?.?} &
+\cross{ELAGG}{?\~{}=? } \\
 \end{tabular}
 
-\cross{ELAGG}{any?}
-\cross{ELAGG}{coerce}
-\cross{ELAGG}{concat}
-\cross{ELAGG}{concat!}
-\cross{ELAGG}{construct}
-\cross{ELAGG}{copy}
-\cross{ELAGG}{convert}
-\cross{ELAGG}{count}
-\cross{ELAGG}{delete}
-\cross{ELAGG}{delete!}
-\cross{ELAGG}{elt}
-\cross{ELAGG}{empty}
-\cross{ELAGG}{empty?}
-\cross{ELAGG}{entries}
-\cross{ELAGG}{entry?}
-\cross{ELAGG}{eval}
-\cross{ELAGG}{every?}
-\cross{ELAGG}{eq?}
-\cross{ELAGG}{fill!}
-\cross{ELAGG}{find}
-\cross{ELAGG}{first}
-\cross{ELAGG}{hash}
-\cross{ELAGG}{index?}
-\cross{ELAGG}{indices}
-\cross{ELAGG}{insert}
-\cross{ELAGG}{insert!}
-\cross{ELAGG}{latex}
-\cross{ELAGG}{less?}
-\cross{ELAGG}{map}
-\cross{ELAGG}{map!}
-\cross{ELAGG}{maxIndex}
-\cross{ELAGG}{member?}
-\cross{ELAGG}{members}
-\cross{ELAGG}{merge!}
-\cross{ELAGG}{minIndex}
-\cross{ELAGG}{more?}
-\cross{ELAGG}{new}
-\cross{ELAGG}{parts}
-\cross{ELAGG}{qelt}
-\cross{ELAGG}{qsetelt!}
-\cross{ELAGG}{reduce}
-\cross{ELAGG}{remove}
-\cross{ELAGG}{remove!}
-\cross{ELAGG}{removeDuplicates}
-\cross{ELAGG}{removeDuplicates!}
-\cross{ELAGG}{sample}
-\cross{ELAGG}{select}
-\cross{ELAGG}{select!}
-\cross{ELAGG}{setelt}
-\cross{ELAGG}{size?}
-\cross{ELAGG}{swap!}
-\cross{ELAGG}{\#?}
-\cross{ELAGG}{?=?}
-\cross{ELAGG}{?.?}
-\cross{ELAGG}{?\~{}=? }
-
 These are directly exported but not implemented:
 \begin{verbatim}
  concat! : (%,S) -> %
@@ -6881,84 +6856,72 @@ digraph pic {
 \pagefrom{OrderedSet}{ORDSET}
 
 {\bf Exports:}\\
-\begin{tabular}{llllll}
- any?      & coerce  & concat   & construct & convert  & copy \\
- copyInto! & count   & delete   & elt       & empty    & empty? \\
- entries   & entry?  & eq?      & eval      & every?   & fill! \\
- find      & first   & hash     & index?    & indices  & insert \\
- latex     & less?   & map      & map!      & max      & maxIndex \\
- member?   & members & merge    & min       & minIndex & more? \\
- new       & parts   & position & qelt      & qsetelt! & reduce \\
- remove    & removeDuplicates   & reverse   & reverse! & sample & select \\
- setelt    & size?   & sort     & sort!     & sorted?  & swap! \\
- \#?       & ?.?     & ?.?      & ?$<$?     & ?$<=$?     & ?=? \\
- ?$>$?     & ?$>=$?  & ?\~{}=?  &&&\\
+\begin{tabular}{lllll}
+\cross{FLAGG}{any?} &
+\cross{FLAGG}{coerce} &
+\cross{FLAGG}{concat} &
+\cross{FLAGG}{construct} &
+\cross{FLAGG}{convert} \\
+\cross{FLAGG}{copy} &
+\cross{FLAGG}{copyInto!} &
+\cross{FLAGG}{count} &
+\cross{FLAGG}{delete} &
+\cross{FLAGG}{elt} \\
+\cross{FLAGG}{empty} &
+\cross{FLAGG}{empty?} &
+\cross{FLAGG}{entries} &
+\cross{FLAGG}{entry?} &
+\cross{FLAGG}{eq?} \\
+\cross{FLAGG}{eval} &
+\cross{FLAGG}{every?} &
+\cross{FLAGG}{fill!} &
+\cross{FLAGG}{find} &
+\cross{FLAGG}{first} \\
+\cross{FLAGG}{hash} &
+\cross{FLAGG}{index?} &
+\cross{FLAGG}{indices} &
+\cross{FLAGG}{insert} &
+\cross{FLAGG}{latex} \\
+\cross{FLAGG}{less?} &
+\cross{FLAGG}{map} &
+\cross{FLAGG}{map!} &
+\cross{FLAGG}{max} &
+\cross{FLAGG}{maxIndex} \\
+\cross{FLAGG}{member?} &
+\cross{FLAGG}{members} &
+\cross{FLAGG}{merge} &
+\cross{FLAGG}{min} &
+\cross{FLAGG}{minIndex} \\
+\cross{FLAGG}{more?} &
+\cross{FLAGG}{new} &
+\cross{FLAGG}{parts} &
+\cross{FLAGG}{position} &
+\cross{FLAGG}{qelt} \\
+\cross{FLAGG}{qsetelt!} &
+\cross{FLAGG}{reduce} &
+\cross{FLAGG}{remove} &
+\cross{FLAGG}{removeDuplicates} &
+\cross{FLAGG}{reverse} \\
+\cross{FLAGG}{reverse!} &
+\cross{FLAGG}{sample} &
+\cross{FLAGG}{select} &
+\cross{FLAGG}{setelt} &
+\cross{FLAGG}{size?} \\
+\cross{FLAGG}{sort} &
+\cross{FLAGG}{sort!} &
+\cross{FLAGG}{sorted?} &
+\cross{FLAGG}{swap!} &
+\cross{FLAGG}{\#?} \\
+\cross{FLAGG}{?.?} &
+\cross{FLAGG}{?.?} &
+\cross{FLAGG}{?$<$?} &
+\cross{FLAGG}{?$<=$?} &
+\cross{FLAGG}{?=?} \\
+\cross{FLAGG}{?$>$?} &
+\cross{FLAGG}{?$>=$?} &
+\cross{FLAGG}{?\~{}=?} &&
 \end{tabular}
 
-\cross{FLAGG}{any?}
-\cross{FLAGG}{coerce}
-\cross{FLAGG}{concat}
-\cross{FLAGG}{construct}
-\cross{FLAGG}{convert}
-\cross{FLAGG}{copy}
-\cross{FLAGG}{copyInto!}
-\cross{FLAGG}{count}
-\cross{FLAGG}{delete}
-\cross{FLAGG}{elt}
-\cross{FLAGG}{empty}
-\cross{FLAGG}{empty?}
-\cross{FLAGG}{entries}
-\cross{FLAGG}{entry?}
-\cross{FLAGG}{eq?}
-\cross{FLAGG}{eval}
-\cross{FLAGG}{every?}
-\cross{FLAGG}{fill!}
-\cross{FLAGG}{find}
-\cross{FLAGG}{first}
-\cross{FLAGG}{hash}
-\cross{FLAGG}{index?}
-\cross{FLAGG}{indices}
-\cross{FLAGG}{insert}
-\cross{FLAGG}{latex}
-\cross{FLAGG}{less?}
-\cross{FLAGG}{map}
-\cross{FLAGG}{map!}
-\cross{FLAGG}{max}
-\cross{FLAGG}{maxIndex}
-\cross{FLAGG}{member?}
-\cross{FLAGG}{members}
-\cross{FLAGG}{merge}
-\cross{FLAGG}{min}
-\cross{FLAGG}{minIndex}
-\cross{FLAGG}{more?}
-\cross{FLAGG}{new}
-\cross{FLAGG}{parts}
-\cross{FLAGG}{position}
-\cross{FLAGG}{qelt}
-\cross{FLAGG}{qsetelt!}
-\cross{FLAGG}{reduce}
-\cross{FLAGG}{remove}
-\cross{FLAGG}{removeDuplicates}
-\cross{FLAGG}{reverse}
-\cross{FLAGG}{reverse!}
-\cross{FLAGG}{sample}
-\cross{FLAGG}{select}
-\cross{FLAGG}{setelt}
-\cross{FLAGG}{size?}
-\cross{FLAGG}{sort}
-\cross{FLAGG}{sort!}
-\cross{FLAGG}{sorted?}
-\cross{FLAGG}{swap!}
-\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:
 \begin{verbatim}
  copyInto! : (%,%,Integer) -> % 
@@ -7223,56 +7186,47 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?             & bag    & coerce     & construct  & convert \\
- copy             & count  & dictionary & duplicates & empty\\
- empty?           & eq?    & eval       & every?     & extract!\\
- find             & hash   & insert!    & inspect    & latex\\
- less?            & map    & map!       & member?    & members\\
- more?            & parts  & reduce     & remove     & remove! \\
- removeDuplicates & removeDuplicates!   & sample & select & select!\\
- size?            & \#?    &  ?=?       & ?\~{}=?    &\\
+\cross{MDAGG}{any?} &
+\cross{MDAGG}{bag} &
+\cross{MDAGG}{coerce} &
+\cross{MDAGG}{construct} &
+\cross{MDAGG}{convert} \\
+\cross{MDAGG}{copy} &
+\cross{MDAGG}{count} &
+\cross{MDAGG}{dictionary} &
+\cross{MDAGG}{duplicates} &
+\cross{MDAGG}{empty} \\
+\cross{MDAGG}{empty?} &
+\cross{MDAGG}{eq?} &
+\cross{MDAGG}{eval} &
+\cross{MDAGG}{every?} &
+\cross{MDAGG}{extract!} \\
+\cross{MDAGG}{find} &
+\cross{MDAGG}{hash} &
+\cross{MDAGG}{insert!} &
+\cross{MDAGG}{inspect} &
+\cross{MDAGG}{latex} \\
+\cross{MDAGG}{less?} &
+\cross{MDAGG}{map} &
+\cross{MDAGG}{map!} &
+\cross{MDAGG}{member?} &
+\cross{MDAGG}{members} \\
+\cross{MDAGG}{more?} &
+\cross{MDAGG}{parts} &
+\cross{MDAGG}{reduce} &
+\cross{MDAGG}{remove} &
+\cross{MDAGG}{remove!} \\
+\cross{MDAGG}{removeDuplicates} &
+\cross{MDAGG}{removeDuplicates!} &
+\cross{MDAGG}{sample} &
+\cross{MDAGG}{select} &
+\cross{MDAGG}{select!} \\
+\cross{MDAGG}{size?} &
+\cross{MDAGG}{\#?} &
+\cross{MDAGG}{?=?} &
+\cross{MDAGG}{?\~{}=?} &
 \end{tabular}
 
-\cross{MDAGG}{any?}
-\cross{MDAGG}{bag}
-\cross{MDAGG}{coerce}
-\cross{MDAGG}{construct}
-\cross{MDAGG}{convert}
-\cross{MDAGG}{copy}
-\cross{MDAGG}{count}
-\cross{MDAGG}{dictionary}
-\cross{MDAGG}{duplicates}
-\cross{MDAGG}{empty}
-\cross{MDAGG}{empty?}
-\cross{MDAGG}{eq?}
-\cross{MDAGG}{eval}
-\cross{MDAGG}{every?}
-\cross{MDAGG}{extract!}
-\cross{MDAGG}{find}
-\cross{MDAGG}{hash}
-\cross{MDAGG}{insert!}
-\cross{MDAGG}{inspect}
-\cross{MDAGG}{latex}
-\cross{MDAGG}{less?}
-\cross{MDAGG}{map}
-\cross{MDAGG}{map!}
-\cross{MDAGG}{member?}
-\cross{MDAGG}{members}
-\cross{MDAGG}{more?}
-\cross{MDAGG}{parts}
-\cross{MDAGG}{reduce}
-\cross{MDAGG}{remove}
-\cross{MDAGG}{remove!}
-\cross{MDAGG}{removeDuplicates}
-\cross{MDAGG}{removeDuplicates!}
-\cross{MDAGG}{sample}
-\cross{MDAGG}{select}
-\cross{MDAGG}{select!}
-\cross{MDAGG}{size?}
-\cross{MDAGG}{\#?}
-\cross{MDAGG}{?=?}
-\cross{MDAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  insert! : (S,%,NonNegativeInteger) -> %
@@ -7422,34 +7376,31 @@ digraph pic {
 \pagepic{ps/v102orderedabelianmonoid.ps}{OAMON}{1.00}
 
 {\bf See:}\\
+\pageto{OrderedCancellationAbelianMonoid}{OCAMON}
 \pagefrom{AbelianMonoid}{ABELMON}
 \pagefrom{OrderedAbelianSemiGroup}{OASGP}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- 0      & coerce  & hash & latex & max    & min & sample \\
- zero?  & ?*?     & ?+?  & ?$<$? & ?$<=$? & ?=? & ?$>$? \\
- ?$>=$? & ?\~{}=? & ?*? &&&&
+\begin{tabular}{lllll}
+\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}{?*?} &&&
 \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             
@@ -7541,104 +7492,87 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?       & children    & child?      & coerce    & concat \\
- concat!    & construct   & convert     & copy      & count \\
- cycleEntry & cycleLength & cycleSplit! & cycleTail & cyclic? \\
- delete     & distance    & elt         & empty     & empty? \\
- entries    & entry?      & eq?         & eval      & every? \\
- explicitlyFinite?        & fill!       & find      & first & hash \\
- index?     & indices     & insert      & last      & latex \\
- leaf?      & leaves      & less?       & map       & map! \\
- maxIndex   & member?     & members     & minIndex  & more? \\
- new        & nodes       & node?       & parts     & possiblyInfinite? \\
- qelt       & qsetelt!    & reduce      & remove    & removeDuplicates \\
- rest       & sample      & second      & select    & setchildren! \\
- setelt     & setfirst!   & setlast!    & setrest!  & setvalue! \\
- size?      & split!      & swap!       & tail      & third \\
- value      & \#?         & ?=?         & ?.?       & ?.first \\
- ?.last     & ?.rest      & ?.value     & ?\~{}=?   &\\
+\cross{STAGG}{any?} &
+\cross{STAGG}{children} &
+\cross{STAGG}{child?} &
+\cross{STAGG}{coerce} &
+\cross{STAGG}{concat} \\
+\cross{STAGG}{concat!} &
+\cross{STAGG}{construct} &
+\cross{STAGG}{convert} &
+\cross{STAGG}{copy} &
+\cross{STAGG}{count} \\
+\cross{STAGG}{cycleEntry} &
+\cross{STAGG}{cycleLength} &
+\cross{STAGG}{cycleSplit!} &
+\cross{STAGG}{cycleTail} &
+\cross{STAGG}{cyclic?} \\
+\cross{STAGG}{delete} &
+\cross{STAGG}{distance} &
+\cross{STAGG}{elt} &
+\cross{STAGG}{empty} &
+\cross{STAGG}{empty?} \\
+\cross{STAGG}{entries} &
+\cross{STAGG}{entry?} &
+\cross{STAGG}{eq?} &
+\cross{STAGG}{eval} &
+\cross{STAGG}{every?} \\
+\cross{STAGG}{explicitlyFinite?} &
+\cross{STAGG}{fill!} &
+\cross{STAGG}{find} &
+\cross{STAGG}{first} &
+\cross{STAGG}{hash} \\
+\cross{STAGG}{index?} &
+\cross{STAGG}{indices} &
+\cross{STAGG}{insert} &
+\cross{STAGG}{last} &
+\cross{STAGG}{latex} \\
+\cross{STAGG}{leaf?} &
+\cross{STAGG}{leaves} &
+\cross{STAGG}{less?} &
+\cross{STAGG}{map} &
+\cross{STAGG}{map!} \\
+\cross{STAGG}{maxIndex} &
+\cross{STAGG}{member?} &
+\cross{STAGG}{members} &
+\cross{STAGG}{minIndex} &
+\cross{STAGG}{more?} \\
+\cross{STAGG}{new} &
+\cross{STAGG}{nodes} &
+\cross{STAGG}{node?} &
+\cross{STAGG}{parts} &
+\cross{STAGG}{possiblyInfinite?} \\
+\cross{STAGG}{qelt} &
+\cross{STAGG}{qsetelt!} &
+\cross{STAGG}{reduce} &
+\cross{STAGG}{remove} &
+\cross{STAGG}{removeDuplicates} \\
+\cross{STAGG}{rest} &
+\cross{STAGG}{sample} &
+\cross{STAGG}{second} &
+\cross{STAGG}{select} &
+\cross{STAGG}{setchildren!} \\
+\cross{STAGG}{setelt} &
+\cross{STAGG}{setfirst!} &
+\cross{STAGG}{setlast!} &
+\cross{STAGG}{setrest!} &
+\cross{STAGG}{setvalue!} \\
+\cross{STAGG}{size?} &
+\cross{STAGG}{split!} &
+\cross{STAGG}{swap!} &
+\cross{STAGG}{tail} &
+\cross{STAGG}{third} \\
+\cross{STAGG}{value} &
+\cross{STAGG}{\#?} &
+\cross{STAGG}{?=?} &
+\cross{STAGG}{?.?} &
+\cross{STAGG}{?.first} \\
+\cross{STAGG}{?.last} &
+\cross{STAGG}{?.rest} &
+\cross{STAGG}{?.value} &
+\cross{STAGG}{?\~{}=?} &
 \end{tabular}
 
-\cross{STAGG}{any?}
-\cross{STAGG}{children}
-\cross{STAGG}{child?}
-\cross{STAGG}{coerce}
-\cross{STAGG}{concat}
-\cross{STAGG}{concat!}
-\cross{STAGG}{construct}
-\cross{STAGG}{convert}
-\cross{STAGG}{copy}
-\cross{STAGG}{count}
-\cross{STAGG}{cycleEntry}
-\cross{STAGG}{cycleLength}
-\cross{STAGG}{cycleSplit!}
-\cross{STAGG}{cycleTail}
-\cross{STAGG}{cyclic?}
-\cross{STAGG}{delete}
-\cross{STAGG}{distance}
-\cross{STAGG}{elt}
-\cross{STAGG}{empty}
-\cross{STAGG}{empty?}
-\cross{STAGG}{entries}
-\cross{STAGG}{entry?}
-\cross{STAGG}{eq?}
-\cross{STAGG}{eval}
-\cross{STAGG}{every?}
-\cross{STAGG}{explicitlyFinite?}
-\cross{STAGG}{fill!}
-\cross{STAGG}{find}
-\cross{STAGG}{first}
-\cross{STAGG}{hash}
-\cross{STAGG}{index?}
-\cross{STAGG}{indices}
-\cross{STAGG}{insert}
-\cross{STAGG}{last}
-\cross{STAGG}{latex}
-\cross{STAGG}{leaf?}
-\cross{STAGG}{leaves}
-\cross{STAGG}{less?}
-\cross{STAGG}{map}
-\cross{STAGG}{map!}
-\cross{STAGG}{maxIndex}
-\cross{STAGG}{member?}
-\cross{STAGG}{members}
-\cross{STAGG}{minIndex}
-\cross{STAGG}{more?}
-\cross{STAGG}{new}
-\cross{STAGG}{nodes}
-\cross{STAGG}{node?}
-\cross{STAGG}{parts}
-\cross{STAGG}{possiblyInfinite?}
-\cross{STAGG}{qelt}
-\cross{STAGG}{qsetelt!}
-\cross{STAGG}{reduce}
-\cross{STAGG}{remove}
-\cross{STAGG}{removeDuplicates}
-\cross{STAGG}{rest}
-\cross{STAGG}{sample}
-\cross{STAGG}{second}
-\cross{STAGG}{select}
-\cross{STAGG}{setchildren!}
-\cross{STAGG}{setelt}
-\cross{STAGG}{setfirst!}
-\cross{STAGG}{setlast!}
-\cross{STAGG}{setrest!}
-\cross{STAGG}{setvalue!}
-\cross{STAGG}{size?}
-\cross{STAGG}{split!}
-\cross{STAGG}{swap!}
-\cross{STAGG}{tail}
-\cross{STAGG}{third}
-\cross{STAGG}{value}
-\cross{STAGG}{\#?}
-\cross{STAGG}{?=?}
-\cross{STAGG}{?.?}
-\cross{STAGG}{?.first}
-\cross{STAGG}{?.last}
-\cross{STAGG}{?.rest}
-\cross{STAGG}{?.value}
-\cross{STAGG}{?\~{}=?}
-
 These are implemented by this category:
 \begin{verbatim}
  concat : (%,%) -> %                  
@@ -7939,84 +7873,70 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?     &  coerce    &  concat  &  construct &  convert \\
- copy     &  copyInto! &  count   &  delete    &  elt \\
- empty    &  empty?    &  entries &  entry?    &  eq? \\
- eval     &  every?    &  fill!   &  find      &  first \\
- hash     &  index?    &  indices &  insert    &  latex \\
- less?    &  map       &  map!    &  max       &  maxIndex \\
- member?  &  members   &  merge   &  min       &  minIndex \\
- more?    &  new       &  parts   &  position  &  qelt \\
- qsetelt! &  reduce    &  remove  &  removeDuplicates &  reverse \\
- reverse! &  sample    &  select  &  setelt    &  size? \\
- sort     &  sort!     &  sorted? &  swap!     &  \#? \\
- ?.?      &  ?$<$?     &  ?$<=$?  &  ?\~{}=?   &  ?=? \\
- ?$>$?    & ?$>=$?     &&&\\
+\cross{A1AGG}{any?} &
+\cross{A1AGG}{coerce} &
+\cross{A1AGG}{concat} &
+\cross{A1AGG}{construct} &
+\cross{A1AGG}{convert} \\
+\cross{A1AGG}{copy} &
+\cross{A1AGG}{copyInto!} &
+\cross{A1AGG}{count} &
+\cross{A1AGG}{delete} &
+\cross{A1AGG}{elt} \\
+\cross{A1AGG}{empty} &
+\cross{A1AGG}{empty?} &
+\cross{A1AGG}{entries} &
+\cross{A1AGG}{entry?} &
+\cross{A1AGG}{eq?} \\
+\cross{A1AGG}{eval} &
+\cross{A1AGG}{every?} &
+\cross{A1AGG}{fill!} &
+\cross{A1AGG}{find} &
+\cross{A1AGG}{first} \\
+\cross{A1AGG}{hash} &
+\cross{A1AGG}{index?} &
+\cross{A1AGG}{indices} &
+\cross{A1AGG}{insert} &
+\cross{A1AGG}{latex} \\
+\cross{A1AGG}{less?} &
+\cross{A1AGG}{map} &
+\cross{A1AGG}{map!} &
+\cross{A1AGG}{max} &
+\cross{A1AGG}{maxIndex} \\
+\cross{A1AGG}{member?} &
+\cross{A1AGG}{members} &
+\cross{A1AGG}{merge} &
+\cross{A1AGG}{min} &
+\cross{A1AGG}{minIndex} \\
+\cross{A1AGG}{more?} &
+\cross{A1AGG}{new} &
+\cross{A1AGG}{parts} &
+\cross{A1AGG}{position} &
+\cross{A1AGG}{qelt} \\
+\cross{A1AGG}{qsetelt!} &
+\cross{A1AGG}{reduce} &
+\cross{A1AGG}{remove} &
+\cross{A1AGG}{removeDuplicates} &
+\cross{A1AGG}{reverse} \\
+\cross{A1AGG}{reverse!} &
+\cross{A1AGG}{sample} &
+\cross{A1AGG}{select} &
+\cross{A1AGG}{setelt} &
+\cross{A1AGG}{size?} \\
+\cross{A1AGG}{sort} &
+\cross{A1AGG}{sort!} &
+\cross{A1AGG}{sorted?} &
+\cross{A1AGG}{swap!} &
+\cross{A1AGG}{\#?} \\
+\cross{A1AGG}{?.?} &
+\cross{A1AGG}{?$<$?} &
+\cross{A1AGG}{?$<=$?} &
+\cross{A1AGG}{?\~{}=?} &
+\cross{A1AGG}{?=?} \\
+\cross{A1AGG}{?$>$?} &
+\cross{A1AGG}{?$>=$?} &&&
 \end{tabular}
 
-\cross{A1AGG}{any?}
-\cross{A1AGG}{coerce}
-\cross{A1AGG}{concat}
-\cross{A1AGG}{construct}
-\cross{A1AGG}{convert}
-\cross{A1AGG}{copy}
-\cross{A1AGG}{copyInto!}
-\cross{A1AGG}{count}
-\cross{A1AGG}{delete}
-\cross{A1AGG}{elt}
-\cross{A1AGG}{empty}
-\cross{A1AGG}{empty?}
-\cross{A1AGG}{entries}
-\cross{A1AGG}{entry?}
-\cross{A1AGG}{eq?}
-\cross{A1AGG}{eval}
-\cross{A1AGG}{every?}
-\cross{A1AGG}{fill!}
-\cross{A1AGG}{find}
-\cross{A1AGG}{first}
-\cross{A1AGG}{hash}
-\cross{A1AGG}{index?}
-\cross{A1AGG}{indices}
-\cross{A1AGG}{insert}
-\cross{A1AGG}{latex}
-\cross{A1AGG}{less?}
-\cross{A1AGG}{map}
-\cross{A1AGG}{map!}
-\cross{A1AGG}{max}
-\cross{A1AGG}{maxIndex}
-\cross{A1AGG}{member?}
-\cross{A1AGG}{members}
-\cross{A1AGG}{merge}
-\cross{A1AGG}{min}
-\cross{A1AGG}{minIndex}
-\cross{A1AGG}{more?}
-\cross{A1AGG}{new}
-\cross{A1AGG}{parts}
-\cross{A1AGG}{position}
-\cross{A1AGG}{qelt}
-\cross{A1AGG}{qsetelt!}
-\cross{A1AGG}{reduce}
-\cross{A1AGG}{remove}
-\cross{A1AGG}{removeDuplicates}
-\cross{A1AGG}{reverse}
-\cross{A1AGG}{reverse!}
-\cross{A1AGG}{sample}
-\cross{A1AGG}{select}
-\cross{A1AGG}{setelt}
-\cross{A1AGG}{size?}
-\cross{A1AGG}{sort}
-\cross{A1AGG}{sort!}
-\cross{A1AGG}{sorted?}
-\cross{A1AGG}{swap!}
-\cross{A1AGG}{\#?}
-\cross{A1AGG}{?.?}
-\cross{A1AGG}{?$<$?}
-\cross{A1AGG}{?$<=$?}
-\cross{A1AGG}{?\~{}=?}
-\cross{A1AGG}{?=?}
-\cross{A1AGG}{?$>$?}
-\cross{A1AGG}{?$>=$?}
-
 These are implemented by this category:
 \begin{verbatim}
  any? : ((S -> Boolean),%) -> Boolean 
@@ -8434,75 +8354,63 @@ digraph pic {
 
 {\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   & \#?        & ?$<$?      & ?=?         & ?\~{}=?\\
+\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}{?\~{}=?} \\
 \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 -> %                  
@@ -8758,58 +8666,49 @@ digraph pic {
 \pagefrom{Dictionary}{DIAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?    & bag              & coerce     & construct & convert \\
- copy    & count            & dictionary & empty     & empty? \\
- eq?     & eval             & every?     & extract!  & find \\
- hash    & insert!          & inspect    & key?      & keys \\
- latex   & less?            & map        & map!      & member? \\
- members & more?            & parts      & reduce    & remove \\
- remove! & removeDuplicates & sample     & search    & select \\
- select! & size?            & \#?        & ?=?       & ?\~{}=? \\
+\begin{tabular}{lllll}
+\cross{KDAGG}{any?} &
+\cross{KDAGG}{bag} &
+\cross{KDAGG}{coerce} &
+\cross{KDAGG}{construct} &
+\cross{KDAGG}{convert} \\
+\cross{KDAGG}{copy} &
+\cross{KDAGG}{count} &
+\cross{KDAGG}{dictionary} &
+\cross{KDAGG}{empty} &
+\cross{KDAGG}{empty?} \\
+\cross{KDAGG}{eq?} &
+\cross{KDAGG}{eval} &
+\cross{KDAGG}{every?} &
+\cross{KDAGG}{extract!} &
+\cross{KDAGG}{find} \\
+\cross{KDAGG}{hash} &
+\cross{KDAGG}{insert!} &
+\cross{KDAGG}{inspect} &
+\cross{KDAGG}{key?} &
+\cross{KDAGG}{keys} \\
+\cross{KDAGG}{latex} &
+\cross{KDAGG}{less?} &
+\cross{KDAGG}{map} &
+\cross{KDAGG}{map!} &
+\cross{KDAGG}{member?} \\
+\cross{KDAGG}{members} &
+\cross{KDAGG}{more?} &
+\cross{KDAGG}{parts} &
+\cross{KDAGG}{reduce} &
+\cross{KDAGG}{remove} \\
+\cross{KDAGG}{remove!} &
+\cross{KDAGG}{removeDuplicates} &
+\cross{KDAGG}{sample} &
+\cross{KDAGG}{search} &
+\cross{KDAGG}{select} \\
+\cross{KDAGG}{select!} &
+\cross{KDAGG}{size?} &
+\cross{KDAGG}{\#?} &
+\cross{KDAGG}{?=?} &
+\cross{KDAGG}{?\~{}=?} \\
 \end{tabular}
 
-\cross{KDAGG}{any?}
-\cross{KDAGG}{bag}
-\cross{KDAGG}{coerce}
-\cross{KDAGG}{construct}
-\cross{KDAGG}{convert}
-\cross{KDAGG}{copy}
-\cross{KDAGG}{count}
-\cross{KDAGG}{dictionary}
-\cross{KDAGG}{empty}
-\cross{KDAGG}{empty?}
-\cross{KDAGG}{eq?}
-\cross{KDAGG}{eval}
-\cross{KDAGG}{every?}
-\cross{KDAGG}{extract!}
-\cross{KDAGG}{find}
-\cross{KDAGG}{hash}
-\cross{KDAGG}{insert!}
-\cross{KDAGG}{inspect}
-\cross{KDAGG}{key?}
-\cross{KDAGG}{keys}
-\cross{KDAGG}{latex}
-\cross{KDAGG}{less?}
-\cross{KDAGG}{map}
-\cross{KDAGG}{map!}
-\cross{KDAGG}{member?}
-\cross{KDAGG}{members}
-\cross{KDAGG}{more?}
-\cross{KDAGG}{parts}
-\cross{KDAGG}{reduce}
-\cross{KDAGG}{remove}
-\cross{KDAGG}{remove!}
-\cross{KDAGG}{removeDuplicates}
-\cross{KDAGG}{sample}
-\cross{KDAGG}{search}
-\cross{KDAGG}{select}
-\cross{KDAGG}{select!}
-\cross{KDAGG}{size?}
-\cross{KDAGG}{\#?}
-\cross{KDAGG}{?=?}
-\cross{KDAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  remove! : (Key,%) -> Union(Entry,"failed")
@@ -8985,6 +8884,126 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{LeftModule}{LMODULE}
+\pagepic{ps/v102leftmodule.ps}{LMODULE}{0.90}
+
+{\bf See:}\\
+\pageto{BiModule}{BMODULE}
+\pageto{Ring}{RING}
+\pagefrom{AbelianGroup}{ABELGRP}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{LMODULE}{0} &
+\cross{LMODULE}{coerce} &
+\cross{LMODULE}{hash} &
+\cross{LMODULE}{latex} &
+\cross{LMODULE}{sample} \\
+\cross{LMODULE}{subtractIfCan} &
+\cross{LMODULE}{zero?} &
+\cross{LMODULE}{?~=?} &
+\cross{LMODULE}{?*?} &
+\cross{LMODULE}{?+?} \\
+\cross{LMODULE}{?-?} &
+\cross{LMODULE}{-?} &
+\cross{LMODULE}{?=?} &&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ ?*? : (R,%) -> %                     
+\end{verbatim}
+
+These exports come from AbelianGroup():
+\begin{verbatim}
+ 0 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?~=? : (%,%) -> Boolean
+ ?=? : (%,%) -> Boolean               
+ ?+? : (%,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (Integer,%) -> %
+ ?-? : (%,%) -> %                     
+ -? : % -> %
+\end{verbatim}
+
+<<category LMODULE LeftModule>>=
+)abbrev category LMODULE LeftModule
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of left modules over an rng (ring not necessarily with unit).
+++ This is an abelian group which supports left multiplation by elements of
+++ the rng.
+++
+++ Axioms:
+++   \spad{ (a*b)*x = a*(b*x) }
+++   \spad{ (a+b)*x = (a*x)+(b*x) }
+++   \spad{ a*(x+y) = (a*x)+(a*y) }
+LeftModule(R:Rng):Category == AbelianGroup with
+   "*": (R,%) -> %     
+     ++ r*x returns the left multiplication of the module element x
+     ++ by the ring element r.
+
+@
+<<LMODULE.dotabb>>=
+"LMODULE"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=LMODULE"];
+"LMODULE" -> "ABELGRP"
+
+@
+<<LMODULE.dotfull>>=
+"LeftModule(a:Rng)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=LMODULE"];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"LeftModule(a:Ring)"
+ [color=seagreen,href="books/bookvol10.2.pamphlet#nameddest=LMODULE"];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+@
+<<LMODULE.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CancellationAbelianMonoid()"
+"AbelianGroup()" -> "RepeatedDoubling(AbelianGroup)"
+
+"RepeatedDoubling(AbelianGroup)" [color="#00EE00"];
+"RepeatedDoubling(AbelianGroup)" -> "RepeatedDoubling(a:SetCategory)"
+
+"RepeatedDoubling(a:SetCategory)" [color="#00EE00"];
+"RepeatedDoubling(a:SetCategory)" -> "Package"
+
+"Package" [color="#00EE00"];
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "ABELMON..."
+
+"ABELMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{ListAggregate}{LSAGG}
 \pagepic{ps/v102listaggregate.ps}{LSAGG}{0.50}
 
@@ -8994,130 +9013,109 @@ digraph pic {
 \pagefrom{FiniteLinearAggregate}{FLAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?      & children   & child?      & coerce       & concat \\
- concat!   & construct  & convert     & copy         & copyInto! \\
- count     & cycleEntry & cycleLength & cycleSplit!  & cycleTail \\
- cyclic?   & delete     & delete!     & distance     & elt \\
- empty     & empty?     & entries     & entry?       & eq? \\
- eval      & every?     & explicitlyFinite? & fill!  & find \\
- first     & hash       & index?      & indices      & insert \\
- insert!   & last       & latex       & leaf?        & leaves \\
- less?     & list       & map         & map!         & max \\
- maxIndex  & member?    & members     & merge        & merge! \\
- min       & minIndex   & more?       & new          & nodes \\
- node?     & parts      & position    & possiblyInfinite? & qelt \\
- qsetelt!  & reduce     & remove      & remove!      & removeDuplicates \\
- removeDuplicates! & rest & reverse   & reverse!     & sample \\
- second    & select     & select!     & setchildren! & setelt \\
- setfirst! & setlast!   & setrest!    & setvalue!    & size? \\
- sort      & sort!      & sorted?     & split!       & swap! \\
- tail      & third      & value       & \#?          & ?.? \\
- ?.last    & ?.rest     & ?.first     & ?.value      & ?$<$? \\
- ?$<=$?    & ?=?        & ?$>$?       & ?$>=$?       & ?\~{}=? \\
+\begin{tabular}{llll}
+\cross{LSAGG}{any?} &
+\cross{LSAGG}{children} &
+\cross{LSAGG}{child?} &
+\cross{LSAGG}{coerce} \\
+\cross{LSAGG}{concat} &
+\cross{LSAGG}{concat!} &
+\cross{LSAGG}{construct} &
+\cross{LSAGG}{convert} \\
+\cross{LSAGG}{copy} &
+\cross{LSAGG}{copyInto!} &
+\cross{LSAGG}{count} &
+\cross{LSAGG}{cycleEntry} \\
+\cross{LSAGG}{cycleLength} &
+\cross{LSAGG}{cycleSplit!} &
+\cross{LSAGG}{cycleTail} &
+\cross{LSAGG}{cyclic?} \\
+\cross{LSAGG}{delete} &
+\cross{LSAGG}{delete!} &
+\cross{LSAGG}{distance} &
+\cross{LSAGG}{elt} \\
+\cross{LSAGG}{empty} &
+\cross{LSAGG}{empty?} &
+\cross{LSAGG}{entries} &
+\cross{LSAGG}{entry?} \\
+\cross{LSAGG}{eq?} &
+\cross{LSAGG}{eval} &
+\cross{LSAGG}{every?} &
+\cross{LSAGG}{explicitlyFinite?} \\
+\cross{LSAGG}{fill!} &
+\cross{LSAGG}{find} &
+\cross{LSAGG}{first} &
+\cross{LSAGG}{hash} \\
+\cross{LSAGG}{index?} &
+\cross{LSAGG}{indices} &
+\cross{LSAGG}{insert} &
+\cross{LSAGG}{insert!} \\
+\cross{LSAGG}{last} &
+\cross{LSAGG}{latex} &
+\cross{LSAGG}{leaf?} &
+\cross{LSAGG}{leaves} \\
+\cross{LSAGG}{less?} &
+\cross{LSAGG}{list} &
+\cross{LSAGG}{map} &
+\cross{LSAGG}{map!} \\
+\cross{LSAGG}{max} &
+\cross{LSAGG}{maxIndex} &
+\cross{LSAGG}{member?} &
+\cross{LSAGG}{members} \\
+\cross{LSAGG}{merge} &
+\cross{LSAGG}{merge!} &
+\cross{LSAGG}{min} &
+\cross{LSAGG}{minIndex} \\
+\cross{LSAGG}{more?} &
+\cross{LSAGG}{new} &
+\cross{LSAGG}{nodes} &
+\cross{LSAGG}{node?} \\
+\cross{LSAGG}{parts} &
+\cross{LSAGG}{position} &
+\cross{LSAGG}{possiblyInfinite?} &
+\cross{LSAGG}{qelt} \\
+\cross{LSAGG}{qsetelt!} &
+\cross{LSAGG}{reduce} &
+\cross{LSAGG}{remove} &
+\cross{LSAGG}{remove!} \\
+\cross{LSAGG}{removeDuplicates} &
+\cross{LSAGG}{removeDuplicates!} &
+\cross{LSAGG}{rest} &
+\cross{LSAGG}{reverse} \\
+\cross{LSAGG}{reverse!} &
+\cross{LSAGG}{sample} &
+\cross{LSAGG}{second} &
+\cross{LSAGG}{select} \\
+\cross{LSAGG}{select!} &
+\cross{LSAGG}{setchildren!} &
+\cross{LSAGG}{setelt} &
+\cross{LSAGG}{setfirst!} \\
+\cross{LSAGG}{setlast!} &
+\cross{LSAGG}{setrest!} &
+\cross{LSAGG}{setvalue!} &
+\cross{LSAGG}{size?} \\
+\cross{LSAGG}{sort} &
+\cross{LSAGG}{sort!} &
+\cross{LSAGG}{sorted?} &
+\cross{LSAGG}{split!} \\
+\cross{LSAGG}{swap!} &
+\cross{LSAGG}{tail} &
+\cross{LSAGG}{third} &
+\cross{LSAGG}{value} \\
+\cross{LSAGG}{\#?} &
+\cross{LSAGG}{?.?} &
+\cross{LSAGG}{?.last} &
+\cross{LSAGG}{?.rest} \\
+\cross{LSAGG}{?.first} &
+\cross{LSAGG}{?.value} &
+\cross{LSAGG}{?$<$?} &
+\cross{LSAGG}{?$<=$?} \\
+\cross{LSAGG}{?=?} &
+\cross{LSAGG}{?$>$?} &
+\cross{LSAGG}{?$>=$?} &
+\cross{LSAGG}{?\~{}=?} \\
 \end{tabular}
 
-\cross{LSAGG}{any?}
-\cross{LSAGG}{children}
-\cross{LSAGG}{child?}
-\cross{LSAGG}{coerce}
-\cross{LSAGG}{concat}
-\cross{LSAGG}{concat!}
-\cross{LSAGG}{construct}
-\cross{LSAGG}{convert}
-\cross{LSAGG}{copy}
-\cross{LSAGG}{copyInto!}
-\cross{LSAGG}{count}
-\cross{LSAGG}{cycleEntry}
-\cross{LSAGG}{cycleLength}
-\cross{LSAGG}{cycleSplit!}
-\cross{LSAGG}{cycleTail}
-\cross{LSAGG}{cyclic?}
-\cross{LSAGG}{delete}
-\cross{LSAGG}{delete!}
-\cross{LSAGG}{distance}
-\cross{LSAGG}{elt}
-\cross{LSAGG}{empty}
-\cross{LSAGG}{empty?}
-\cross{LSAGG}{entries}
-\cross{LSAGG}{entry?}
-\cross{LSAGG}{eq?}
-\cross{LSAGG}{eval}
-\cross{LSAGG}{every?}
-\cross{LSAGG}{explicitlyFinite?}
-\cross{LSAGG}{fill!}
-\cross{LSAGG}{find}
-\cross{LSAGG}{first}
-\cross{LSAGG}{hash}
-\cross{LSAGG}{index?}
-\cross{LSAGG}{indices}
-\cross{LSAGG}{insert}
-\cross{LSAGG}{insert!}
-\cross{LSAGG}{last}
-\cross{LSAGG}{latex}
-\cross{LSAGG}{leaf?}
-\cross{LSAGG}{leaves}
-\cross{LSAGG}{less?}
-\cross{LSAGG}{list}
-\cross{LSAGG}{map}
-\cross{LSAGG}{map!}
-\cross{LSAGG}{max}
-\cross{LSAGG}{maxIndex}
-\cross{LSAGG}{member?}
-\cross{LSAGG}{members}
-\cross{LSAGG}{merge}
-\cross{LSAGG}{merge!}
-\cross{LSAGG}{min}
-\cross{LSAGG}{minIndex}
-\cross{LSAGG}{more?}
-\cross{LSAGG}{new}
-\cross{LSAGG}{nodes}
-\cross{LSAGG}{node?}
-\cross{LSAGG}{parts}
-\cross{LSAGG}{position}
-\cross{LSAGG}{possiblyInfinite?}
-\cross{LSAGG}{qelt}
-\cross{LSAGG}{qsetelt!}
-\cross{LSAGG}{reduce}
-\cross{LSAGG}{remove}
-\cross{LSAGG}{remove!}
-\cross{LSAGG}{removeDuplicates}
-\cross{LSAGG}{removeDuplicates!}
-\cross{LSAGG}{rest}
-\cross{LSAGG}{reverse}
-\cross{LSAGG}{reverse!}
-\cross{LSAGG}{sample}
-\cross{LSAGG}{second}
-\cross{LSAGG}{select}
-\cross{LSAGG}{select!}
-\cross{LSAGG}{setchildren!}
-\cross{LSAGG}{setelt}
-\cross{LSAGG}{setfirst!}
-\cross{LSAGG}{setlast!}
-\cross{LSAGG}{setrest!}
-\cross{LSAGG}{setvalue!}
-\cross{LSAGG}{size?}
-\cross{LSAGG}{sort}
-\cross{LSAGG}{sort!}
-\cross{LSAGG}{sorted?}
-\cross{LSAGG}{split!}
-\cross{LSAGG}{swap!}
-\cross{LSAGG}{tail}
-\cross{LSAGG}{third}
-\cross{LSAGG}{value}
-\cross{LSAGG}{\#?}
-\cross{LSAGG}{?.?}
-\cross{LSAGG}{?.last}
-\cross{LSAGG}{?.rest}
-\cross{LSAGG}{?.first}
-\cross{LSAGG}{?.value}
-\cross{LSAGG}{?$<$?}
-\cross{LSAGG}{?$<=$?}
-\cross{LSAGG}{?=?}
-\cross{LSAGG}{?$>$?}
-\cross{LSAGG}{?$>=$?}
-\cross{LSAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
 \end{verbatim}
@@ -9582,67 +9580,56 @@ digraph pic {
 \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      & \#? & ?\~{}=?\\
- ?$<$?      &  ?=? &&&
+\begin{tabular}{llll}
+\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}{?=?} &
 \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
@@ -9772,36 +9759,268 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedCancellationAbelianMonoid}{OCAMON}
+\pagepic{ps/v102orderedcancellationabelianmonoid.ps}{OCAMON}{0.75}
+
+{\bf See:}\\
+\pageto{OrderedAbelianGroup}{OAGROUP}
+\pageto{OrderedAbelianMonoidSup}{OAMONS}
+\pagefrom{CancellationAbelianMonoid}{CABMON}
+\pagefrom{OrderedAbelianMonoid}{OAMON}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{OCAMON}{0} &
+\cross{OCAMON}{coerce} &
+\cross{OCAMON}{hash} &
+\cross{OCAMON}{latex} &
+\cross{OCAMON}{max} \\
+\cross{OCAMON}{min} &
+\cross{OCAMON}{sample} &
+\cross{OCAMON}{subtractIfCan} &
+\cross{OCAMON}{zero?} &
+\cross{OCAMON}{?\~{}=?} \\
+\cross{OCAMON}{?*?} &
+\cross{OCAMON}{?+?} &
+\cross{OCAMON}{?$<$?} &
+\cross{OCAMON}{?$<=$?} &
+\cross{OCAMON}{?=?} \\
+\cross{OCAMON}{?$>$?} &
+\cross{OCAMON}{?$>=$?} &&&
+\end{tabular}
+
+These exports come from OrderedAbelianMonoid():
+\begin{verbatim}
+ 0 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ max : (%,%) -> %
+ min : (%,%) -> %                     
+ sample : () -> %
+ zero? : % -> Boolean                 
+ ?<? : (%,%) -> Boolean               
+ ?<=? : (%,%) -> Boolean
+ ?=? : (%,%) -> Boolean               
+ ?>? : (%,%) -> Boolean
+ ?>=? : (%,%) -> Boolean              
+ ?~=? : (%,%) -> Boolean
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?+? : (%,%) -> %
+\end{verbatim}
+
+These exports come from CancellationAbelianMonoid():
+\begin{verbatim}
+ subtractIfCan : (%,%) -> Union(%,"failed")
+\end{verbatim}
+
+<<category OCAMON OrderedCancellationAbelianMonoid>>=
+)abbrev category OCAMON OrderedCancellationAbelianMonoid
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Ordered sets which are also abelian cancellation monoids, 
+++ such that the addition preserves the ordering.
+OrderedCancellationAbelianMonoid(): Category ==
+        Join(OrderedAbelianMonoid, CancellationAbelianMonoid)
+
+@
+<<OCAMON.dotabb>>=
+"OCAMON"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OCAMON"];
+"OCAMON" -> "OAMON"
+"OCAMON" -> "CABMON"
+
+@
+<<OCAMON.dotfull>>=
+"OrderedCancellationAbelianMonoid()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OCAMON"];
+"OrderedCancellationAbelianMonoid()" -> "OrderedAbelianMonoid()"
+"OrderedCancellationAbelianMonoid()" -> "CancellationAbelianMonoid()"
+
+@
+<<OCAMON.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedCancellationAbelianMonoid()" [color=lightblue];
+"OrderedCancellationAbelianMonoid()" -> "OrderedAbelianMonoid()"
+"OrderedCancellationAbelianMonoid()" -> "CancellationAbelianMonoid()"
+
+"OrderedAbelianMonoid()" [color=lightblue];
+"OrderedAbelianMonoid()" -> "OrderedAbelianSemiGroup()"
+"OrderedAbelianMonoid()" -> "AbelianMonoid()"
+
+"OrderedAbelianSemiGroup()" [color=lightblue];
+"OrderedAbelianSemiGroup()" -> "OrderedSet()"
+"OrderedAbelianSemiGroup()" -> "AbelianMonoid()"
+
+"OrderedSet()" [color=lightblue];
+"OrderedSet()" -> "SETCAT..."
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "AbelianMonoid()"
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "ABELSG..."
+
+"SETCAT..." [color=lightblue];
+"ABELSG..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{RightModule}{RMODULE}
+\pagepic{ps/v102rightmodule.ps}{RMODULE}{1.00}
+
+{\bf See:}\\
+\pageto{BiModule}{BMODULE}
+\pagefrom{AbelianGroup}{ABELGRP}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{RMODULE}{0} &
+\cross{RMODULE}{coerce} &
+\cross{RMODULE}{hash} &
+\cross{RMODULE}{latex} &
+\cross{RMODULE}{sample} \\
+\cross{RMODULE}{subtractIfCan} &
+\cross{RMODULE}{zero?} &
+\cross{RMODULE}{?\~{}=?} &
+\cross{RMODULE}{?*?} &
+\cross{RMODULE}{?+?} \\
+\cross{RMODULE}{?-?} &
+\cross{RMODULE}{-?} &
+\cross{RMODULE}{?=?} &&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ ?*? : (%,R) -> %                     
+\end{verbatim}
+
+These exports come from AbelianGroup():
+\begin{verbatim}
+ 0 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?~=? : (%,%) -> Boolean
+ ?*? : (PositiveInteger,%) -> %       
+ ?+? : (%,%) -> %
+ ?=? : (%,%) -> Boolean               
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (Integer,%) -> %
+ ?-? : (%,%) -> %                     
+ -? : % -> %
+\end{verbatim}
+
+<<category RMODULE RightModule>>=
+)abbrev category RMODULE RightModule
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of right modules over an rng (ring not necessarily 
+++ with unit). This is an abelian group which supports right 
+++ multiplication by elements of the rng.
+++
+++ Axioms:
+++   \spad{ x*(a*b) = (x*a)*b }
+++   \spad{ x*(a+b) = (x*a)+(x*b) }
+++   \spad{ (x+y)*x = (x*a)+(y*a) }
+RightModule(R:Rng):Category == AbelianGroup with
+   "*": (%,R) -> %  
+     ++ x*r returns the right multiplication of the module element x
+     ++ by the ring element r.
+
+@
+<<RMODULE.dotabb>>=
+"RMODULE"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=RMODULE"];
+"RMODULE" -> "ABELGRP"
+
+@
+<<RMODULE.dotfull>>=
+"RightModule(a:Rng)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=RMODULE"];
+"RightModule(a:Rng)" -> "AbelianGroup()"
+
+"RightModule(a:Ring)"
+ [color=seagreen,href="books/bookvol10.2.pamphlet#nameddest=RMODULE"];
+"RightModule(a:Ring)" -> "RightModule(a:Rng)"
+
+@
+<<RMODULE.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"RightModule(a:Rng)" [color=lightblue];
+"RightModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CancellationAbelianMonoid()"
+"AbelianGroup()" -> "REPDB..."
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "ABELMON..."
+
+"ABELMON..." [color=lightblue];
+"REPDB..." [color="#00EE00"];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{Rng}{RNG}
 \pagepic{ps/v102rng.ps}{RNG}{1.00}
 
+Rng is a Ring that does not necessarily have a unit.
+
 {\bf See:}\\
+\pageto{Ring}{RING}
 \pagefrom{AbelianGroup}{ABELGRP}
 \pagefrom{SemiGroup}{SGROUP}
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- 0     & coerce        & hash & latex   & sample \\
- zero? & subtractIfCan & ?*?  & ?**?    & ?+?    \\
- ?-?   & -?            & ?=?  & ?\~{}=? & ?\^{}? \\
+\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}{?\^{}?} \\
 \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 : () -> %                          
@@ -9907,103 +10126,86 @@ digraph pic {
 \pagefrom{OneDimensionalArrayAggregate}{A1AGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllllll}
- any?     & coerce     & concat     & construct  & copy \\
- convert  & copyInto!  & count      & delete     & elt \\
- empty    & empty?     & entries    & entry?     & eval \\
- every?   & eq?        & fill!      & find       & first \\
- hash     & index?     & indices    & insert     & latex \\
- leftTrim & less?      & lowerCase  & lowerCase! & map \\
- map!     & match      & match?     & max        & maxIndex \\
- member?  & members    & merge      & min        & minIndex \\
- more?    & new        & parts      & position   & prefix? \\
- qelt     & qsetelt!   & reduce     & remove     & removeDuplicates \\
- replace  & reverse    & reverse!   & rightTrim  & sample \\
- setelt   & size?      & sort       & sort!      & sorted? \\
- split    & substring? & suffix?    & swap!      & trim \\
- trim     & upperCase  & upperCase! & \#?        & ?\~{}=? \\
- ?.?      & ?$<$?      & ?$<=$?     & ?=?        & ?$>$? \\
- ?$>=$? &&&&\\
+\begin{tabular}{lllll}
+\cross{SRAGG}{any?} &
+\cross{SRAGG}{coerce} &
+\cross{SRAGG}{concat} &
+\cross{SRAGG}{construct} &
+\cross{SRAGG}{copy} \\
+\cross{SRAGG}{convert} &
+\cross{SRAGG}{copyInto!} &
+\cross{SRAGG}{count} &
+\cross{SRAGG}{delete} &
+\cross{SRAGG}{?.?} \\
+\cross{SRAGG}{elt} &
+\cross{SRAGG}{empty} &
+\cross{SRAGG}{empty?} &
+\cross{SRAGG}{entries} &
+\cross{SRAGG}{entry?} \\
+\cross{SRAGG}{eval} &
+\cross{SRAGG}{every?} &
+\cross{SRAGG}{eq?} &
+\cross{SRAGG}{fill!} &
+\cross{SRAGG}{find} \\
+\cross{SRAGG}{first} &
+\cross{SRAGG}{hash} &
+\cross{SRAGG}{index?} &
+\cross{SRAGG}{indices} &
+\cross{SRAGG}{insert} \\
+\cross{SRAGG}{latex} &
+\cross{SRAGG}{leftTrim} &
+\cross{SRAGG}{less?} &
+\cross{SRAGG}{lowerCase} &
+\cross{SRAGG}{lowerCase!} \\
+\cross{SRAGG}{map} &
+\cross{SRAGG}{map!} &
+\cross{SRAGG}{match} &
+\cross{SRAGG}{match?} &
+\cross{SRAGG}{max} \\
+\cross{SRAGG}{maxIndex} &
+\cross{SRAGG}{member?} &
+\cross{SRAGG}{members} &
+\cross{SRAGG}{merge} &
+\cross{SRAGG}{min} \\
+\cross{SRAGG}{minIndex} &
+\cross{SRAGG}{more?} &
+\cross{SRAGG}{new} &
+\cross{SRAGG}{parts} &
+\cross{SRAGG}{position} \\
+\cross{SRAGG}{prefix?} &
+\cross{SRAGG}{qelt} &
+\cross{SRAGG}{qsetelt!} &
+\cross{SRAGG}{reduce} &
+\cross{SRAGG}{remove} \\
+\cross{SRAGG}{removeDuplicates} &
+\cross{SRAGG}{replace} &
+\cross{SRAGG}{reverse} &
+\cross{SRAGG}{reverse!} &
+\cross{SRAGG}{rightTrim} \\
+\cross{SRAGG}{sample} &
+\cross{SRAGG}{setelt} &
+\cross{SRAGG}{size?} &
+\cross{SRAGG}{sort} &
+\cross{SRAGG}{sort!} \\
+\cross{SRAGG}{sorted?} &
+\cross{SRAGG}{split} &
+\cross{SRAGG}{substring?} &
+\cross{SRAGG}{suffix?} &
+\cross{SRAGG}{swap!} \\
+\cross{SRAGG}{trim} &
+\cross{SRAGG}{trim} &
+\cross{SRAGG}{upperCase} &
+\cross{SRAGG}{upperCase!} &
+\cross{SRAGG}{\#?} \\
+\cross{SRAGG}{?\~{}=?} &
+\cross{SRAGG}{?.?} &
+\cross{SRAGG}{?$<$?} &
+\cross{SRAGG}{?$<=$?} &
+\cross{SRAGG}{?=?} \\
+\cross{SRAGG}{?$>$?} &
+\cross{SRAGG}{?$>=$?} &&&
 \end{tabular}
 
-\cross{SRAGG}{any?}
-\cross{SRAGG}{coerce}
-\cross{SRAGG}{concat}
-\cross{SRAGG}{construct}
-\cross{SRAGG}{copy}
-\cross{SRAGG}{convert}
-\cross{SRAGG}{copyInto!}
-\cross{SRAGG}{count}
-\cross{SRAGG}{delete}
-\cross{SRAGG}{?.?}
-\cross{SRAGG}{elt}
-\cross{SRAGG}{empty}
-\cross{SRAGG}{empty?}
-\cross{SRAGG}{entries}
-\cross{SRAGG}{entry?}
-\cross{SRAGG}{eval}
-\cross{SRAGG}{every?}
-\cross{SRAGG}{eq?}
-\cross{SRAGG}{fill!}
-\cross{SRAGG}{find}
-\cross{SRAGG}{first}
-\cross{SRAGG}{hash}
-\cross{SRAGG}{index?}
-\cross{SRAGG}{indices}
-\cross{SRAGG}{insert}
-\cross{SRAGG}{latex}
-\cross{SRAGG}{leftTrim}
-\cross{SRAGG}{less?}
-\cross{SRAGG}{lowerCase}
-\cross{SRAGG}{lowerCase!}
-\cross{SRAGG}{map}
-\cross{SRAGG}{map!}
-\cross{SRAGG}{match}
-\cross{SRAGG}{match?}
-\cross{SRAGG}{max}
-\cross{SRAGG}{maxIndex}
-\cross{SRAGG}{member?}
-\cross{SRAGG}{members}
-\cross{SRAGG}{merge}
-\cross{SRAGG}{min}
-\cross{SRAGG}{minIndex}
-\cross{SRAGG}{more?}
-\cross{SRAGG}{new}
-\cross{SRAGG}{parts}
-\cross{SRAGG}{position}
-\cross{SRAGG}{prefix?}
-\cross{SRAGG}{qelt}
-\cross{SRAGG}{qsetelt!}
-\cross{SRAGG}{reduce}
-\cross{SRAGG}{remove}
-\cross{SRAGG}{removeDuplicates}
-\cross{SRAGG}{replace}
-\cross{SRAGG}{reverse}
-\cross{SRAGG}{reverse!}
-\cross{SRAGG}{rightTrim}
-\cross{SRAGG}{sample}
-\cross{SRAGG}{setelt}
-\cross{SRAGG}{size?}
-\cross{SRAGG}{sort}
-\cross{SRAGG}{sort!}
-\cross{SRAGG}{sorted?}
-\cross{SRAGG}{split}
-\cross{SRAGG}{substring?}
-\cross{SRAGG}{suffix?}
-\cross{SRAGG}{swap!}
-\cross{SRAGG}{trim}
-\cross{SRAGG}{trim}
-\cross{SRAGG}{upperCase}
-\cross{SRAGG}{upperCase!}
-\cross{SRAGG}{\#?}
-\cross{SRAGG}{?\~{}=?}
-\cross{SRAGG}{?.?}
-\cross{SRAGG}{?$<$?}
-\cross{SRAGG}{?$<=$?}
-\cross{SRAGG}{?=?}
-\cross{SRAGG}{?$>$?}
-\cross{SRAGG}{?$>=$?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  leftTrim : (%,Character) -> %
@@ -10330,75 +10532,63 @@ digraph pic {
 
 {\bf Exports:}\\
 \begin{tabular}{lllll}
- any?   & bag      & coerce           & construct & convert\\
- copy   & count    & dictionary       & elt       & empty\\
- empty? & entries  & entry?           & eq?       & eval\\
- every? & extract! & fill!            & find      & first\\
- hash   & index?   & indices          & insert!   & inspect\\
- key?   & keys     & latex            & less?     & map\\
- map!   & maxIndex & member?          & members   & minIndex\\
- more?  & parts    & qelt             & qsetelt!  & reduce\\
- remove & remove!  & removeDuplicates & sample    & search\\
- select & select!  & setelt           & size?     & swap!\\
- table  & \#?      & ?=?              & ?.?       & ?\~{}=?\\
+\cross{TBAGG}{any?} &
+\cross{TBAGG}{bag} &
+\cross{TBAGG}{coerce} &
+\cross{TBAGG}{construct} &
+\cross{TBAGG}{convert} \\
+\cross{TBAGG}{copy} &
+\cross{TBAGG}{count} &
+\cross{TBAGG}{dictionary} &
+\cross{TBAGG}{elt} &
+\cross{TBAGG}{empty} \\
+\cross{TBAGG}{empty?} &
+\cross{TBAGG}{entries} &
+\cross{TBAGG}{entry?} &
+\cross{TBAGG}{eq?} &
+\cross{TBAGG}{eval} \\
+\cross{TBAGG}{every?} &
+\cross{TBAGG}{extract!} &
+\cross{TBAGG}{fill!} &
+\cross{TBAGG}{find} &
+\cross{TBAGG}{first} \\
+\cross{TBAGG}{hash} &
+\cross{TBAGG}{index?} &
+\cross{TBAGG}{indices} &
+\cross{TBAGG}{insert!} &
+\cross{TBAGG}{inspect} \\
+\cross{TBAGG}{key?} &
+\cross{TBAGG}{keys} &
+\cross{TBAGG}{latex} &
+\cross{TBAGG}{less?} &
+\cross{TBAGG}{map} \\
+\cross{TBAGG}{map!} &
+\cross{TBAGG}{maxIndex} &
+\cross{TBAGG}{member?} &
+\cross{TBAGG}{members} &
+\cross{TBAGG}{minIndex} \\
+\cross{TBAGG}{more?} &
+\cross{TBAGG}{parts} &
+\cross{TBAGG}{qelt} &
+\cross{TBAGG}{qsetelt!} &
+\cross{TBAGG}{reduce} \\
+\cross{TBAGG}{remove} &
+\cross{TBAGG}{remove!} &
+\cross{TBAGG}{removeDuplicates} &
+\cross{TBAGG}{sample} &
+\cross{TBAGG}{search} \\
+\cross{TBAGG}{select} &
+\cross{TBAGG}{select!} &
+\cross{TBAGG}{setelt} &
+\cross{TBAGG}{size?} &
+\cross{TBAGG}{swap!} \\
+\cross{TBAGG}{table} &
+\cross{TBAGG}{\#?} &
+\cross{TBAGG}{?=?} &
+\cross{TBAGG}{?.?} &
+\cross{TBAGG}{?\~{}=?} \\
 \end{tabular}
 
-\cross{TBAGG}{any?}
-\cross{TBAGG}{bag}
-\cross{TBAGG}{coerce}
-\cross{TBAGG}{construct}
-\cross{TBAGG}{convert}
-\cross{TBAGG}{copy}
-\cross{TBAGG}{count}
-\cross{TBAGG}{dictionary}
-\cross{TBAGG}{elt}
-\cross{TBAGG}{empty}
-\cross{TBAGG}{empty?}
-\cross{TBAGG}{entries}
-\cross{TBAGG}{entry?}
-\cross{TBAGG}{eq?}
-\cross{TBAGG}{eval}
-\cross{TBAGG}{every?}
-\cross{TBAGG}{extract!}
-\cross{TBAGG}{fill!}
-\cross{TBAGG}{find}
-\cross{TBAGG}{first}
-\cross{TBAGG}{hash}
-\cross{TBAGG}{index?}
-\cross{TBAGG}{indices}
-\cross{TBAGG}{insert!}
-\cross{TBAGG}{inspect}
-\cross{TBAGG}{key?}
-\cross{TBAGG}{keys}
-\cross{TBAGG}{latex}
-\cross{TBAGG}{less?}
-\cross{TBAGG}{map}
-\cross{TBAGG}{map!}
-\cross{TBAGG}{maxIndex}
-\cross{TBAGG}{member?}
-\cross{TBAGG}{members}
-\cross{TBAGG}{minIndex}
-\cross{TBAGG}{more?}
-\cross{TBAGG}{parts}
-\cross{TBAGG}{qelt}
-\cross{TBAGG}{qsetelt!}
-\cross{TBAGG}{reduce}
-\cross{TBAGG}{remove}
-\cross{TBAGG}{remove!}
-\cross{TBAGG}{removeDuplicates}
-\cross{TBAGG}{sample}
-\cross{TBAGG}{search}
-\cross{TBAGG}{select}
-\cross{TBAGG}{select!}
-\cross{TBAGG}{setelt}
-\cross{TBAGG}{size?}
-\cross{TBAGG}{swap!}
-\cross{TBAGG}{table}
-\cross{TBAGG}{\#?}
-\cross{TBAGG}{?=?}
-\cross{TBAGG}{?.?}
-\cross{TBAGG}{?\~{}=?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  setelt : (%,Key,Entry) -> Entry
@@ -10773,141 +10963,118 @@ digraph pic {
 \pagefrom{TableAggregate}{TBAGG}
 
 {\bf Exports:}\\
-\begin{tabular}{lllll}
- any?        & assoc     & bag      & children   & child? \\
- coerce      & concat    & concat!  & construct  & convert \\
- copy        & copyInto! & count    & cycleEntry & cycleLength \\
- cycleSplit! & cycleTail & cyclic?  & delete     & delete! \\
- dictionary  & distance  & elt      & empty      & empty? \\
- entries     & entry?    & eq?      & eval       & every?\\
- explicitlyFinite? &  extract! &  fill! & find   & first \\
- hash        & index?    & indices  & insert     & insert! \\
- inspect     & key?      & keys     & last       & latex \\
- leaf?       & leaves    & less?    & list       & map \\
- map!        & max       & maxIndex & member?    & members \\
- merge       & merge!    & min      & minIndex   & more? \\
- new         & nodes     & node?    & parts      & position \\
- possiblyInfinite? &  qelt &  qsetelt! &  reduce & remove \\
- remove!     & removeDuplicates &  removeDuplicates! &  rest  & reverse \\
- reverse!    & sample    & search   & second     & select \\
- select!     & setchildren! &  setelt &  setfirst!  & setlast! \\
- setrest!    & setvalue! & size?    & sort       & sort! \\
- sorted?     & split!    & swap!    & table      & tail \\
- third       & value     & \#?      & ?$<$?      & ?$<=$? \\
- ?=?         & ?$>$?     & ?$>=$?   & ?\~{}=?    & ?.rest \\
- ?.value     & ?.first   & ?.last   & ?.?        &\\
+\begin{tabular}{llll}
+\cross{ALAGG}{any?} &
+\cross{ALAGG}{assoc} &
+\cross{ALAGG}{bag} &
+\cross{ALAGG}{children} \\
+\cross{ALAGG}{child?} &
+\cross{ALAGG}{coerce} &
+\cross{ALAGG}{concat} &
+\cross{ALAGG}{concat!} \\
+\cross{ALAGG}{construct} &
+\cross{ALAGG}{convert} &
+\cross{ALAGG}{copy} &
+\cross{ALAGG}{copyInto!} \\
+\cross{ALAGG}{count} &
+\cross{ALAGG}{cycleEntry} &
+\cross{ALAGG}{cycleLength} &
+\cross{ALAGG}{cycleSplit!} \\
+\cross{ALAGG}{cycleTail} &
+\cross{ALAGG}{cyclic?} &
+\cross{ALAGG}{delete} &
+\cross{ALAGG}{delete!} \\
+\cross{ALAGG}{dictionary} &
+\cross{ALAGG}{distance} &
+\cross{ALAGG}{elt} &
+\cross{ALAGG}{empty} \\
+\cross{ALAGG}{empty?} &
+\cross{ALAGG}{entries} &
+\cross{ALAGG}{entry?} &
+\cross{ALAGG}{eq?} \\
+\cross{ALAGG}{eval} &
+\cross{ALAGG}{every?} &
+\cross{ALAGG}{explicitlyFinite?} &
+\cross{ALAGG}{extract!} \\
+\cross{ALAGG}{fill!} &
+\cross{ALAGG}{find} &
+\cross{ALAGG}{first} &
+\cross{ALAGG}{hash} \\
+\cross{ALAGG}{index?} &
+\cross{ALAGG}{indices} &
+\cross{ALAGG}{insert} &
+\cross{ALAGG}{insert!} \\
+\cross{ALAGG}{inspect} &
+\cross{ALAGG}{key?} &
+\cross{ALAGG}{keys} &
+\cross{ALAGG}{last} \\
+\cross{ALAGG}{latex} &
+\cross{ALAGG}{leaf?} &
+\cross{ALAGG}{leaves} &
+\cross{ALAGG}{less?} \\
+\cross{ALAGG}{list} &
+\cross{ALAGG}{map} &
+\cross{ALAGG}{map!} &
+\cross{ALAGG}{max} \\
+\cross{ALAGG}{maxIndex} &
+\cross{ALAGG}{member?} &
+\cross{ALAGG}{members} &
+\cross{ALAGG}{merge} \\
+\cross{ALAGG}{merge!} &
+\cross{ALAGG}{min} &
+\cross{ALAGG}{minIndex} &
+\cross{ALAGG}{more?} \\
+\cross{ALAGG}{new} &
+\cross{ALAGG}{nodes} &
+\cross{ALAGG}{node?} &
+\cross{ALAGG}{parts} \\
+\cross{ALAGG}{position} &
+\cross{ALAGG}{possiblyInfinite?} &
+\cross{ALAGG}{qelt} &
+\cross{ALAGG}{qsetelt!} \\
+\cross{ALAGG}{reduce} &
+\cross{ALAGG}{remove} &
+\cross{ALAGG}{remove!} &
+\cross{ALAGG}{removeDuplicates} \\
+\cross{ALAGG}{removeDuplicates!} &
+\cross{ALAGG}{rest} &
+\cross{ALAGG}{reverse} &
+\cross{ALAGG}{reverse!} \\
+\cross{ALAGG}{sample} &
+\cross{ALAGG}{search} &
+\cross{ALAGG}{second} &
+\cross{ALAGG}{select} \\
+\cross{ALAGG}{select!} &
+\cross{ALAGG}{setchildren!} &
+\cross{ALAGG}{setelt} &
+\cross{ALAGG}{setfirst!} \\
+\cross{ALAGG}{setlast!} &
+\cross{ALAGG}{setrest!} &
+\cross{ALAGG}{setvalue!} &
+\cross{ALAGG}{size?} \\
+\cross{ALAGG}{sort} &
+\cross{ALAGG}{sort!} &
+\cross{ALAGG}{sorted?} &
+\cross{ALAGG}{split!} \\
+\cross{ALAGG}{swap!} &
+\cross{ALAGG}{table} &
+\cross{ALAGG}{tail} &
+\cross{ALAGG}{third} \\
+\cross{ALAGG}{value} &
+\cross{ALAGG}{\#?} &
+\cross{ALAGG}{?$<$?} &
+\cross{ALAGG}{?$<=$?} \\
+\cross{ALAGG}{?=?} &
+\cross{ALAGG}{?$>$?} &
+\cross{ALAGG}{?$>=$?} &
+\cross{ALAGG}{?\~{}=?} \\
+\cross{ALAGG}{?.rest} &
+\cross{ALAGG}{?.value} &
+\cross{ALAGG}{?.first} &
+\cross{ALAGG}{?.last} \\
+\cross{ALAGG}{?.?} &
 \end{tabular}
 
-\cross{ALAGG}{any?}
-\cross{ALAGG}{assoc}
-\cross{ALAGG}{bag}
-\cross{ALAGG}{children}
-\cross{ALAGG}{child?}
-\cross{ALAGG}{coerce}
-\cross{ALAGG}{concat}
-\cross{ALAGG}{concat!}
-\cross{ALAGG}{construct}
-\cross{ALAGG}{convert}
-\cross{ALAGG}{copy}
-\cross{ALAGG}{copyInto!}
-\cross{ALAGG}{count}
-\cross{ALAGG}{cycleEntry}
-\cross{ALAGG}{cycleLength}
-\cross{ALAGG}{cycleSplit!}
-\cross{ALAGG}{cycleTail}
-\cross{ALAGG}{cyclic?}
-\cross{ALAGG}{delete}
-\cross{ALAGG}{delete!}
-\cross{ALAGG}{dictionary}
-\cross{ALAGG}{distance}
-\cross{ALAGG}{elt}
-\cross{ALAGG}{empty}
-\cross{ALAGG}{empty?}
-\cross{ALAGG}{entries}
-\cross{ALAGG}{entry?}
-\cross{ALAGG}{eq?}
-\cross{ALAGG}{eval}
-\cross{ALAGG}{every?}
-\cross{ALAGG}{explicitlyFinite?}
-\cross{ALAGG}{extract!}
-\cross{ALAGG}{fill!}
-\cross{ALAGG}{find}
-\cross{ALAGG}{first}
-\cross{ALAGG}{hash}
-\cross{ALAGG}{index?}
-\cross{ALAGG}{indices}
-\cross{ALAGG}{insert}
-\cross{ALAGG}{insert!}
-\cross{ALAGG}{inspect}
-\cross{ALAGG}{key?}
-\cross{ALAGG}{keys}
-\cross{ALAGG}{last}
-\cross{ALAGG}{latex}
-\cross{ALAGG}{leaf?}
-\cross{ALAGG}{leaves}
-\cross{ALAGG}{less?}
-\cross{ALAGG}{list}
-\cross{ALAGG}{map}
-\cross{ALAGG}{map!}
-\cross{ALAGG}{max}
-\cross{ALAGG}{maxIndex}
-\cross{ALAGG}{member?}
-\cross{ALAGG}{members}
-\cross{ALAGG}{merge}
-\cross{ALAGG}{merge!}
-\cross{ALAGG}{min}
-\cross{ALAGG}{minIndex}
-\cross{ALAGG}{more?}
-\cross{ALAGG}{new}
-\cross{ALAGG}{nodes}
-\cross{ALAGG}{node?}
-\cross{ALAGG}{parts}
-\cross{ALAGG}{position}
-\cross{ALAGG}{possiblyInfinite?}
-\cross{ALAGG}{qelt}
-\cross{ALAGG}{qsetelt!}
-\cross{ALAGG}{reduce}
-\cross{ALAGG}{remove}
-\cross{ALAGG}{remove!}
-\cross{ALAGG}{removeDuplicates}
-\cross{ALAGG}{removeDuplicates!}
-\cross{ALAGG}{rest}
-\cross{ALAGG}{reverse}
-\cross{ALAGG}{reverse!}
-\cross{ALAGG}{sample}
-\cross{ALAGG}{search}
-\cross{ALAGG}{second}
-\cross{ALAGG}{select}
-\cross{ALAGG}{select!}
-\cross{ALAGG}{setchildren!}
-\cross{ALAGG}{setelt}
-\cross{ALAGG}{setfirst!}
-\cross{ALAGG}{setlast!}
-\cross{ALAGG}{setrest!}
-\cross{ALAGG}{setvalue!}
-\cross{ALAGG}{size?}
-\cross{ALAGG}{sort}
-\cross{ALAGG}{sort!}
-\cross{ALAGG}{sorted?}
-\cross{ALAGG}{split!}
-\cross{ALAGG}{swap!}
-\cross{ALAGG}{table}
-\cross{ALAGG}{tail}
-\cross{ALAGG}{third}
-\cross{ALAGG}{value}
-\cross{ALAGG}{\#?}
-\cross{ALAGG}{?$<$?}
-\cross{ALAGG}{?$<=$?}
-\cross{ALAGG}{?=?}
-\cross{ALAGG}{?$>$?}
-\cross{ALAGG}{?$>=$?}
-\cross{ALAGG}{?\~{}=?}
-\cross{ALAGG}{?.rest}
-\cross{ALAGG}{?.value}
-\cross{ALAGG}{?.first}
-\cross{ALAGG}{?.last}
-\cross{ALAGG}{?.?}
-
 These are directly exported but not implemented:
 \begin{verbatim}
  assoc : (Key,%) -> Union(Record(key: Key,entry: Entry),"failed")
@@ -11294,80 +11461,459 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{BiModule}{BMODULE}
+\pagepic{ps/v102bimodule.ps}{BMODULE}{1.00}
+
+{\bf See:}\\
+\pagefrom{LeftModule}{LMODULE}
+\pagefrom{RightModule}{RMODULE}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{BMODULE}{0} &
+\cross{BMODULE}{coerce} &
+\cross{BMODULE}{hash} &
+\cross{BMODULE}{latex} &
+\cross{BMODULE}{sample} \\
+\cross{BMODULE}{subtractIfCan} &
+\cross{BMODULE}{zero?} &
+\cross{BMODULE}{?~=?} &
+\cross{BMODULE}{?*?} &
+\cross{BMODULE}{?+?} \\
+\cross{BMODULE}{?-?} &
+\cross{BMODULE}{-?} &
+\cross{BMODULE}{?=?} &&
+\end{tabular}
+
+These exports come from LeftModule(R:Ring):
+\begin{verbatim}
+ 0 : () -> %                          
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (R,%) -> %
+ ?=? : (%,%) -> Boolean
+ ?+? : (%,%) -> %                     
+ ?*? : (PositiveInteger,%) -> %
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (Integer,%) -> %               
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+\end{verbatim}
+
+These exports come from RightModule(S:Ring):
+\begin{verbatim}
+ ?*? : (%,S) -> %                     
+\end{verbatim}
+
+<<category BMODULE BiModule>>=
+)abbrev category BMODULE BiModule
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ A \spadtype{BiModule} is both a left and right module with respect
+++ to potentially different rings.
+++
+++ Axiom:
+++   \spad{ r*(x*s) = (r*x)*s }
+BiModule(R:Ring,S:Ring):Category ==
+  Join(LeftModule(R),RightModule(S)) with
+     leftUnitary 
+       ++ \spad{1 * x = x}
+     rightUnitary 
+       ++ \spad{x * 1 = x}
+
+@
+<<BMODULE.dotabb>>=
+"BMODULE"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=BMODULE"];
+"BMODULE" -> "LMODULE"
+"BMODULE" -> "RMODULE"
+
+@
+<<BMODULE.dotfull>>=
+"BiModule(a:Ring,b:Ring)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=BMODULE"];
+"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
+"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
+
+"BiModule(a:CommutativeRing,b:CommutativeRing)"
+ [color=seagreen,href="books/bookvol10.2.pamphlet#nameddest=BMODULE"];
+"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BiModule(a:Ring,b:Ring)"
+
+"BiModule(a:Ring,b:OrderedAbelianMonoid)"
+ [color=seagreen,href="books/bookvol10.2.pamphlet#nameddest=BMODULE"];
+"BiModule(a:Ring,b:OrderedAbelianMonoid)" -> "BiModule(a:Ring,b:Ring)"
+
+@
+<<BMODULE.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"BiModule(a:Ring,b:Ring)"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=BMODULE"];
+"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
+"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
+
+"RightModule(a:Ring)" [color=seagreen];
+"RightModule(a:Ring)" -> "RightModule(a:Rng)"
+
+"RightModule(a:Rng)" [color=lightblue];
+"RightModule(a:Rng)" -> "AbelianGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CancellationAbelianMonoid()"
+"AbelianGroup()" -> "REPDB..."
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "ABELMON..."
+
+"ABELMON..." [color=lightblue];
+"REPDB..." [color="#00EE00"];
+}
+
+
+
+
+
+
+
+
+
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedAbelianGroup}{OAGROUP}
+\pagepic{ps/v102orderedabeliangroup.ps}{OAGROUP}{1.00}
+
+{\bf See:}\\
+\pageto{OrderedRing}{ORDRING}
+\pagefrom{AbelianGroup}{ABELGRP}
+\pagefrom{OrderedCancellationAbelianMonoid}{OCAMON}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{OAGROUP}{0} &
+\cross{OAGROUP}{coerce} &
+\cross{OAGROUP}{hash} &
+\cross{OAGROUP}{latex} &
+\cross{OAGROUP}{max} \\
+\cross{OAGROUP}{min} &
+\cross{OAGROUP}{sample} &
+\cross{OAGROUP}{subtractIfCan} &
+\cross{OAGROUP}{zero?} &
+\cross{OAGROUP}{?\~{}=?} \\
+\cross{OAGROUP}{?*?} &
+\cross{OAGROUP}{?+?} &
+\cross{OAGROUP}{-?} &
+\cross{OAGROUP}{?-?} &
+\cross{OAGROUP}{?$<$?} \\
+\cross{OAGROUP}{?$<=$?} &
+\cross{OAGROUP}{?=?} &
+\cross{OAGROUP}{?$>$?} &
+\cross{OAGROUP}{?$>=$?} &
+\end{tabular}
+
+These exports come from OrderedCancellationAbelianMonoid():
+\begin{verbatim}
+ 0 : () -> %                          
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ max : (%,%) -> %                     
+ min : (%,%) -> %
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+ ?<? : (%,%) -> Boolean
+ ?<=? : (%,%) -> Boolean              
+ ?=? : (%,%) -> Boolean
+ ?>? : (%,%) -> Boolean               
+ ?>=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %
+ ?+? : (%,%) -> %                     
+\end{verbatim}
+
+These exports come from AbelianGroup():
+\begin{verbatim}
+ -? : % -> %
+ ?*? : (Integer,%) -> %               
+ ?-? : (%,%) -> %                     
+\end{verbatim}
+
+<<category OAGROUP OrderedAbelianGroup>>=
+)abbrev category OAGROUP OrderedAbelianGroup
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Ordered sets which are also abelian groups, such that the 
+++ addition preserves the ordering.
+OrderedAbelianGroup(): Category ==
+        Join(OrderedCancellationAbelianMonoid, AbelianGroup)
+
+@
+<<OAGROUP.dotabb>>=
+"OAGROUP"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OAGROUP"];
+"OAGROUP" -> "OCAMON"
+"OAGROUP" -> "ABELGRP"
+
+@
+<<OAGROUP.dotfull>>=
+"OrderedAbelianGroup()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OAGROUP"];
+"OrderedAbelianGroup()" -> "OrderedCancellationAbelianMonoid()"
+"OrderedAbelianGroup()" -> "AbelianGroup()"
+
+@
+<<OAGROUP.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedAbelianGroup()" [color=lightblue];
+"OrderedAbelianGroup()" -> "OrderedCancellationAbelianMonoid()"
+"OrderedAbelianGroup()" -> "AbelianGroup()"
+
+"OrderedCancellationAbelianMonoid()" [color=lightblue];
+"OrderedCancellationAbelianMonoid()" -> "OAMON..."
+"OrderedCancellationAbelianMonoid()" -> "CABMON..."
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"REPDB..." [color="#00EE00"];
+"OAMON..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedAbelianMonoidSup}{OAMONS}
+\pagepic{ps/v102orderedabelianmonoidsup.ps}{OAMONS}{0.75}
+
+{\bf See:}\\
+\pagefrom{OrderedCancellationAbelianMonoid}{OCAMON}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{OAMONS}{0} &
+\cross{OAMONS}{coerce} &
+\cross{OAMONS}{hash} &
+\cross{OAMONS}{latex} &
+\cross{OAMONS}{max} \\
+\cross{OAMONS}{min} &
+\cross{OAMONS}{sample} &
+\cross{OAMONS}{subtractIfCan} &
+\cross{OAMONS}{sup} &
+\cross{OAMONS}{zero?} \\
+\cross{OAMONS}{?\~{}=?} &
+\cross{OAMONS}{?*?} &
+\cross{OAMONS}{?$<=$?} &
+\cross{OAMONS}{?+?} &
+\cross{OAMONS}{?$<$?} \\
+\cross{OAMONS}{?=?} &
+\cross{OAMONS}{?$>$?} &
+\cross{OAMONS}{?$>=$?} &&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ sup : (%,%) -> %                     
+\end{verbatim}
+
+These exports come from OrderedCancellationAbelianMonoid():
+\begin{verbatim}
+ 0 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ max : (%,%) -> %
+ min : (%,%) -> %                     
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean
+ ?~=? : (%,%) -> Boolean              
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?+? : (%,%) -> %
+ ?<? : (%,%) -> Boolean               
+ ?<=? : (%,%) -> Boolean
+ ?=? : (%,%) -> Boolean               
+ ?>? : (%,%) -> Boolean
+ ?>=? : (%,%) -> Boolean              
+
+\end{verbatim}
+
+<<category OAMONS OrderedAbelianMonoidSup>>=
+)abbrev category OAMONS OrderedAbelianMonoidSup
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ This domain is an OrderedAbelianMonoid with a \spadfun{sup} 
+++ operation added. The purpose of the \spadfun{sup} operator 
+++ in this domain is to act as a supremum with respect to the 
+++ partial order imposed by \spadop{-}, rather than with respect to
+++ the total \spad{>} order (since that is "max").
+++
+++ Axioms:
+++   \spad{sup(a,b)-a \~~= "failed"}
+++   \spad{sup(a,b)-b \~~= "failed"}
+++   \spad{x-a \~~= "failed" and x-b \~~= "failed" => x >= sup(a,b)}
+
+OrderedAbelianMonoidSup(): Category == OrderedCancellationAbelianMonoid with
+  sup: (%,%) -> %
+    ++ sup(x,y) returns the least element from which both
+    ++ x and y can be subtracted.
+
+@
+<<OAMONS.dotabb>>=
+"OAMONS"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OAMONS"];
+"OAMONS" -> "OCAMON"
+
+@
+<<OAMONS.dotfull>>=
+"OrderedAbelianMonoidSup()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=OAMONS"];
+"OrderedAbelianMonoidSup()" -> "OrderedCancellationAbelianMonoid()"
+
+@
+<<OAMONS.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedAbelianMonoidSup()" [color=lightblue];
+"OrderedAbelianMonoidSup()" -> "OrderedCancellationAbelianMonoid()"
+
+"OrderedCancellationAbelianMonoid()" [color=lightblue];
+"OrderedCancellationAbelianMonoid()" -> "OrderedAbelianMonoid()"
+"OrderedCancellationAbelianMonoid()" -> "CancellationAbelianMonoid()"
+
+"OrderedAbelianMonoid()" [color=lightblue];
+"OrderedAbelianMonoid()" -> "OrderedAbelianSemiGroup()"
+"OrderedAbelianMonoid()" -> "AbelianMonoid()"
+
+"OrderedAbelianSemiGroup()" [color=lightblue];
+"OrderedAbelianSemiGroup()" -> "OrderedSet()"
+"OrderedAbelianSemiGroup()" -> "AbelianMonoid()"
+
+"OrderedSet()" [color=lightblue];
+"OrderedSet()" -> "SETCAT..."
+
+"CancellationAbelianMonoid()" [color=lightblue];
+"CancellationAbelianMonoid()" -> "AbelianMonoid()"
+
+"AbelianMonoid()" [color=lightblue];
+"AbelianMonoid()" -> "ABELSG..."
+
+"SETCAT..." [color=lightblue];
+"ABELSG..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \pagehead{OrderedMultisetAggregate}{OMSAGG}
-\pagepic{ps/v102orderedmultisetaggregate.ps}{OMSAGG}{0.65}
+\pagepic{ps/v102orderedmultisetaggregate.ps}{OMSAGG}{0.50}
 
 {\bf See:}\\
 \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   & \#?        & ?$<$? & ?=?\\
- ?\~{}=? &&&&
+\begin{tabular}{llll}
+\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}{?\~{}?} &
 \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
@@ -11383,8 +11929,10 @@ These exports come from MultisetAggregate(S:OrderedSet):
  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
+ count : (S,%) -> NonNegativeInteger 
+     if S has SETCAT and $ has finiteAggregate
+ count : ((S -> Boolean),%) -> NonNegativeInteger 
+     if $ has finiteAggregate
  dictionary : List S -> %             
  dictionary : () -> %
  difference : (%,S) -> %
@@ -11393,11 +11941,16 @@ These exports come from MultisetAggregate(S:OrderedSet):
  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
+ 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            
@@ -11409,18 +11962,27 @@ These exports come from MultisetAggregate(S:OrderedSet):
  less? : (%,NonNegativeInteger) -> Boolean
  map : ((S -> S),%) -> %
  map! : ((S -> S),%) -> % if $ has shallowlyMutable
- member? : (S,%) -> Boolean if S has SETCAT and $ has finiteAggregate
+ 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
+ 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
@@ -11514,12 +12076,10 @@ digraph pic {
 "DictionaryOperations(a:SetCategory)" -> "BGAGG..."
 "DictionaryOperations(a:SetCategory)" -> "CLAGG..."
 
-"PriorityQueueAggregate(a:SetCategory)"
- [color=seagreen,href="books/bookvol10.2.pamphlet#nameddest=PRQAGG"];
+"PriorityQueueAggregate(a:SetCategory)" [color=seagreen];
 "PriorityQueueAggregate(a:SetCategory)" -> "PriorityQueueAggregate(a:Type)"
 
-"PriorityQueueAggregate(a:Type)"
- [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=PRQAGG"];
+"PriorityQueueAggregate(a:Type)" [color=lightblue];
 "PriorityQueueAggregate(a:Type)" -> "BGAGG..."
 
 "BGAGG..." [color=lightblue];
@@ -11529,6 +12089,376 @@ digraph pic {
 
 @
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{Ring}{RING}
+\pagepic{ps/v102ring.ps}{RING}{1.00}
+
+{\bf See:}\\
+\pageto{OrderedRing}{ORDRING}
+\pagefrom{LeftModule}{LMODULE}
+\pagefrom{Monoid}{MONOID}
+\pagefrom{Rng}{RNG}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{RING}{1} &
+\cross{RING}{0} &
+\cross{RING}{characteristic} &
+\cross{RING}{coerce} &
+\cross{RING}{hash} \\
+\cross{RING}{latex} &
+\cross{RING}{one?} &
+\cross{RING}{recip} &
+\cross{RING}{sample} &
+\cross{RING}{subtractIfCan} \\
+\cross{RING}{zero?} &
+\cross{RING}{?\~{}=?} &
+\cross{RING}{?*?} &
+\cross{RING}{?**?} &
+\cross{RING}{?\^{}?} \\
+\cross{RING}{?*?} &
+\cross{RING}{?**?} &
+\cross{RING}{?+?} &
+\cross{RING}{?-?} &
+\cross{RING}{-?} \\
+\cross{RING}{?=?} &&&&
+\end{tabular}
+
+These are directly exported but not implemented:
+\begin{verbatim}
+ characteristic : () -> NonNegativeInteger
+\end{verbatim}
+
+These are implemented by this category:
+\begin{verbatim}
+ coerce : Integer -> %
+\end{verbatim}
+
+These exports come from Rng():
+\begin{verbatim}
+ 0 : () -> %
+ coerce : % -> OutputForm             
+ hash : % -> SingleInteger
+ latex : % -> String                  
+ sample : () -> %
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?+? : (%,%) -> %                     
+ ?=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (Integer,%) -> %
+ ?*? : (%,%) -> %                     
+ ?-? : (%,%) -> %
+ -? : % -> %                          
+ ?**? : (%,PositiveInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+\end{verbatim}
+
+These exports come from Monoid():
+\begin{verbatim}
+ 1 : () -> %                          
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")       
+ ?**? : (%,NonNegativeInteger) -> %
+ ?^? : (%,NonNegativeInteger) -> %
+\end{verbatim}
+
+TPDHERE: Note that none of the exports of LeftModule are needed.
+Perhaps this can be eliminated.
+
+These exports come from LeftModule(Ring):
+\begin{verbatim}
+\end{verbatim}
+
+<<category RING Ring>>=
+)abbrev category RING Ring
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ The category of rings with unity, always associative, but
+++ not necessarily commutative.
+Ring(): Category == Join(Rng,Monoid,LeftModule(%)) with
+      characteristic: () -> NonNegativeInteger
+        ++ characteristic() returns the characteristic of the ring
+        ++ this is the smallest positive integer n such that
+        ++ \spad{n*x=0} for all x in the ring, or zero if no such n
+        ++ exists.
+        --We can not make this a constant, since some domains are mutable
+      coerce: Integer -> %
+        ++ coerce(i) converts the integer i to a member of the given domain.
+--    recip: % -> Union(%,"failed") -- inherited from Monoid
+      unitsKnown
+        ++ recip truly yields
+        ++ reciprocal or "failed" if not a unit.
+        ++ Note: \spad{recip(0) = "failed"}.
+   add
+      n:Integer
+      coerce(n) == n * 1$%
+
+@
+<<RING.dotabb>>=
+"RING"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=RING"];
+"RING" -> "RNG"
+"RING" -> "MONOID"
+"RING" -> "LMODULE"
+
+@
+<<RING.dotfull>>=
+"Ring()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=RING"];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+@
+<<RING.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "AbelianGroup()"
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "AbelianGroup()"
+
+"AbelianGroup()" [color=lightblue];
+"AbelianGroup()" -> "CABMON..."
+"AbelianGroup()" -> "REPDB..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPDB..." [color="#00EE00"];
+"REPSQ..." [color="#00EE00"];
+"SETCAT..." [color=lightblue];
+"CABMON..." [color=lightblue];
+}
+
+@
+\chapter{Category Layer 9}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pagehead{OrderedRing}{ORDRING}
+\pagepic{ps/v102orderedring.ps}{ORDRING}{0.65}
+
+{\bf See:}\\
+\pagefrom{Monoid}{MONOID}
+\pagefrom{OrderedAbelianGroup}{OAGROUP}
+\pagefrom{Ring}{RING}
+
+{\bf Exports:}\\
+\begin{tabular}{lllll}
+\cross{ORDRING}{1} &
+\cross{ORDRING}{0} &
+\cross{ORDRING}{abs} &
+\cross{ORDRING}{characteristic} &
+\cross{ORDRING}{coerce} \\
+\cross{ORDRING}{hash} &
+\cross{ORDRING}{latex} &
+\cross{ORDRING}{max} &
+\cross{ORDRING}{min} &
+\cross{ORDRING}{negative?} \\
+\cross{ORDRING}{one?} &
+\cross{ORDRING}{positive?} &
+\cross{ORDRING}{recip} &
+\cross{ORDRING}{sample} &
+\cross{ORDRING}{sign} \\
+\cross{ORDRING}{subtractIfCan} &
+\cross{ORDRING}{zero?} &
+\cross{ORDRING}{?\^{}?} &
+\cross{ORDRING}{?\~{}=?} &
+\cross{ORDRING}{?*?} \\
+\cross{ORDRING}{?**?} &
+\cross{ORDRING}{?+?} &
+\cross{ORDRING}{-?} &
+\cross{ORDRING}{?-?} &
+\cross{ORDRING}{?$<$?} \\
+\cross{ORDRING}{?$<=$?} &
+\cross{ORDRING}{?=?} &
+\cross{ORDRING}{?$>$?} &
+\cross{ORDRING}{?$>=$?} &
+\end{tabular}
+
+These are implemented by this category:
+\begin{verbatim}
+ abs : % -> %
+ negative? : % -> Boolean             
+ positive? : % -> Boolean             
+ sign : % -> Integer
+\end{verbatim}
+
+These exports come from OrderedAbelianGroup():
+\begin{verbatim}
+ 0 : () -> %
+ coerce : % -> OutputForm
+ hash : % -> SingleInteger            
+ latex : % -> String
+ max : (%,%) -> %                     
+ min : (%,%) -> %
+ sample : () -> %                     
+ subtractIfCan : (%,%) -> Union(%,"failed")
+ zero? : % -> Boolean                 
+ ?<? : (%,%) -> Boolean
+ ?<=? : (%,%) -> Boolean              
+ ?=? : (%,%) -> Boolean
+ ?>? : (%,%) -> Boolean               
+ ?>=? : (%,%) -> Boolean
+ ?~=? : (%,%) -> Boolean
+ ?*? : (NonNegativeInteger,%) -> %
+ ?*? : (PositiveInteger,%) -> %       
+ ?*? : (Integer,%) -> %
+ ?+? : (%,%) -> %                     
+ -? : % -> %
+ ?-? : (%,%) -> %                     
+\end{verbatim}
+
+These exports come from Ring():
+\begin{verbatim}
+ 1 : () -> %                          
+ characteristic : () -> NonNegativeInteger
+ coerce : Integer -> %                
+ one? : % -> Boolean
+ recip : % -> Union(%,"failed")
+ ?**? : (%,NonNegativeInteger) -> %
+ ?**? : (%,PositiveInteger) -> %
+ ?*? : (%,%) -> %                     
+ ?^? : (%,NonNegativeInteger) -> %
+ ?^? : (%,PositiveInteger) -> %       
+\end{verbatim}
+
+TPDHERE: Note that none of the exports of Monoid are needed.
+Perhaps this can be eliminated.
+
+These exports come from Monoid();
+\begin{verbatim}
+\end{verbatim}
+
+<<category ORDRING OrderedRing>>=
+)abbrev category ORDRING OrderedRing
+++ Author:
+++ Date Created:
+++ Date Last Updated:
+++ Basic Functions:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description:
+++ Ordered sets which are also rings, that is, domains where the ring
+++ operations are compatible with the ordering.
+++
+++ Axiom:
+++   \spad{0<a and b<c => ab< ac}
+OrderedRing(): Category == Join(OrderedAbelianGroup,Ring,Monoid) with
+     positive?: % -> Boolean
+       ++ positive?(x) tests whether x is strictly greater than 0.
+     negative?: % -> Boolean
+       ++ negative?(x) tests whether x is strictly less than 0.
+     sign     : % -> Integer
+       ++ sign(x) is 1 if x is positive, -1 if x is negative, 
+       ++ 0 if x equals 0.
+     abs      : % -> %
+       ++ abs(x) returns the absolute value of x.
+  add
+     positive? x == x>0
+     negative? x == x<0
+     sign x ==
+       positive? x => 1
+       negative? x => -1
+       zero? x => 0
+       error "x satisfies neither positive?, negative? or zero?"
+     abs x ==
+       positive? x => x
+       negative? x => -x
+       zero? x => 0
+       error "x satisfies neither positive?, negative? or zero?"
+
+@
+<<ORDRING.dotabb>>=
+"ORDRING"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDRING"];
+"ORDRING" -> "OAGROUP"
+"ORDRING" -> "RING"
+"ORDRING" -> "MONOID"
+
+@
+<<ORDRING.dotfull>>=
+"OrderedRing()"
+ [color=lightblue,href="books/bookvol10.2.pamphlet#nameddest=ORDRING"];
+"OrderedRing()" -> "OrderedAbelianGroup()"
+"OrderedRing()" -> "Ring()"
+"OrderedRing()" -> "Monoid()"
+
+@
+<<ORDRING.dotpic>>=
+digraph pic {
+ fontsize=10;
+ bgcolor="#FFFF66";
+ node [shape=box, color=white, style=filled];
+
+"OrderedRing()" [color=lightblue];
+"OrderedRing()" -> "OrderedAbelianGroup()"
+"OrderedRing()" -> "Ring()"
+"OrderedRing()" -> "Monoid()"
+
+"Ring()" [color=lightblue];
+"Ring()" -> "Rng()"
+"Ring()" -> "Monoid()"
+"Ring()" -> "LeftModule(a:Ring)"
+
+"Rng()" [color=lightblue];
+"Rng()" -> "ABELGRP..."
+"Rng()" -> "SemiGroup()"
+
+"Monoid()" [color=lightblue];
+"Monoid()" -> "SemiGroup()"
+
+"OrderedAbelianGroup()" [color=lightblue];
+"OrderedAbelianGroup()" -> "OCAMON..."
+"OrderedAbelianGroup()" -> "ABELGRP..."
+
+"LeftModule(a:Ring)" [color=seagreen];
+"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
+
+"LeftModule(a:Rng)" [color=lightblue];
+"LeftModule(a:Rng)" -> "ABELGRP..."
+
+"SemiGroup()" [color=lightblue];
+"SemiGroup()" -> "SETCAT..."
+"SemiGroup()" -> "REPSQ..."
+
+"REPSQ..." [color="#00EE00"];
+"OCAMON..." [color=lightblue];
+"SETCAT..." [color=lightblue];
+"ABELGRP..." [color=lightblue];
+}
+
+@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \chapter{Category Layers}
 \section{category BTAGG BitAggregate}
 <<category BTAGG BitAggregate>>=
@@ -14012,6 +14942,139 @@ Note that this code is not included in the generated catdef.spad file.
   (QUOTE |lookupComplete|))) 
 
 @
+\section{ORDRING.lsp BOOTSTRAP}
+{\bf ORDRING} depends on {\bf INT}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf ORDRING}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf ORDRING.o} file to the {\bf OUT} directory.
+This is eventually forcibly replaced by a recompiled version. 
+
+Technically I can't justify this bootstrap stanza based on the lattice
+since {\bf INT} is already bootstrapped. However using {\bf INT} naked
+generates a "value stack overflow" error suggesting an infinite recursive
+loop. This code is here to experiment with breaking that loop.
+
+Note that this code is not included in the generated catdef.spad file.
+
+<<ORDRING.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |OrderedRing;AL| (QUOTE NIL)) 
+
+(DEFUN |OrderedRing| NIL 
+  (LET (#:G84457)  
+    (COND 
+      (|OrderedRing;AL|) 
+      (T (SETQ |OrderedRing;AL| (|OrderedRing;|)))))) 
+
+(DEFUN |OrderedRing;| NIL 
+  (PROG (#1=#:G84455) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|OrderedAbelianGroup|)
+            (|Ring|)
+            (|Monoid|)
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|positive?| ((|Boolean|) |$|)) T)
+                ((|negative?| ((|Boolean|) |$|)) T)
+                ((|sign| ((|Integer|) |$|)) T)
+                ((|abs| (|$| |$|)) T)))
+              NIL 
+              (QUOTE ((|Integer|) (|Boolean|)))
+              NIL)) 
+           |OrderedRing|)
+        (SETELT #1# 0 (QUOTE (|OrderedRing|))))))) 
+
+(MAKEPROP (QUOTE |OrderedRing|) (QUOTE NILADIC) T) 
+
+@
+\section{ORDRING-.lsp BOOTSTRAP}
+{\bf ORDRING-} depends on {\bf ORDRING}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf ORDRING-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf ORDRING-.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.
+
+<<ORDRING-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |ORDRING-;positive?;SB;1| (|x| |$|) 
+  (SPADCALL (|spadConstant| |$| 7) |x| (QREFELT |$| 9))) 
+
+(DEFUN |ORDRING-;negative?;SB;2| (|x| |$|) 
+  (SPADCALL |x| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
+
+(DEFUN |ORDRING-;sign;SI;3| (|x| |$|) 
+  (COND 
+    ((SPADCALL |x| (QREFELT |$| 12)) 1)
+    ((SPADCALL |x| (QREFELT |$| 13)) -1)
+    ((SPADCALL |x| (QREFELT |$| 15)) 0)
+    ((QUOTE T) 
+      (|error| "x satisfies neither positive?, negative? or zero?")))) 
+
+(DEFUN |ORDRING-;abs;2S;4| (|x| |$|) 
+  (COND 
+    ((SPADCALL |x| (QREFELT |$| 12)) |x|)
+    ((SPADCALL |x| (QREFELT |$| 13)) (SPADCALL |x| (QREFELT |$| 18)))
+    ((SPADCALL |x| (QREFELT |$| 15)) (|spadConstant| |$| 7))
+    ((QUOTE T) 
+      (|error| "x satisfies neither positive?, negative? or zero?")))) 
+
+(DEFUN |OrderedRing&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|OrderedRing&|))
+        (LETT |dv$| (LIST (QUOTE |OrderedRing&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 20) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |OrderedRing&|)
+  (QUOTE |infovec|)
+  (LIST
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (0 . |Zero|)
+        (|Boolean|)
+        (4 . |<|)
+        |ORDRING-;positive?;SB;1|
+        |ORDRING-;negative?;SB;2|
+        (10 . |positive?|)
+        (15 . |negative?|)
+        (20 . |One|)
+        (24 . |zero?|)
+        (|Integer|)
+        |ORDRING-;sign;SI;3|
+        (29 . |-|)
+        |ORDRING-;abs;2S;4|)) 
+    (QUOTE #(|sign| 34 |positive?| 39 |negative?| 44 |abs| 49))
+    (QUOTE NIL)
+    (CONS 
+      (|makeByteWordVec2| 1 (QUOTE NIL))
+      (CONS 
+        (QUOTE #())
+        (CONS 
+          (QUOTE #())
+          (|makeByteWordVec2| 19 
+            (QUOTE 
+              (0 6 0 7 2 6 8 0 0 9 1 6 8 0 12 1 6 8 0 13 0 6 0 14 1 6 8 0 15
+               1 6 0 0 18 1 0 16 0 17 1 0 8 0 10 1 0 8 0 11 1 0 0 0 19))))))
+   (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}
@@ -14149,6 +15212,103 @@ Note that this code is not included in the generated catdef.spad file.
      10 2 0 15 0 0 18))))))
   (QUOTE |lookupComplete|))) 
 @
+\section{RING.lsp BOOTSTRAP}
+{\bf RING} depends on itself. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf RING}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf RING.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.
+
+<<RING.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(SETQ |Ring;AL| (QUOTE NIL)) 
+
+(DEFUN |Ring| NIL 
+  (LET (#:G82789) 
+    (COND 
+      (|Ring;AL|) 
+      (T (SETQ |Ring;AL| (|Ring;|)))))) 
+
+(DEFUN |Ring;| NIL 
+  (PROG (#1=#:G82787) 
+    (RETURN 
+      (PROG1 
+        (LETT #1# 
+          (|Join| 
+            (|Rng|) 
+            (|Monoid|) 
+            (|LeftModule| (QUOTE |$|))
+            (|mkCategory| 
+              (QUOTE |domain|)
+              (QUOTE (
+                ((|characteristic| ((|NonNegativeInteger|))) T)
+                ((|coerce| (|$| (|Integer|))) T)))
+              (QUOTE ((|unitsKnown| T)))
+              (QUOTE ((|Integer|) (|NonNegativeInteger|)))
+              NIL))
+           |Ring|)
+        (SETELT #1# 0 (QUOTE (|Ring|))))))) 
+
+(MAKEPROP (QUOTE |Ring|) (QUOTE NILADIC) T) 
+
+@
+\section{RING-.lsp BOOTSTRAP}
+{\bf RING-} depends on {\bf RING}. We need to break this cycle to build
+the algebra. So we keep a cached copy of the translated {\bf RING-}
+category which we can write into the {\bf MID} directory. We compile 
+the lisp code and copy the {\bf RING-.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.
+
+<<RING-.lsp BOOTSTRAP>>=
+
+(|/VERSIONCHECK| 2) 
+
+(DEFUN |RING-;coerce;IS;1| (|n| |$|) 
+  (SPADCALL |n| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
+
+(DEFUN |Ring&| (|#1|) 
+  (PROG (|DV$1| |dv$| |$| |pv$|) 
+    (RETURN 
+      (PROGN 
+        (LETT |DV$1| (|devaluate| |#1|) . #1=(|Ring&|))
+        (LETT |dv$| (LIST (QUOTE |Ring&|) |DV$1|) . #1#)
+        (LETT |$| (GETREFV 12) . #1#)
+        (QSETREFV |$| 0 |dv$|)
+        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
+        (|stuffDomainSlots| |$|)
+        (QSETREFV |$| 6 |#1|)
+        |$|)))) 
+
+(MAKEPROP 
+  (QUOTE |Ring&|)
+  (QUOTE |infovec|)
+  (LIST 
+    (QUOTE 
+      #(NIL NIL NIL NIL NIL NIL 
+        (|local| |#1|)
+        (0 . |One|)
+        (|Integer|)
+        (4 . |*|)
+        |RING-;coerce;IS;1| 
+        (|OutputForm|))) 
+  (QUOTE #(|coerce| 10)) 
+  (QUOTE NIL) 
+  (CONS 
+    (|makeByteWordVec2| 1 (QUOTE NIL))
+    (CONS 
+      (QUOTE #())
+      (CONS 
+        (QUOTE #())
+        (|makeByteWordVec2| 10 (QUOTE (0 6 0 7 2 6 0 8 0 9 1 0 0 8 10))))))
+   (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
@@ -15591,6 +16751,7 @@ Note that this code is not included in the generated catdef.spad file.
 <<category A1AGG OneDimensionalArrayAggregate>>
 <<category BASTYPE BasicType>>
 <<category BGAGG BagAggregate>>
+<<category BMODULE BiModule>>
 <<category BRAGG BinaryRecursiveAggregate>>
 <<category BTAGG BitAggregate>>
 <<category CABMON CancellationAbelianMonoid>>
@@ -15605,26 +16766,34 @@ Note that this code is not included in the generated catdef.spad file.
 <<category FINITE Finite>>
 <<category FLAGG FiniteLinearAggregate>>
 <<category FSAGG FiniteSetAggregate>>
+<<category GROUP Group>>
 <<category HOAGG HomogeneousAggregate>>
 <<category IXAGG IndexedAggregate>>
 <<category KDAGG KeyedDictionary>>
 <<category KOERCE CoercibleTo>>
 <<category KONVERT ConvertibleTo>>
+<<category LMODULE LeftModule>>
 <<category LNAGG LinearAggregate>>
 <<category LSAGG ListAggregate>>
 <<category MONOID Monoid>>
 <<category MDAGG MultiDictionary>>
 <<category MSETAGG MultisetAggregate>>
+<<category OAGROUP OrderedAbelianGroup>>
 <<category OAMON OrderedAbelianMonoid>>
+<<category OAMONS OrderedAbelianMonoidSup>>
 <<category OASGP OrderedAbelianSemiGroup>>
+<<category OCAMON OrderedCancellationAbelianMonoid>>
 <<category OMSAGG OrderedMultisetAggregate>>
 <<category ORDFIN OrderedFinite>>
 <<category ORDMON OrderedMonoid>>
+<<category ORDRING OrderedRing>>
 <<category ORDSET OrderedSet>>
 <<category PRQAGG PriorityQueueAggregate>>
 <<category QUAGG QueueAggregate>>
 <<category RCAGG RecursiveAggregate>>
 <<category RETRACT RetractableTo>>
+<<category RING Ring>>
+<<category RMODULE RightModule>>
 <<category RNG Rng>>
 <<category SETAGG SetAggregate>>
 <<category SETCAT SetCategory>>
@@ -15654,6 +16823,7 @@ digraph dotabb {
 <<A1AGG.dotabb>>
 <<BASTYPE.dotabb>>
 <<BGAGG.dotabb>>
+<<BMODULE.dotabb>>
 <<BRAGG.dotabb>>
 <<BTAGG.dotabb>>
 <<CABMON.dotabb>>
@@ -15673,21 +16843,28 @@ digraph dotabb {
 <<KDAGG.dotabb>>
 <<KOERCE.dotabb>>
 <<KONVERT.dotabb>>
+<<LMODULE.dotabb>>
 <<LNAGG.dotabb>>
 <<LSAGG.dotabb>>
 <<MDAGG.dotabb>>
 <<MONOID.dotabb>>
 <<MSETAGG.dotabb>>
+<<OAGROUP.dotabb>>
 <<OAMON.dotabb>>
+<<OAMONS.dotabb>>
 <<OASGP.dotabb>>
+<<OCAMON.dotabb>>
 <<OMSAGG.dotabb>>
 <<ORDFIN.dotabb>>
 <<ORDMON.dotabb>>
+<<ORDRING.dotabb>>
 <<ORDSET.dotabb>>
 <<PRQAGG.dotabb>>
 <<QUAGG.dotabb>>
 <<RCAGG.dotabb>>
 <<RETRACT.dotabb>>
+<<RING.dotabb>>
+<<RMODULE.dotabb>>
 <<RNG.dotabb>>
 <<SETAGG.dotabb>>
 <<SETCAT.dotabb>>
@@ -15720,6 +16897,7 @@ digraph dotfull {
 <<A1AGG.dotfull>>
 <<BASTYPE.dotfull>>
 <<BGAGG.dotfull>>
+<<BMODULE.dotfull>>
 <<BRAGG.dotfull>>
 <<BTAGG.dotfull>>
 <<CABMON.dotfull>>
@@ -15739,21 +16917,28 @@ digraph dotfull {
 <<KDAGG.dotfull>>
 <<KOERCE.dotfull>>
 <<KONVERT.dotfull>>
+<<LMODULE.dotfull>>
 <<LNAGG.dotfull>>
 <<LSAGG.dotfull>>
 <<MDAGG.dotfull>>
 <<MONOID.dotfull>>
 <<MSETAGG.dotfull>>
+<<OAGROUP.dotfull>>
 <<OAMON.dotfull>>
+<<OAMONS.dotabb>>
 <<OASGP.dotfull>>
+<<OCAMON.dotfull>>
 <<OMSAGG.dotfull>>
 <<ORDFIN.dotfull>>
 <<ORDMON.dotfull>>
+<<ORDRING.dotfull>>
 <<ORDSET.dotfull>>
 <<PRQAGG.dotfull>>
 <<QUAGG.dotfull>>
 <<RCAGG.dotfull>>
 <<RETRACT.dotfull>>
+<<RING.dotfull>>
+<<RMODULE.dotfull>>
 <<RNG.dotfull>>
 <<SETAGG.dotfull>>
 <<SETCAT.dotfull>>
diff --git a/books/ps/v102bimodule.ps b/books/ps/v102bimodule.ps
new file mode 100644
index 0000000..b830c3f
--- /dev/null
+++ b/books/ps/v102bimodule.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 353 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 353 440
+%%PageOrientation: Portrait
+gsave
+36 36 317 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
+315 402 lineto
+315 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+315 402 lineto
+315 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% BiModule(a:Ring,b:Ring)
+[ /Rect [ 84 360 246 396 ]
+  /Border [ 0 0 0 ]
+  /Action << /Subtype /URI /URI (books/bookvol10.2.pamphlet#nameddest=BMODULE) >>
+  /Subtype /Link
+/ANN pdfmark
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 246 396 moveto
+84 396 lineto
+84 360 lineto
+246 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 246 396 moveto
+84 396 lineto
+84 360 lineto
+246 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+92 373 moveto
+(BiModule\(a:Ring,b:Ring\))
+[9.36 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 3.6 6.96 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 155 324 moveto
+25 324 lineto
+25 288 lineto
+155 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 155 324 moveto
+25 324 lineto
+25 288 lineto
+155 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+33 301 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->LeftModule(a:Ring)
+newpath 146 360 moveto
+137 351 126 341 116 331 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 119 329 moveto
+109 324 lineto
+114 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 119 329 moveto
+109 324 lineto
+114 334 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 309 324 moveto
+173 324 lineto
+173 288 lineto
+309 288 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 309 324 moveto
+173 324 lineto
+173 288 lineto
+309 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+180 301 moveto
+(RightModule\(a:Ring\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% BiModule(a:Ring,b:Ring)->RightModule(a:Ring)
+newpath 184 360 moveto
+194 351 205 341 215 331 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 217 334 moveto
+222 324 lineto
+212 329 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 217 334 moveto
+222 324 lineto
+212 329 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 154 252 moveto
+28 252 lineto
+28 216 lineto
+154 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 154 252 moveto
+28 252 lineto
+28 216 lineto
+154 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+36 229 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 90 288 moveto
+91 280 91 271 91 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 95 262 moveto
+91 252 lineto
+88 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 95 262 moveto
+91 252 lineto
+88 262 lineto
+closepath
+stroke
+end grestore
+% RightModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 307 252 moveto
+173 252 lineto
+173 216 lineto
+307 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 307 252 moveto
+173 252 lineto
+173 216 lineto
+307 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+181 229 moveto
+(RightModule\(a:Rng\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% RightModule(a:Ring)->RightModule(a:Rng)
+newpath 241 288 moveto
+240 280 240 271 240 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 244 262 moveto
+240 252 lineto
+237 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 244 262 moveto
+240 252 lineto
+237 262 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 218 180 moveto
+112 180 lineto
+112 144 lineto
+218 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 218 180 moveto
+112 180 lineto
+112 144 lineto
+218 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+120 157 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
+% RightModule(a:Rng)->AbelianGroup()
+newpath 221 216 moveto
+212 207 201 197 191 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 194 185 moveto
+184 180 lineto
+189 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 194 185 moveto
+184 180 lineto
+189 190 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 184 108 moveto
+0 108 lineto
+0 72 lineto
+184 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 184 108 moveto
+0 108 lineto
+0 72 lineto
+184 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 85 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 147 144 moveto
+138 135 127 125 117 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 120 113 moveto
+110 108 lineto
+115 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 120 113 moveto
+110 108 lineto
+115 118 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 274 108 moveto
+202 108 lineto
+202 72 lineto
+274 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 274 108 moveto
+202 108 lineto
+202 72 lineto
+274 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+209 85 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 183 144 moveto
+192 135 203 125 213 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 215 118 moveto
+220 108 lineto
+210 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 215 118 moveto
+220 108 lineto
+210 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 110 216 moveto
+119 207 130 197 140 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 142 190 moveto
+147 180 lineto
+137 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 142 190 moveto
+147 180 lineto
+137 185 lineto
+closepath
+stroke
+end grestore
+% ABELMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 141 36 moveto
+43 36 lineto
+43 0 lineto
+141 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 141 36 moveto
+43 36 lineto
+43 0 lineto
+141 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+51 13 moveto
+(ABELMON...)
+[10.08 9.36 8.64 8.64 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CancellationAbelianMonoid()->ABELMON...
+newpath 92 72 moveto
+92 64 92 55 92 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 96 46 moveto
+92 36 lineto
+89 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 96 46 moveto
+92 36 lineto
+89 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102group.ps b/books/ps/v102group.ps
new file mode 100644
index 0000000..d0e930f
--- /dev/null
+++ b/books/ps/v102group.ps
@@ -0,0 +1,791 @@
+%!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 554 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 554 512
+%%PageOrientation: Portrait
+gsave
+36 36 518 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
+516 474 lineto
+516 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 474 lineto
+516 474 lineto
+516 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Group()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 386 468 moveto
+324 468 lineto
+324 432 lineto
+386 432 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 386 468 moveto
+324 468 lineto
+324 432 lineto
+386 432 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+332 445 moveto
+(Group\(\))
+[10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Monoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 338 396 moveto
+268 396 lineto
+268 360 lineto
+338 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 338 396 moveto
+268 396 lineto
+268 360 lineto
+338 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+275 373 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Group()->Monoid()
+newpath 342 432 moveto
+336 424 329 413 322 404 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 325 402 moveto
+316 396 lineto
+319 406 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 325 402 moveto
+316 396 lineto
+319 406 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(Group)
+gsave 10 dict begin
+filled
+0.333 1.000 0.933 nodecolor
+0.333 1.000 0.933 nodecolor
+newpath 510 324 moveto
+346 324 lineto
+346 288 lineto
+510 288 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 510 324 moveto
+346 324 lineto
+346 288 lineto
+510 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+354 301 moveto
+(RepeatedSquaring\(Group\))
+[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 10.08 4.8 6.96 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Group()->RepeatedSquaring(Group)
+newpath 364 432 moveto
+377 407 400 362 414 333 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 417 334 moveto
+419 324 lineto
+411 331 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 417 334 moveto
+419 324 lineto
+411 331 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 328 324 moveto
+238 324 lineto
+238 288 lineto
+328 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 328 324 moveto
+238 324 lineto
+238 288 lineto
+328 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+246 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 298 360 moveto
+296 352 293 343 291 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 294 333 moveto
+288 324 lineto
+288 335 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 294 333 moveto
+288 324 lineto
+288 335 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 490 180 moveto
+284 180 lineto
+284 144 lineto
+490 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 490 180 moveto
+284 180 lineto
+284 144 lineto
+490 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+291 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(Group)->RepeatedSquaring(a:SetCategory)
+newpath 425 288 moveto
+422 269 416 240 409 216 curveto
+406 207 403 198 399 189 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 402 188 moveto
+395 180 lineto
+396 191 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 402 188 moveto
+395 180 lineto
+396 191 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 190 252 moveto
+96 252 lineto
+96 216 lineto
+190 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 190 252 moveto
+96 252 lineto
+96 216 lineto
+190 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+103 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 248 288 moveto
+229 279 206 267 187 257 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 188 254 moveto
+178 252 lineto
+185 260 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 188 254 moveto
+178 252 lineto
+185 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 400 252 moveto
+208 252 lineto
+208 216 lineto
+400 216 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 400 252 moveto
+208 252 lineto
+208 216 lineto
+400 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+216 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 288 288 moveto
+291 280 294 271 296 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 299 263 moveto
+299 252 lineto
+293 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 299 263 moveto
+299 252 lineto
+293 261 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 112 216 moveto
+99 206 83 194 73 180 curveto
+60 162 52 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 148 216 moveto
+151 208 154 199 156 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 159 191 moveto
+159 180 lineto
+153 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 159 191 moveto
+159 180 lineto
+153 189 lineto
+closepath
+stroke
+end grestore
+% RepeatedSquaring(SemiGroup)->RepeatedSquaring(a:SetCategory)
+newpath 325 216 moveto
+335 207 348 196 359 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 362 189 moveto
+367 180 lineto
+357 184 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 362 189 moveto
+367 180 lineto
+357 184 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 418 108 moveto
+356 108 lineto
+356 72 lineto
+418 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 418 108 moveto
+356 108 lineto
+356 72 lineto
+418 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+363 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 387 144 moveto
+387 136 387 127 387 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 391 118 moveto
+387 108 lineto
+384 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 391 118 moveto
+387 108 lineto
+384 118 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102leftmodule.ps b/books/ps/v102leftmodule.ps
new file mode 100644
index 0000000..df491a4
--- /dev/null
+++ b/books/ps/v102leftmodule.ps
@@ -0,0 +1,519 @@
+%!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 456 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 456 368
+%%PageOrientation: Portrait
+gsave
+36 36 420 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
+418 330 lineto
+418 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+418 330 lineto
+418 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 262 324 moveto
+136 324 lineto
+136 288 lineto
+262 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 262 324 moveto
+136 324 lineto
+136 288 lineto
+262 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+144 301 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 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 252 252 moveto
+146 252 lineto
+146 216 lineto
+252 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 252 252 moveto
+146 252 lineto
+146 216 lineto
+252 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+154 229 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
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 199 288 moveto
+199 280 199 271 199 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 203 262 moveto
+199 252 lineto
+196 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 203 262 moveto
+199 252 lineto
+196 262 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 184 180 moveto
+0 180 lineto
+0 144 lineto
+184 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 184 180 moveto
+0 180 lineto
+0 144 lineto
+184 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 157 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 172 216 moveto
+159 207 142 196 128 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 129 183 moveto
+119 180 lineto
+125 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 129 183 moveto
+119 180 lineto
+125 188 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 412 180 moveto
+202 180 lineto
+202 144 lineto
+412 144 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 412 180 moveto
+202 180 lineto
+202 144 lineto
+412 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+210 157 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 226 216 moveto
+240 207 257 196 271 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 274 188 moveto
+280 180 lineto
+270 183 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 274 188 moveto
+280 180 lineto
+270 183 lineto
+closepath
+stroke
+end grestore
+% ABELMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 141 108 moveto
+43 108 lineto
+43 72 lineto
+141 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 141 108 moveto
+43 108 lineto
+43 72 lineto
+141 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+51 85 moveto
+(ABELMON...)
+[10.08 9.36 8.64 8.64 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CancellationAbelianMonoid()->ABELMON...
+newpath 92 144 moveto
+92 136 92 127 92 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 96 118 moveto
+92 108 lineto
+89 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 96 118 moveto
+92 108 lineto
+89 118 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 411 108 moveto
+203 108 lineto
+203 72 lineto
+411 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 411 108 moveto
+203 108 lineto
+203 72 lineto
+411 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+210 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 307 144 moveto
+307 136 307 127 307 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 311 118 moveto
+307 108 lineto
+304 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 311 118 moveto
+307 108 lineto
+304 118 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 338 36 moveto
+276 36 lineto
+276 0 lineto
+338 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 338 36 moveto
+276 36 lineto
+276 0 lineto
+338 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+283 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 307 72 moveto
+307 64 307 55 307 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 311 46 moveto
+307 36 lineto
+304 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 311 46 moveto
+307 36 lineto
+304 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedabeliangroup.ps b/books/ps/v102orderedabeliangroup.ps
new file mode 100644
index 0000000..8608006
--- /dev/null
+++ b/books/ps/v102orderedabeliangroup.ps
@@ -0,0 +1,493 @@
+%!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 398 224
+%%EndComments
+save
+%%BeginProlog
+/DotDict 200 dict def
+DotDict begin
+
+/setupLatin1 {
+mark
+/EncodingVector 256 array def
+ EncodingVector 0
+
+ISOLatin1Encoding 0 255 getinterval putinterval
+EncodingVector 45 /hyphen put
+
+% Set up ISO Latin 1 character encoding
+/starnetISO {
+        dup dup findfont dup length dict begin
+        { 1 index /FID ne { def }{ pop pop } ifelse
+        } forall
+        /Encoding EncodingVector def
+        currentdict end definefont
+} def
+/Times-Roman starnetISO def
+/Times-Italic starnetISO def
+/Times-Bold starnetISO def
+/Times-BoldItalic starnetISO def
+/Helvetica starnetISO def
+/Helvetica-Oblique starnetISO def
+/Helvetica-Bold starnetISO def
+/Helvetica-BoldOblique starnetISO def
+/Courier starnetISO def
+/Courier-Oblique starnetISO def
+/Courier-Bold starnetISO def
+/Courier-BoldOblique starnetISO def
+cleartomark
+} bind def
+
+%%BeginResource: procset graphviz 0 0
+/coord-font-family /Times-Roman def
+/default-font-family /Times-Roman def
+/coordfont coord-font-family findfont 8 scalefont def
+
+/InvScaleFactor 1.0 def
+/set_scale {
+	dup 1 exch div /InvScaleFactor exch def
+	dup scale
+} bind def
+
+% styles
+/solid { [] 0 setdash } bind def
+/dashed { [9 InvScaleFactor mul dup ] 0 setdash } bind def
+/dotted { [1 InvScaleFactor mul 6 InvScaleFactor mul] 0 setdash } bind def
+/invis {/fill {newpath} def /stroke {newpath} def /show {pop newpath} def} bind def
+/bold { 2 setlinewidth } bind def
+/filled { } bind def
+/unfilled { } bind def
+/rounded { } bind def
+/diagonals { } bind def
+
+% hooks for setting color 
+/nodecolor { sethsbcolor } bind def
+/edgecolor { sethsbcolor } bind def
+/graphcolor { sethsbcolor } bind def
+/nopcolor {pop pop pop} bind def
+
+/beginpage {	% i j npages
+	/npages exch def
+	/j exch def
+	/i exch def
+	/str 10 string def
+	npages 1 gt {
+		gsave
+			coordfont setfont
+			0 0 moveto
+			(\() show i str cvs show (,) show j str cvs show (\)) show
+		grestore
+	} if
+} bind def
+
+/set_font {
+	findfont exch
+	scalefont setfont
+} def
+
+% draw aligned label in bounding box aligned to current point
+/alignedtext {			% width adj text
+	/text exch def
+	/adj exch def
+	/width exch def
+	gsave
+		width 0 gt {
+			text stringwidth pop adj mul 0 rmoveto
+		} if
+		[] 0 setdash
+		text show
+	grestore
+} def
+
+/boxprim {				% xcorner ycorner xsize ysize
+		4 2 roll
+		moveto
+		2 copy
+		exch 0 rlineto
+		0 exch rlineto
+		pop neg 0 rlineto
+		closepath
+} bind def
+
+/ellipse_path {
+	/ry exch def
+	/rx exch def
+	/y exch def
+	/x exch def
+	matrix currentmatrix
+	newpath
+	x y translate
+	rx ry scale
+	0 0 1 0 360 arc
+	setmatrix
+} bind def
+
+/endpage { showpage } bind def
+/showpage { } def
+
+/layercolorseq
+	[	% layer color sequence - darkest to lightest
+		[0 0 0]
+		[.2 .8 .8]
+		[.4 .8 .8]
+		[.6 .8 .8]
+		[.8 .8 .8]
+	]
+def
+
+/layerlen layercolorseq length def
+
+/setlayer {/maxlayer exch def /curlayer exch def
+	layercolorseq curlayer 1 sub layerlen mod get
+	aload pop sethsbcolor
+	/nodecolor {nopcolor} def
+	/edgecolor {nopcolor} def
+	/graphcolor {nopcolor} def
+} bind def
+
+/onlayer { curlayer ne {invis} if } def
+
+/onlayers {
+	/myupper exch def
+	/mylower exch def
+	curlayer mylower lt
+	curlayer myupper gt
+	or
+	{invis} if
+} def
+
+/curlayer 0 def
+
+%%EndResource
+%%EndProlog
+%%BeginSetup
+14 default-font-family set_font
+1 setmiterlimit
+% /arrowlength 10 def
+% /arrowwidth 5 def
+
+% make sure pdfmark is harmless for PS-interpreters other than Distiller
+/pdfmark where {pop} {userdict /pdfmark /cleartomark load put} ifelse
+% make '<<' and '>>' safe on PS Level 1 devices
+/languagelevel where {pop languagelevel}{1} ifelse
+2 lt {
+    userdict (<<) cvn ([) cvn load put
+    userdict (>>) cvn ([) cvn load put
+} if
+
+%%EndSetup
+%%Page: 1 1
+%%PageBoundingBox: 36 36 398 224
+%%PageOrientation: Portrait
+gsave
+36 36 362 188 boxprim clip newpath
+36 36 translate
+0 0 1 beginpage
+1.0000 set_scale
+4 4 translate 0 rotate
+0.167 0.600 1.000 graphcolor
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 186 lineto
+360 186 lineto
+360 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 186 lineto
+360 186 lineto
+360 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedAbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 283 180 moveto
+133 180 lineto
+133 144 lineto
+283 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 283 180 moveto
+133 180 lineto
+133 144 lineto
+283 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+140 157 moveto
+(OrderedAbelianGroup\(\))
+[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 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedCancellationAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 230 108 moveto
+0 108 lineto
+0 72 lineto
+230 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 230 108 moveto
+0 108 lineto
+0 72 lineto
+230 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 85 moveto
+(OrderedCancellationAbelianMonoid\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 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
+% OrderedAbelianGroup()->OrderedCancellationAbelianMonoid()
+newpath 185 144 moveto
+174 135 159 124 146 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 148 111 moveto
+138 108 lineto
+144 117 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 148 111 moveto
+138 108 lineto
+144 117 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 354 108 moveto
+248 108 lineto
+248 72 lineto
+354 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 354 108 moveto
+248 108 lineto
+248 72 lineto
+354 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+256 85 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
+% OrderedAbelianGroup()->AbelianGroup()
+newpath 231 144 moveto
+242 135 257 124 270 114 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 272 117 moveto
+278 108 lineto
+268 111 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 272 117 moveto
+278 108 lineto
+268 111 lineto
+closepath
+stroke
+end grestore
+% OAMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+70 36 lineto
+70 0 lineto
+148 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 148 36 moveto
+70 36 lineto
+70 0 lineto
+148 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+77 13 moveto
+(OAMON...)
+[9.36 10.08 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedCancellationAbelianMonoid()->OAMON...
+newpath 113 72 moveto
+112 64 112 55 111 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 115 46 moveto
+111 36 lineto
+108 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 115 46 moveto
+111 36 lineto
+108 46 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 254 36 moveto
+166 36 lineto
+166 0 lineto
+254 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 254 36 moveto
+166 36 lineto
+166 0 lineto
+254 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+174 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedCancellationAbelianMonoid()->CABMON...
+newpath 139 72 moveto
+150 63 165 52 178 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 180 45 moveto
+186 36 lineto
+176 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 180 45 moveto
+186 36 lineto
+176 39 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()->CABMON...
+newpath 278 72 moveto
+267 63 253 52 241 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 39 moveto
+233 36 lineto
+239 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 39 moveto
+233 36 lineto
+239 45 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 344 36 moveto
+272 36 lineto
+272 0 lineto
+344 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 344 36 moveto
+272 36 lineto
+272 0 lineto
+344 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+279 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 303 72 moveto
+304 64 304 55 305 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 308 46 moveto
+306 36 lineto
+302 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 308 46 moveto
+306 36 lineto
+302 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedabelianmonoidsup.ps b/books/ps/v102orderedabelianmonoidsup.ps
new file mode 100644
index 0000000..76d969b
--- /dev/null
+++ b/books/ps/v102orderedabelianmonoidsup.ps
@@ -0,0 +1,652 @@
+%!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 464 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 464 440
+%%PageOrientation: Portrait
+gsave
+36 36 428 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
+426 402 lineto
+426 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 402 lineto
+426 402 lineto
+426 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedAbelianMonoidSup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 355 396 moveto
+175 396 lineto
+175 360 lineto
+355 360 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 355 396 moveto
+175 396 lineto
+175 360 lineto
+355 360 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+182 373 moveto
+(OrderedAbelianMonoidSup\(\))
+[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 7.68 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedCancellationAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 380 324 moveto
+150 324 lineto
+150 288 lineto
+380 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 380 324 moveto
+150 324 lineto
+150 288 lineto
+380 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 301 moveto
+(OrderedCancellationAbelianMonoid\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 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
+% OrderedAbelianMonoidSup()->OrderedCancellationAbelianMonoid()
+newpath 265 360 moveto
+265 352 265 343 265 334 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 269 334 moveto
+265 324 lineto
+262 334 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 269 334 moveto
+265 324 lineto
+262 334 lineto
+closepath
+stroke
+end grestore
+% OrderedAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 288 252 moveto
+128 252 lineto
+128 216 lineto
+288 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 288 252 moveto
+128 252 lineto
+128 216 lineto
+288 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+136 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
+% OrderedCancellationAbelianMonoid()->OrderedAbelianMonoid()
+newpath 251 288 moveto
+244 279 236 269 228 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 231 258 moveto
+222 252 lineto
+225 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 231 258 moveto
+222 252 lineto
+225 262 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 420 180 moveto
+236 180 lineto
+236 144 lineto
+420 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 420 180 moveto
+236 180 lineto
+236 144 lineto
+420 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+244 157 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
+% OrderedCancellationAbelianMonoid()->CancellationAbelianMonoid()
+newpath 277 288 moveto
+283 278 291 264 297 252 curveto
+306 232 314 208 320 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 323 191 moveto
+323 180 lineto
+317 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 323 191 moveto
+323 180 lineto
+317 189 lineto
+closepath
+stroke
+end grestore
+% OrderedAbelianSemiGroup()
+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
+8 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 178 216 moveto
+163 207 144 195 128 185 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 129 182 moveto
+119 180 lineto
+126 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 129 182 moveto
+119 180 lineto
+126 188 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 266 108 moveto
+152 108 lineto
+152 72 lineto
+266 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 266 108 moveto
+152 108 lineto
+152 72 lineto
+266 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+159 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 208 216 moveto
+208 191 209 147 209 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 118 moveto
+209 108 lineto
+206 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 118 moveto
+209 108 lineto
+206 118 lineto
+closepath
+stroke
+end grestore
+% CancellationAbelianMonoid()->AbelianMonoid()
+newpath 298 144 moveto
+283 135 264 123 248 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 249 110 moveto
+239 108 lineto
+246 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 249 110 moveto
+239 108 lineto
+246 116 lineto
+closepath
+stroke
+end grestore
+% OrderedAbelianSemiGroup()->AbelianMonoid()
+newpath 120 144 moveto
+135 135 154 123 170 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 172 116 moveto
+179 108 lineto
+169 110 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 172 116 moveto
+179 108 lineto
+169 110 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 134 108 moveto
+46 108 lineto
+46 72 lineto
+134 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 134 108 moveto
+46 108 lineto
+46 72 lineto
+134 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+53 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 90 144 moveto
+90 136 90 127 90 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 118 moveto
+90 108 lineto
+87 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 118 moveto
+90 108 lineto
+87 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 250 36 moveto
+168 36 lineto
+168 0 lineto
+250 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 250 36 moveto
+168 36 lineto
+168 0 lineto
+250 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+175 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 209 72 moveto
+209 64 209 55 209 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 46 moveto
+209 36 lineto
+206 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 46 moveto
+209 36 lineto
+206 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 129 36 moveto
+51 36 lineto
+51 0 lineto
+129 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 129 36 moveto
+51 36 lineto
+51 0 lineto
+129 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 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 90 72 moveto
+90 64 90 55 90 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 46 moveto
+90 36 lineto
+87 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 46 moveto
+90 36 lineto
+87 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedcancellationabelianmonoid.ps b/books/ps/v102orderedcancellationabelianmonoid.ps
new file mode 100644
index 0000000..1fb5a28
--- /dev/null
+++ b/books/ps/v102orderedcancellationabelianmonoid.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 464 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 464 368
+%%PageOrientation: Portrait
+gsave
+36 36 428 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
+426 330 lineto
+426 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+426 330 lineto
+426 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedCancellationAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 380 324 moveto
+150 324 lineto
+150 288 lineto
+380 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 380 324 moveto
+150 324 lineto
+150 288 lineto
+380 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 301 moveto
+(OrderedCancellationAbelianMonoid\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 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
+% OrderedAbelianMonoid()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 288 252 moveto
+128 252 lineto
+128 216 lineto
+288 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 288 252 moveto
+128 252 lineto
+128 216 lineto
+288 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+136 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
+% OrderedCancellationAbelianMonoid()->OrderedAbelianMonoid()
+newpath 251 288 moveto
+244 279 236 269 228 260 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 231 258 moveto
+222 252 lineto
+225 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 231 258 moveto
+222 252 lineto
+225 262 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 420 180 moveto
+236 180 lineto
+236 144 lineto
+420 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 420 180 moveto
+236 180 lineto
+236 144 lineto
+420 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+244 157 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
+% OrderedCancellationAbelianMonoid()->CancellationAbelianMonoid()
+newpath 277 288 moveto
+283 278 291 264 297 252 curveto
+306 232 314 208 320 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 323 191 moveto
+323 180 lineto
+317 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 323 191 moveto
+323 180 lineto
+317 189 lineto
+closepath
+stroke
+end grestore
+% OrderedAbelianSemiGroup()
+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
+8 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 178 216 moveto
+163 207 144 195 128 185 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 129 182 moveto
+119 180 lineto
+126 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 129 182 moveto
+119 180 lineto
+126 188 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 266 108 moveto
+152 108 lineto
+152 72 lineto
+266 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 266 108 moveto
+152 108 lineto
+152 72 lineto
+266 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+159 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 208 216 moveto
+208 191 209 147 209 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 118 moveto
+209 108 lineto
+206 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 118 moveto
+209 108 lineto
+206 118 lineto
+closepath
+stroke
+end grestore
+% CancellationAbelianMonoid()->AbelianMonoid()
+newpath 298 144 moveto
+283 135 264 123 248 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 249 110 moveto
+239 108 lineto
+246 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 249 110 moveto
+239 108 lineto
+246 116 lineto
+closepath
+stroke
+end grestore
+% OrderedAbelianSemiGroup()->AbelianMonoid()
+newpath 120 144 moveto
+135 135 154 123 170 113 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 172 116 moveto
+179 108 lineto
+169 110 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 172 116 moveto
+179 108 lineto
+169 110 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 134 108 moveto
+46 108 lineto
+46 72 lineto
+134 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 134 108 moveto
+46 108 lineto
+46 72 lineto
+134 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+53 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 90 144 moveto
+90 136 90 127 90 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 118 moveto
+90 108 lineto
+87 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 118 moveto
+90 108 lineto
+87 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 250 36 moveto
+168 36 lineto
+168 0 lineto
+250 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 250 36 moveto
+168 36 lineto
+168 0 lineto
+250 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+175 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 209 72 moveto
+209 64 209 55 209 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 46 moveto
+209 36 lineto
+206 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 46 moveto
+209 36 lineto
+206 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 129 36 moveto
+51 36 lineto
+51 0 lineto
+129 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 129 36 moveto
+51 36 lineto
+51 0 lineto
+129 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 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 90 72 moveto
+90 64 90 55 90 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 46 moveto
+90 36 lineto
+87 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 46 moveto
+90 36 lineto
+87 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102orderedring.ps b/books/ps/v102orderedring.ps
new file mode 100644
index 0000000..f0edfac
--- /dev/null
+++ b/books/ps/v102orderedring.ps
@@ -0,0 +1,832 @@
+%!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 515 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 515 368
+%%PageOrientation: Portrait
+gsave
+36 36 479 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
+477 330 lineto
+477 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+477 330 lineto
+477 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% OrderedRing()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 368 324 moveto
+270 324 lineto
+270 288 lineto
+368 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 368 324 moveto
+270 324 lineto
+270 288 lineto
+368 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+277 301 moveto
+(OrderedRing\(\))
+[10.08 4.56 6.96 6.24 4.8 6.24 6.96 9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedAbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 191 252 moveto
+41 252 lineto
+41 216 lineto
+191 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 191 252 moveto
+41 252 lineto
+41 216 lineto
+191 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+48 229 moveto
+(OrderedAbelianGroup\(\))
+[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 10.08 4.8 6.96 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedRing()->OrderedAbelianGroup()
+newpath 270 289 moveto
+242 279 207 266 177 255 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 178 252 moveto
+167 252 lineto
+176 258 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 178 252 moveto
+167 252 lineto
+176 258 lineto
+closepath
+stroke
+end grestore
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 346 252 moveto
+292 252 lineto
+292 216 lineto
+346 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 346 252 moveto
+292 252 lineto
+292 216 lineto
+346 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+300 229 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedRing()->Ring()
+newpath 319 288 moveto
+319 280 319 271 319 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 323 262 moveto
+319 252 lineto
+316 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 323 262 moveto
+319 252 lineto
+316 262 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 434 180 moveto
+364 180 lineto
+364 144 lineto
+434 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 434 180 moveto
+364 180 lineto
+364 144 lineto
+434 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+371 157 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% OrderedRing()->Monoid()
+newpath 332 288 moveto
+339 278 348 264 355 252 curveto
+367 232 379 208 387 189 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 390 191 moveto
+391 180 lineto
+384 188 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 390 191 moveto
+391 180 lineto
+384 188 lineto
+closepath
+stroke
+end grestore
+% ABELGRP...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 254 36 moveto
+164 36 lineto
+164 0 lineto
+254 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 254 36 moveto
+164 36 lineto
+164 0 lineto
+254 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+171 13 moveto
+(ABELGRP...)
+[10.08 9.36 8.64 8.64 10.08 9.36 6.24 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedAbelianGroup()->ABELGRP...
+newpath 114 216 moveto
+112 184 110 118 137 72 curveto
+144 60 155 50 166 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 168 45 moveto
+174 36 lineto
+164 39 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 168 45 moveto
+174 36 lineto
+164 39 lineto
+closepath
+stroke
+end grestore
+% OCAMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 88 180 moveto
+0 180 lineto
+0 144 lineto
+88 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 88 180 moveto
+0 180 lineto
+0 144 lineto
+88 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+7 157 moveto
+(OCAMON...)
+[10.08 9.12 10.08 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% OrderedAbelianGroup()->OCAMON...
+newpath 98 216 moveto
+89 207 79 197 69 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 72 185 moveto
+62 180 lineto
+67 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 72 185 moveto
+62 180 lineto
+67 190 lineto
+closepath
+stroke
+end grestore
+% Ring()->Monoid()
+newpath 339 216 moveto
+349 207 361 196 372 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 374 190 moveto
+379 180 lineto
+369 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 374 190 moveto
+379 180 lineto
+369 185 lineto
+closepath
+stroke
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 346 180 moveto
+292 180 lineto
+292 144 lineto
+346 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 346 180 moveto
+292 180 lineto
+292 144 lineto
+346 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+302 157 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 319 216 moveto
+319 208 319 199 319 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 323 190 moveto
+319 180 lineto
+316 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 323 190 moveto
+319 180 lineto
+316 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 274 180 moveto
+144 180 lineto
+144 144 lineto
+274 144 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 274 180 moveto
+144 180 lineto
+144 144 lineto
+274 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+152 157 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 292 216 moveto
+278 207 260 196 245 186 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 247 183 moveto
+237 180 lineto
+243 189 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 247 183 moveto
+237 180 lineto
+243 189 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 435 108 moveto
+345 108 lineto
+345 72 lineto
+435 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 435 108 moveto
+345 108 lineto
+345 72 lineto
+435 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+353 85 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 397 144 moveto
+396 136 395 127 394 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 397 117 moveto
+392 108 lineto
+391 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 397 117 moveto
+392 108 lineto
+391 118 lineto
+closepath
+stroke
+end grestore
+% Rng()->ABELGRP...
+newpath 314 144 moveto
+309 125 298 94 281 72 curveto
+272 61 260 50 248 42 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 250 39 moveto
+240 36 lineto
+246 45 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 250 39 moveto
+240 36 lineto
+246 45 lineto
+closepath
+stroke
+end grestore
+% Rng()->SemiGroup()
+newpath 337 144 moveto
+346 135 356 125 365 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+372 108 lineto
+363 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 368 118 moveto
+372 108 lineto
+363 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 272 108 moveto
+146 108 lineto
+146 72 lineto
+272 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 272 108 moveto
+146 108 lineto
+146 72 lineto
+272 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+154 85 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 209 144 moveto
+209 136 209 127 209 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 118 moveto
+209 108 lineto
+206 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 118 moveto
+209 108 lineto
+206 118 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 471 36 moveto
+393 36 lineto
+393 0 lineto
+471 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 471 36 moveto
+393 36 lineto
+393 0 lineto
+471 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+401 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 401 72 moveto
+406 64 411 54 417 45 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 420 46 moveto
+422 36 lineto
+414 43 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 420 46 moveto
+422 36 lineto
+414 43 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 375 36 moveto
+305 36 lineto
+305 0 lineto
+375 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 375 36 moveto
+305 36 lineto
+305 0 lineto
+375 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+312 13 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 377 72 moveto
+372 64 365 54 359 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 362 42 moveto
+353 36 lineto
+356 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 362 42 moveto
+353 36 lineto
+356 46 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->ABELGRP...
+newpath 209 72 moveto
+209 64 209 55 209 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 213 46 moveto
+209 36 lineto
+206 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 213 46 moveto
+209 36 lineto
+206 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102rightmodule.ps b/books/ps/v102rightmodule.ps
new file mode 100644
index 0000000..fa2565d
--- /dev/null
+++ b/books/ps/v102rightmodule.ps
@@ -0,0 +1,427 @@
+%!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 318 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 318 296
+%%PageOrientation: Portrait
+gsave
+36 36 282 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
+280 258 lineto
+280 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 258 lineto
+280 258 lineto
+280 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% RightModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+98 252 lineto
+98 216 lineto
+232 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 232 252 moveto
+98 252 lineto
+98 216 lineto
+232 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+106 229 moveto
+(RightModule\(a:Rng\))
+[9.36 3.84 6.96 6.96 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 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 218 180 moveto
+112 180 lineto
+112 144 lineto
+218 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 218 180 moveto
+112 180 lineto
+112 144 lineto
+218 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+120 157 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
+% RightModule(a:Rng)->AbelianGroup()
+newpath 165 216 moveto
+165 208 165 199 165 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 169 190 moveto
+165 180 lineto
+162 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 169 190 moveto
+165 180 lineto
+162 190 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 184 108 moveto
+0 108 lineto
+0 72 lineto
+184 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 184 108 moveto
+0 108 lineto
+0 72 lineto
+184 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 85 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 147 144 moveto
+138 135 127 125 117 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 120 113 moveto
+110 108 lineto
+115 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 120 113 moveto
+110 108 lineto
+115 118 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 274 108 moveto
+202 108 lineto
+202 72 lineto
+274 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 274 108 moveto
+202 108 lineto
+202 72 lineto
+274 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+209 85 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 183 144 moveto
+192 135 203 125 213 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 215 118 moveto
+220 108 lineto
+210 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 215 118 moveto
+220 108 lineto
+210 113 lineto
+closepath
+stroke
+end grestore
+% ABELMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 141 36 moveto
+43 36 lineto
+43 0 lineto
+141 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 141 36 moveto
+43 36 lineto
+43 0 lineto
+141 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+51 13 moveto
+(ABELMON...)
+[10.08 9.36 8.64 8.64 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% CancellationAbelianMonoid()->ABELMON...
+newpath 92 72 moveto
+92 64 92 55 92 46 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 96 46 moveto
+92 36 lineto
+89 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 96 46 moveto
+92 36 lineto
+89 46 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/books/ps/v102ring.ps b/books/ps/v102ring.ps
new file mode 100644
index 0000000..d91d60f
--- /dev/null
+++ b/books/ps/v102ring.ps
@@ -0,0 +1,744 @@
+%!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 403 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 403 368
+%%PageOrientation: Portrait
+gsave
+36 36 367 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
+365 330 lineto
+365 -6 lineto
+closepath
+fill
+0.167 0.600 1.000 graphcolor
+newpath -6 -6 moveto
+-6 330 lineto
+365 330 lineto
+365 -6 lineto
+closepath
+stroke
+0.000 0.000 0.000 graphcolor
+14.00 /Times-Roman set_font
+% Ring()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 324 moveto
+148 324 lineto
+148 288 lineto
+202 288 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+156 301 moveto
+(Ring\(\))
+[9.36 3.84 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Rng()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 202 252 moveto
+148 252 lineto
+148 216 lineto
+202 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+158 229 moveto
+(Rng\(\))
+[9.36 6.96 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Rng()
+newpath 175 288 moveto
+175 280 175 271 175 262 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 179 262 moveto
+175 252 lineto
+172 262 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 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 290 252 moveto
+220 252 lineto
+220 216 lineto
+290 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+227 229 moveto
+(Monoid\(\))
+[12.48 6.96 6.96 6.96 3.84 6.96 4.56 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->Monoid()
+newpath 195 288 moveto
+205 279 217 268 228 259 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 230 262 moveto
+235 252 lineto
+225 257 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Ring)
+gsave 10 dict begin
+filled
+0.404 0.667 0.545 nodecolor
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+fill
+0.404 0.667 0.545 nodecolor
+newpath 130 252 moveto
+0 252 lineto
+0 216 lineto
+130 216 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+8 229 moveto
+(LeftModule\(a:Ring\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 3.84 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% Ring()->LeftModule(a:Ring)
+newpath 148 288 moveto
+134 279 116 268 101 258 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 103 255 moveto
+93 252 lineto
+99 261 lineto
+closepath
+stroke
+end grestore
+% AbelianGroup()
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 157 108 moveto
+51 108 lineto
+51 72 lineto
+157 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+59 85 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 169 216 moveto
+163 197 152 168 140 144 curveto
+135 134 129 125 123 116 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 126 114 moveto
+117 108 lineto
+120 118 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 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 296 180 moveto
+206 180 lineto
+206 144 lineto
+296 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+214 157 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 194 216 moveto
+204 207 215 197 225 187 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 227 190 moveto
+232 180 lineto
+222 185 lineto
+closepath
+stroke
+end grestore
+% Monoid()->SemiGroup()
+newpath 254 216 moveto
+253 208 253 199 253 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 256 190 moveto
+252 180 lineto
+250 190 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 131 180 moveto
+5 180 lineto
+5 144 lineto
+131 144 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+13 157 moveto
+(LeftModule\(a:Rng\))
+[8.64 6.24 4.8 3.84 12.48 6.96 6.96 6.96 3.84 6.24 4.56 6.24 3.84 9.36 6.96 6.96 4.56]
+xshow
+end grestore
+end grestore
+% LeftModule(a:Ring)->LeftModule(a:Rng)
+newpath 66 216 moveto
+67 208 67 199 67 190 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 71 190 moveto
+67 180 lineto
+64 190 lineto
+closepath
+stroke
+end grestore
+% CABMON...
+gsave 10 dict begin
+filled
+0.537 0.247 0.902 nodecolor
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 99 36 moveto
+11 36 lineto
+11 0 lineto
+99 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+19 13 moveto
+(CABMON...)
+[9.12 10.08 9.36 12.48 10.08 9.84 3.6 3.6 3.6]
+xshow
+end grestore
+end grestore
+% AbelianGroup()->CABMON...
+newpath 92 72 moveto
+86 64 79 54 73 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 76 42 moveto
+67 36 lineto
+70 46 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 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 189 36 moveto
+117 36 lineto
+117 0 lineto
+189 0 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+124 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 116 72 moveto
+122 64 129 54 135 44 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 138 46 moveto
+141 36 lineto
+132 42 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 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+fill
+0.537 0.247 0.902 nodecolor
+newpath 271 108 moveto
+193 108 lineto
+193 72 lineto
+271 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+201 85 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 246 144 moveto
+244 136 242 127 240 118 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 243 117 moveto
+237 108 lineto
+237 119 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 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+fill
+0.333 1.000 0.933 nodecolor
+newpath 359 108 moveto
+289 108 lineto
+289 72 lineto
+359 72 lineto
+closepath
+stroke
+gsave 10 dict begin
+0.000 0.000 0.000 nodecolor
+296 85 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 269 144 moveto
+278 135 289 125 299 115 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 301 118 moveto
+306 108 lineto
+296 113 lineto
+closepath
+stroke
+end grestore
+% LeftModule(a:Rng)->AbelianGroup()
+newpath 77 144 moveto
+81 136 86 126 91 117 curveto
+stroke
+gsave 10 dict begin
+solid
+1 setlinewidth
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+fill
+0.000 0.000 0.000 edgecolor
+newpath 94 119 moveto
+95 108 lineto
+88 116 lineto
+closepath
+stroke
+end grestore
+endpage
+showpage
+grestore
+%%PageTrailer
+%%EndPage: 1
+%%Trailer
+%%Pages: 1
+end
+restore
+%%EOF
diff --git a/src/algebra/catdef.spad.pamphlet b/src/algebra/catdef.spad.pamphlet
index 9252bff..e564a0c 100644
--- a/src/algebra/catdef.spad.pamphlet
+++ b/src/algebra/catdef.spad.pamphlet
@@ -47,38 +47,6 @@ Algebra(R:CommutativeRing): Category ==
   coerce(x:R):% == x * 1$%
 
 @
-\section{category BMODULE BiModule}
-<<dot>>=
-"BMODULE" -> "LMODULE"
-"BiModule(a:Ring,b:Ring)" -> "LeftModule(a:Ring)"
-"BiModule(a:CommutativeRing,b:CommutativeRing)" -> "BiModule(a:Ring,b:Ring)"
-"BiModule(a:Ring,b:OrderedAbelianMonoid)" -> "BiModule(a:Ring,b:Ring)"
-"BMODULE" -> "RMODULE"
-"BiModule(a:Ring,b:Ring)" -> "RightModule(a:Ring)"
-@
-<<category BMODULE BiModule>>=
-)abbrev category BMODULE BiModule
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ A \spadtype{BiModule} is both a left and right module with respect
-++ to potentially different rings.
-++
-++ Axiom:
-++   \spad{ r*(x*s) = (r*x)*s }
-BiModule(R:Ring,S:Ring):Category ==
-  Join(LeftModule(R),RightModule(S)) with
-     leftUnitary ++ \spad{1 * x = x}
-     rightUnitary ++ \spad{x * 1 = x}
-
-@
 \section{category CHARNZ CharacteristicNonZero}
 <<dot>>=
 "CHARNZ" -> "RING"
@@ -1992,55 +1960,6 @@ Note that this code is not included in the generated catdef.spad file.
    (QUOTE |lookupComplete|))) 
 
 @
-\section{category GROUP Group}
-<<dot>>=
-"GROUP" -> "MONOID"
-"Group()" -> "Monoid()"
-@
-<<category GROUP Group>>=
-)abbrev category GROUP Group
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The class of multiplicative groups, i.e. monoids with
-++ multiplicative inverses.
-++
-++ Axioms:
-++   \spad{leftInverse("*":(%,%)->%,inv)}\tab{30}\spad{ inv(x)*x = 1 }
-++   \spad{rightInverse("*":(%,%)->%,inv)}\tab{30}\spad{ x*inv(x) = 1 }
-Group(): Category == Monoid with
-    --operations
-      inv: % -> %               ++ inv(x) returns the inverse of x.
-      "/": (%,%) -> %           ++ x/y is the same as x times the inverse of y.
-      "**": (%,Integer) -> %    ++ x**n returns x raised to the integer power n.
-      "^": (%,Integer) -> %     ++ x^n returns x raised to the integer power n.
-      unitsKnown                ++ unitsKnown asserts that recip only returns
-                                ++ "failed" for non-units.
-      conjugate: (%,%) -> %
-        ++ conjugate(p,q) computes \spad{inv(q) * p * q}; this is 'right action
-        ++ by conjugation'.
-      commutator: (%,%) -> %
-        ++ commutator(p,q) computes \spad{inv(p) * inv(q) * p * q}.
-    add
-      import RepeatedSquaring(%)
-      x:% / y:% == x*inv(y)
-      recip(x:%) == inv(x)
-      _^(x:%, n:Integer):% == x ** n
-      x:% ** n:Integer ==
-         zero? n => 1
-         n<0 => expt(inv(x),(-n) pretend PositiveInteger)
-         expt(x,n pretend PositiveInteger)
-      conjugate(p,q) == inv(q) * p * q
-      commutator(p,q) == inv(p) * inv(q) * p * q
-
-@
 \section{category INTDOM IntegralDomain}
 <<dot>>=
 "INTDOM" -> "COMRING"
@@ -2273,38 +2192,6 @@ Note that this code is not included in the generated catdef.spad file.
    (QUOTE |lookupComplete|))) 
 
 @
-\section{category LMODULE LeftModule}
-<<dot>>=
-"LMODULE" -> "ABELGRP"
-"LeftModule(a:Rng)" -> "AbelianGroup()"
-"LeftModule(a:Ring)" -> "LeftModule(a:Rng)"
-@
-<<category LMODULE LeftModule>>=
-)abbrev category LMODULE LeftModule
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of left modules over an rng (ring not necessarily with unit).
-++ This is an abelian group which supports left multiplation by elements of
-++ the rng.
-++
-++ Axioms:
-++   \spad{ (a*b)*x = a*(b*x) }
-++   \spad{ (a+b)*x = (a*x)+(b*x) }
-++   \spad{ a*(x+y) = (a*x)+(a*y) }
-LeftModule(R:Rng):Category == AbelianGroup with
-    --operations
-      "*": (R,%) -> %     ++ r*x returns the left multiplication of the module element x
-                          ++ by the ring element r.
-
-@
 \section{category LINEXP LinearlyExplicitRingOver}
 <<dot>>=
 "LINEXP" -> "RING"
@@ -2365,92 +2252,6 @@ Module(R:CommutativeRing): Category == BiModule(R,R)
     if not(R is %) then x:%*r:R == r*x
 
 @
-\section{category OAGROUP OrderedAbelianGroup}
-<<dot>>=
-"OAGROUP" -> "OCAMON"
-"OrderedAbelianGroup()" -> "OrderedCancellationAbelianMonoid()"
-"OAGROUP" -> "ABELGRP"
-"OrderedAbelianGroup()" -> "AbelianGroup()"
-@
-<<category OAGROUP OrderedAbelianGroup>>=
-)abbrev category OAGROUP OrderedAbelianGroup
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Ordered sets which are also abelian groups, such that the addition preserves
-++ the ordering.
-
-OrderedAbelianGroup(): Category ==
-        Join(OrderedCancellationAbelianMonoid, AbelianGroup)
-
-@
-\section{category OAMONS OrderedAbelianMonoidSup}
-<<dot>>=
-"OAMONS" -> "OCAMON"
-"OrderedAbelianMonoidSup()" -> "OrderedCancellationAbelianMonoid()"
-@
-<<category OAMONS OrderedAbelianMonoidSup>>=
-)abbrev category OAMONS OrderedAbelianMonoidSup
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ This domain is an OrderedAbelianMonoid with a \spadfun{sup} operation added.
-++ The purpose of the \spadfun{sup} operator in this domain is to act as a supremum
-++ with respect to the partial order imposed by \spadop{-}, rather than with respect to
-++ the total \spad{>} order (since that is "max").
-++
-++ Axioms:
-++   \spad{sup(a,b)-a \~~= "failed"}
-++   \spad{sup(a,b)-b \~~= "failed"}
-++   \spad{x-a \~~= "failed" and x-b \~~= "failed" => x >= sup(a,b)}
-
-OrderedAbelianMonoidSup(): Category == OrderedCancellationAbelianMonoid with
-    --operation
-      sup: (%,%) -> %
-        ++ sup(x,y) returns the least element from which both
-        ++ x and y can be subtracted.
-
-@
-\section{category OCAMON OrderedCancellationAbelianMonoid}
-<<dot>>=
-"OCAMON" -> "OAMON"
-"OrderedCancellationAbelianMonoid()" -> "OrderedAbelianMonoid()"
-"OCAMON" -> "CABMON"
-"OrderedCancellationAbelianMonoid()" -> "CancellationAbelianMonoid()"
-@
-<<category OCAMON OrderedCancellationAbelianMonoid>>=
-)abbrev category OCAMON OrderedCancellationAbelianMonoid
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Ordered sets which are also abelian cancellation monoids, such that the addition
-++ preserves the ordering.
-
-OrderedCancellationAbelianMonoid(): Category ==
-        Join(OrderedAbelianMonoid, CancellationAbelianMonoid)
-
-@
 \section{category OINTDOM OrderedIntegralDomain}
 <<dot>>=
 "OINTDOM" -> "INTDOM"
@@ -2509,190 +2310,6 @@ Note that this code is not included in the generated catdef.spad file.
 (MAKEPROP (QUOTE |OrderedIntegralDomain|) (QUOTE NILADIC) T) 
 
 @
-\section{category ORDRING OrderedRing}
-<<dot>>=
-"ORDRING" -> "OAGROUP"
-"OrderedRing()" -> "OrderedAbelianGroup()"
-"ORDRING" -> "RING"
-"OrderedRing()" -> "Ring()"
-"ORDRING" -> "MONOID"
-"OrderedRing()" -> "Monoid()"
-@
-<<category ORDRING OrderedRing>>=
-)abbrev category ORDRING OrderedRing
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ Ordered sets which are also rings, that is, domains where the ring
-++ operations are compatible with the ordering.
-++
-++ Axiom:
-++   \spad{0<a and b<c => ab< ac}
-
-OrderedRing(): Category == Join(OrderedAbelianGroup,Ring,Monoid) with
-     positive?: % -> Boolean
-       ++ positive?(x) tests whether x is strictly greater than 0.
-     negative?: % -> Boolean
-       ++ negative?(x) tests whether x is strictly less than 0.
-     sign     : % -> Integer
-       ++ sign(x) is 1 if x is positive, -1 if x is negative, 0 if x equals 0.
-     abs      : % -> %
-       ++ abs(x) returns the absolute value of x.
-  add
-     positive? x == x>0
-     negative? x == x<0
-     sign x ==
-       positive? x => 1
-       negative? x => -1
-       zero? x => 0
-       error "x satisfies neither positive?, negative? or zero?"
-     abs x ==
-       positive? x => x
-       negative? x => -x
-       zero? x => 0
-       error "x satisfies neither positive?, negative? or zero?"
-
-@
-\section{ORDRING.lsp BOOTSTRAP}
-{\bf ORDRING} depends on {\bf INT}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf ORDRING}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf ORDRING.o} file to the {\bf OUT} directory.
-This is eventually forcibly replaced by a recompiled version. 
-
-Technically I can't justify this bootstrap stanza based on the lattice
-since {\bf INT} is already bootstrapped. However using {\bf INT} naked
-generates a "value stack overflow" error suggesting an infinite recursive
-loop. This code is here to experiment with breaking that loop.
-
-Note that this code is not included in the generated catdef.spad file.
-
-<<ORDRING.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |OrderedRing;AL| (QUOTE NIL)) 
-
-(DEFUN |OrderedRing| NIL 
-  (LET (#:G84457)  
-    (COND 
-      (|OrderedRing;AL|) 
-      (T (SETQ |OrderedRing;AL| (|OrderedRing;|)))))) 
-
-(DEFUN |OrderedRing;| NIL 
-  (PROG (#1=#:G84455) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|OrderedAbelianGroup|)
-            (|Ring|)
-            (|Monoid|)
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|positive?| ((|Boolean|) |$|)) T)
-                ((|negative?| ((|Boolean|) |$|)) T)
-                ((|sign| ((|Integer|) |$|)) T)
-                ((|abs| (|$| |$|)) T)))
-              NIL 
-              (QUOTE ((|Integer|) (|Boolean|)))
-              NIL)) 
-           |OrderedRing|)
-        (SETELT #1# 0 (QUOTE (|OrderedRing|))))))) 
-
-(MAKEPROP (QUOTE |OrderedRing|) (QUOTE NILADIC) T) 
-
-@
-\section{ORDRING-.lsp BOOTSTRAP}
-{\bf ORDRING-} depends on {\bf ORDRING}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf ORDRING-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf ORDRING-.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.
-
-<<ORDRING-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |ORDRING-;positive?;SB;1| (|x| |$|) 
-  (SPADCALL (|spadConstant| |$| 7) |x| (QREFELT |$| 9))) 
-
-(DEFUN |ORDRING-;negative?;SB;2| (|x| |$|) 
-  (SPADCALL |x| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
-
-(DEFUN |ORDRING-;sign;SI;3| (|x| |$|) 
-  (COND 
-    ((SPADCALL |x| (QREFELT |$| 12)) 1)
-    ((SPADCALL |x| (QREFELT |$| 13)) -1)
-    ((SPADCALL |x| (QREFELT |$| 15)) 0)
-    ((QUOTE T) 
-      (|error| "x satisfies neither positive?, negative? or zero?")))) 
-
-(DEFUN |ORDRING-;abs;2S;4| (|x| |$|) 
-  (COND 
-    ((SPADCALL |x| (QREFELT |$| 12)) |x|)
-    ((SPADCALL |x| (QREFELT |$| 13)) (SPADCALL |x| (QREFELT |$| 18)))
-    ((SPADCALL |x| (QREFELT |$| 15)) (|spadConstant| |$| 7))
-    ((QUOTE T) 
-      (|error| "x satisfies neither positive?, negative? or zero?")))) 
-
-(DEFUN |OrderedRing&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|OrderedRing&|))
-        (LETT |dv$| (LIST (QUOTE |OrderedRing&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 20) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |OrderedRing&|)
-  (QUOTE |infovec|)
-  (LIST
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (0 . |Zero|)
-        (|Boolean|)
-        (4 . |<|)
-        |ORDRING-;positive?;SB;1|
-        |ORDRING-;negative?;SB;2|
-        (10 . |positive?|)
-        (15 . |negative?|)
-        (20 . |One|)
-        (24 . |zero?|)
-        (|Integer|)
-        |ORDRING-;sign;SI;3|
-        (29 . |-|)
-        |ORDRING-;abs;2S;4|)) 
-    (QUOTE #(|sign| 34 |positive?| 39 |negative?| 44 |abs| 49))
-    (QUOTE NIL)
-    (CONS 
-      (|makeByteWordVec2| 1 (QUOTE NIL))
-      (CONS 
-        (QUOTE #())
-        (CONS 
-          (QUOTE #())
-          (|makeByteWordVec2| 19 
-            (QUOTE 
-              (0 6 0 7 2 6 8 0 0 9 1 6 8 0 12 1 6 8 0 13 0 6 0 14 1 6 8 0 15
-               1 6 0 0 18 1 0 16 0 17 1 0 8 0 10 1 0 8 0 11 1 0 0 0 19))))))
-   (QUOTE |lookupComplete|))) 
-@
 \section{category PDRING PartialDifferentialRing}
 <<dot>>=
 "PDRING" -> "RING"
@@ -2889,180 +2506,6 @@ PrincipalIdealDomain(): Category == GcdDomain with
          ++ is not in the ideal generated by the fi.
 
 @
-\section{category RMODULE RightModule}
-<<dot>>=
-"RMODULE" -> "ABELGRP"
-"RightModule(a:Rng)" -> "AbelianGroup()"
-"RightModule(a:Ring)" -> "RightModule(a:Rng)"
-@
-<<category RMODULE RightModule>>=
-)abbrev category RMODULE RightModule
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of right modules over an rng (ring not necessarily with unit).
-++ This is an abelian group which supports right multiplation by elements of
-++ the rng.
-++
-++ Axioms:
-++   \spad{ x*(a*b) = (x*a)*b }
-++   \spad{ x*(a+b) = (x*a)+(x*b) }
-++   \spad{ (x+y)*x = (x*a)+(y*a) }
-RightModule(R:Rng):Category == AbelianGroup with
-    --operations
-      "*": (%,R) -> %  ++ x*r returns the right multiplication of the module element x
-                       ++ by the ring element r.
-
-@
-\section{category RING Ring}
-<<dot>>=
-"RING" -> "RNG"
-"Ring()" -> "Rng()"
-"RING" -> "MONOID"
-"Ring()" -> "Monoid()"
-"RING" -> "LMODULE"
-"Ring()" -> "LeftModule(a:Ring)"
-@
-<<category RING Ring>>=
-)abbrev category RING Ring
-++ Author:
-++ Date Created:
-++ Date Last Updated:
-++ Basic Functions:
-++ Related Constructors:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ The category of rings with unity, always associative, but
-++ not necessarily commutative.
-
---Ring(): Category == Join(Rng,Monoid,LeftModule(%:Rng)) with
-Ring(): Category == Join(Rng,Monoid,LeftModule(%)) with
-    --operations
-      characteristic: () -> NonNegativeInteger
-        ++ characteristic() returns the characteristic of the ring
-        ++ this is the smallest positive integer n such that
-        ++ \spad{n*x=0} for all x in the ring, or zero if no such n
-        ++ exists.
-        --We can not make this a constant, since some domains are mutable
-      coerce: Integer -> %
-        ++ coerce(i) converts the integer i to a member of the given domain.
---    recip: % -> Union(%,"failed") -- inherited from Monoid
-      unitsKnown
-        ++ recip truly yields
-        ++ reciprocal or "failed" if not a unit.
-        ++ Note: \spad{recip(0) = "failed"}.
-   add
-      n:Integer
-      coerce(n) == n * 1$%
-
-@
-\section{RING.lsp BOOTSTRAP}
-{\bf RING} depends on itself. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf RING}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf RING.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.
-
-<<RING.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(SETQ |Ring;AL| (QUOTE NIL)) 
-
-(DEFUN |Ring| NIL 
-  (LET (#:G82789) 
-    (COND 
-      (|Ring;AL|) 
-      (T (SETQ |Ring;AL| (|Ring;|)))))) 
-
-(DEFUN |Ring;| NIL 
-  (PROG (#1=#:G82787) 
-    (RETURN 
-      (PROG1 
-        (LETT #1# 
-          (|Join| 
-            (|Rng|) 
-            (|Monoid|) 
-            (|LeftModule| (QUOTE |$|))
-            (|mkCategory| 
-              (QUOTE |domain|)
-              (QUOTE (
-                ((|characteristic| ((|NonNegativeInteger|))) T)
-                ((|coerce| (|$| (|Integer|))) T)))
-              (QUOTE ((|unitsKnown| T)))
-              (QUOTE ((|Integer|) (|NonNegativeInteger|)))
-              NIL))
-           |Ring|)
-        (SETELT #1# 0 (QUOTE (|Ring|))))))) 
-
-(MAKEPROP (QUOTE |Ring|) (QUOTE NILADIC) T) 
-
-@
-\section{RING-.lsp BOOTSTRAP}
-{\bf RING-} depends on {\bf RING}. We need to break this cycle to build
-the algebra. So we keep a cached copy of the translated {\bf RING-}
-category which we can write into the {\bf MID} directory. We compile 
-the lisp code and copy the {\bf RING-.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.
-
-<<RING-.lsp BOOTSTRAP>>=
-
-(|/VERSIONCHECK| 2) 
-
-(DEFUN |RING-;coerce;IS;1| (|n| |$|) 
-  (SPADCALL |n| (|spadConstant| |$| 7) (QREFELT |$| 9))) 
-
-(DEFUN |Ring&| (|#1|) 
-  (PROG (|DV$1| |dv$| |$| |pv$|) 
-    (RETURN 
-      (PROGN 
-        (LETT |DV$1| (|devaluate| |#1|) . #1=(|Ring&|))
-        (LETT |dv$| (LIST (QUOTE |Ring&|) |DV$1|) . #1#)
-        (LETT |$| (GETREFV 12) . #1#)
-        (QSETREFV |$| 0 |dv$|)
-        (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #1#))
-        (|stuffDomainSlots| |$|)
-        (QSETREFV |$| 6 |#1|)
-        |$|)))) 
-
-(MAKEPROP 
-  (QUOTE |Ring&|)
-  (QUOTE |infovec|)
-  (LIST 
-    (QUOTE 
-      #(NIL NIL NIL NIL NIL NIL 
-        (|local| |#1|)
-        (0 . |One|)
-        (|Integer|)
-        (4 . |*|)
-        |RING-;coerce;IS;1| 
-        (|OutputForm|))) 
-  (QUOTE #(|coerce| 10)) 
-  (QUOTE NIL) 
-  (CONS 
-    (|makeByteWordVec2| 1 (QUOTE NIL))
-    (CONS 
-      (QUOTE #())
-      (CONS 
-        (QUOTE #())
-        (|makeByteWordVec2| 10 (QUOTE (0 6 0 7 2 6 0 8 0 9 1 0 0 8 10))))))
-   (QUOTE |lookupComplete|))) 
-
-@
 \section{category UFD UniqueFactorizationDomain}
 <<dot>>=
 "UFD" -> "GCDDOM"
@@ -3346,11 +2789,6 @@ VectorSpace(S:Field): Category ==  Module(S) with
 <<*>>=
 <<license>>
 
-<<category GROUP Group>>
-<<category LMODULE LeftModule>>
-<<category RMODULE RightModule>>
-<<category RING Ring>>
-<<category BMODULE BiModule>>
 <<category ENTIRER EntireRing>>
 <<category CHARZ CharacteristicZero>>
 <<category CHARNZ CharacteristicNonZero>>
@@ -3368,11 +2806,7 @@ VectorSpace(S:Field): Category ==  Module(S) with
 <<category DIVRING DivisionRing>>
 <<category FIELD Field>>
 <<category VSPACE VectorSpace>>
-<<category OCAMON OrderedCancellationAbelianMonoid>>
-<<category OAGROUP OrderedAbelianGroup>>
-<<category ORDRING OrderedRing>>
 <<category OINTDOM OrderedIntegralDomain>>
-<<category OAMONS OrderedAbelianMonoidSup>>
 <<category DIFRING DifferentialRing>>
 <<category PDRING PartialDifferentialRing>>
 <<category DIFEXT DifferentialExtension>>
