{VERSION 2 3 "DEC ALPHA UNIX" "2.3" }
{USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0
1 0 0 0 0 }{CSTYLE "2D Math" -1 2 "Times" 0 1 0 0 0 0 0 0 2 0 0 0 0 0
0 }{CSTYLE "2D Output" 2 20 "" 0 1 0 0 255 1 0 0 0 0 0 0 0 0 0 }
{CSTYLE "" -1 256 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE ""
-1 257 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 258 "" 1
12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 259 "times" 1 12 0 0 0 0
0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 260 "times" 1 12 0 0 0 0 0 2 0 0 0 0
0 0 0 }{CSTYLE "" -1 261 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }
{CSTYLE "" -1 262 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE ""
-1 263 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 266 "time
s" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 267 "times" 1 12 0 0
0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 268 "times" 1 12 0 0 0 0 0 2 0 0
0 0 0 0 0 }{CSTYLE "" -1 269 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 }
{CSTYLE "" -1 270 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE ""
-1 271 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 272 "time
s" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 273 "times" 1 12 0 0
0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 274 "times" 1 12 0 0 0 0 0 2 0 0
0 0 0 0 0 }{CSTYLE "" -1 275 "times" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 }
{CSTYLE "" -1 276 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE ""
-1 277 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 278 "time
s" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }{CSTYLE "" -1 279 "times" 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 280 "times" 1 12 0 0 0 0 0 2 0 0
0 0 0 0 0 }{CSTYLE "" -1 281 "times" 1 12 0 0 0 0 0 2 0 0 0 0 0 0 0 }
{PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "Courier" 1 14 0 0 0 0 2 1 2
0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Heading 1" 0 3
1 {CSTYLE "" -1 -1 "" 1 18 0 0 0 0 0 1 0 0 0 0 0 0 0 }1 0 0 0 6 6 0 0
0 0 0 0 -1 0 }{PSTYLE "Maple Output" 0 11 1 {CSTYLE "" -1 -1 "" 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 }3 3 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE ""
11 12 1 {CSTYLE "" -1 -1 "" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 }1 0 0 -1
-1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "Maple Plot" 0 13 1 {CSTYLE "" -1 -1 "
" 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 }3 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }
{PSTYLE "R3 Font 0" -1 256 1 {CSTYLE "" -1 -1 "Courier" 1 12 0 0 0 0
2 2 2 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "R3 Font 2
" -1 257 1 {CSTYLE "" -1 -1 "Courier" 1 14 0 0 0 0 2 2 2 0 0 0 0 0 0 }
0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "R3 Font 3" -1 258 1 {CSTYLE
"" -1 -1 "Times" 1 24 0 0 0 0 2 1 2 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0
0 0 0 -1 0 }{PSTYLE "R3 Font 4" -1 259 1 {CSTYLE "" -1 -1 "Times" 1
18 0 0 0 0 2 1 2 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }
{PSTYLE "R3 Font 5" -1 260 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 0 2
1 2 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "R3 Font 6"
-1 261 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 0 2 1 2 0 0 0 0 0 0 }0 0
0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "R3 Font 7" -1 262 1 {CSTYLE ""
-1 -1 "Times" 1 18 0 0 0 0 2 1 2 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0
0 0 -1 0 }{PSTYLE "R3 Font 8" -1 263 1 {CSTYLE "" -1 -1 "Times" 1 18
0 0 0 0 2 1 2 0 0 0 0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "R
3 Font 9" -1 264 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 0 2 1 2 0 0 0
0 0 0 }0 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }{PSTYLE "R3 Font 10" -1 265 1
{CSTYLE "" -1 -1 "Times" 1 18 0 0 0 0 1 1 2 0 0 0 0 0 0 }0 0 0 -1 -1
-1 0 0 0 0 0 0 -1 0 }{PSTYLE "" 258 266 1 {CSTYLE "" -1 -1 "" 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 }3 0 0 -1 -1 -1 0 0 0 0 0 0 -1 0 }}
{SECT 0 {EXCHG {PARA 266 "" 0 "" {TEXT -1 32 "Combinatorial Structures
Package" }}{PARA 0 "" 0 "" {TEXT 256 1170 "\nThe combstruct package i
s used to define, count and generate combinatorial structures.\n\nA co
mbinatorial class is defined by writing a grammar specification that d
escribes it. In this way, an extensive collection of different classe
s may be defined. For example, the system applies to all regular and
context-free grammars, grammars to define binary trees, plane general
trees, necklaces, functional graphs, expression trees etc. \n\nGiven
a grammar specification, the system creates a dedicated counting proc
edure for that structure. The number of objects of size n is counted \+
in worst-case O(n^2) arithmetic operations. This bound is independent
of the combinatorial class.\n\nIn the same way, an object of size n i
s generated uniformly at random in worst-case O(n log(n)) arithmetic o
perations. Again, this bound applies to all structures. O(n log(n)) i
s the best known bound for many combinatorial classes.\n\nThis workshe
et explores through examples some of the uses of the combstruct packag
e. A companion worksheet explains in detail how to write a grammar sp
ecification, the pre-defined structures available in combstruct, and t
he use of the various functions.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0
17 "with(combstruct):" }}}{SECT 0 {PARA 3 "" 0 "" {TEXT 257 13 "Genera
l Trees" }}{EXCHG {PARA 259 "" 0 "" {TEXT 258 475 "Combstruct can be u
sed to analyze certain aspects of a combinatorial structure. By repea
tedly generating random examples of our structure, we can get some ide
a of its average behaviour. For example, say we are interested in the
average height of a general tree. We can use combstruct to model such
trees and analyze the results.\n\nFirst, we write a grammar specifica
tion that describes a tree. A tree consists of a root node, and zero \+
or more children that are also trees.\n" }}{PARA 0 "> " 0 "" {MPLTEXT
1 0 28 "Tree := \{T=Prod(Z, Set(T))\}:" }}}{EXCHG {PARA 0 "" 0 ""
{TEXT 259 42 "\nWe can count and generate general trees.\n" }}{PARA 0
"> " 0 "" {MPLTEXT 1 0 36 "seq(count([T,Tree],size=i),i=1..20);" }}
{PARA 12 "" 1 "" {XPPMATH 20 "66\"\"\"F#\"\"#\"\"%\"\"*\"#?\"#[\"$:\"
\"$'G\"$>(\"%U=\"%mZ\"&'[7\"&tH$\"&6y)\"'\"QN#\"'Z[j\"(f6s\"\"(w')o%\"
)Gi#G\"" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 22 "draw([T,Tree],si
ze=5);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#-%%ProdG6$%\"ZG-%$SetG6#-F$6
$F&-F(6$-F$6$F&%(EpsilonG-F$6$F&-F(6#F." }}}{EXCHG {PARA 0 "" 0 ""
{TEXT 260 74 "\nNow we write a small procedure that takes a tree and r
eturns its height.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 220 "height := \+
proc(t)\nlocal h;\n if t=Prod(Z,Epsilon) then h := 1\n else h := 1+ \+
max(op(map(procname, op(2,t))))\n fi;\n if length(t) < 100 then # s
tore small values in the remember table\n height(t) := h;\n fi;\n \+
h;\nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 27 "t := draw([T,T
ree],size=5);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#>%\"tG-%%ProdG6$%\"ZG
-%$SetG6&-F&6$F(%(EpsilonGF,F,F," }}}{EXCHG {PARA 0 "> " 0 ""
{MPLTEXT 1 0 10 "height(t);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"\"#"
}}}{EXCHG {PARA 0 "" 0 "" {TEXT 261 85 "\nNext we generate many trees \+
of size 100, and for each tree we calculate its height.\n" }}{PARA 0 "
> " 0 "" {MPLTEXT 1 0 16 "treesize := 100:" }}}{EXCHG {PARA 0 "> " 0 "
" {MPLTEXT 1 0 16 "numtrees := 200:" }}}{EXCHG {PARA 0 "> " 0 ""
{MPLTEXT 1 0 38 "heights := array(sparse, 1..treesize):" }}}{EXCHG
{PARA 0 "> " 0 "" {MPLTEXT 1 0 96 "to numtrees do \n h := height(draw
([T,Tree],size=treesize)):\n heights[h] := heights[h] + 1:\nod:" }}}
{EXCHG {PARA 0 "" 0 "" {TEXT 262 91 "\nIn order to get a reasonably sm
ooth curve, we will group the heights into intervals of 4.\n" }}{PARA
0 "> " 0 "" {MPLTEXT 1 0 46 "groupedheights := array(sparse,1..treesiz
e/4):" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 101 "for i to treesize
do \n groupedheights[iquo(i-1,4)+1] := groupedheights[iquo(i-1,4)+1
]+heights[i]od:" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 263 74 "\nNow we plot
the distribution of heights of our randomly generated trees.\n" }}
{PARA 0 "> " 0 "" {MPLTEXT 1 0 112 "plot([seq([i*4-2, groupedheights[i
]], i=1..treesize/4)],\n title=`distribution of heights of trees of si
ze 100`);" }}{PARA 13 "" 1 "" {INLPLOT "6$-%'CURVESG6$7;7$$\"\"#\"\"!F
*7$$\"\"'F*F*7$$\"#5F*F(7$$\"#9F*$\"#UF*7$$\"#=F*$\"#pF*7$$\"#AF*$\"#c
F*7$$\"#EF*$\"#>F*7$$\"#IF*$\"\"*F*7$$\"#MF*$\"\"\"F*7$$\"#QF*F(7$F4F*
7$$\"#YF*F*7$$\"#]F*F*7$$\"#aF*F*7$$\"#eF*F*7$$\"#iF*F*7$$\"#mF*F*7$$
\"#qF*F*7$$\"#uF*F*7$$\"#yF*F*7$$\"##)F*F*7$$\"#')F*F*7$$\"#!*F*F*7$$
\"#%*F*F*7$$\"#)*F*F*-%'COLOURG6&%$RGBG$F0!\"\"F*F*-%&TITLEG6#%Mdistri
bution~of~heights~of~trees~of~size~100G" 2 322 322 322 2 0 1 0 2 9 0
4 2 1.000000 45.000000 45.000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 5384 0 0 0 0 0 0 }}}}{SECT 0 {PARA 3 "" 0 "" {TEXT 266 27 "C
onnected Functional Graphs" }}{EXCHG {PARA 0 "" 0 "" {TEXT 267 899 "Ev
ery function that takes distinct elements \{1,...,n\} into itself has \+
a corresponding graph. Points on the graph are either cyclic, meaning \+
that some iterate of the function takes that element back onto itself,
or non-cyclic. The set of points that go to the same cyclic point is
a general tree. A connected functional graph is a functional graph \+
which has one component. Such a graph corresponds to a function which
, for any two elements, iterating the function on the first element a \+
certain number of times will reach the same result as iterating the fu
nction on the second element a (possibly different) number of times. I
n other \"words\",\na function f such that, for every x and y in \{1,.
..n\}, there exists a pair of non-negative integers (i,j) such that f^
(i)(x) = f^(j)(y).\n\nWe can count the number of all such functions on
n elements by counting the number of connected functional graphs." }}
{PARA 0 "" 0 "" {TEXT -1 0 "" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 52 "fun
graph := \{F=Cycle(tree), tree=Prod(Z,Set(tree))\}:" }}}{EXCHG {PARA
0 "> " 0 "" {MPLTEXT 1 0 40 "count([F, fungraph, labelled], size=40);
" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"[o++++)oUQ&\\NZd/_))*HCS]=R)3Ubt
n1Lr*H#" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 53 "seq(count([F, fu
ngraph, labelled], size=i), i=1..10);" }}{PARA 11 "" 1 "" {XPPMATH 20
"6,\"\"\"\"\"$\"#<\"$U\"\"%p:\"&w:#\"'\"3b$\"('H0o\"*`\"p)[\"\"+!o:-m$
" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 268 64 "\nWe can also generate examp
les of functions with this property.\n" }}{PARA 0 "> " 0 "" {MPLTEXT
1 0 39 "draw([F, fungraph, labelled], size=11);" }}{PARA 12 "" 1 ""
{XPPMATH 20 "6#-%&CycleG6#-%%ProdG6$&%\"ZG6#\"\")-%$SetG6$-F'6$&F*6#\"
\"%-F.6#-F'6$&F*6#\"\"&-F.6#-F'6$&F*6#\"#5-F.6$-F'6$&F*6#\"\"\"%(Epsil
onG-F'6$&F*6#\"\"(-F.6#-F'6$&F*6#\"\"$FJ-F'6$&F*6#\"\"'-F.6#-F'6$&F*6#
\"\"*-F.6#-F'6$&F*6#\"\"#-F.6#-F'6$&F*6#\"#6FJ" }}}}{SECT 0 {PARA 3 "
" 0 "" {TEXT 269 8 "Alcohols" }}{EXCHG {PARA 0 "" 0 "" {TEXT 270 174 "
We can model alcohol molecules, C_n H_\{2n+1\} OH, using combstruct. \+
We write a grammar for an alkyl, C_n H_\{2n+1\}, which is a ternary ro
oted tree that moves freely in space.\n" }}{PARA 0 "> " 0 "" {MPLTEXT
1 0 76 "molecule := \{alkyl = Union(H, Prod(C, Set(alkyl, card=3))), H
=Atom, C=Atom\}:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 39 "count([
alkyl, molecule], size=6+2*6+1);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"
#<" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 271 101 "\nThus we see that there \+
are 17 different alcohol molecules with 6 carbon atoms. Here is one of
them.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 38 "draw([alkyl, molecule],
size=6+6*2+1);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#-%%ProdG6$%\"CG-%$S
etG6%%\"HGF*-F$6$F&-F(6%-F$6$F&-F(6%F*F*-F$6$F&-F(6%F*F*F*F3F3" }}}}
{SECT 0 {PARA 3 "" 0 "" {TEXT 272 9 "Necklaces" }}{EXCHG {PARA 0 "" 0
"" {TEXT 273 523 "A necklace is a classical structure from combinatori
cs. It is a cycle containing beads of different colours. Necklaces a
re particularly difficult to count because of the symmetries involved,
since beads of the same colour are indistinguishable, and because kno
wing how many necklaces there are of size n does not help us determine
how many necklaces there are of size n+1, since the symmetries change
for each size depending on how that integer factors. \n\nWe define a
necklace that has three different colours of beads.\n" }}{PARA 0 "> \+
" 0 "" {MPLTEXT 1 0 86 "necklace := \{N=Cycle(bead), bead=Union(red,bl
ue,green),red=Atom,blue=Atom,green=Atom\}:" }}}{EXCHG {PARA 0 "> " 0 "
" {MPLTEXT 1 0 43 "seq(count([N, necklace], size=i), i=1..15);" }}
{PARA 11 "" 1 "" {XPPMATH 20 "61\"\"$\"\"'\"#6\"#C\"#^\"$I\"\"$:$\"$M)
\"%&>#\"%Mf\"&2h\"\"&oV%\"'VE7\"'-=M\"'Nm&*" }}}{EXCHG {PARA 0 "> " 0
"" {MPLTEXT 1 0 29 "draw([N, necklace], size=10);" }}{PARA 11 "" 1 ""
{XPPMATH 20 "6#-%&CycleG6,%$redGF&%&greenGF'%%blueGF&F'F(F'F'" }}}
{EXCHG {PARA 0 "" 0 "" {TEXT 274 44 "\nWe can also create necklaces of
necklaces.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 96 "neckneck := \{NN=C
ycle(Cycle(bead)), bead=Union(red,blue,green), red=Atom, blue=Atom,gre
en=Atom\}:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 30 "count([NN,nec
kneck], size=80);" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"XX_nU-%Q;%>0\\u
7S/iv2%>Gp?q(e%=5" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 29 "draw([
NN,neckneck], size=15);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#-%&CycleG6)
-F$6$%&greenGF(-F$6%%%blueGF+F(-F$6#F(-F$6%F+F+%$redG-F$6&F+F+F+F0-F$6
#F+F3" }}}}{SECT 0 {PARA 3 "" 0 "" {TEXT 275 11 "Involutions" }}
{EXCHG {PARA 0 "" 0 "" {TEXT 276 191 "An involution is a permutation o
f elements that is its own inverse. Such a permutation must decompose
into cycles of length one or two. We can count the involutions on n \+
distinct elements.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 47 "involution \+
:= \{inv = Set(Cycle(Z, card <= 2))\}:" }}}{EXCHG {PARA 0 "> " 0 ""
{MPLTEXT 1 0 43 "count([inv, involution,labelled], size=12);" }}{PARA
11 "" 1 "" {XPPMATH 20 "6#\"'_,9" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 277
140 "\nWe can compare this with the total number of permutations on 12
elements. (Here, we use one of the pre-defined structures of combstr
uct.)\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 23 "count(Permutation(12));
" }}{PARA 11 "" 1 "" {XPPMATH 20 "6#\"*+;+z%" }}}{EXCHG {PARA 0 "" 0 "
" {TEXT 278 48 "\nHere is one of the involutions on 12 elements.\n" }}
{PARA 0 "> " 0 "" {MPLTEXT 1 0 42 "draw([inv, involution,labelled], si
ze=12);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#-%$SetG6)-%&CycleG6$&%\"ZG6
#\"\"&&F*6#\"\"*-F'6#&F*6#\"#5-F'6#&F*6#\"\"%-F'6$&F*6#\"\"$&F*6#\"#6-
F'6$&F*6#\"\"\"&F*6#\"\"(-F'6$&F*6#\"\"'&F*6#\"\")-F'6$&F*6#\"\"#&F*6#
\"#7" }}}}{SECT 0 {PARA 3 "" 0 "" {TEXT 279 20 "Generating Test Data"
}}{EXCHG {PARA 0 "" 0 "" {TEXT 280 859 "Another use of combstruct is t
o generate tests for another program (not limited to other Maple progr
ams).\n \nThe project CROAP at INRIA, France, is developing a program
ming environment generator called Centaur. Given the grammar and \"pr
etty-printer\" of a computer language, Centaur produces an editor that
knows about the syntax and appearance of that language. The research
ers of CROAP are using combstruct in order to produce test cases for t
he resulting editor. A specification for the computer language is wri
tten in combstruct, and the \"programs\" that combstruct produces are \+
fed to the editor. Here is one of the specifications (which they gene
rate automatically from the syntax of the language) that is used to cr
eate tests for Centaur. (Thanks to Laurence Rideau, , for explaining her application of combstruct.)\n" }}
{PARA 0 "> " 0 "" {MPLTEXT 1 0 883 "Exp_spec := \{EXP_S = Union(Prod(`
Exp$exp_s`,Sequence(EXP,\n card >=1))),\n EXP = Union(
Prod(`Exp$assign`,VAR, EXP),\n `Exp$integer`,\n \+
Prod(`Exp$minus`,EXP, EXP),\n Prod(`Exp$plus`,EXP, EX
P),\n Prod(`Exp$prod`,EXP, EXP),\n Prod(`Exp
$uminus`,EXP),\n `Exp$variable`),\n VAR = Union(`Exp$var
iable`),\n INTEGER = Union(`Exp$integer`),\n ENV = Union(Prod(`Exp$e
nv`,Sequence(PAIR))),\n PAIR = Union(Prod(`Exp$pair`,VAR, INTEGER)),
\n COMMENT = Union(`Exp$comment`),\n COMMENT_S = Union(Prod(`Exp$com
ment_s`,Sequence(\n COMMENT))),\n `Exp$assign`=Ato
m, `Exp$comment`=Atom,\n `Exp$comment_s`=Atom, `Exp$env`=Atom,\n `Ex
p$exp_s`=Atom, `Exp$integer`=Atom,\n `Exp$meta`=Atom, `Exp$minus`=Ato
m,\n `Exp$pair`=Atom, `Exp$plus`=Atom,\n `Exp$prod`=Atom, `Exp$uminu
s`=Atom,\n `Exp$variable`=Atom\}:" }}}{EXCHG {PARA 0 "" 0 "" {TEXT
281 63 "\nThe test programs are then generated using the draw function
.\n" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 33 "draw([EXP_S, Exp_spec], size
=17);" }}{PARA 12 "" 1 "" {XPPMATH 20 "6#-%%ProdG6$%*Exp$exp_sG-%)Sequ
enceG6'-F$6$%+Exp$uminusG-F$6$F,-F$6%%*Exp$minusG-F$6%F1%-Exp$variable
G-F$6%%)Exp$prodG-F$6$F,%,Exp$integerGF4F:F:F:F4-F$6%F1F:F4" }}}
{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}}{MARK "0 1 0" 9 }
{VIEWOPTS 1 1 0 1 1 1803 }