about summary refs log tree commit diff stats
path: root/js/games/nluqo.github.io/~bh/noss.ps
diff options
context:
space:
mode:
authorelioat <elioat@tilde.institute>2023-08-23 07:52:19 -0400
committerelioat <elioat@tilde.institute>2023-08-23 07:52:19 -0400
commit562a9a52d599d9a05f871404050968a5fd282640 (patch)
tree7d3305c1252c043bfe246ccc7deff0056aa6b5ab /js/games/nluqo.github.io/~bh/noss.ps
parent5d012c6c011a9dedf7d0a098e456206244eb5a0f (diff)
downloadtour-562a9a52d599d9a05f871404050968a5fd282640.tar.gz
*
Diffstat (limited to 'js/games/nluqo.github.io/~bh/noss.ps')
-rw-r--r--js/games/nluqo.github.io/~bh/noss.ps2386
1 files changed, 2386 insertions, 0 deletions
diff --git a/js/games/nluqo.github.io/~bh/noss.ps b/js/games/nluqo.github.io/~bh/noss.ps
new file mode 100644
index 0000000..78baaaa
--- /dev/null
+++ b/js/games/nluqo.github.io/~bh/noss.ps
@@ -0,0 +1,2386 @@
+%!PS-Adobe-2.0
+%%Creator: dvips 5.528 Copyright 1986, 1994 Radical Eye Software
+%%Title: noss.dvi
+%%Pages: 24
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%EndComments
+%DVIPSCommandLine: dvips noss.dvi -o noss.ps
+%DVIPSParameters: dpi=300, comments removed
+%DVIPSSource:  TeX output 1994.07.21:1329
+%%BeginProcSet: tex.pro
+/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR matrix currentmatrix dup dup 4 get round 4 exch put dup dup 5 get
+round 5 exch put setmatrix}N /@landscape{/isls true N}B /@manualfeed{
+statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0
+0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn
+begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X
+array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo
+setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx
+FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{
+pop nn dup definefont setfont}B /ch-width{ch-data dup length 5 sub get}
+B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 ch-data dup
+length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 sub}B
+/ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type
+/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp
+0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2
+index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff
+ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice
+ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{
+ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn
+/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1
+sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{cc 1 add D
+}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin 0 0
+moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add
+.99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage
+userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for
+65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0
+0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V
+{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7
+getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false}
+ifelse}{false}ifelse end{{gsave TR -.1 -.1 TR 1 1 scale rulex ruley
+false RMat{BDot}imagemask grestore}}{{gsave TR -.1 -.1 TR rulex ruley
+scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave
+transform round exch round exch itransform moveto rulex 0 rlineto 0
+ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta
+0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}
+B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{
+3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p
+-1 w}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{
+3 2 roll p a}B /bos{/SS save N}B /eos{SS restore}B end
+%%EndProcSet
+TeXDict begin 40258431 52099146 1095 300 300
+(/home/anarres/g/users/bh/papers/noss.dvi) @start /Fa
+1 111 df<383C004CC7004F03004E03009C07001C07001C07001C0E00380E00380E4038
+1C40381C80700C80300700120E7E8D16>110 D E /Fb 4 52 df<0FC018603030703860
+186018E01CE01CE01CE01CE01CE01CE01CE01CE01CE01C60187038303018600FC00E157F
+9412>48 D<03000700FF0007000700070007000700070007000700070007000700070007
+0007000700070007007FF00C157E9412>I<1F0021C040E080E0C070E070407000F000E0
+00E001C001800300060004000810101020303FE07FE0FFE00C157E9412>I<0FC0306060
+707078703800780070007000E007C0006000780038003C003CE03CE03CC038407830600F
+C00E157F9412>I E /Fc 12 121 df<70F8F8F87005057C840D>58
+D<70F8FCFC74040404080810102040060E7C840D>I<E0000000780000001E0000000780
+000001E0000000780000001C0000000700000003C0000000F00000003C0000000F000000
+03C0000003C000000F0000003C000000F0000003C00000070000001C00000078000001E0
+0000078000001E00000078000000E00000001A1A7C9723>62 D<00000200000006000000
+0E0000000E0000001E0000001F0000002F0000002F0000004F0000008F0000008F000001
+0F0000010F0000020F0000040F0000040F0000080F800008078000100780002007800020
+0780007FFF800040078000800780018007800100078002000780020007C0040003C00C00
+03C01E0007C0FF807FFC1E207E9F22>65 D<00FFFFE0000F0078000F003C000F001C000F
+001E001E001E001E001E001E001E001E001E003C003C003C003C003C0078003C00F00078
+03C0007FFF80007803C0007801E000F000F000F000F000F000F000F0007001E000F001E0
+00F001E000F001E000E003C001E003C003C003C0038003C00F0007801E00FFFFF0001F1F
+7E9E22>I<0000FE0200078186001C004C0038003C0060003C00C0001C01C00018038000
+18070000180F0000181E0000101E0000103C0000003C0000007800000078000000780000
+0078000000F0000000F0000000F0000000F0000000F00000807000008070000080700001
+003800010038000200180004000C001800060020000381C00000FE00001F217E9F21>I<
+00F1800389C00707800E03801C03803C0380380700780700780700780700F00E00F00E00
+F00E00F00E10F01C20F01C20703C20705C40308C400F078014147E9318>97
+D<07803F8007000700070007000E000E000E000E001C001C001CF01D0C3A0E3C0E380F38
+0F700F700F700F700FE01EE01EE01EE01CE03CE038607060E031C01F0010207E9F14>I<
+00007C0000CE00019E00039E00030C000700000700000700000700000E00000E00000E00
+00FFF0000E00000E00001C00001C00001C00001C00001C00003800003800003800003800
+00380000700000700000700000700000700000E00000E00000E00000E00000C00001C000
+318000798000F300006200003C000017297E9F16>102 D<001E3000713800E0F001C070
+0380700780700700E00F00E00F00E00F00E01E01C01E01C01E01C01E01C01E03801E0380
+0E07800E0B8006170001E700000700000700000E00000E00300E00781C00F03800607000
+3FC000151D809316>I<1E07802318C023A06043C0704380704380708700E00700E00700
+E00700E00E01C00E01C00E01C00E03821C03841C07041C07081C03083803101801E01714
+7E931B>110 D<03C1C00C62201034701038F02038F02038604070000070000070000070
+0000E00000E00000E00000E02061C040F1C040F1C080E2C080446300383C0014147E931A
+>120 D E /Fd 72 121 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F870000000000070
+F8F8F870051C779B18>33 D<4010E038F078E038E038E038E038E038E038E038E038E038
+E03860300D0E7B9C18>I<030600078F00078F00078F00078F00078F00078F007FFFC0FF
+FFE0FFFFE07FFFC00F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FFFFE07F
+FFC01E3C001E3C001E3C001E3C001E3C001E3C000C1800131C7E9B18>I<387C7C7E3E0E
+0E0E1C1C38F8F0C0070E789B18>39 D<007000F001E003C007800F001E001C0038003800
+7000700070007000E000E000E000E000E000E000E000E000700070007000700038003800
+1C001E000F00078003C001F000F000700C24799F18>I<6000F00078003C001E000F0007
+80038001C001C000E000E000E000E00070007000700070007000700070007000E000E000
+E000E001C001C0038007800F001E003C007800F00060000C247C9F18>I<01C00001C000
+01C00001C000C1C180F1C780F9CF807FFF001FFC0007F00007F0001FFC007FFF00F9CF80
+F1C780C1C18001C00001C00001C00001C00011147D9718>I<00600000F00000F00000F0
+0000F00000F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F00000F00000F00000F0
+0000F00000F00000F00000600013147E9718>I<1C3E7E7F3F1F070E1E7CF860080C7885
+18>I<7FFF00FFFF80FFFF807FFF0011047D8F18>I<3078FCFC78300606778518>I<0003
+00000780000780000F80000F00001F00001E00001E00003E00003C00007C000078000078
+0000F80000F00001F00001E00003E00003C00003C00007C0000780000F80000F00000F00
+001F00001E00003E00003C00003C00007C0000780000F80000F00000F000006000001124
+7D9F18>I<01F00007FC000FFE001F1F001C07003803807803C07001C07001C0E000E0E0
+00E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07001C07803C038
+03801C07001F1F000FFE0007FC0001F000131C7E9B18>I<01800380038007800F803F80
+FF80FB804380038003800380038003800380038003800380038003800380038003800380
+03807FFCFFFE7FFC0F1C7B9B18>I<03F0000FFE003FFF007C0F807003C0E001C0F000E0
+F000E06000E00000E00000E00001C00001C00003C0000780000F00001E00003C00007800
+00F00001E00007C0000F80001E00E03C00E07FFFE0FFFFE07FFFE0131C7E9B18>I<07F8
+001FFE003FFF007807807803C07801C03001C00001C00003C0000380000F0003FF0003FE
+0003FF000007800003C00001C00000E00000E00000E0F000E0F000E0F001C0F003C07C07
+803FFF001FFE0003F800131C7E9B18>I<001F00003F0000770000770000E70001E70001
+C7000387000787000707000E07001E07003C0700380700780700F00700FFFFF8FFFFF8FF
+FFF8000700000700000700000700000700000700007FF000FFF8007FF0151C7F9B18>I<
+1FFF803FFF803FFF803800003800003800003800003800003800003800003800003BF800
+3FFE003FFF003C07801803C00001C00000E00000E06000E0F000E0F000E0E001C07003C0
+7C0F803FFF001FFC0003F000131C7E9B18>I<007E0001FF0007FF800F83C01E03C01C03
+C0380180380000700000700000E1F800E7FE00FFFF00FE0780F803C0F001C0F000E0E000
+E0F000E07000E07000E07000E03801C03C03C01E07800FFF0007FE0001F800131C7E9B18
+>I<E00000FFFFE0FFFFE0FFFFE0E003C0E00780000700000E00001E00001C0000380000
+380000700000700000E00000E00000E00001C00001C00001C00001C00003C00003800003
+8000038000038000038000038000038000131D7E9C18>I<03F8000FFE001FFF003E0F80
+3803807001C07001C07001C07001C03803803C07801FFF0007FC000FFE001F1F003C0780
+7001C0F001E0E000E0E000E0E000E0E000E07001C07803C03E0F801FFF000FFE0003F800
+131C7E9B18>I<03F0000FFC001FFE003C0F00780780700380E001C0E001C0E001C0E001
+E0E001E07001E07803E03C0FE01FFFE00FFEE003F0E00000E00001C00001C00001C03003
+80780780780F00783E003FFC001FF00007C000131C7E9B18>I<3078FCFC783000000000
+000000003078FCFC78300614779318>I<183C7E7E3C180000000000000000183C7E7E3E
+1E0E1C3C78F060071A789318>I<000300000780001F80003F00007E0001FC0003F00007
+E0001FC0003F00007E0000FC0000FC00007E00003F00001FC00007E00003F00001FC0000
+7E00003F00001F8000078000030011187D9918>I<7FFFC0FFFFE0FFFFE0FFFFE0000000
+000000000000000000FFFFE0FFFFE0FFFFE07FFFC0130C7E9318>I<0FF0003FFC007FFF
+00700F00F00380F00380600780000F00003E00007C0001F00001E00003C00003C00003C0
+0003C00003C00003800000000000000000000000000000000003800007C00007C00007C0
+00038000111C7D9B18>63 D<00700000F80000F80000D80000D80001DC0001DC0001DC00
+018C00038E00038E00038E00038E000306000707000707000707000707000FFF800FFF80
+0FFF800E03800E03801C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>65
+D<FFFC00FFFF00FFFF801C03C01C01C01C00E01C00E01C00E01C00E01C01E01C01C01C07
+C01FFF801FFF001FFFC01C03C01C00E01C00F01C00701C00701C00701C00701C00F01C00
+E01C03E0FFFFC0FFFF80FFFE00141C7F9B18>I<00F8E003FEE007FFE00F07E01E03E03C
+01E03800E07000E07000E0700000E00000E00000E00000E00000E00000E00000E00000E0
+00007000007000E07000E03800E03C00E01E01C00F07C007FF8003FE0000F800131C7E9B
+18>I<7FF800FFFE007FFF001C0F801C03C01C03C01C01E01C00E01C00E01C00F01C0070
+1C00701C00701C00701C00701C00701C00701C00701C00F01C00E01C00E01C01E01C01C0
+1C03C01C0F807FFF00FFFE007FF800141C7F9B18>I<FFFFF0FFFFF0FFFFF01C00701C00
+701C00701C00701C00001C00001C0E001C0E001C0E001FFE001FFE001FFE001C0E001C0E
+001C0E001C00001C00001C00381C00381C00381C00381C0038FFFFF8FFFFF8FFFFF8151C
+7F9B18>I<FFFFE0FFFFE0FFFFE01C00E01C00E01C00E01C00E01C00001C00001C1C001C
+1C001C1C001FFC001FFC001FFC001C1C001C1C001C1C001C00001C00001C00001C00001C
+00001C00001C0000FFC000FFC000FFC000131C7E9B18>I<01F1C003FDC00FFFC01F0FC0
+1C03C03803C03801C07001C07001C0700000E00000E00000E00000E00000E00000E00FF0
+E01FF0E00FF07001C07001C07003C03803C03803C01C07C01F0FC00FFFC003FDC001F1C0
+141C7E9B18>I<7F07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C01
+C01C01C01C01C01FFFC01FFFC01FFFC01C01C01C01C01C01C01C01C01C01C01C01C01C01
+C01C01C01C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>I<7FFF00FFFF807FFF0001
+C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001
+C00001C00001C00001C00001C00001C00001C00001C00001C00001C0007FFF00FFFF807F
+FF00111C7D9B18>I<01FFC003FFC001FFC0000E00000E00000E00000E00000E00000E00
+000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00
+000E00F00E00F00E00F03C007FFC003FF0000FC000121C7D9B18>I<7F07F0FF87F87F07
+F01C03C01C07801C07001C0E001C1E001C3C001C38001C70001CF0001DF0001DF0001FB8
+001FB8001F1C001E1C001C0E001C0E001C07001C07001C03801C03801C01C07F03F0FF87
+F87F03F0151C7F9B18>I<7FE000FFE0007FE0000E00000E00000E00000E00000E00000E
+00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E
+00700E00700E00700E00700E00707FFFF0FFFFF07FFFF0141C7F9B18>I<FC01F8FE03F8
+FE03F83B06E03B06E03B06E03B06E03B8EE03B8EE0398CE0398CE039DCE039DCE039DCE0
+38D8E038D8E038F8E03870E03870E03800E03800E03800E03800E03800E03800E0FE03F8
+FE03F8FE03F8151C7F9B18>I<7E07F0FF0FF87F07F01D81C01D81C01D81C01DC1C01CC1
+C01CC1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C31C01C39C01C39C01C39C01C19
+C01C19C01C1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C0151C7F9B18>I<0FF8003F
+FE007FFF00780F00700700F00780E00380E00380E00380E00380E00380E00380E00380E0
+0380E00380E00380E00380E00380E00380E00380E00380E00380F00780700700780F007F
+FF003FFE000FF800111C7D9B18>I<FFFE00FFFF80FFFFC01C03C01C01E01C00E01C0070
+1C00701C00701C00701C00701C00E01C01E01C03C01FFFC01FFF801FFE001C00001C0000
+1C00001C00001C00001C00001C00001C0000FF8000FF8000FF8000141C7F9B18>I<0FF8
+003FFE007FFF00780F00700700F00780E00380E00380E00380E00380E00380E00380E003
+80E00380E00380E00380E00380E00380E00380E00380E1E380E1E380F0E78070F700787F
+007FFF003FFE000FFC00001C00001E00000E00000F0000070000070011227D9B18>I<7F
+F800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C01C03C01C03801C0F801F
+FF001FFE001FFE001C0F001C07001C03801C03801C03801C03801C03801C039C1C039C1C
+039C7F01F8FF81F87F00F0161C7F9B18>I<03F3801FFF803FFF807C0F80700780E00380
+E00380E00380E000007000007800003F00001FF00007FE0000FF00000F800003C00001C0
+0000E00000E06000E0E000E0E001E0F001C0F80780FFFF80FFFE00E7F800131C7E9B18>
+I<7FFFF8FFFFF8FFFFF8E07038E07038E07038E070380070000070000070000070000070
+000070000070000070000070000070000070000070000070000070000070000070000070
+0000700007FF0007FF0007FF00151C7F9B18>I<FF83FEFF83FEFF83FE1C00701C00701C
+00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C00701C
+00701C00701C00701C00701C00700E00E00F01E00783C003FF8001FF00007C00171C809B
+18>I<FF07F8FF07F8FF07F81C01C01C01C01C01C01C01C00E03800E03800E03800E0380
+0F0780070700070700070700070700038E00038E00038E00038E00018C0001DC0001DC00
+01DC0000D80000F80000F800007000151C7F9B18>I<FE03F8FE03F8FE03F87000707000
+707000703800E03800E03800E03800E03800E038F8E038F8E039DCE039DCE019DCC019DC
+C019DCC0198CC01D8DC01D8DC01D8DC01D8DC00D8D800D05800F07800F07800E0380151C
+7F9B18>I<7F8FE07F9FE07F8FE00E07000F0700070E00078E00039C0003DC0001F80001
+F80000F00000F00000700000F00000F80001F80001DC00039E00038E00070F000707000E
+07800E03801E03C07F07F0FF8FF87F07F0151C7F9B18>I<FF07F8FF07F8FF07F81C01C0
+1E03C00E03800F0780070700070700038E00038E0001DC0001DC0001DC0000F80000F800
+00700000700000700000700000700000700000700000700000700001FC0003FE0001FC00
+151C7F9B18>I<FFF8FFF8FFF8E000E000E000E000E000E000E000E000E000E000E000E0
+00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0
+00FFF8FFF8FFF80D24779F18>91 D<FFF8FFF8FFF8003800380038003800380038003800
+380038003800380038003800380038003800380038003800380038003800380038003800
+380038003800380038FFF8FFF8FFF80D247F9F18>93 D<1FE0003FF8007FFC00781E0030
+0E0000070000070000FF0007FF001FFF007F0700780700E00700E00700E00700F00F0078
+1F003FFFF01FFBF007E1F014147D9318>97 D<7E0000FE00007E00000E00000E00000E00
+000E00000E00000E3E000EFF800FFFC00FC1E00F80E00F00700E00700E00380E00380E00
+380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF80063E00151C809B18
+>I<01FE0007FF001FFF803E0780380300700000700000E00000E00000E00000E00000E0
+0000E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F80
+003F80001F8000038000038000038000038000038003E3800FFB801FFF803C1F80380F80
+700780700380E00380E00380E00380E00380E00380E00380700780700780380F803C1F80
+1FFFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F003807807003807003
+80E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E03C01FFF8007FF
+0001FC0012147D9318>I<7E0000FE00007E00000E00000E00000E00000E00000E00000E
+3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E
+00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3FC171C809B18>104
+D<03800007C00007C00007C0000380000000000000000000000000007FC000FFC0007FC0
+0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0
+0001C00001C000FFFF00FFFF80FFFF00111D7C9C18>I<7FE000FFE0007FE00000E00000
+E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000
+E00000E00000E00000E00000E00000E00000E00000E00000E0007FFFC0FFFFE07FFFC013
+1C7E9B18>108 D<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C001C1C1C00
+1C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C00
+1C1C1C007F1F1F00FFBFBF807F1F1F001914819318>I<7E3E00FEFF807FFFC00FC1C00F
+80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E
+00E07FC3FCFFE7FE7FC3FC1714809318>I<01F0000FFE001FFF003E0F803803807001C0
+7001C0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF00
+0FFE0001F00013147E9318>I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E00
+380E00380E00380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF800E3E
+000E00000E00000E00000E00000E00000E00000E00007FC000FFE0007FC000151E809318
+>I<7F87E0FF9FF07FBFF803F87803F03003E00003C00003C00003800003800003800003
+80000380000380000380000380000380007FFE00FFFF007FFE0015147F9318>114
+D<07F7003FFF007FFF00780F00E00700E00700E007007C00007FE0001FFC0003FE00001F
+00600780E00380E00380F00380F80F00FFFF00FFFC00E7F00011147D9318>I<01800003
+80000380000380000380007FFFC0FFFFC0FFFFC003800003800003800003800003800003
+80000380000380000380000380400380E00380E00380E001C1C001FFC000FF80003E0013
+197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0
+0E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC1714809318>
+I<FF8FF8FF8FF8FF8FF83800E03800E03800E01C01C01C01C01C71C01CF9C01CF9C01CD9
+C01CD9C00DDD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>119
+D<7F8FF07F9FF07F8FF0070700078E00039E0001DC0001F80000F80000700000F00000F8
+0001DC00039E00038E000707000F07807F8FF0FF8FF87F8FF015147F9318>I
+E /Fe 2 3 df<FFFFFFC0FFFFFFC01A027C8B23>0 D<400004C0000C6000183000301800
+600C00C006018003030001860000CC0000780000300000300000780000CC000186000303
+000601800C00C0180060300030600018C0000C40000416187A9623>2
+D E /Ff 3 27 df<00000C0000180000300000600000C00001C000038000070000060000
+0E00001C00001C0000380000700000700000E00000E00001E00001C00003C00003800003
+80000780000700000700000F00000E00000E00001E00001E00001C00003C00003C00003C
+00003C0000380000780000780000780000780000780000780000780000700000F00000F0
+0000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0
+0000F00000F00000F00000F00000F00000F0000070000078000078000078000078000078
+00007800007800003800003C00003C00003C00003C00001C00001E00001E00000E00000E
+00000F000007000007000007800003800003800003C00001C00001E00000E00000E00000
+7000007000003800001C00001C00000E000006000007000003800001C00000C000006000
+003000001800000C166C778121>18 D<C000006000003000001800000C00000E00000700
+0003800001800001C00000E00000E000007000003800003800001C00001C00001E00000E
+00000F000007000007000007800003800003800003C00001C00001C00001E00001E00000
+E00000F00000F00000F00000F00000700000780000780000780000780000780000780000
+7800003800003C00003C00003C00003C00003C00003C00003C00003C00003C00003C0000
+3C00003C00003C00003C00003C00003C00003C00003C00003C00003C0000380000780000
+780000780000780000780000780000780000700000F00000F00000F00000F00000E00001
+E00001E00001C00001C00003C0000380000380000780000700000700000F00000E00001E
+00001C00001C0000380000380000700000E00000E00001C0000180000380000700000E00
+000C0000180000300000600000C00000166C7F8121>I<0000380000780001F00003C000
+0780000F00001E00001E00003C00003C0000780000780000780000780000780000780000
+780000780000780000780000780000780000780000780000780000780000780000780000
+780000780000780000780000780000780000780000780000780000780000780000780000
+780000780000780000780000F00000F00001E00001E00003C0000780000F00001E000078
+0000F00000F000007800001E00000F000007800003C00001E00001E00000F00000F00000
+780000780000780000780000780000780000780000780000780000780000780000780000
+780000780000780000780000780000780000780000780000780000780000780000780000
+7800007800007800007800007800007800007800007800007800007800003C00003C0000
+1E00001E00000F000007800003C00001F0000078000038156C7A8122>26
+D E /Fg 41 122 df<00003FE00000E01000018038000380780003007800070030000700
+000007000000070000000E0000000E0000000E000000FFFFE0000E00E0001C01C0001C01
+C0001C01C0001C01C0001C03800038038000380380003803800038070000380700007007
+000070071000700E2000700E2000700E2000E00E2000E0064000E0038000E0000000C000
+0001C0000001C000003180000079800000F3000000620000003C0000001D29829F1A>12
+D<1C3C3C3C3C040408081020204080060E7D840E>44 D<7FF0FFE07FE00C037D8A10>I<
+0007C0001C200030200060E000C1E00181E00380C00700000F00000E00001E00001E7800
+1D84003E06003E07003C07007C0780780780780780780780700F00700F00F00F00F00E00
+F01E00701C00601C0070380030700010C0000F8000131F7B9D17>54
+D<001F000061800080C00100600300600600600600600600600E00C00F00800F818007C3
+0007E40003F80001F80003FC00047E00183F00300F00200700600700C00300C00300C003
+00800600800600C00C00C008004030003060001F8000131F7B9D17>56
+D<00000200000006000000060000000E0000001E0000001E0000003F0000002F0000004F
+0000004F0000008F0000010F0000010F0000020F0000020F0000040F00000C0F0000080F
+0000100F0000100F0000200F80003FFF800040078000C007800080078001000780010007
+800200078002000780060007801E000F80FF807FF81D207E9F22>65
+D<0000FE0200078186001C004C0038003C0060003C00C0001C01C0001803800018070000
+180F0000181E0000101E0000103C0000003C000000780000007800000078000000780000
+00F0000000F0000000F0000000F0000000F0000080700000807000008070000100380001
+0038000200180004000C001800060020000381C00000FE00001F217A9F21>67
+D<01FFFFFE001E001C001E000C001E0004001E0004003C0004003C0004003C0004003C00
+040078080800780800007808000078180000F0300000FFF00000F0300000F0300001E020
+0001E0200001E0200001E0001003C0002003C0002003C0004003C0004007800080078001
+8007800100078007000F001F00FFFFFE001F1F7D9E1F>69 D<01FFF0001F00001E00001E
+00001E00003C00003C00003C00003C0000780000780000780000780000F00000F00000F0
+0000F00001E00001E00001E00001E00003C00003C00003C00003C0000780000780000780
+000780000F8000FFF800141F7D9E12>73 D<01FFF800001F0000001E0000001E0000001E
+0000003C0000003C0000003C0000003C00000078000000780000007800000078000000F0
+000000F0000000F0000000F0000001E0000001E0000001E0000001E0008003C0010003C0
+010003C0030003C00200078006000780060007800C0007801C000F007800FFFFF800191F
+7D9E1D>76 D<01FE00007FC0001E0000FC00001E0000F800001700017800001700017800
+00270002F00000270004F00000270004F00000270008F00000470009E00000470011E000
+00470021E00000470021E00000870043C00000838043C00000838083C00000838083C000
+0103810780000103820780000103820780000103840780000203840F00000203880F0000
+0203900F00000203900F00000401E01E00000401E01E00000401C01E00000C01801E0000
+1C01803E0000FF8103FFC0002A1F7D9E29>I<01FFFF80001E00E0001E0070001E003800
+1E003C003C003C003C003C003C003C003C003C0078007800780078007800F0007800E000
+F003C000F00F0000FFFC0000F0000001E0000001E0000001E0000001E0000003C0000003
+C0000003C0000003C00000078000000780000007800000078000000F800000FFF000001E
+1F7D9E1F>80 D<0007E040001C18C0003005800060038000C0038001C001800180010003
+80010003800100038001000380000003C0000003C0000003F8000001FF800001FFE00000
+7FF000001FF0000001F80000007800000078000000380000003800200038002000380020
+00300060007000600060006000E0007000C000E8038000C606000081F800001A217D9F1A
+>83 D<0FFFFFF01E0780E0180780201007802020078020200F0020600F0020400F002040
+0F0020801E0040001E0000001E0000001E0000003C0000003C0000003C0000003C000000
+78000000780000007800000078000000F0000000F0000000F0000000F0000001E0000001
+E0000001E0000001E0000003E00000FFFF00001C1F789E21>I<001FC0001FC000180000
+180000300000300000300000300000600000600000600000600000C00000C00000C00000
+C00001800001800001800001800003000003000003000003000006000006000006000006
+00000C00000C00000C00000C000018000018000018000018000030000030000030000030
+00006000006000006000007F0000FE0000122D7EA10E>91 D<001FC0001FC00000C00000
+C00001800001800001800001800003000003000003000003000006000006000006000006
+00000C00000C00000C00000C000018000018000018000018000030000030000030000030
+0000600000600000600000600000C00000C00000C00000C0000180000180000180000180
+000300000300000300007F0000FE0000122D82A10E>93 D<00F1800389C00707800E0380
+1C03803C0380380700780700780700780700F00E00F00E00F00E00F00E20F01C40F01C40
+703C40705C40308C800F070013147C9317>97 D<07803F8007000700070007000E000E00
+0E000E001C001C001CF01D0C3A0E3C0E380F380F700F700F700F700FE01EE01EE01EE01C
+E03CE038607060E031C01F0010207B9F15>I<007E0001C1000300800E07801E07801C07
+003C0200780000780000780000F00000F00000F00000F00000F000007001007002003004
+0018380007C00011147C9315>I<0000780003F80000700000700000700000700000E000
+00E00000E00000E00001C00001C000F1C00389C00707800E03801C03803C038038070078
+0700780700780700F00E00F00E00F00E00F00E20F01C40F01C40703C40705C40308C800F
+070015207C9F17>I<007C01C207010E011C013C013802780C7BF07C00F000F000F000F0
+007000700170023804183807C010147C9315>I<00007800019C00033C00033C00071800
+0700000700000E00000E00000E00000E00000E0001FFE0001C00001C00001C00001C0000
+380000380000380000380000380000700000700000700000700000700000700000E00000
+E00000E00000E00000C00001C00001C0000180003180007B0000F300006600003C000016
+29829F0E>I<003C6000E27001C1E00380E00700E00F00E00E01C01E01C01E01C01E01C0
+3C03803C03803C03803C03803C07003C07001C0F001C17000C2E0003CE00000E00000E00
+001C00001C00301C00783800F0700060E0003F8000141D7E9315>I<01E0000FE00001C0
+0001C00001C00001C000038000038000038000038000070000070000071E000763000E81
+800F01C00E01C00E01C01C03801C03801C03801C0380380700380700380700380E10700E
+20700C20701C20700C40E00CC060070014207D9F17>I<00C001E001E001C00000000000
+0000000000000000000E003300230043804300470087000E000E000E001C001C001C0038
+40388030807080310033001C000B1F7C9E0E>I<0001800003C00003C000038000000000
+0000000000000000000000000000000000003C0000460000870000870001070001070002
+0E00000E00000E00000E00001C00001C00001C00001C0000380000380000380000380000
+700000700000700000700000E00000E00030E00079C000F180006300003C00001228829E
+0E>I<01E0000FE00001C00001C00001C00001C000038000038000038000038000070000
+0700000703C00704200E08E00E11E00E21E00E40C01C80001D00001E00001FC00038E000
+387000387000383840707080707080707080703100E03100601E0013207D9F15>I<03C0
+1FC0038003800380038007000700070007000E000E000E000E001C001C001C001C003800
+3800380038007000700070007100E200E200E200E200640038000A207C9F0C>I<1C0F80
+F0002630C318004740640C004780680E004700700E004700700E008E00E01C000E00E01C
+000E00E01C000E00E01C001C01C038001C01C038001C01C038001C01C070803803807100
+3803806100380380E10038038062007007006600300300380021147C9325>I<1C0F8026
+30C04740604780604700704700708E00E00E00E00E00E00E00E01C01C01C01C01C01C01C
+03843803883803083807083803107003303001C016147C931A>I<007C0001C300030180
+0E01C01E01C01C01E03C01E07801E07801E07801E0F003C0F003C0F003C0F00780F00700
+700F00700E0030180018700007C00013147C9317>I<01C1E002621804741C04781C0470
+1E04701E08E01E00E01E00E01E00E01E01C03C01C03C01C03C01C0380380780380700380
+E003C1C0072380071E000700000700000E00000E00000E00000E00001C00001C0000FFC0
+00171D809317>I<00F0400388C00705800E03801C03803C038038070078070078070078
+0700F00E00F00E00F00E00F00E00F01C00F01C00703C00705C0030B8000F380000380000
+380000700000700000700000700000E00000E0000FFE00121D7C9315>I<1C1E00266100
+4783804787804707804703008E00000E00000E00000E00001C00001C00001C00001C0000
+38000038000038000038000070000030000011147C9313>I<00FC030206010C030C070C
+060C000F800FF007F803FC003E000E700EF00CF00CE008401020601F8010147D9313>I<
+018001C0038003800380038007000700FFF007000E000E000E000E001C001C001C001C00
+3800380038003820704070407080708031001E000C1C7C9B0F>I<0E00C03300E02301C0
+4381C04301C04701C08703800E03800E03800E03801C07001C07001C07001C07101C0E20
+180E20180E201C1E200C264007C38014147C9318>I<0E03803307802307C04383C04301
+C04700C08700800E00800E00800E00801C01001C01001C01001C02001C02001C04001C04
+001C08000E300003C00012147C9315>I<0E00C1C03300E3C02301C3E04381C1E04301C0
+E04701C060870380400E0380400E0380400E0380401C0700801C0700801C0700801C0701
+001C0701001C0602001C0F02000C0F04000E13080003E1F0001B147C931E>I<0383800C
+C4401068E01071E02071E02070C040E00000E00000E00000E00001C00001C00001C00001
+C040638080F38080F38100E5810084C60078780013147D9315>I<0E00C03300E02301C0
+4381C04301C04701C08703800E03800E03800E03801C07001C07001C07001C07001C0E00
+180E00180E001C1E000C3C0007DC00001C00001C00003800F03800F07000E06000C0C000
+4380003E0000131D7C9316>I E /Fh 80 124 df<001F83E000F06E3001C078780380F8
+780300F03007007000070070000700700007007000070070000700700007007000FFFFFF
+800700700007007000070070000700700007007000070070000700700007007000070070
+000700700007007000070070000700700007007000070070000700700007007000070070
+007FE3FF001D20809F1B>11 D<003F0000E0C001C0C00381E00701E00701E00700000700
+00070000070000070000070000FFFFE00700E00700E00700E00700E00700E00700E00700
+E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E07FC3
+FE1720809F19>I<003FE000E0E001C1E00381E00700E00700E00700E00700E00700E007
+00E00700E00700E0FFFFE00700E00700E00700E00700E00700E00700E00700E00700E007
+00E00700E00700E00700E00700E00700E00700E00700E00700E00700E07FE7FE1720809F
+19>I<001F81F80000F04F040001C07C06000380F80F000300F00F000700F00F00070070
+000007007000000700700000070070000007007000000700700000FFFFFFFF0007007007
+000700700700070070070007007007000700700700070070070007007007000700700700
+070070070007007007000700700700070070070007007007000700700700070070070007
+00700700070070070007007007007FE3FE3FF02420809F26>I<70F8F8F8F8F8F8F87070
+70707070707070702020202020000000000070F8F8F87005217CA00D>33
+D<7038F87CFC7EFC7E743A0402040204020804080410081008201040200F0E7E9F17>I<
+70F8FCFC74040404080810102040060E7C9F0D>39 D<0020004000800100020006000C00
+0C00180018003000300030007000600060006000E000E000E000E000E000E000E000E000
+E000E000E000E0006000600060007000300030003000180018000C000C00060002000100
+0080004000200B2E7DA112>I<800040002000100008000C000600060003000300018001
+80018001C000C000C000C000E000E000E000E000E000E000E000E000E000E000E000E000
+C000C000C001C001800180018003000300060006000C00080010002000400080000B2E7D
+A112>I<0006000000060000000600000006000000060000000600000006000000060000
+00060000000600000006000000060000000600000006000000060000FFFFFFF0FFFFFFF0
+000600000006000000060000000600000006000000060000000600000006000000060000
+0006000000060000000600000006000000060000000600001C207D9A23>43
+D<70F8FCFC74040404080810102040060E7C840D>I<FFC0FFC00A027F8A0F>I<70F8F8F8
+7005057C840D>I<03F0000E1C001C0E00180600380700700380700380700380700380F0
+03C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F0
+03C07003807003807003807807803807001806001C0E000E1C0003F000121F7E9D17>48
+D<018003800F80F380038003800380038003800380038003800380038003800380038003
+80038003800380038003800380038003800380038007C0FFFE0F1E7C9D17>I<03F0000C
+1C00100E00200700400780800780F007C0F803C0F803C0F803C02007C00007C000078000
+0780000F00000E00001C0000380000700000600000C0000180000300000600400C004018
+00401000803FFF807FFF80FFFF80121E7E9D17>I<03F0000C1C00100E00200F00780F80
+780780780780380F80000F80000F00000F00000E00001C0000380003F000003C00000E00
+000F000007800007800007C02007C0F807C0F807C0F807C0F00780400780400F00200E00
+1C3C0003F000121F7E9D17>I<000600000600000E00000E00001E00002E00002E00004E
+00008E00008E00010E00020E00020E00040E00080E00080E00100E00200E00200E00400E
+00C00E00FFFFF0000E00000E00000E00000E00000E00000E00000E0000FFE0141E7F9D17
+>I<1803001FFE001FFC001FF8001FE00010000010000010000010000010000010000011
+F000161C00180E001007001007800003800003800003C00003C00003C07003C0F003C0F0
+03C0E00380400380400700200600100E000C380003E000121F7E9D17>I<007C00018200
+0701000E03800C07801C0780380300380000780000700000700000F1F000F21C00F40600
+F80700F80380F80380F003C0F003C0F003C0F003C0F003C07003C07003C0700380380380
+3807001807000C0E00061C0001F000121F7E9D17>I<4000007FFFC07FFF807FFF804001
+0080020080020080040000080000080000100000200000200000400000400000C00000C0
+0001C0000180000380000380000380000380000780000780000780000780000780000780
+00078000030000121F7D9D17>I<03F0000C0C0010060030030020018060018060018060
+01807001807803003E03003F06001FC8000FF00003F80007FC000C7E00103F00300F8060
+03804001C0C001C0C000C0C000C0C000C0C000806001802001001002000C0C0003F00012
+1F7E9D17>I<03F0000E18001C0C00380600380700700700700380F00380F00380F003C0
+F003C0F003C0F003C0F003C07007C07007C03807C0180BC00E13C003E3C0000380000380
+000380000700300700780600780E00700C002018001070000FC000121F7E9D17>I<70F8
+F8F8700000000000000000000070F8F8F87005147C930D>I<70F8F8F870000000000000
+0000000070F0F8F878080808101010202040051D7C930D>I<7FFFFFE0FFFFFFF0000000
+0000000000000000000000000000000000000000000000000000000000FFFFFFF07FFFFF
+E01C0C7D9023>61 D<0FC0307040384038E03CF03CF03C603C0038007000E000C0018001
+80010003000200020002000200020002000000000000000000000007000F800F800F8007
+000E207D9F15>63 D<000100000003800000038000000380000007C0000007C0000007C0
+000009E0000009E0000009E0000010F0000010F0000010F0000020780000207800002078
+0000403C0000403C0000403C0000801E0000801E0000FFFE0001000F0001000F0001000F
+00020007800200078002000780040003C00E0003C01F0007E0FFC03FFE1F207F9F22>65
+D<FFFFE0000F80380007801E0007801F0007800F0007800F8007800F8007800F8007800F
+8007800F8007800F0007801F0007801E0007803C0007FFF00007803C0007801E0007800F
+0007800F8007800780078007C0078007C0078007C0078007C0078007C00780078007800F
+8007800F0007801F000F803C00FFFFF0001A1F7E9E20>I<000FC040007030C001C009C0
+038005C0070003C00E0001C01E0000C01C0000C03C0000C07C0000407C00004078000040
+F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000
+780000007C0000407C0000403C0000401C0000401E0000800E0000800700010003800200
+01C0040000703800000FC0001A217D9F21>I<FFFFE0000F803C0007801E000780070007
+800380078003C0078001E0078001E0078001F0078000F0078000F0078000F8078000F807
+8000F8078000F8078000F8078000F8078000F8078000F8078000F8078000F0078000F007
+8000F0078001E0078001E0078003C0078003800780070007800E000F803C00FFFFE0001D
+1F7E9E23>I<FFFFFF000F800F0007800300078003000780010007800180078000800780
+008007800080078080800780800007808000078080000781800007FF8000078180000780
+800007808000078080000780800007800020078000200780002007800040078000400780
+0040078000C0078000C0078001800F800F80FFFFFF801B1F7E9E1F>I<FFFFFF000F800F
+000780030007800300078001000780018007800080078000800780008007800080078080
+000780800007808000078080000781800007FF8000078180000780800007808000078080
+000780800007800000078000000780000007800000078000000780000007800000078000
+000FC00000FFFE0000191F7E9E1E>I<000FE0200078186000E004E0038002E0070001E0
+0F0000E01E0000601E0000603C0000603C0000207C00002078000020F8000000F8000000
+F8000000F8000000F8000000F8000000F8000000F8007FFCF80003E0780001E07C0001E0
+3C0001E03C0001E01E0001E01E0001E00F0001E0070001E0038002E000E0046000781820
+000FE0001E217D9F24>I<FFF8FFF80F800F8007800F0007800F0007800F0007800F0007
+800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007FFFF0007
+800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007800F0007
+800F0007800F0007800F0007800F0007800F000F800F80FFF8FFF81D1F7E9E22>I<FFFC
+0FC007800780078007800780078007800780078007800780078007800780078007800780
+07800780078007800780078007800780078007800FC0FFFC0E1F7F9E10>I<0FFFC0007C
+00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C00003C
+00003C00003C00003C00003C00003C00003C00003C00003C00003C00203C00F83C00F83C
+00F83C00F0380040780040700030E0000F800012207E9E17>I<FFFE000FC00007800007
+800007800007800007800007800007800007800007800007800007800007800007800007
+800007800007800007800007800007800207800207800207800207800607800407800407
+800C07801C0F807CFFFFFC171F7E9E1C>76 D<FF80001FF80F80001F800780001F0005C0
+002F0005C0002F0005C0002F0004E0004F0004E0004F000470008F000470008F00047000
+8F000438010F000438010F000438010F00041C020F00041C020F00041C020F00040E040F
+00040E040F00040E040F000407080F000407080F000407080F000403900F000403900F00
+0401E00F000401E00F000401E00F000E00C00F001F00C01F80FFE0C1FFF8251F7E9E2A>
+I<FF803FF807C007C007C0038005E0010005E0010004F001000478010004780100043C01
+00043C0100041E0100040F0100040F010004078100040781000403C1000401E1000401E1
+000400F1000400F1000400790004003D0004003D0004001F0004001F0004000F00040007
+00040007000E0003001F000300FFE001001D1F7E9E22>I<001F800000F0F00001C03800
+07801E000F000F000E0007001E0007803C0003C03C0003C07C0003E0780001E0780001E0
+F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0F80001F0
+780001E07C0003E07C0003E03C0003C03C0003C01E0007800E0007000F000F0007801E00
+01C0380000F0F000001F80001C217D9F23>I<FFFFE0000F80780007801C0007801E0007
+800F0007800F8007800F8007800F8007800F8007800F8007800F8007800F0007801E0007
+801C000780780007FFE00007800000078000000780000007800000078000000780000007
+8000000780000007800000078000000780000007800000078000000FC00000FFFC000019
+1F7E9E1F>I<FFFF80000F80F0000780780007803C0007801E0007801E0007801F000780
+1F0007801F0007801F0007801E0007801E0007803C00078078000780F00007FF80000781
+C0000780E0000780F0000780700007807800078078000780780007807C0007807C000780
+7C0007807C0407807E0407803E040FC01E08FFFC0F10000003E01E207E9E21>82
+D<07E0800C1980100780300380600180600180E00180E00080E00080E00080F00000F000
+007800007F00003FF0001FFC000FFE0003FF00001F800007800003C00003C00001C08001
+C08001C08001C08001C0C00180C00380E00300F00600CE0C0081F80012217D9F19>I<7F
+FFFFE0780F01E0600F0060400F0020400F0020C00F0030800F0010800F0010800F001080
+0F0010000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
+0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
+0F0000000F0000001F800007FFFE001C1F7E9E21>I<FFFC3FF80FC007C0078003800780
+010007800100078001000780010007800100078001000780010007800100078001000780
+010007800100078001000780010007800100078001000780010007800100078001000780
+01000780010007800100038002000380020001C0020001C0040000E00800007018000038
+2000000FC0001D207E9E22>I<FFF003FE1F8000F80F0000600F80006007800040078000
+4003C0008003C0008003C0008001E0010001E0010001F0010000F0020000F0020000F806
+000078040000780400003C0800003C0800003C0800001E1000001E1000001F3000000F20
+00000F20000007C0000007C0000007C000000380000003800000038000000100001F207F
+9E22>I<FFF07FF81FF01F800FC007C00F00078003800F00078001000F0007C001000780
+07C00200078007C00200078007C0020003C009E0040003C009E0040003C009E0040003E0
+10F00C0001E010F0080001E010F0080001F02078080000F02078100000F02078100000F0
+403C10000078403C20000078403C20000078C03E2000003C801E4000003C801E4000003C
+801E4000001F000F8000001F000F8000001F000F8000001E00078000000E00070000000E
+00070000000C000300000004000200002C207F9E2F>I<FFF003FF1F8000F80F80006007
+80004007C0004003E0008001E0008001F0010000F0030000F80200007C0400003C040000
+3E0800001E0800001F1000000FB0000007A0000007C0000003C0000003C0000003C00000
+03C0000003C0000003C0000003C0000003C0000003C0000003C0000003C0000007C00000
+7FFE00201F7F9E22>89 D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0
+C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE072D7CA10D>91
+D<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E7B9F17>I<
+FEFE06060606060606060606060606060606060606060606060606060606060606060606
+06060606060606FEFE072D7FA10D>I<081020204040808080B8FCFC7C38060E7D9F0D>
+96 D<1FE000303000781800781C00300E00000E00000E00000E0000FE00078E001E0E00
+380E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>I<0E00
+00FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E
+000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E00780E00780E00
+780E00700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C1C1E38
+1E380C70007000F000F000F000F000F000F00070007000380138011C020E0C03F010147E
+9314>I<000380003F800003800003800003800003800003800003800003800003800003
+8000038003E380061B801C0780380380380380700380700380F00380F00380F00380F003
+80F00380F003807003807003803803803807801C07800E1B8003E3F815207E9F19>I<03
+F0000E1C001C0E00380700380700700700700380F00380F00380FFFF80F00000F00000F0
+00007000007000003800801800800C010007060001F80011147F9314>I<007C00C6018F
+038F07060700070007000700070007000700FFF007000700070007000700070007000700
+07000700070007000700070007000700070007007FF01020809F0E>I<0000E003E3300E
+3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E380033E00020
+00002000003000003000003FFE001FFF800FFFC03001E0600070C00030C00030C00030C0
+00306000603000C01C038003FC00141F7F9417>I<0E0000FE00000E00000E00000E0000
+0E00000E00000E00000E00000E00000E00000E00000E3E000E43000E81800F01C00F01C0
+0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0
+0E01C00E01C0FFE7FC16207F9F19>I<1C001E003E001E001C0000000000000000000000
+00000E007E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00
+0E000E00FFC00A1F809E0C>I<00E001F001F001F000E000000000000000000000000000
+7007F000F000700070007000700070007000700070007000700070007000700070007000
+70007000700070007000706070F060F0C061803F000C28829E0E>I<0E0000FE00000E00
+000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0FF00E03C00E03
+000E02000E04000E08000E10000E30000E70000EF8000F38000E1C000E1E000E0E000E07
+000E07800E03800E03C00E03E0FFCFF815207F9F18>I<0E00FE000E000E000E000E000E
+000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E
+000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F01F000FE618618000E81C81C
+000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00
+0E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E
+00E00E000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C00F01C0
+0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0
+0E01C00E01C0FFE7FC16147F9319>I<01F800070E001C03803801C03801C07000E07000
+E0F000F0F000F0F000F0F000F0F000F0F000F07000E07000E03801C03801C01C0380070E
+0001F80014147F9317>I<0E3E00FEC3800F01C00F00E00E00E00E00F00E00700E00780E
+00780E00780E00780E00780E00780E00700E00F00E00E00F01E00F01C00EC3000E3E000E
+00000E00000E00000E00000E00000E00000E00000E0000FFE000151D7F9319>I<03E080
+0619801C05803C0780380380780380700380F00380F00380F00380F00380F00380F00380
+7003807803803803803807801C0B800E138003E380000380000380000380000380000380
+000380000380000380003FF8151D7E9318>I<0E78FE8C0F1E0F1E0F0C0E000E000E000E
+000E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>I<1F9030704030
+C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D0608F800D14
+7E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E000E
+000E000E000E000E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE
+1FC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E
+01C00E01C00E01C00E03C00603C0030DC001F1FC16147F9319>I<FF83F81E01E01C00C0
+0E00800E00800E008007010007010003820003820003820001C40001C40001EC0000E800
+00E80000700000700000700000200015147F9318>I<FF9FE1FC3C0780701C0300601C03
+80200E0380400E0380400E03C0400707C0800704C0800704E080038861000388710003C8
+730001D0320001D03A0000F03C0000E01C0000E01C0000601800004008001E147F9321>
+I<7FC3FC0F01E00701C007018003810001C20000E40000EC00007800003800003C00007C
+00004E000087000107000303800201C00601E01E01E0FF07FE1714809318>I<FF83F81E
+01E01C00C00E00800E00800E008007010007010003820003820003820001C40001C40001
+EC0000E80000E800007000007000007000002000002000004000004000004000F08000F0
+8000F100006200003C0000151D7F9318>I<3FFF380E200E201C40384078407000E001E0
+01C00380078007010E011E011C0338027006700EFFFE10147F9314>I<FFFFFC1601808C
+17>I E /Fi 43 122 df<387CFEFFFF7F3B030306060E0C18702008107C860F>44
+D<FFF0FFF0FFF0FFF00C047F8B11>I<387CFEFEFE7C38000000000000387CFEFEFE7C38
+07147C930F>58 D<07F8001FFE00381F80780F80FC0FC0FC0FC0FC0FC0780FC0301F8000
+1F00003E00007C0000700000E00000E00000C00000C00000C00000C00000C00000C00000
+000000000000000000000001C00003E00007F00007F00007F00003E00001C00012207D9F
+19>63 D<0000E000000000E000000001F000000001F000000001F000000003F800000003
+F800000006FC00000006FC0000000EFE0000000C7E0000000C7E000000183F000000183F
+000000303F800000301F800000701FC00000600FC00000600FC00000C007E00000FFFFE0
+0001FFFFF000018003F000018003F000030001F800030001F800060001FC00060000FC00
+0E0000FE00FFE00FFFE0FFE00FFFE0231F7E9E28>65 D<FFFFFE00FFFFFFC007C007E007
+C003F007C001F807C001FC07C001FC07C001FC07C001FC07C001FC07C001F807C003F807
+C007F007C00FE007FFFF8007FFFFC007C003F007C001F807C001FC07C000FC07C000FE07
+C000FE07C000FE07C000FE07C000FE07C000FC07C001FC07C003F807C007F0FFFFFFE0FF
+FFFF001F1F7E9E25>I<0007FC02003FFF0E00FE03DE03F000FE07E0003E0FC0001E1F80
+001E3F00000E3F00000E7F0000067E0000067E000006FE000000FE000000FE000000FE00
+0000FE000000FE000000FE0000007E0000007E0000067F0000063F0000063F00000C1F80
+000C0FC0001807E0003803F0007000FE01C0003FFF800007FC001F1F7D9E26>I<FFFFFE
+0000FFFFFFC00007E007F00007E001F80007E000FC0007E0007E0007E0003F0007E0003F
+0007E0001F8007E0001F8007E0001F8007E0001FC007E0001FC007E0001FC007E0001FC0
+07E0001FC007E0001FC007E0001FC007E0001FC007E0001FC007E0001F8007E0001F8007
+E0001F8007E0003F0007E0003F0007E0007E0007E000FC0007E001F80007E007F000FFFF
+FFC000FFFFFE0000221F7E9E28>I<FFFFFFE0FFFFFFE007E007E007E001E007E000E007
+E0006007E0007007E0003007E0003007E0603007E0603007E0600007E0E00007E1E00007
+FFE00007FFE00007E1E00007E0E00007E0600007E0600C07E0600C07E0000C07E0001807
+E0001807E0001807E0003807E0007807E000F807E003F0FFFFFFF0FFFFFFF01E1F7E9E22
+>I<FFFFFFE0FFFFFFE007E007E007E001E007E000E007E0006007E0007007E0003007E0
+003007E0603007E0603007E0600007E0E00007E1E00007FFE00007FFE00007E1E00007E0
+E00007E0600007E0600007E0600007E0000007E0000007E0000007E0000007E0000007E0
+000007E0000007E00000FFFF8000FFFF80001C1F7E9E21>I<FFFF0FFFF0FFFF0FFFF007
+E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0
+007E0007E0007E0007E0007E0007E0007E0007E0007E0007FFFFFE0007FFFFFE0007E000
+7E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E
+0007E0007E0007E0007E0007E0007E0007E0007E0007E0007E00FFFF0FFFF0FFFF0FFFF0
+241F7E9E29>72 D<FFFFFFFF07E007E007E007E007E007E007E007E007E007E007E007E0
+07E007E007E007E007E007E007E007E007E007E007E007E007E007E007E0FFFFFFFF101F
+7E9E14>I<FFFF8000FFFF800007E0000007E0000007E0000007E0000007E0000007E000
+0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E000
+0007E0000007E0000007E000C007E000C007E000C007E001C007E001C007E001C007E003
+8007E0038007E00F8007E01F80FFFFFF80FFFFFF801A1F7E9E1F>76
+D<FFE000003FF8FFF000007FF807F000007F0006F80000DF0006F80000DF0006F80000DF
+00067C00019F00067C00019F00063E00031F00063E00031F00061F00061F00061F00061F
+00060F800C1F00060F800C1F000607C0181F000607C0181F000607C0181F000603E0301F
+000603E0301F000601F0601F000601F0601F000600F8C01F000600F8C01F0006007D801F
+0006007D801F0006003F001F0006003F001F0006003F001F0006001E001F00FFF01E03FF
+F8FFF00C03FFF82D1F7E9E32>I<FFFFFE00FFFFFF8007E00FE007E003F007E001F807E0
+01F807E001FC07E001FC07E001FC07E001FC07E001FC07E001F807E001F807E003F007E0
+0FE007FFFF8007FFFE0007E0000007E0000007E0000007E0000007E0000007E0000007E0
+000007E0000007E0000007E0000007E0000007E00000FFFF0000FFFF00001E1F7E9E24>
+80 D<FFFFF80000FFFFFF000007E01FC00007E007E00007E003F00007E003F00007E003
+F80007E003F80007E003F80007E003F80007E003F00007E003F00007E007E00007E01FC0
+0007FFFF000007FFFC000007E03E000007E01F000007E00F800007E00F800007E00FC000
+07E00FC00007E00FC00007E00FE00007E00FE00007E00FE00007E00FE03007E007F03007
+E003F860FFFF01FFC0FFFF007F80241F7E9E27>82 D<03FC080FFF381E03F83800F87000
+78700038F00038F00018F00018F80000FC00007FC0007FFE003FFF801FFFE00FFFF007FF
+F000FFF80007F80000FC00007C00003CC0003CC0003CC0003CE00038E00078F80070FE01
+E0E7FFC081FF00161F7D9E1D>I<7FFFFFFC7FFFFFFC7C07E07C7007E01C6007E00C6007
+E00CE007E00EC007E006C007E006C007E006C007E0060007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E00003FFFFC003FFFFC01F1E7E9D24>I<FFFF01
+FFE0FFFF01FFE007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C
+0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C00
+07E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007E0000C0007
+E0000C0007E0000C0003E000180001F000180001F000300000F8006000007E03C000001F
+FF80000003FC0000231F7E9E28>I<FFFE0FFFC0FFE0FFFE0FFFC0FFE00FC000FC000E00
+0FE000FC000E0007E000FE000C0007E000FE000C0003F000FE00180003F001FF00180003
+F001BF00180001F801BF00300001F8031F80300001FC031F80700000FC031F80600000FC
+060FC06000007E060FC0C000007E0E0FE0C000007E0C07E0C000003F0C07E18000003F18
+03F18000003F9803F38000001F9803F30000001FB001FB0000000FF001FE0000000FF001
+FE0000000FE000FE00000007E000FC00000007C0007C00000007C0007C00000003C00078
+00000003800038000000018000300000331F7F9E36>87 D<07FC001FFF003F0F803F07C0
+3F03E03F03E00C03E00003E0007FE007FBE01F03E03C03E07C03E0F803E0F803E0F803E0
+FC05E07E0DE03FF8FE0FE07E17147F9319>97 D<FF0000FF00001F00001F00001F00001F
+00001F00001F00001F00001F00001F00001F00001F1FC01F7FF01FE0F81F807C1F007E1F
+003E1F003E1F003F1F003F1F003F1F003F1F003F1F003F1F003E1F003E1F007C1F807C1E
+C1F81C7FE0181F8018207E9F1D>I<01FE0007FF801F0FC03E0FC03E0FC07C0FC07C0300
+FC0000FC0000FC0000FC0000FC0000FC00007C00007E00003E00603F00C01F81C007FF00
+01FC0013147E9317>I<0007F80007F80000F80000F80000F80000F80000F80000F80000
+F80000F80000F80000F801F8F80FFEF81F83F83E01F87E00F87C00F87C00F8FC00F8FC00
+F8FC00F8FC00F8FC00F8FC00F87C00F87C00F87E00F83E01F81F07F80FFEFF03F8FF1820
+7E9F1D>I<01FE0007FF800F83C01E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC
+0000FC0000FC00007C00007C00003E00181E00180F807007FFE000FF8015147F9318>I<
+001F8000FFC001F3E003E7E003C7E007C7E007C3C007C00007C00007C00007C00007C000
+FFFC00FFFC0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C000
+07C00007C00007C00007C00007C00007C0003FFC003FFC0013207F9F10>I<01FC3C07FF
+FE0F079E1E03DE3E03E03E03E03E03E03E03E03E03E01E03C00F07800FFF0009FC001800
+001800001C00001FFF800FFFF007FFF81FFFFC3C007C70003EF0001EF0001EF0001E7800
+3C78003C3F01F80FFFE001FF00171E7F931A>I<FF0000FF00001F00001F00001F00001F
+00001F00001F00001F00001F00001F00001F00001F0FC01F3FE01F61F01FC0F81F80F81F
+00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F
+00F8FFE3FFFFE3FF18207D9F1D>I<1C003E007F007F007F003E001C0000000000000000
+0000000000FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+001F001F00FFE0FFE00B217EA00E>I<FF0000FF00001F00001F00001F00001F00001F00
+001F00001F00001F00001F00001F00001F01FE1F01FE1F00F01F00C01F03801F07001F0C
+001F18001F7C001FFC001F9E001F0F001E0F801E07C01E03C01E01E01E01F01E00F8FFC3
+FFFFC3FF18207E9F1C>107 D<FF00FF001F001F001F001F001F001F001F001F001F001F
+001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F
+00FFE0FFE00B207E9F0E>I<FE0FE03F80FE1FF07FC01E70F9C3E01E407D01F01E807E01
+F01F807E01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F0
+1F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F0FFE3FF8FFEFF
+E3FF8FFE27147D932C>I<FE0FC0FE3FE01E61F01EC0F81E80F81F00F81F00F81F00F81F
+00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8FFE3FFFFE3FF18
+147D931D>I<01FF0007FFC01F83F03E00F83E00F87C007C7C007CFC007EFC007EFC007E
+FC007EFC007EFC007E7C007C7C007C3E00F83E00F81F83F007FFC001FF0017147F931A>
+I<FF1FC0FF7FF01FE1F81F80FC1F007E1F007E1F003E1F003F1F003F1F003F1F003F1F00
+3F1F003F1F003E1F007E1F007C1F80FC1FC1F81F7FE01F1F801F00001F00001F00001F00
+001F00001F00001F0000FFE000FFE000181D7E931D>I<01F81807FE381F87783F01F83E
+01F87E00F87C00F8FC00F8FC00F8FC00F8FC00F8FC00F8FC00F87C00F87E00F87E00F83F
+01F81F87F80FFEF803F8F80000F80000F80000F80000F80000F80000F80000F80007FF00
+07FF181D7E931C>I<FE3E00FE7F801ECFC01E8FC01E8FC01F8FC01F03001F00001F0000
+1F00001F00001F00001F00001F00001F00001F00001F00001F0000FFF000FFF00012147E
+9316>I<0FE63FFE701E600EE006E006F800FFC07FF83FFC1FFE03FE001FC007C007E007
+F006F81EFFFCC7F010147E9315>I<01800180018003800380038007800F803F80FFFCFF
+FC0F800F800F800F800F800F800F800F800F800F800F860F860F860F860F8607CC03F801
+F00F1D7F9C14>I<FF07F8FF07F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F
+00F81F00F81F00F81F00F81F00F81F00F81F01F81F01F80F06F807FCFF03F8FF18147D93
+1D>I<FFE07F80FFE07F801F001C000F8018000F80180007C0300007C0300003E0600003
+E0600001F0C00001F0C00001F9C00000F9800000FF8000007F0000007F0000003E000000
+3E0000001C0000001C000019147F931C>I<FFE1FF00FFE1FF000F80700007C0E00007E0
+C00003E1800001F3800000FF0000007E0000003E0000003F0000007F8000006F800000C7
+C0000183E0000381F0000701F8000E00FC00FF81FF80FF81FF8019147F931C>120
+D<FFE07F80FFE07F801F001C000F8018000F80180007C0300007C0300003E0600003E060
+0001F0C00001F0C00001F9C00000F9800000FF8000007F0000007F0000003E0000003E00
+00001C0000001C0000001800000018000078300000FC300000FC600000C0E00000E1C000
+007F8000001E000000191D7F931C>I E /Fj 13 119 df<00003FC0000000003FC00000
+00003FC0000000007FE0000000007FE0000000007FE000000000FBF000000000FBF00000
+0000FBF000000001F3F800000001F1F800000001F1F800000003F1FC00000003E1FC0000
+0003E0FC00000007E0FE00000007C0FE00000007C07E0000000FC07F0000000FC07F0000
+000F807F0000001F803F8000001F803F8000001F003F8000003F001FC000003F001FC000
+003E001FC000007E000FE000007E000FE000007C000FE00000FC0007F00000FC0007F000
+00F80007F00001F80003F80001F80003F80001FFFFFFF80003FFFFFFFC0003FFFFFFFC00
+03FFFFFFFC0007FFFFFFFE0007E00000FE0007E00000FE000FC00000FF000FC000007F00
+0FC000007F001F8000003F801F8000003F801F8000003F803F0000001FC03F0000001FC0
+3F0000001FC07E0000000FE07E0000000FE07C0000000FE0FC00000007F02C377EB631>
+65 D<FFFFFC0000FFFFFFC000FFFFFFF000FFFFFFF800FFFFFFFE00FE0007FF00FE0000
+FF80FE00003FC0FE00001FC0FE00000FE0FE00000FE0FE000007E0FE000007F0FE000007
+F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007E0FE00000FE0FE00000FE0
+FE00001FC0FE00003FC0FE0000FF80FE0007FF00FFFFFFFE00FFFFFFF800FFFFFFF000FF
+FFFFC000FFFFFF0000FE003F8000FE003F8000FE001FC000FE001FC000FE000FE000FE00
+07E000FE0007F000FE0003F000FE0003F800FE0001FC00FE0001FC00FE0000FE00FE0000
+FE00FE00007F00FE00007F00FE00003F80FE00003F80FE00001FC0FE00000FC0FE00000F
+E0FE000007F0FE000007F0FE000003F8FE000003F8FE000001FC263779B630>82
+D<000FF800007FFF0001FFFFC003FFFFE007FFFFE00FF00FE01FC001C01F8000C03F0000
+003F0000007E0000007E0000007E000000FC000000FC000000FC000000FC000000FC0000
+00FC000000FC000000FC0000007E0000007E0000007E0000003F0000003F0000201F8000
+E01FC003E00FF00FE007FFFFE003FFFFE001FFFFC0007FFE00000FF0001B227DA121>99
+D<000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001
+F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001
+F8000001F8000001F8000001F8003F81F801FFE1F803FFF9F807FFFFF80FFFFFF81FF81F
+F81FE007F83F8003F83F0001F87F0001F87E0001F87E0001F8FE0001F8FC0001F8FC0001
+F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FE0001F87E0001F87E0001
+F87F0001F83F0003F83F8007F81FC00FF81FF03FF80FFFFFF807FFFDF803FFF9F801FFE1
+F8007F01F81D377DB626>I<001FE000007FF80001FFFE0003FFFF0007FFFF800FF03F80
+1FC01FC01F8007C03F0007E03F0003E07E0003E07E0001F07FFFFFF0FFFFFFF0FFFFFFF0
+FFFFFFF0FFFFFFF0FC000000FC000000FC000000FC0000007C0000007E0000007E000000
+3F0000003F8000001FC000101FE000F00FF807F007FFFFF003FFFFF000FFFFE0007FFF00
+000FF8001C227EA121>I<001F801F0000FFF1FF0001FFFFFF8003FFFFFF8007FFFFFF80
+0FE07F00001FC03F80001F801F80001F801F80003F000FC0003F000FC0003F000FC0003F
+000FC0003F000FC0003F000FC0001F801F80001F801F80001FC03F80000FE07F00000FFF
+FE00000FFFFC00001FFFF800001EFFF000001E1F8000003E000000003E000000003E0000
+00001F000000001FFFFE00001FFFFFC0000FFFFFF0000FFFFFF8001FFFFFFC003FFFFFFC
+007F0003FE007E0000FE00FE00007F00FC00003F00FC00003F00FC00003F00FC00003F00
+FE00007F007F0000FE007F8001FE003FF00FFC001FFFFFF8000FFFFFF00003FFFFC00000
+FFFF0000001FF8000021327EA125>103 D<FEFEFEFEFEFEFE0000000000000000000000
+007E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E7E07
+357CB411>105 D<FC07F800FC3FFE00FC7FFF00FDFFFF80FFFFFFC0FFE07FC0FF801FC0
+FF000FE0FF0007E0FE0007E0FE0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0
+FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0
+FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0
+1B227BA126>110 D<000FF000007FFE0000FFFF0003FFFFC007FFFFE00FF81FF01FE007
+F81F8001F83F0000FC3F0000FC7E00007E7E00007E7C00003EFC00003FFC00003FFC0000
+3FFC00003FFC00003FFC00003FFC00003FFC00003F7E00007E7E00007E7E00007E3F0000
+FC3F8001FC1FC003F81FE007F80FF81FF007FFFFE003FFFFC000FFFF00007FFE00000FF0
+0020227EA125>I<FC03C0FC1FC0FC3FC0FCFFC0FDFFC0FFFC00FFF000FFC000FF8000FF
+0000FF0000FE0000FE0000FE0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC
+0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC
+000012227BA119>114 D<01FF8007FFF01FFFFC3FFFFC3FFFFC7F00F87E0018FC0000FC
+0000FC0000FC0000FE00007F00007FF0003FFF001FFFC00FFFF007FFF801FFFC001FFE00
+01FE00007F00003F00003F00003F40003F60003F78007EFF01FEFFFFFCFFFFFC7FFFF00F
+FFE001FF0018227EA11C>I<FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0
+FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0
+FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0
+FC0007E0FC000FE0FC001FE0FC003FE0FF00FFE07FFFFFE07FFFF7E03FFFE7E01FFF87E0
+0FF807E01B227BA126>117 D<FC00007E7E0000FC7E0000FC7E0000FC3F0001F83F0001
+F83F8001F81F8003F01F8003F01FC003F00FC007E00FC007E00FE007E007E00FC007E00F
+C007F00FC003F01F8003F01F8001F01F0001F83F0001F83F0000F83E0000FC7E0000FC7E
+00007C7C00007C7C00007EFC00003EF800003EF800003EF800001FF000001FF000001FF0
+00000FE0001F227FA122>I E end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 300dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 680 55 a Fj(Avoiding)26 b(Recursion)820 141 y
+Fi(Brian)18 b(Harv)o(ey)590 199 y(Univ)o(ersit)o(y)f(of)g(California,)i
+(Berk)o(eley)91 317 y Fh(It)11 b(is)h(traditional)f(to)g(understand)g
+(a)g(computer)g(program)f(as)h(a)g Fg(se)n(quenc)n(e)i
+Fh(of)d(instructions.)20 b(The)11 b(computer)0 375 y(carries)h(out)g
+(these)h(instructions)g(one)f(after)f(another.)19 b(V)l(arious)12
+b Fg(c)n(ontr)n(ol)h(structur)n(es)j Fh(allo)o(w)c(the)h(programmer)e
+(to)0 433 y(c)o(hange)16 b(the)g(order)g(in)g(whic)o(h)h(these)f
+(instructions)h(are)f(carried)g(out;)g(there)g(are)f(conditional)j
+(structures)e(that)0 491 y(allo)o(w)c(a)g(c)o(hoice)h(b)q(et)o(w)o(een)
+f(subsequences,)i(and)f(lo)q(oping)g(structures)f(that)f(allo)o(w)h
+(the)g(rep)q(etition)i(of)d(a)h(sequence.)91 553 y(In)f(con)o(trast)e
+(to)h(this)h(idea)h(of)e(sequen)o(tial)i(programming)e(there)h(is)g(a)f
+(more)g(recen)o(t)h(mo)q(del)g(called)i Fg(functional)0
+611 y(pr)n(o)n(gr)n(amming)18 b Fh([Bac)o(kus,)c(1978;)f(Allen,)j
+(1984;)d(Ab)q(elson,)i(1985].)k(In)14 b(this)h(approac)o(h,)f(a)g
+(program)f(is)i(view)o(ed)g(as)0 669 y(a)c(collection)j(of)d
+(mathematical)g(functions,)i(whic)o(h)f(can)g(b)q(e)g(applied)h(to)e
+(argumen)o(ts)g(and)h(comp)q(osed)f(with)h(other)0 727
+y(functions)17 b(to)f(create)g(more)g(complicated)h(functions.)24
+b(The)17 b(emphasis)g(is)g(on)f(the)g(input-output)i(b)q(eha)o(vior)e
+(of)0 785 y(a)i(function,)h(rather)e(than)h(on)g(the)g(sequence)i(of)d
+(ev)o(en)o(ts)h(b)o(y)g(whic)o(h)h(the)f(computer)g(determines)h(the)f
+(output)0 843 y(v)m(alue.)i(Programming)10 b(languages)i(suc)o(h)g(as)f
+(LISP)l(,)h(Logo,)g(and)g(APL)g(emphasize)g(the)g(functional)h(mo)q
+(del,)f(while)0 901 y(BASIC,)k(P)o(ascal,)e(and)i(C)f(emphasize)h(the)f
+(sequen)o(tial)i(view.)j(\(This)15 b(division)j(is)d(not)g(absolute;)g
+(an)o(y)g(program)0 960 y(can)f(b)q(e)h(written)f(in)h(an)o(y)e
+(language,)h(more)g(or)f(less.)20 b(But)15 b(eac)o(h)f(language)g
+(encourages)g(a)f(certain)i(natural)f(st)o(yle)0 1018
+y(of)h(programming.\))91 1080 y(In)23 b(this)g(pap)q(er)g(I)g(b)q(egin)
+h(b)o(y)e(arguing)h(that)f(functional)h(programming)f(is)h(not)f(only)i
+(more)e(p)q(o)o(w)o(erful)0 1138 y(tec)o(hnically)d(but)e(also)g(more)g
+(sensible)h(p)q(edagogically)l(,)h(esp)q(ecially)h(when)d(computer)g
+(programming)g(is)g(to)f(b)q(e)0 1196 y(used)j(as)e(a)h(v)o(ehicle)h
+(for)f(teac)o(hing)g(mathematical)g(ideas.)29 b(Wh)o(y)l(,)18
+b(then,)h(is)f(secondary)g(sc)o(ho)q(ol)h(programming)0
+1254 y(done)14 b(almost)f(exclusiv)o(ely)j(in)e(BASIC)g(and)g(P)o
+(ascal?)20 b(Wh)o(y)13 b(not)g(Logo?)19 b(Although)14
+b(there)g(are)f(sev)o(eral)h(answ)o(ers)0 1312 y(to)h(this)h(question,)
+f(I)h(w)o(an)o(t)f(to)f(fo)q(cus)i(atten)o(tion)f(on)g(one)h(tec)o
+(hnical)h(reason:)j(T)l(eac)o(hers)15 b(are)g(put)h(o\013)e(b)o(y)i
+(Logo's)0 1370 y(hea)o(vy)j(reliance)j(on)d(recursion)i(as)e(the)g
+(principal)j(con)o(trol)e(mec)o(hanism.)33 b(I)20 b(shall)h(discuss)g
+(the)e(relationship)0 1428 y(b)q(et)o(w)o(een)e(functional)g
+(programming)f(and)h(recursion,)g(sho)o(w)f(ho)o(w)g(the)h(t)o(w)o(o)e
+(can)i(b)q(e)g(separated,)f(and)h(suggest)0 1486 y(sp)q(eci\014c)g
+(approac)o(hes)e(to)g(sample)g(mathematical)h(programming)e(problems.)
+91 1548 y(Recursion)19 b(is)f(itself)g(an)g(in)o(teresting)g
+(mathematical)g(idea,)g(b)q(ecause)h(of)e(its)g(connection)i(with)f
+(pro)q(of)f(b)o(y)0 1606 y(induction.)30 b(I)19 b(don't)e(mean)h(to)f
+(suggest)h(that)f(mathematics)h(teac)o(hers)g(should)h(wish)f(to)g(a)o
+(v)o(oid)f(recursion)i(in)0 1664 y(ev)o(ery)12 b(situation.)19
+b(Indeed,)14 b(later)f(w)o(e'll)g(consider)g(examples)g(\(e.g.,)e
+(computing)i(the)f(determinan)o(t)h(of)f(a)g(matrix\))0
+1723 y(for)i(whic)o(h)h(the)g(use)f(of)g(recursion)h(is)g(naturally)g
+(connected)h(with)f(the)f(task.)19 b(Logo)14 b(is,)h(of)f(course,)g(an)
+g(excellen)o(t)0 1781 y(v)o(ehicle)j(for)d(the)h(study)f(of)h
+(recursion)g(when)h(that)e(is)h(desired.)21 b(But)15
+b(not)f(ev)o(ery)h(topic)g(is)g(inheren)o(tly)i(recursiv)o(e,)0
+1839 y(and)c(the)g(v)m(alue)h(of)e(functional)i(programming)f(will)h(b)
+q(e)g(enhanced)g(if)f(the)g(issue)h(of)e(recursion)i(can)f(b)q(e)g
+(separated)0 1897 y(from)h(that)h(of)g(functions.)0 2013
+y Fi(Sequen)o(tial)j(and)g(F)l(unctional)i(Programming)91
+2130 y Fh(Consider)c(the)f(problem)h(of)f(adding)h(t)o(w)o(o)d
+(matrices:)666 2199 y Ff(\022)707 2236 y Fh(2)45 b(3)g(4)707
+2291 y(5)g(6)g(7)873 2199 y Ff(\023)917 2263 y Fh(+)962
+2199 y Ff(\022)1010 2236 y Fh(87)62 b(0)57 b(14)1003
+2291 y Fe(\000)p Fh(6)46 b(28)56 b(9)1251 2199 y Ff(\023)0
+2380 y Fh(The)12 b(result)g(is)h(a)e(matrix)h(with)g(the)g(same)g(shap)
+q(e)g(as)g(the)g(t)o(w)o(o)e(addends.)20 b(Eac)o(h)11
+b(elemen)o(t)i(of)f(the)g(result)g(is)g(formed)0 2438
+y(b)o(y)j(adding)i(the)e(corresp)q(onding)h(elemen)o(ts)h(of)e(the)g
+(addends;)h(in)g(sequen)o(tial)h(programming)e(this)h(leads)g(to)e(six)
+0 2496 y(assignmen)o(t)h(instructions,)h(whic)o(h)g(can)f(b)q(e)h
+(arranged)f(in)h(t)o(w)o(o)e(nested)i(lo)q(ops)g(to)e(re\015ect)i(the)f
+(t)o(w)o(o-dimensional)0 2554 y(structure)h(of)g(the)h(matrix.)24
+b(F)l(or)16 b(no)o(w)g(let's)g(ignore)h(the)g(matter)e(of)h(reading)h
+(these)g(particular)g(n)o(um)o(b)q(ers)g(in)o(to)0 2612
+y(the)c(computer,)h(and)f(supp)q(ose)h(w)o(e)f(ha)o(v)o(e)g(t)o(w)o(o)f
+(arra)o(ys)g Fd(A)h Fh(and)g Fd(B)g Fh(con)o(taining)h(the)g(addends.)
+20 b(A)13 b(BASIC)h(program)0 2670 y(to)h(add)g(these)g(matrices)h
+(migh)o(t)f(b)q(e)g(written)h(as)e(follo)o(ws.)964 2779
+y(1)p eop
+%%Page: 2 2
+2 1 bop 0 45 a Fd(10)24 b(DIMENSION)e(A\(2,3\),)h(B\(2,3\),)g(C\(2,3\))
+0 104 y(20)h(FOR)f(I)h(=)f(1)h(TO)g(2)0 162 y(30)71 b(FOR)24
+b(J)f(=)h(1)g(TO)g(3)0 220 y(40)119 b(C\(I,J\))23 b(=)h(A\(I,J\))f(+)h
+(B\(I,J\))0 278 y(50)71 b(NEXT)24 b(J)0 336 y(60)g(NEXT)f(I)0
+394 y(70)h(END)0 474 y Fh(This)c(is)g(a)f(simple)i(enough)e(program.)32
+b(It)19 b(has)g(t)o(w)o(o)f(main)i(w)o(eaknesses.)32
+b(One)20 b(has)g(to)e(do)i(with)f(the)h(use)f(of)0 532
+y(arra)o(ys)h(to)g(represen)o(t)h(the)h(matrices.)37
+b(The)22 b(problem)f(is)h(that)e(the)i(particular)f(dimensions,)j(t)o
+(w)o(o)c(ro)o(ws)g(b)o(y)0 590 y(three)d(columns,)h(m)o(ust)e(b)q(e)i
+(built)g(in)o(to)f(the)g(program,)f(b)q(oth)h(in)g(the)g(arra)o(y)f
+(declarations)h(and)h(in)f(the)g(con)o(trol)0 648 y(structures)f(\(the)
+g Fd(FOR)g Fh(statemen)o(ts\))f(that)g(con)o(trol)i(the)f(sequence)h
+(of)f(ev)o(en)o(ts.)23 b(The)17 b(second)g(w)o(eakness)f(is)h(that)0
+706 y(this)h(program)f(exp)q(ects)i(to)e(\014nd)i(its)f(data)f(in)i
+(\014xed)g(places,)g(the)f(arra)o(ys)f Fd(A)h Fh(and)g
+Fd(B)p Fh(,)f(and)h(lea)o(v)o(es)h(its)f(result)g(in)0
+765 y(a)f(third)g(predetermined)i(lo)q(cation)e Fd(C)p
+Fh(.)g(This)g(is)h(\014ne)f(if)h(w)o(e)e(only)i(w)o(an)o(t)d(to)i
+(compute)g Fc(A)11 b Fh(+)h Fc(B)r Fh(,)17 b(but)g(what)g(if)g(w)o(e)0
+823 y(w)o(an)o(t)f(to)h(solv)o(e)h(a)f(sligh)o(tly)h(di\013eren)o(t)g
+(problem,)g(lik)o(e)h Fc(A)12 b Fh(+)g(2)p Fc(B)r Fh(?)27
+b(What)17 b(if)h(w)o(e)f(w)o(an)o(t)g(to)f(c)o(hec)o(k)i(that)f
+(addition)0 881 y(of)g(matrices)h(is)g(truly)f(comm)o(utativ)o(e,)g(b)o
+(y)h(adding)g(\014rst)f Fc(A)12 b Fh(+)g Fc(B)20 b Fh(and)e(then)g
+Fc(B)c Fh(+)e Fc(A)p Fh(?)28 b(Or,)18 b(ha)o(ving)g(computed)0
+939 y Fc(C)g Fh(as)d(the)g(sum)h(of)f Fc(A)g Fh(and)h
+Fc(B)r Fh(,)f(what)g(if)h(w)o(e)f(w)o(an)o(t)f(to)h(use)h(that)e
+(result)i(as)f(part)g(of)g(a)g(larger)g(computation,)g(lik)o(e)0
+997 y Fc(C)e Fh(+)d Fc(B)r Fh(?)22 b(In)16 b(eac)o(h)f(case)g(w)o(e)g
+(ha)o(v)o(e)g(to)f(rewrite)i(the)f(program.)91 1063 y(A)j(b)q(etter)g
+(in)o(teractiv)o(e)g(system)f(for)g(studen)o(ts)h(to)f(use)h(in)h
+(exploring)g(matrix)e(arithmetic)i(w)o(ould)f(supply)0
+1121 y(functions)e(whose)f(domain)h(and)f(range)g(are)g(matrices.)20
+b(W)l(e)15 b(should)h(b)q(e)g(able)g(to)f(en)o(ter)g(instructions)h
+(lik)o(e)0 1198 y Fd(PRINT)23 b(ADD\(A,B\))0 1256 y(PRINT)g(ADD\(A,)g
+(ADD\(B,B\)\))0 1314 y(LET)g(C)h(=)g(ADD\(A,B\))0 1372
+y(PRINT)f(ADD\(C,B\))0 1430 y(IF)h(ADD\(A,B\))e(=)i(ADD\(B,A\))f(THEN)g
+(PRINT)g("IT'S)h(COMMUTATIVE.")0 1510 y Fh(\(In)18 b(this)g(fanciful)h
+(example)g(I)f(am)g(using)g(the)g(syn)o(tax)f(of)g(BASIC,)h(but)g
+(asking)g(for)g(computations)f(that)g(are)0 1568 y(b)q(ey)o(ond)22
+b(the)g(p)q(o)o(w)o(ers)f(of)g(most)g(v)o(ersions)h(of)f(BASIC.)h(Man)o
+(y)f(v)o(ersions)h(do)g(allo)o(w)g(this)g(sort)f(of)g(functional)0
+1626 y(notation,)14 b(but)i(only)g(for)e(certain)i(functions)g(of)e
+(single)j(n)o(um)o(b)q(ers,)e(not)g(arra)o(y-v)m(alued)g(functions.\))
+91 1692 y(Although)k(functions)g(are)e(one)i(of)e(the)i(cen)o(tral)f
+(ideas)h(of)e(mathematics,)i(they)f(are)g(not)f(limited)j(to)e(the)0
+1750 y(narro)o(w)c(sc)o(ho)q(ol)i(v)o(ersion)f(of)g(mathematics)g(as)g
+(\\stu\013)f(ab)q(out)h(n)o(um)o(b)q(ers.")20 b(Consider)c(the)f
+(functions)0 1827 y(plural\(b)q(o)o(x\))h(=)f(b)q(o)o(xes)0
+1885 y(F)l(renc)o(h\(b)q(o)q(ok\))g(=)h(livre)0 1943
+y(capital\(England\))g(=)g(London)0 2001 y(A)o(tomicW)l(eigh)o(t\(silv)
+o(er\))g(=)f(107.87)0 2081 y(I)i(shall)i(resist)e(the)g(temptation)g
+(to)f(explore)i(p)q(ossible)h(p)q(edagogic)e(uses)h(of)e(functional)j
+(programming)d(in)i(the)0 2139 y(areas)g(suggested)h(b)o(y)g(these)g
+(simple)h(functions.)32 b(A)18 b(serious)i(e\013ort)d(to)i(translate)f
+(English)i(in)o(to)f(F)l(renc)o(h,)h(for)0 2198 y(example,)d(w)o(ould)g
+(need)g(m)o(uc)o(h)g(more)f(sophistication)h(than)g(the)f(w)o
+(ord-for-w)o(ord)f(translation)i(function)g(illus-)0
+2256 y(trated)i(ab)q(o)o(v)o(e.)35 b(The)20 b(p)q(oin)o(t)g(is)h(that)e
+(no)h(matter)f(what)h(a)g(computation)g(is)g(ab)q(out,)h(the)f(abilit)o
+(y)i(to)d(de\014ne,)0 2314 y(in)o(v)o(ok)o(e,)c(and)g(comp)q(ose)g
+(functions)h(is)g(a)f(natural)g(and)h(con)o(v)o(enien)o(t)f(to)q(ol.)91
+2380 y(Computer)h(scien)o(tists)i(are)e(excited)i(ab)q(out)e
+(functional)i(programming)e(for)g(reasons)g(unconnected)j(with)0
+2438 y(p)q(edagogy)l(.)43 b(T)l(o)23 b(a)f(computer)h(scien)o(tist,)i
+(what)e(distinguishes)i(this)e(metho)q(dology)g(from)f(traditional)i
+(ap-)0 2496 y(proac)o(hes)14 b(is)h(that)e(a)h(function)h(has)f(no)g
+(\\side)g(e\013ects.")19 b(That)14 b(is,)g(when)h(a)f(programmer)f
+(asks)g(for)h(the)g(v)m(alue)h(of)0 2554 y Fc(f)5 b Fh(\(7\))14
+b(the)h(v)m(alue)h(returned)f(is)g(alw)o(a)o(ys)f(the)h(same.)20
+b(This)15 b(computation)g(do)q(es)g(not)f(cause)h(a)g(p)q(ermanen)o(t)g
+(c)o(hange)0 2612 y(in)f(the)f(computer's)g(memory)f(that)h(migh)o(t)g
+(a\013ect)f(later)h(computations.)19 b(\(F)l(or)13 b(example,)h(there)f
+(are)g(no)g(assign-)0 2670 y(men)o(ts)h(to)f(global)i(v)m(ariables.\))
+21 b(This)14 b(is)h(imp)q(ortan)o(t)f(for)f(t)o(w)o(o)g(reasons.)19
+b(First,)14 b(it)g(is)h(easier)f(to)g(carry)g(out)f(formal)964
+2779 y(2)p eop
+%%Page: 3 3
+3 2 bop 0 45 a Fh(reasoning)14 b(ab)q(out)g(a)g(program)e(without)i
+(side)h(e\013ects.)k(One)c(branc)o(h)f(of)g(computer)g(science)h(is)g
+(concerned)g(with)0 104 y(program)g Fg(veri\014c)n(ation)s
+Fh(:)h(the)h(attempt)e(to)h(pro)o(vide)h(formal)f(pro)q(of)g(of)g(the)h
+(correctness)f(of)g(a)h(program.)22 b(F)l(unc-)0 162
+y(tional)14 b(programs)f(lend)i(themselv)o(es)g(to)e(this)h(attempt)f
+(more)h(readily)h(than)f(traditional)g(sequen)o(tial)h(programs)0
+220 y(that)20 b(are)g(hea)o(vily)i(dep)q(enden)o(t)g(on)e(long-term)h
+(v)m(ariable)h(assignmen)o(t.)36 b(Second,)22 b(if)f(the)g(computation)
+f(of)g(a)0 278 y(function)15 b(has)g(no)f(side)i(e\013ects,)e(then)h
+(it)f(mak)o(es)g(no)h(di\013erence)h(whic)o(h)f(of)f(t)o(w)o(o)f
+(desired)j(computations)f(is)g(done)0 336 y(\014rst;)i(eac)o(h)g(is)g
+(guaran)o(teed)f(to)g(b)q(e)i(indep)q(enden)o(t)h(of)d(the)h(other.)25
+b(Recen)o(t)17 b(dev)o(elopmen)o(ts)g(in)h(computer)f(hard-)0
+394 y(w)o(are)f(include)k Fg(p)n(ar)n(al)r(lel)h Fh(pro)q(cessors,)c
+(in)h(whic)o(h)g(the)f(t)o(w)o(o)f(computations)h(migh)o(t)g(actually)h
+(tak)o(e)e(place)i(at)f(the)0 452 y(same)c(time.)19 b(F)l(unctional)14
+b(programs)e(can)h(easily)h(tak)o(e)e(adv)m(an)o(tage)g(of)h(this)g
+(parallelism;)j(traditional)d(programs)0 510 y(require)j(detailed)h
+(analysis)f(b)q(efore)f(an)o(y)g(subtask)g(can)g(b)q(e)h(split)g(o\013)
+f(for)f(parallel)j(computation.)91 576 y(F)l(or)c(our)g(p)q(edagogic)h
+(purp)q(oses,)h(ho)o(w)o(ev)o(er,)d(the)i(imp)q(ortan)o(t)f(p)q(oin)o
+(ts)h(ab)q(out)g(functional)g(programming)f(are)0 634
+y(di\013eren)o(t.)22 b(A)15 b(studen)o(t)h(who)f(w)o(an)o(ted)g(to)g
+(use)h(the)g(BASIC)h(instructions)f(sho)o(wn)f(ab)q(o)o(v)o(e)h(to)f
+(add)h(t)o(w)o(o)e(matrices)0 693 y(in)i(a)f(larger)f(program)g(w)o
+(ould)i(ha)o(v)o(e)e(to)h(remem)o(b)q(er)g(that)f(the)h(result)h(is)f
+(in)h(the)f(arra)o(y)f Fd(C)g Fh(and)i(write)f(the)g(rest)f(of)0
+751 y(the)k(program)e(accordingly)l(.)29 b(Tw)o(o)16
+b(suc)o(h)i(addition)h(problems)f(with)g(di\013eren)o(t)g(matrices)g(w)
+o(ould)g(require)g(t)o(w)o(o)0 809 y(copies)g(of)f(the)g(instructions)h
+(or)f(reuse)g(of)g(the)g(same)g(arra)o(ys)f(for)g(di\013eren)o(t)i
+(purp)q(oses.)26 b(A)17 b(function)h(that)f(can)0 867
+y(b)q(e)f(applied)h(to)e(an)o(y)g(t)o(w)o(o)f(matrices,)h(and)g(whose)g
+(return)h(v)m(alue)g(can)g(b)q(e)g(used)f(as)g(part)g(of)g(a)g(larger)g
+(expression)0 925 y(instead)h(of)g(b)q(eing)h(tied)f(to)f(a)h(sp)q
+(eci\014c)h(result)f(arra)o(y)l(,)f(allo)o(ws)h(the)g(studen)o(t)f(to)g
+(think)i(ab)q(out)e(the)h(mathematics)0 983 y(instead)g(of)f(tripping)h
+(o)o(v)o(er)e(the)i(programming)e(language.)0 1104 y
+Fi(First-Class)k(Data)g(Aggregates)91 1224 y Fh(Consider)i(no)o(w)f
+(the)h(problem)g(of)f(en)o(tering)i(the)e(actual)h(matrix)f(v)m(alues)i
+(in)o(to)f(the)f(program.)33 b(In)20 b(most)0 1283 y(programming)14
+b(languages,)g(the)g(facilities)i(for)e(dealing)h(with)g(individual)i
+(n)o(um)o(b)q(ers)e(\(scalars\))e(are)h(m)o(uc)o(h)g(more)0
+1341 y(\015exible)23 b(than)f(the)f(facilities)i(for)e(arra)o(ys.)37
+b(It)21 b(is)h(as)f(if)h(n)o(um)o(b)q(ers)g(are)f(\\real)g(things")g
+(while)i(collections)g(of)0 1399 y(n)o(um)o(b)q(ers)15
+b(are)g(less)h(real.)k(F)l(or)14 b(example,)i(in)f(BASIC)h(or)f(P)o
+(ascal)f(a)h(scalar)g(constan)o(t)f(can)h(b)q(e)h(directly)g(assigned)0
+1457 y(to)f(a)f(v)m(ariable)j(\()p Fd(X)23 b(=)h(3)p
+Fh(\))15 b(or)g(can)g(b)q(e)h(part)e(of)h(a)g(larger)g(expression)h(\()
+p Fd(X)23 b(=)h(Y+3)p Fh(\),)14 b(but)i(y)o(ou)e(can't)h(sa)o(y)0
+1534 y Fd(A)24 b(=)f(2,3,4,5,6,7)0 1614 y Fh(to)c(assign)h(a)f(v)m
+(alue)i(to)e(an)g(en)o(tire)h(arra)o(y)e(at)h(once.)34
+b(Instead,)20 b(getting)g(this)g(v)m(alue)h(in)o(to)e(the)h(computer)f
+(is)h(a)0 1672 y(sequence)c(of)f(ev)o(en)o(ts)g(in)h(itself:)0
+1749 y Fd(10)24 b(DIMENSION)e(A\(2,3\))0 1807 y(20)i(FOR)f(I)h(=)f(1)h
+(TO)g(2)0 1865 y(30)71 b(FOR)24 b(J)f(=)h(1)g(TO)g(3)0
+1924 y(40)119 b(READ)23 b(A\(I,J\))0 1982 y(50)71 b(NEXT)24
+b(J)0 2040 y(60)g(NEXT)f(I)0 2098 y(70)h(DATA)f(2,3,4,5,6,7)0
+2156 y(80)h(END)91 2236 y Fh(Logo's)16 b(list)h(pro)q(cessing)h(mak)o
+(es)e(matrix)h(manipulation)h(m)o(uc)o(h)f(more)f(con)o(v)o(enien)o(t.)
+25 b(F)l(or)17 b(one)g(thing,)g(the)0 2295 y(size)e(of)f(a)g(list)h
+(need)g(not)e(b)q(e)i(declared)g(in)g(adv)m(ance;)g(w)o(e)f(can)g
+(write)h(matrix)e(functions)i(that)f(w)o(ork)f(on)h(matrices)0
+2353 y(of)i(an)o(y)f(size)i(or)e(shap)q(e.)23 b(Also,)16
+b(a)g(list)h(is)f(a)g(\\\014rst-class")f(en)o(tit)o(y:)21
+b(Lik)o(e)c(a)f(n)o(um)o(b)q(er,)g(it)g(can)g(b)q(e)h(used)f(as)g(part)
+f(of)0 2411 y(an)h(expression,)g(as)g(an)g(input)h(to)e(or)h(output)f
+(from)g(a)h(function,)h(as)e(the)h(v)m(alue)h(assigned)g(to)e(a)h(v)m
+(ariable,)h(or)e(as)0 2469 y(something)g(to)g(b)q(e)h(read)f(or)g(prin)
+o(ted.)91 2535 y(W)l(e'll)i(represen)o(t)g(a)f(matrix)g(as)h(a)f(list)h
+(of)f(lists.)25 b(Eac)o(h)17 b(of)f(the)g(sublists)i(will)g(b)q(e)g
+(one)e(ro)o(w)g(of)g(the)h(matrix.)0 2593 y(W)l(e)e(can)h(solv)o(e)f
+(the)g(addition)i(problem)e(p)q(osed)h(ab)q(o)o(v)o(e)f(b)o(y)g
+(assigning)h(matrix)f(v)m(alues)h(to)f(v)m(ariables:)0
+2670 y Fd(MAKE)23 b("A)h([[2)f(3)h(4])g([5)f(6)h(7]])964
+2779 y Fh(3)p eop
+%%Page: 4 4
+4 3 bop 0 45 a Fd(MAKE)23 b("B)h([[87)f(0)h(14])f([-6)h(28)f(9]])0
+104 y(SHOW)g(ADD)h(:A)f(:B)0 177 y Fh(or)15 b(w)o(e)g(can)g(use)g(the)h
+(matrix)f(v)m(alues)h(directly)g(as)f(inputs)h(to)f(the)g(addition)i
+(function:)0 254 y Fd(SHOW)23 b(ADD)h([[2)f(3)h(4])g([5)f(6)h(7]])47
+b([[87)23 b(0)h(14])g([-6)f(28)h(9]])0 327 y Fh(The)13
+b(brac)o(k)o(ets)f(that)g(delimit)i(the)f(sublists)h(mak)o(e)e(the)h(t)
+o(w)o(o-b)o(y-three)f(shap)q(e)h(of)f(the)h(matrix)f(immediately)i
+(clear)0 385 y(to)h(a)f(h)o(uman)i(reader)f(as)g(w)o(ell)h(as)f(to)f
+(the)h(computer)h(program.)0 500 y Fi(Adding)i(Matrices)f(in)h(Logo)91
+614 y Fh(I)12 b(ha)o(v)o(e)g(indicated)h(some)f(of)f(the)h(reasons)f
+(wh)o(y)h(Logo)f(is)i(a)e(go)q(o)q(d)h(language)g(in)h(whic)o(h)f(to)g
+(add)g(matrices,)g(but)0 672 y(I)h(ha)o(v)o(e)g(not)f(y)o(et)h(gotten)f
+(around)h(to)f(writing)h(the)g(actual)g(program.)18 b(I)c(shall)g(no)o
+(w)e(do)h(so,)g(in)g(a)g(traditional)g(Logo)0 730 y(st)o(yle.)25
+b(The)17 b(t)o(w)o(o-dimensional)h(nature)f(of)f(a)h(matrix)f(is)h
+(re\015ected)h(in)g(a)e(t)o(w)o(o-pro)q(cedure)h(program)f(structure.)0
+788 y(The)g(top-lev)o(el)h(pro)q(cedure)g(go)q(es)f(through)g(the)g(t)o
+(w)o(o)f(input)i(matrices)f(ro)o(w)f(b)o(y)h(ro)o(w,)f(adding)i(pairs)f
+(of)g(ro)o(ws)f(to)0 846 y(pro)q(duce)h(a)g(ro)o(w)e(of)h(the)h
+(result.)21 b(The)16 b(subpro)q(cedure)h(that)e(adds)g(a)h(ro)o(w)e
+(has)i(the)f(same)h(general)g(structure;)f(it)0 904 y(go)q(es)i
+(through)h(t)o(w)o(o)e(v)o(ectors)h(\(that's)f(what)h(a)h(ro)o(w)e(of)i
+(a)f(matrix)g(is\))h(elemen)o(t)h(b)o(y)e(elemen)o(t,)i(adding)f(pairs)
+g(of)0 962 y(n)o(um)o(b)q(ers.)0 1039 y Fd(TO)24 b(MATRIX.ADD)e(:M1)i
+(:M2)24 1097 y(IF)f(EMPTYP)g(:M1)h([OUTPUT)f([]])24 1155
+y(OUTPUT)g(FPUT)g(\(VECTOR.ADD)g(FIRST)g(:M1)g(FIRST)g(:M2\))310
+1213 y(\(MATRIX.ADD)g(BUTFIRST)f(:M1)i(BUTFIRST)f(:M2\))0
+1271 y(END)0 1387 y(TO)h(VECTOR.ADD)e(:V1)i(:V2)24 1446
+y(IF)f(EMPTYP)g(:V1)h([OUTPUT)f([]])24 1504 y(OUTPUT)g(FPUT)g(\(SUM)h
+(FIRST)f(:V1)g(FIRST)g(:V2\))310 1562 y(\(VECTOR.ADD)g(BUTFIRST)f(:V1)i
+(BUTFIRST)f(:V2\))0 1620 y(END)0 1693 y Fh(I'v)o(e)f(called)i(the)f
+(top-lev)o(el)g(pro)q(cedure)g Fd(MATRIX.ADD)e Fh(rather)h(than)g(just)
+g Fd(ADD)g Fh(to)g(mak)o(e)f(sure)i(there)f(is)h(no)0
+1751 y(confusion)17 b(ab)q(out)g(whic)o(h)g(is)g(whic)o(h.)24
+b(The)17 b(pro)q(cedure)g Fd(SUM)f Fh(that's)g(used)h(b)o(y)f
+Fd(VECTOR.ADD)f Fh(is)i(Logo's)f(built-in)0 1810 y(addition)g(function)
+g(for)f(scalars.)0 1886 y Fd(?)24 b(SHOW)f(MATRIX.ADD)g([[2)g(3)h(4])f
+([5)h(6)g(7]])47 b([[87)23 b(0)h(14])f([-6)h(28)f(9]])0
+1944 y([[89)g(3)h(18])f([-1)h(34)g(16]])91 2018 y Fh(These)d(pro)q
+(cedures)g(are)g Fg(r)n(e)n(cursive)p Fh(.)35 b(That)20
+b(is,)i(eac)o(h)e(of)h(them)f(includes)j(an)d(in)o(v)o(o)q(cation)h(of)
+g(the)f(same)0 2076 y(function)h(applied)g(to)f(di\013eren)o(t)g
+(inputs.)35 b(De\014ning)21 b(a)e(function)i(in)g(terms)e(of)g(itself)i
+(is)f(a)g(familiar)h(tric)o(k)f(to)0 2134 y(mathematicians:)678
+2265 y Fc(n)p Fh(!)12 b(=)778 2200 y Ff(\032)820 2236
+y Fh(1)259 b(if)15 b Fc(n)e Fh(=)g(0;)820 2291 y Fc(n)d
+Fe(\002)h Fh(\()p Fc(n)f Fe(\000)g Fh(1\)!)45 b(if)15
+b Fc(n)e(>)g Fh(0.)0 2378 y(But)i(mathematicians)h(also)f(kno)o(w)f
+(that)g(it's)h(hard)g(to)g(get)f(studen)o(ts)h(to)g(understand)g(these)
+g(inductiv)o(e)i(de\014ni-)0 2436 y(tions)e(at)g(\014rst.)91
+2496 y(There)k(are)f(man)o(y)h(reasons)f(wh)o(y)g(Logo)h(is)g(not)f
+(widely)j(used)e(in)g(teac)o(hing)h(mathematical)f(topics)g(suc)o(h)0
+2554 y(as)i(matrix)f(arithmetic.)38 b(BASIC)22 b(is)g(p)q(opular)f(b)q
+(ecause)h(it)g(often)e(comes)h(free)g(with)h(p)q(ersonal)f(computers.)0
+2612 y(P)o(ascal)d(is)g(p)q(opular,)h(in)g(the)f(United)h(States,)e(b)q
+(ecause)i(of)f(the)g(Adv)m(anced)h(Placemen)o(t)f(Exam)g(in)g(Computer)
+0 2670 y(Science.)24 b(Logo,)16 b(b)q(ecause)h(of)e(its)i(widespread)g
+(use)f(in)h(elemen)o(tary)f(sc)o(ho)q(ols,)g(has)g(an)g(undeserv)o(ed)h
+(but)f(nearly)964 2779 y(4)p eop
+%%Page: 5 5
+5 4 bop 0 45 a Fh(univ)o(ersal)20 b(reputation)f(as)f(a)g(language)h
+(suitable)h Fg(only)i Fh(for)c(v)o(ery)h(y)o(oung)f(studen)o(ts)h
+(doing)g(trivial)h(problems.)0 104 y(Man)o(y)12 b(p)q(eople)h(b)q
+(eliev)o(e)h(that)e(Logo)g(can)g(only)h(do)f(graphics,)h(lik)o(e)g(a)f
+(pain)o(t)g(program.)18 b(But)12 b(ev)o(en)h(p)q(eople)h(who)e(see)0
+162 y(past)17 b(these)g(misunderstandings)i(often)e(consider)h(Logo)e
+(list)i(pro)q(cessing)g(di\016cult)h(b)q(ecause)f(of)f(the)g(frequen)o
+(t)0 220 y(use)f(of)e(recursion.)91 280 y(Wh)o(y)20 b(is)h(a)f
+(recursiv)o(e)i(de\014nition)g(needed)g(here?)37 b(Later)20
+b(I)h(shall)h(suggest)e(that)g(the)g(use)h(of)f(recursion)0
+338 y(is)i Fg(not)j Fh(truly)d(necessary;)i(b)o(y)d(pro)o(viding)i(a)e
+(larger)g(functional)h(programming)f(\\to)q(olkit")g(w)o(e)g(can)h
+(express)0 396 y(the)e(desired)h(computation)f(without)g(writing)h
+(self-referen)o(tial)h(pro)q(cedures.)35 b(Still,)22
+b(there)f(is)f(a)g(connection)0 455 y(b)q(et)o(w)o(een)14
+b(the)f(functional)i(approac)o(h)e(and)g(the)h(use)g(of)f(recursion.)20
+b(T)l(o)13 b(simplify)i(the)f(discussion,)h(let's)e(consider)0
+513 y(the)j(subpro)q(cedure)i Fd(VECTOR.ADD)p Fh(.)c(The)i(sequen)o
+(tial)h(view)g(of)f(programming)f(w)o(ould)i(express)f(the)g(job)g(of)g
+(this)0 571 y(pro)q(cedure)g(as)f(a)g(sequence)h(of)f(ev)o(en)o(ts,)f
+(one)i(for)e(eac)o(h)i(elemen)o(t)g(of)e(the)i(result)f(v)o(ector:)0
+647 y Fd(LET)23 b(C\(1\))h(=)f(A\(1\))h(+)g(B\(1\))0
+705 y(LET)f(C\(2\))h(=)f(A\(2\))h(+)g(B\(2\))0 763 y(LET)f(C\(3\))h(=)f
+(A\(3\))h(+)g(B\(3\))0 838 y Fh(In)15 b(this)f(illustration)h(I)g(am)e
+(supp)q(osing)i(that)f(w)o(e)f(are)h(adding)h(v)o(ectors)e(of)g(length)
+i(three.)k(Sequen)o(tial)d(program-)0 896 y(ming)j(languages)g
+(generally)h(pro)o(vide)f(a)f(lo)q(oping)i(mec)o(hanism)f(so)f(that)g
+(a)h(string)f(of)g(similar)i(ev)o(en)o(ts)f(can)f(b)q(e)0
+954 y(enco)q(ded)f(without)e(explicit)i(rep)q(etition:)0
+1030 y Fd(FOR)23 b(I=1)h(TO)f(3)0 1088 y(LET)g(C\(I\))h(=)f(A\(I\))h(+)
+g(B\(I\))0 1147 y(NEXT)f(I)0 1221 y Fh(In)18 b(the)g(functional)h
+(programming)e(mo)q(del,)i(w)o(e)e(are)h(trying)g(to)f(get)g(a)o(w)o(a)
+o(y)f(from)h(this)h(idea)h(of)e(a)g(sequence)i(of)0 1279
+y(ev)o(en)o(ts.)k(F)l(or)15 b(one)i(thing,)f(w)o(e)g(ha)o(v)o(e)g(no)g
+(predetermined)i(place,)f(lik)o(e)g(the)f(arra)o(y)f
+Fd(C)h Fh(in)h(the)g(sequen)o(tial)g(v)o(ersion,)0 1337
+y(to)d(put)h(the)f(result.)21 b(Still,)16 b(it's)e(p)q(ossible)i(to)e
+(express)h(the)g(output)f(v)m(alue)i(in)g(terms)e(of)g(comp)q(osition)h
+(of)g(built-in)0 1395 y(functions.)20 b(W)l(e)12 b(m)o(ust)f(use)i(the)
+f(addition)h(function)g Fd(SUM)p Fh(,)e(but)h(also)g(functions)h(that)f
+(select)h(particular)f(elemen)o(ts)0 1453 y(from)i(a)h(v)o(ector)g(or)g
+(com)o(bine)h(elemen)o(ts)f(in)o(to)h(a)e(new)i(v)o(ector:)0
+1530 y Fd(TO)24 b(VECTOR.ADD)e(:V1)i(:V2)24 1588 y(OUTPUT)f(\(LIST)g
+(\(SUM)g(ITEM)h(1)f(:V1)h(ITEM)f(1)h(:V2\))334 1646 y(\(SUM)f(ITEM)h(2)
+f(:V1)h(ITEM)f(2)h(:V2\))334 1704 y(\(SUM)f(ITEM)h(3)f(:V1)h(ITEM)f(3)h
+(:V2\)\))0 1762 y(END)0 1837 y Fh(Again,)13 b(in)g(this)g(illustration)
+h(I)f(am)f(assuming)h(three-elemen)o(t)h(v)o(ectors.)k(I'v)o(e)12
+b(used)i(the)e(built-in)j(function)f Fd(ITEM)0 1895 y
+Fh(to)k(select)h(one)g(elemen)o(t)g(from)f(a)g(v)o(ector)g(and)g(the)h
+(function)g Fd(LIST)f Fh(to)g(com)o(bine)h(sev)o(eral)g(elemen)o(ts)g
+(in)o(to)g(one)0 1953 y(v)o(ector.)f(\(I'v)o(e)13 b(formatted)f(this)i
+(pro)q(cedure)g(to)e(indicate)j(the)e(groupings)h(clearly)g(but)f(in)h
+(most)f(micro)q(computer)0 2011 y(v)o(ersions)i(of)g(Logo)g(the)g
+Fd(OUTPUT)f Fh(instruction)j(m)o(ust)d(b)q(e)i(en)o(tered)g(as)e(a)h
+(single,)h(long)g(line.\))91 2071 y(The)f(di\016cult)o(y)g(comes)g(in)g
+(generalizing)h(this)f(de\014nition)h(to)e(w)o(ork)g(with)g(v)o(ectors)
+g(of)g(an)o(y)g(length.)20 b(F)l(ormal)0 2129 y(mathematical)15
+b(notation)g(has)g(no)g(trouble)h(with)467 2249 y(\()p
+Fc(a)509 2256 y Fb(1)529 2249 y Fc(;)8 b(a)574 2256 y
+Fb(2)594 2249 y Fc(;)g(a)639 2256 y Fb(3)658 2249 y Fh(\))i(+)h(\()p
+Fc(b)770 2256 y Fb(1)789 2249 y Fc(;)d(b)830 2256 y Fb(2)849
+2249 y Fc(;)g(b)890 2256 y Fb(3)909 2249 y Fh(\))13 b(=)g(\()p
+Fc(a)1030 2256 y Fb(1)1060 2249 y Fh(+)d Fc(b)1125 2256
+y Fb(1)1145 2249 y Fc(;)e(a)1190 2256 y Fb(2)1220 2249
+y Fh(+)i Fc(b)1285 2256 y Fb(2)1305 2249 y Fc(;)e(a)1350
+2256 y Fb(3)1380 2249 y Fh(+)i Fc(b)1445 2256 y Fb(3)1465
+2249 y Fh(\))0 2342 y(but)15 b(when)h(w)o(e)f(w)o(an)o(t)f(to)h
+(generalize)h(w)o(e)f(m)o(ust)g(resort)f(to)h(ellipses:)479
+2461 y(\()p Fc(a)521 2468 y Fb(1)542 2461 y Fc(;)8 b(:)g(:)g(:)t(;)g(a)
+667 2468 y Fa(n)691 2461 y Fh(\))i(+)h(\()p Fc(b)803
+2468 y Fb(1)822 2461 y Fc(;)d(:)g(:)g(:)d(;)j(b)944 2468
+y Fa(n)967 2461 y Fh(\))13 b(=)g(\()p Fc(a)1088 2468
+y Fb(1)1118 2461 y Fh(+)d Fc(b)1183 2468 y Fb(1)1203
+2461 y Fc(;)e(:)g(:)g(:)d(;)j(a)1329 2468 y Fa(n)1363
+2461 y Fh(+)j Fc(b)1429 2468 y Fa(n)1453 2461 y Fh(\))0
+2554 y(This)16 b(notation)g(is)g(ok)m(a)o(y)f(on)h(pap)q(er)g(but)g
+(not)g(quite)g(what)f(w)o(e)h(w)o(an)o(t)e(for)i(a)f(computer)h
+(program.)k(The)c(mathe-)0 2612 y(matician's)e(solution)g(is)g(an)f
+(inductiv)o(e)j(de\014nition:)21 b(Imagine)14 b(that)f(w)o(e)g(kno)o(w)
+g(ho)o(w)g(to)g(add)g Fc(n)p Fh(-elemen)o(t)i(v)o(ectors,)0
+2670 y(and)20 b(use)g(that)f(to)g(de\014ne)i(addition)g(of)e(v)o
+(ectors)g(with)h Fc(n)13 b Fh(+)h(1)19 b(elemen)o(ts.)34
+b(T)l(o)20 b(do)g(this)g(w)o(e)f(need)i(a)e(function)964
+2779 y(5)p eop
+%%Page: 6 6
+6 5 bop 0 45 a Fh(\\adjoin")16 b(that)g(tak)o(es)f(a)h(n)o(um)o(b)q(er)
+h(and)g(a)f(v)o(ector)f(as)h(inputs,)i(giving)f(as)f(its)g(output)g(a)h
+(sligh)o(tly)g(longer)g(v)o(ector)0 104 y(including)h(the)d(new)h(n)o
+(um)o(b)q(er.)k(Then)c(w)o(e)f(can)g(sa)o(y)456 226 y(adjoin\()p
+Fc(a)620 233 y Fb(0)640 226 y Fc(;)8 b Fi(a)p Fh(\))i(+)g(adjoin\()p
+Fc(b)919 233 y Fb(0)939 226 y Fc(;)e Fi(b)p Fh(\))k(=)h(adjoin\()p
+Fc(a)1231 233 y Fb(0)1261 226 y Fh(+)e Fc(b)1327 233
+y Fb(0)1347 226 y Fc(;)d Fi(a)h Fh(+)i Fi(b)p Fh(\))0
+323 y(The)16 b(Logo)f(equiv)m(alen)o(t)i(of)e(adjoin)h(is)g(called)h
+Fd(FPUT)p Fh(,)e(for)f(\\\014rst)h(put.")21 b(It)15 b(tak)o(es)g(t)o(w)
+o(o)f(inputs.)22 b(The)16 b(\014rst)f(can)g(b)q(e)0 381
+y(an)o(ything,)f(but)g(the)h(second)f(m)o(ust)g(b)q(e)h(a)e(list.)21
+b(The)14 b(output)g(is)h(a)f(new)g(list)h(consisting)g(of)f(the)g(old)g
+(list)h(with)g(the)0 439 y(new)f(thing)h(put)f(in)h(fron)o(t.)j(T)l
+(aking)c(apart)f(a)h(v)o(ector)f(is)i(accomplished)h(with)e(the)g
+(functions)h Fd(FIRST)p Fh(,)d(to)i(extract)0 497 y(the)k(\014rst)g
+(elemen)o(t)i(of)e(a)g(list,)h(and)g Fd(BUTFIRST)p Fh(,)e(whose)h
+(output)g(is)h(a)f(list)h(equal)g(to)f(its)h(input)g(with)g(the)f
+(\014rst)0 555 y(elemen)o(t)e(remo)o(v)o(ed.)91 618 y(The)g(recursiv)o
+(e)h(de\014nition)h(of)e Fd(VECTOR.ADD)p Fh(,)e(then,)i(expresses)h
+(the)f(sum)g(of)g(its)g(input)h(v)o(ectors)f(in)h(terms)0
+676 y(of)i(the)g(sum)g(of)g(t)o(w)o(o)f(smaller)i(v)o(ectors,)f(namely)
+g(the)h Fd(BUTFIRST)p Fh(s)e(of)g(the)i(inputs,)g(with)g(one)f(extra)g
+(n)o(um)o(b)q(er)0 734 y(adjoined,)12 b(namely)g(the)f(ordinary)g(n)o
+(umeric)h(sum)f(of)f(the)h Fd(FIRST)g Fh(elemen)o(ts)g(of)g(eac)o(h)g
+(v)o(ector.)18 b(Lik)o(e)12 b(an)o(y)e(inductiv)o(e)0
+792 y(de\014nition,)18 b(it)f(needs)g(a)f(base)h(case.)24
+b(This)17 b(one)f(sa)o(ys)g(that)g(the)g(sum)h(of)f(t)o(w)o(o)f
+(zero-length)i(\(empt)o(y\))f(v)o(ectors)f(is)0 850 y(the)i(empt)o(y)f
+(v)o(ector.)22 b(The)17 b(analysis)g(of)f Fd(MATRIX.ADD)f
+Fh(is)i(similar,)h(except)f(that)e(a)h(matrix)g(is)h(a)g(list)g(of)f(v)
+o(ectors)0 909 y(rather)f(than)g(a)g(list)h(of)e(n)o(um)o(b)q(ers.)0
+1026 y Fi(Wh)o(y)j(Is)g(Recursion)g(Hard?)91 1144 y Fh(There)12
+b(are)g(sev)o(eral)h(asp)q(ects)f(to)g(the)g(di\016cult)o(y)i(that)d
+(studen)o(ts)h(ha)o(v)o(e)g(in)h(coming)g(to)e(understand)i(recursiv)o
+(e)0 1202 y(programming)i(st)o(yle.)23 b(One)17 b(of)e(these)h(is)h
+(also)f(found)g(in)h(learning)g(to)f(accept)g(inductiv)o(e)i(pro)q
+(ofs:)d(the)h(sense)g(of)0 1260 y(unfairness)d(in)h(an)o(y)e
+(self-referen)o(tial)i(de\014nition.)21 b(\\Y)l(ou're)12
+b(assuming)h(what)f(y)o(ou're)g(supp)q(osed)h(to)f(b)q(e)i(pro)o
+(ving!")0 1318 y(But)h(in)h(some)f(w)o(a)o(ys)f(the)i(di\016cult)o(y)g
+(is)g(greater)e(in)i(the)f(case)h(of)e(programming.)91
+1382 y(An)19 b(inductiv)o(e)i(pro)q(of)e(can)h(b)q(e)g(presen)o(ted)f
+(\\ground)g(up.")33 b(W)l(e)19 b(sho)o(w)g(explicitly)j(that)c(the)h
+(theorem)g(is)0 1440 y(true)d(for)g Fc(n)e Fh(=)h(1.)23
+b(Then,)16 b(b)o(y)h(the)f(inductiv)o(e)i(step,)e(w)o(e)g(can)g(see)h
+(that)f(it)g(m)o(ust)g(b)q(e)h(true)f(for)f Fc(n)g Fh(=)g(2.)22
+b(Then,)17 b(b)o(y)0 1498 y(induction)f(again,)e(it)g(m)o(ust)f(also)h
+(b)q(e)h(true)f(for)f Fc(n)g Fh(=)g(3.)19 b(The)14 b(adv)m(an)o(tage)g
+(of)f(this)i(p)q(ersp)q(ectiv)o(e)g(is)g(that)e(eac)o(h)h(step)0
+1556 y(is)h(tak)o(en)f(from)g(a)g(\014rm)h(fo)q(oting,)f(with)h
+(nothing)g(hanging)g(in)h(the)e(air.)20 b(That)14 b(is,)h(b)o(y)f(the)h
+(time)g(w)o(e)f(consider)i(the)0 1614 y(case)f Fc(n)e
+Fh(=)g(3)i(w)o(e)g(are)g(completely)h(satis\014ed)g(that)f(the)g
+(theorem)g(has)g(b)q(een)h(demonstrated)f(for)f Fc(n)f
+Fh(=)g(2.)91 1677 y(By)19 b(con)o(trast,)f(in)i(the)f(programming)f
+(con)o(text)h(the)g(more)f(usual)i(situation)g(is)f(that)f(w)o(e)h(ha)o
+(v)o(e)g(to)f(w)o(ork)0 1735 y(bac)o(kw)o(ards.)h(F)l(or)13
+b(example,)h(w)o(e)g(are)f(presen)o(ted)i(with)f(a)f(pair)i(of)e
+(three-elemen)o(t)i(v)o(ectors)e(to)g(add.)20 b(That)13
+b(is)h(our)0 1793 y(starting)i(p)q(oin)o(t.)23 b(W)l(e)16
+b(then)h(sa)o(y)l(,)e(\\w)o(e)h(could)h(do)f(this)h(if)f(w)o(e)g(knew)h
+(ho)o(w)e(to)h(add)g(t)o(w)o(o-elemen)o(t)g(v)o(ectors.")22
+b(The)0 1852 y(initial)16 b(problem)e(m)o(ust)f(b)q(e)i(susp)q(ended)g
+(while)h(w)o(e)d(consider)i(this)f(subproblem.)21 b(By)13
+b(the)h(time)g(w)o(e)g(get)f(do)o(wn)h(to)0 1910 y(the)g(base)h(case)f
+(there)g(are)g(three)h(suc)o(h)f(susp)q(ended)i(problems.)k(This)15
+b(state)f(of)f(a\013airs)h(is)h(a)f(c)o(hallenge)i(not)d(only)0
+1968 y(to)g(our)h(faith)f(but)h(to)f(our)h(memory)l(.)19
+b(It)14 b(is)g(v)o(ery)f(easy)h(to)f(lose)h(the)g(thread)f(of)h(con)o
+(texts)f(in)h(whic)o(h)h(subproblems)0 2026 y(arose.)27
+b(The)18 b(di\013erence)h(b)q(et)o(w)o(een)f(the)g(pro)q(of)f(and)h
+(the)g(program)f(arises)h(b)q(ecause)h(in)f(the)g(pro)q(of)f(w)o(e)h
+(are)f(not)0 2084 y(sp)q(eci\014cally)f(concerned)e(with)g(an)o(y)f
+(concrete)g(example;)i(the)e(goal)g(is)h(a)f(general)h(truth,)e(and)i
+(it)f(mak)o(es)g(as)g(m)o(uc)o(h)0 2142 y(sense)19 b(to)f(start)f
+(small)i(as)f(not.)29 b(But)18 b(w)o(e)g(wrote)g(the)g(program)g(b)q
+(ecause)h(w)o(e)f(w)o(an)o(ted)g(to)g(solv)o(e)g(a)g(particular)0
+2200 y(problem,)e(and)f(most)f(often)h(not)g(a)g(trivial)h(base-case)g
+(problem.)91 2263 y(F)l(or)21 b(teac)o(hing)i(purp)q(oses,)h(it)e(is)g
+(p)q(ossible)i(to)e(in)o(tro)q(duce)h(recursion)f(from)g(the)g(ground)g
+(up.)41 b(W)l(e)22 b(can)0 2321 y(in)o(tro)q(duce)15
+b(a)f(general)h(problem,)g(then)g(decide)h(to)e(start)f(b)o(y)h
+(solving)h(the)g(simplest)g(p)q(ossible)h(case.)k(This)15
+b(is)g(the)0 2380 y(metho)q(d)e(I)f(prefer)h(in)g(m)o(y)f(o)o(wn)g
+(teac)o(hing.)20 b(The)12 b(adv)m(an)o(tage)g(is)h(that)f(it)h(a)o(v)o
+(oids)f(the)g(sense)h(of)f(hanging)h(in)g(midair,)0 2438
+y(but)i(there)g(are)g(t)o(w)o(o)f(costs.)19 b(First,)14
+b(it)i(means)f(that)f(the)h(use)h(of)e(recursion)i(can't)f(b)q(e)g
+(motiv)m(ated)h(b)o(y)f(a)f(problem)0 2496 y(that)h(really)i(arises)f
+(in)h(class;)f(suc)o(h)g(problems)g(w)o(on't)f(b)q(e)i(so)e(simple.)23
+b(Second,)17 b(although)f(the)g(studen)o(ts)f(don't)0
+2554 y(feel)e(strained,)g(they)f(do)g(feel)h(fo)q(olish)g(during)g(the)
+f(b)q(eginning)i(stages)d(of)h(the)g(explanation.)20
+b(The)12 b(recursiv)o(e)h(st)o(yle)0 2612 y(seems)k(lik)o(e)i(an)e(o)o
+(v)o(erly)g(complicated)i(approac)o(h)e(to)f(suc)o(h)i(simple)h
+(problems.)27 b(Then)17 b(the)h(more)f(complicated)0
+2670 y(cases)e(can)g(feel)i(lik)o(e)f(rabbits)f(suddenly)i(pulled)h
+(from)c(a)h(hat.)964 2779 y(6)p eop
+%%Page: 7 7
+7 6 bop 91 45 a Fh(Another)12 b(problem)g(in)h(learning)g(recursion)g
+(is)f(faced)h(b)o(y)e(studen)o(ts)h(who)g(ha)o(v)o(e)f(previous)i(exp)q
+(erience)h(in)f(the)0 104 y(sequen)o(tial)k(programming)f(st)o(yle.)22
+b(They)17 b(are)e(strongly)h(tempted)g(to)g(in)o(terpret)g(the)g
+(recursiv)o(e)h(in)o(v)o(o)q(cation)f(as)0 162 y(a)e(lo)q(op,)g(an)g
+(instruction)h(to)f(\\do)f(it)i(again.")k(That)14 b(in)o(terpretation)g
+(can)g(sometimes)g(w)o(ork)f(for)h(recursiv)o(e)g(Logo)0
+220 y(commands)j(\(programs)g(with)h(side-e\013ect)g(instructions\),)h
+(but)e(is)i(almost)e(nev)o(er)h(appropriate)f(for)g(recursiv)o(e)0
+278 y(op)q(erations)h(\(functions)h(that)e(return)h(v)m(alues,)i(lik)o
+(e)f Fd(VECTOR.ADD)p Fh(\).)d(The)i(actual)g(sequence)i(of)d(ev)o(en)o
+(ts)h(in)h(the)0 336 y(computer)14 b(is)g(not)f(what)g(these)h(studen)o
+(ts)f(w)o(ould)h(predict,)h(in)f(whic)o(h)h(the)f(\014rst)f(in)o(v)o(o)
+q(cation)h(computes)g(the)f(\014rst)0 394 y(elemen)o(t,)19
+b(then)f(the)g(second)g(tak)o(es)f(o)o(v)o(er.)27 b(It)18
+b(w)o(ould)g(b)q(e)h(more)e(nearly)i(accurate)e(to)h(sa)o(y)f(that)g
+(the)h(sequence)0 452 y(happ)q(ens)h(bac)o(kw)o(ards;)e(the)h(\014rst)f
+(in)o(v)o(o)q(cation)i(can't)e(do)g(its)h(job)g(un)o(til)g(the)g
+(second)g(is)h(complete,)f(and)g(so)f(on.)0 510 y(So)e(it)h(is)f(the)h
+Fg(last)j Fh(in)o(v)o(o)q(cation,)c(the)g(one)h(for)e(the)h(base)h
+(case,)e(that)h(really)h(happ)q(ens)g(\014rst!)91 591
+y(A)c(problem)g(related)h(to)e(the)h(\\do)f(it)h(again")g
+(misunderstanding)i(concerns)e(the)g(nature)g(of)f(lo)q(cal)i(v)m
+(ariables.)0 649 y(In)h(a)g(lo)q(op,)g(suc)o(h)g(as)g(the)f
+Fd(FOR)p Fh({)p Fd(NEXT)g Fh(examples)h(seen)h(earlier,)f(there)g(is)h
+(one)e(single)j(lo)q(op)e(v)m(ariable)h(whose)f(v)m(alue)0
+707 y(k)o(eeps)j(c)o(hanging.)25 b(In)18 b(a)e(recursiv)o(e)i(pro)q
+(cedure,)f(the)g(relev)m(an)o(t)h(v)m(ariable)g(names)f(\(the)f(pro)q
+(cedure)i(inputs,)g(lik)o(e)0 765 y Fd(V1)d Fh(and)g
+Fd(V2)p Fh(\))g(do)g(not)g(corresp)q(ond)g(to)g(a)g(single)h(b)q(o)o(x)
+g(in)o(to)f(whic)o(h)h(c)o(hanging)g(v)m(alues)g(are)f(placed.)21
+b(Rather,)15 b(eac)o(h)0 823 y(in)o(v)o(o)q(cation)i(of)f(the)g(pro)q
+(cedure)h(creates)f(a)g(new)h(set)f(of)g(v)m(ariables.)24
+b(Sev)o(eral)17 b(suc)o(h)g(v)m(ariables)g(can)g(exist)f(at)g(the)0
+881 y(same)g(time.)24 b(Studen)o(ts)16 b(ha)o(v)o(e)g(to)g(w)o(ork)g
+(out)g(ho)o(w)g(the)g(program)f(decides)j(whic)o(h)f(v)m(ariable)h(to)e
+(use)h(when)g(suc)o(h)0 939 y(a)e(name)g(app)q(ears)g(in)h(an)g
+(instruction.)0 1074 y Fi(F)l(unctional)j(Programming)e(Without)i
+(Recursion)91 1209 y Fh(One)g(language)f(sp)q(eci\014cally)j(designed)e
+(for)e(matrix)h(manipulation)h(is)g(APL.)f(T)l(o)f(add)i(t)o(w)o(o)d
+(matrices)i(in)0 1267 y(APL,)e(w)o(e)g(can)g(simply)i(use)e(the)h
+(built-in)h Fd(+)e Fh(op)q(eration.)23 b(Addition)18
+b(in)f(APL)g(is)f(de\014ned)i(to)e(w)o(ork)f(for)g(scalars,)0
+1325 y(v)o(ectors,)k(matrices,)g(or)f(higher-dimensional)k(arra)o(ys.)
+30 b(The)19 b(APL)g(programmer)f(a)o(v)o(oids)h(b)q(oth)g(lo)q(oping)h
+(and)0 1383 y(recursion.)37 b(\(Of)21 b(course)g(there)g(is)g(some)g
+(kind)g(of)g(rep)q(etition)h(going)f(on)f(b)q(ehind)j(the)e(scenes,)h
+(if)g(the)f(APL)0 1441 y(program)13 b(is)i(running)g(on)f(a)g(con)o(v)o
+(en)o(tional)h(computer)f(that)g(can)g(only)h(p)q(erform)f(one)g
+(arithmetic)h(op)q(eration)g(at)0 1499 y(a)j(time.)28
+b(But)18 b(this)h(rep)q(etition)g(is)f(in)o(visible)j(to)d(the)g
+(programmer,)f(just)g(as)h(ev)o(ery)g(language)g(mak)o(es)g(certain)0
+1557 y(details)e(in)o(visible.\))91 1638 y(APL)h(encourages)f(a)h
+(functional)g(programming)f(st)o(yle.)24 b(The)17 b(addition)g(op)q
+(erator)f(is)h(a)f(function;)i(it)f(can)0 1696 y(b)q(e)i(comp)q(osed)g
+(with)f(other)g(functions)h(to)f(build)i(new,)f(more)e(complex)j
+(functions.)29 b(Because)19 b(the)g(primitiv)o(e)0 1754
+y(functions)g(all)h(w)o(ork)d(on)h(arra)o(ys)f(as)h(w)o(ell)i(as)e
+(scalars,)h(man)o(y)f(problems)h(can)f(b)q(e)h(solv)o(ed)g(using)g
+(\\one-liners,")0 1812 y(programs)e(with)h(no)g(visible)j(con)o(trol)c
+(structures)h(at)f(all.)30 b(There)18 b(is)h(no)f(lo)q(oping)h
+(construct)f(in)h(APL.)f(When)0 1870 y(a)d(con)o(trol)g(mec)o(hanism)g
+(is)h(needed,)g(the)f(APL)g(programmer)f(can)h(c)o(ho)q(ose)g(b)q(et)o
+(w)o(een)h(t)o(w)o(o)e(extremes,)g(Logo-lik)o(e)0 1928
+y(recursion)i(and)g(an)f(unstructured)h(\\goto")e(op)q(eration.)21
+b(But)16 b(man)o(y)f(mathematical)h(problems)g(can)f(b)q(e)i(solv)o(ed)
+0 1986 y(without)e(raising)h(the)f(issue)h(of)f(con)o(trol,)g(whic)o(h)
+h(is)f(adv)m(an)o(tageous)g(for)g(a)f(math)h(teac)o(her.)91
+2067 y(Unfortunately)l(,)20 b(APL)g(is)g(not)f(widely)i(a)o(v)m
+(ailable.)34 b(The)20 b(largest)f(obstacle)g(is)h(that)f(it)h(uses)f(a)
+g(notation)0 2125 y(v)o(ery)14 b(close)i(to)e(that)g(of)g(ordinary)h
+(mathematics,)f(full)j(of)d(Greek)g(letters)h(and)g(other)g(strange)f
+(sym)o(b)q(ols.)20 b(These)0 2183 y(are)d(not)h(part)f(of)g(the)h
+(standard)f(computer)g(c)o(haracter)g(set,)h(and)g(sp)q(ecial)h(hardw)o
+(are)e(is)h(required)h(to)e(displa)o(y)0 2241 y(them.)29
+b(\(Indeed,)20 b(there)f(aren't)e(enough)i(k)o(eys)f(ev)o(en)h(on)f
+(the)g(APL)h(k)o(eyb)q(oard.)29 b(Some)19 b(sym)o(b)q(ols)f(are)g
+(formed)0 2299 y(b)o(y)d(o)o(v)o(erprin)o(ting)g(t)o(w)o(o)f(other)g
+(sym)o(b)q(ols.)20 b(This)c(approac)o(h)f(w)o(as)f(designed)i(for)f
+(hardcop)o(y)g(computer)g(terminals,)0 2357 y(whic)o(h)i(bac)o(kspace)g
+(and)f(o)o(v)o(erprin)o(t)g(naturally)l(.)25 b(It)16
+b(isn't)h(suitable)g(for)f(most)g(curren)o(t)g(displa)o(y)h(devices,)h
+(whic)o(h)0 2415 y(allo)o(w)d(only)h(one)g(c)o(haracter)e(in)i(an)o(y)f
+(screen)h(p)q(osition.\))91 2496 y(Can)h(w)o(e)h(use,)g(in)h(Logo,)e
+(the)h(APL)g(idea)g(of)g(op)q(erating)g(on)f(a)h(v)o(ector)f(or)g
+(matrix)g(\\all)h(at)g(once,")g(rather)0 2554 y(than)12
+b(explicitly)j(manipulating)e(eac)o(h)g(elemen)o(t)f(individual)q(ly?)
+23 b(T)l(o)q(ols)12 b(for)g(this)g(programming)g(metaphor)f(ha)o(v)o(e)
+0 2612 y(long)17 b(b)q(een)h(part)e(of)h(LISP)l(,)h(Logo's)e(paren)o(t)
+g(language.)25 b(It)17 b(is)h(an)e(easy)h(matter)f(to)g(extend)i(Logo)e
+(\(b)o(y)g(writing)0 2670 y(pro)q(cedures)g(in)g(Logo)f(and)g(loading)h
+(them)f(for)g(studen)o(ts\))g(with)g(suc)o(h)h(to)q(ols.)964
+2779 y(7)p eop
+%%Page: 8 8
+8 7 bop 0 45 a Fi(Av)o(oiding)17 b(Recursion)h(in)g(Logo)91
+176 y Fh(Let)d(me)h(b)q(egin)g(b)o(y)f(de\014ning)i(a)e(few)g(simple)i
+(arithmetic)e(pro)q(cedures.)0 254 y Fd(TO)24 b(SQUARE)f(:X)24
+312 y(OUTPUT)g(:X)g(*)h(:X)0 370 y(END)0 486 y(TO)g(NEXT)f(:X)24
+544 y(OUTPUT)g(:X)g(+)h(1)0 602 y(END)0 718 y(TO)g(DOUBLE)f(:X)24
+777 y(OUTPUT)g(:X)g(*)h(2)0 835 y(END)0 926 y Fh(No)o(w)15
+b(consider)h(these)f(in)o(teractions)h(with)f(Logo:)0
+1003 y Fd(?)24 b(SHOW)f(MAP)g("SQUARE)g([2)h(3)g(4)f(5])0
+1062 y([4)h(9)f(16)h(25])0 1120 y(?)g(SHOW)f(MAP)g("NEXT)h([7)f(8)h(9])
+0 1178 y([8)g(9)f(10])0 1236 y(?)h(SHOW)f(MAP)g("DOUBLE)g([5)h(3)g(20)f
+(6)h(1])0 1294 y([10)f(6)h(40)g(12)f(2])0 1385 y Fh(The)18
+b(pro)q(cedures)g Fd(SQUARE)f Fh(and)g(so)g(on)h(are)f(de\014ned)h(to)f
+(op)q(erate)h(on)f(scalars.)26 b(The)18 b(general)g(to)q(ol)f(called)i
+Fd(MAP)0 1443 y Fh(allo)o(ws)c(these)h(functions)g(to)e(w)o(ork)h(on)g
+(v)o(ectors,)f(b)o(y)h(arranging)g(to)f(apply)i(a)f(function)h(to)f
+(eac)o(h)g(elemen)o(t)h(of)f(the)0 1501 y(v)o(ector.)k(The)c(output)f
+(from)g Fd(MAP)g Fh(is)i(another)e(v)o(ector)g(with)h(the)f(same)h(n)o
+(um)o(b)q(er)g(of)f(elemen)o(ts,)h(but)g(with)g(v)m(alues)0
+1559 y(computed)h(b)o(y)f(the)g(function)h(b)q(eing)h(mapp)q(ed.)91
+1635 y(Logo)c(is)g(an)g(extensible)i(language.)k(This)14
+b(means)f(that)f(a)h(user-de\014ned)i(pro)q(cedure)f(is)f(in)o(v)o(ok)o
+(ed)h(in)g(exactly)0 1693 y(the)22 b(same)f(w)o(a)o(y)f(as)h(a)h
+(primitiv)o(e)g(pro)q(cedure.)40 b Fd(MAP)21 b Fh(happ)q(ens)i(not)e
+(to)g(b)q(e)h(a)f(Logo)g(primitiv)o(e,)j(but)e(if)g(it)f(is)0
+1751 y(included)d(in)e(a)f(startup)g(\014le)h(it)g(can)f(b)q(e)h
+(presen)o(ted)g(to)f(studen)o(ts)g(just)g(as)g(if)h(it)f(w)o(ere)g(a)g
+(primitiv)o(e.)22 b(Its)15 b(purp)q(ose)0 1809 y(is)i(immediately)h
+(clear,)f(and)g(should)h(presen)o(t)e(no)h(conceptual)g(problems)h(to)e
+(studen)o(ts.)23 b(The)17 b(same)f(idea)i(can)0 1868
+y(b)q(e)e(extended)g(to)f(functions)h(of)e(t)o(w)o(o)g(inputs:)0
+1945 y Fd(?)24 b(SHOW)f(MAP.2)g("SUM)h([1)f(2)h(3])f([40)h(50)f(60])0
+2003 y([41)g(52)h(63])0 2062 y(?)g(SHOW)f(MAP.2)g("PRODUCT)g([5)h(6])f
+([7)h(8])0 2120 y([35)f(48])0 2178 y(?)h(SHOW)f(MAP.2)g("EQUALP)g([1)h
+(4)f(6)h(7])g([30)f(4)h(5)g(9])0 2236 y([FALSE)f(TRUE)g(FALSE)h(FALSE])
+0 2327 y(MAP.2)18 b Fh(requires)h(three)f(inputs,)h(a)f(function)h(and)
+g(t)o(w)o(o)e(lists.)29 b(The)19 b(t)o(w)o(o)e(lists)i(m)o(ust)f(ha)o
+(v)o(e)f(the)i(same)f(length,)0 2385 y(and)d(the)h(output)f(will)i(ha)o
+(v)o(e)d(that)h(length)h(also.)91 2461 y(W)l(e)f(are)g(no)o(w)g(in)h(a)
+f(p)q(osition)h(to)e(return)i(to)e(the)h(problem)h(of)f(matrix)g
+(addition)h(with)g(whic)o(h)g(w)o(e)f(b)q(egan:)0 2539
+y Fd(TO)24 b(MATRIX.ADD)e(:M1)i(:M2)24 2597 y(OUTPUT)f(MAP.2)g
+("VECTOR.ADD)f(:M1)i(:M2)0 2655 y(END)964 2779 y Fh(8)p
+eop
+%%Page: 9 9
+9 8 bop 0 45 a Fd(TO)24 b(VECTOR.ADD)e(:V1)i(:V2)24 104
+y(OUTPUT)f(MAP.2)g("SUM)g(:V1)h(:V2)0 162 y(END)0 240
+y Fh(That's)19 b(it!)35 b(I)21 b(\014nd)f(this)h(v)o(ersion)f(simpler)i
+(than)e(the)g(original)h(BASIC)g(program)e(with)i(nested)f
+Fd(FOR)g Fh(lo)q(ops.)0 298 y(There)14 b(are)g(no)g(auxiliary)h(v)m
+(ariables)g Fd(I)f Fh(and)g Fd(J)p Fh(;)f(there)h(is)h(no)f(need)g(to)g
+(build)i(the)e(size)h(or)e(shap)q(e)h(of)g(the)g(matrices)0
+356 y(in)o(to)h(the)h(pro)q(cedures.)21 b(Once)16 b(the)f(general)h
+(idea)g(of)f Fd(MAP)g Fh(is)g(understo)q(o)q(d,)h(its)f(application)i
+(to)e(this)g(problem)h(is)0 414 y(straigh)o(tforw)o(ard.)91
+478 y(The)f Fd(MAP)g Fh(and)g Fd(MAP.2)f Fh(pro)q(cedures)i(themselv)o
+(es)f(are,)g(naturally)l(,)g(a)g(little)h(more)f(complicated.)21
+b(They)15 b(are)0 536 y(de\014ned)g(recursiv)o(ely)l(,)f(using)g(some)f
+(of)g(the)g(more)g(adv)m(anced)h(capabilities)i(of)c(Logo.)19
+b(If)14 b(studen)o(ts)f(\(or)f(teac)o(hers!\))0 594 y(w)o(an)o(t)j(to)g
+(understand)h(the)g(inner)g(w)o(orkings)g(of)f(these)h(to)q(ols,)f
+(they)h(m)o(ust)f(face)g(the)h(c)o(hallenge)h(of)f(recursion.)22
+b(I)0 652 y(think)13 b(this)f(is)g(\014ne;)i(p)q(eople)f(who)e(are)h
+(in)o(terested)g(in)h(programming)e(m)o(ust,)h(ev)o(en)o(tually)l(,)h
+(understand)g(recursion.)0 711 y(The)h(p)q(oin)o(t)h(is)f(that)g(that)f
+(understanding)i(no)f(longer)g(has)g(to)g(come)g(\014rst.)19
+b(The)14 b(mathematics)g(can)g(b)q(e)h(studied)0 769
+y(and)h(the)f(programming)g(issues)h(can)g(b)q(e)g(p)q(ostp)q(oned.)22
+b(\(The)15 b(Logo)g(de\014nitions)j(of)d(all)h(the)g(to)q(ols)f(presen)
+o(ted)h(in)0 827 y(this)g(pap)q(er)f(are)g(collected)i(in)f(an)f(app)q
+(endix.\))0 945 y Fi(T)l(emplates)91 1064 y Fh(One)j(problem)h(with)e
+(the)h(mapping)g(to)q(ols)g(as)f(I'v)o(e)h(presen)o(ted)g(them)f(ab)q
+(o)o(v)o(e)g(is)h(that)f(w)o(e)h(m)o(ust)f(de\014ne)h(a)0
+1122 y(named)i(scalar)f(function)h(in)g(order)f(to)g(use)g(that)g(name)
+g(as)g(an)g(input)h(to)f Fd(MAP)p Fh(.)g(F)l(or)f(example,)j(when)f(I)f
+(\014rst)0 1180 y(in)o(tro)q(duced)e Fd(MAP)p Fh(,)d(I)i(had)f(to)g
+(detour)g(through)g(de\014nitions)i(of)e Fd(SQUARE)p
+Fh(,)f Fd(NEXT)p Fh(,)g(and)i Fd(DOUBLE)e Fh(in)j(order)e(to)f(ha)o(v)o
+(e)0 1238 y(something)22 b(to)f(map)h(o)o(v)o(er)f(the)h(v)o(ectors)f
+(in)h(the)g(examples.)41 b(It's)21 b(not)h(so)f(bad)h(to)f(ha)o(v)o(e)h
+(names)g(for)f(these)0 1296 y(functions,)16 b(since)h(the)f(functions)g
+(are)f(useful)i(in)g(themselv)o(es)f(and)g(the)f(names)h(are)f
+(sensible.)23 b(But)16 b(sometimes)0 1354 y(w)o(e)g(need)i(an)f
+Fg(ad)h(ho)n(c)h Fh(function)f(just)e(for)g(one)h(particular)g(mapping)
+h(op)q(eration.)25 b(The)16 b(problem)i(will)g(b)q(ecome)0
+1413 y(clearer)e(if)f(w)o(e)g(consider)h(an)g(example.)91
+1477 y(W)l(e)f(w)o(ould)h(lik)o(e)g(to)e(b)q(e)i(able)g(to)e(m)o
+(ultiply)j(a)e(matrix)g(b)o(y)g(a)g(scalar.)k(That)c(is,)g(w)o(e)g(w)o
+(an)o(t)f(to)g(b)q(e)i(able)g(to)f(sa)o(y)0 1553 y Fd(?)24
+b(SHOW)f(MATRIX.SCALE)f(3)i([[1)f(2)h(3])g([4)f(5)h(6]])0
+1612 y([[3)f(6)h(9])g([12)f(15)h(18]])0 1690 y Fh(The)19
+b(function)g Fd(MATRIX.SCALE)e Fh(\(I'm)h(sa)o(ving)h(the)g(name)f
+Fd(MULTIPLY)g Fh(for)g(m)o(ultiplication)j(of)d(a)g(matrix)h(b)o(y)f(a)
+0 1748 y(matrix\))e(tak)o(es)f(t)o(w)o(o)g(inputs,)i(a)g(n)o(um)o(b)q
+(er)f(and)h(a)f(matrix.)23 b(Its)16 b(output)g(is)h(a)f(matrix)g(with)h
+(the)f(same)g(shap)q(e)h(as)0 1806 y(the)e(input,)h(but)f(with)h(eac)o
+(h)f(elemen)o(t)h(m)o(ultiplied)i(b)o(y)d(the)h(n)o(um)o(b)q(er.)91
+1870 y(It)f(ma)o(y)g(b)q(e)h(tempting)f(to)g(write)g
+Fd(MATRIX.SCALE)e Fh(as)i(follo)o(ws:)0 1947 y Fd(TO)24
+b(MATRIX.SCALE)e(:NUM)h(:MAT)477 b(;)24 b(incorrect!)24
+2005 y(OUTPUT)f(MAP.2)g("VECTOR.SCALE)f(:NUM)h(:MAT)0
+2063 y(END)0 2179 y(TO)h(VECTOR.SCALE)e(:NUM)h(:VEC)24
+2237 y(OUTPUT)g(MAP.2)g("PRODUCT)g(:NUM)g(:VEC)0 2295
+y(END)0 2374 y Fh(This)d(lo)q(oks)f(lik)o(e)h(a)f(straigh)o(tforw)o
+(ard)e(application)k(of)e(the)g(same)g(ideas)h(w)o(e)f(used)g(in)h
+Fd(MATRIX.ADD)p Fh(,)e(but)h(the)0 2432 y(parallel)f(do)q(esn't)e(w)o
+(ork.)22 b(The)17 b(problem)g(is)f(that)g Fd(MAP.2)f
+Fh(requires)i(t)o(w)o(o)e Fg(lists)k Fh(of)d(equal)h(length)g(so)f
+(that)f(it)i(can)0 2490 y(inductiv)o(ely)e(step)e(through)f(them,)h
+(applying)h(the)e(function)i(input)g(to)e(pairs)g(of)h(elemen)o(ts.)19
+b(Here)13 b(w)o(e)g(are)f(trying)0 2548 y(to)j(use)g(a)g(single)h(n)o
+(um)o(b)q(er)g Fd(:NUM)f Fh(rep)q(eatedly)l(.)91 2612
+y(There)e(is)h(really)g(only)g(one)f(matrix)g(input)h(in)g(this)f
+(problem,)h(not)f(t)o(w)o(o,)f(and)h(so)g(w)o(e)g(need)h(a)e(solution)i
+(using)0 2670 y Fd(MAP)p Fh(,)g(not)h Fd(MAP.2)p Fh(.)k(It)d(w)o(ould)f
+(b)q(e)h(easy)f(enough)h(to)e(do)h(this)h(for)e(an)o(y)h(sp)q(eci\014c)
+i(scale)f(factor:)964 2779 y(9)p eop
+%%Page: 10 10
+10 9 bop 0 45 a Fd(TO)24 b(TIMES3)f(:X)24 104 y(OUTPUT)g(3)h(*)f(:X)0
+162 y(END)0 278 y(TO)h(MATRIX.SCALE3)e(:MAT)24 336 y(OUTPUT)h(MAP)g
+("VECTOR.SCALE3)f(:MAT)0 394 y(END)0 510 y(TO)i(VECTOR.SCALE3)e(:VEC)24
+568 y(OUTPUT)h(MAP)g("TIMES3)g(:VEC)0 626 y(END)0 713
+y Fh(But)16 b(it's)f(not)g(ob)o(vious)h(ho)o(w)f(to)g(generalize)i
+(this)f(in)o(to)g(the)f(desired)i Fd(MATRIX.SCALE)d Fh(function.)22
+b(W)l(e'd)15 b(ha)o(v)o(e)h(to)0 771 y(b)q(e)g(able)g(to)e(in)o(v)o(en)
+o(t)i(the)f(functions)h(lik)o(e)g Fd(TIMES3)f Fh(\\on)g(the)g(\015y)l
+(.")91 842 y(The)f(problem)h(w)o(e)f(are)g(exp)q(eriencing)j(here)e
+(turns)f(out)g(to)g(b)q(e)h(similar)g(to)f(the)g(problem)h(that)f
+(encouraged)0 900 y(us)h(to)f(switc)o(h)g(from)g(BASIC)h(to)f(Logo)g
+(as)h(the)f(medium)i(for)e(matrix)g(manipulation.)21
+b(In)15 b(BASIC,)g(w)o(e)f(couldn't)0 958 y(compute)22
+b(the)g(sum)h(of)e(t)o(w)o(o)g(matrices)h(without)g(putting)h(the)f
+(result)g(in)h(a)f(sp)q(eci\014c)i(named)e(arra)o(y)f
+Fd(C)p Fh(.)h(An)0 1016 y(arra)o(y)e(couldn't)h(exist)h(as)f(a)f(real)i
+(ob)s(ject)e(on)h(its)h(o)o(wn,)f(without)g(a)g(name.)38
+b(Logo)20 b(lists,)j(b)o(y)e(con)o(trast,)g(are)0 1074
+y(\014rst-class)16 b(ob)s(jects)f(that)f(can)i(b)q(e)g(en)o(tered)g
+(directly)h(as)e(argumen)o(ts)g(to)g(functions)h(lik)o(e)h
+Fd(MATRIX.ADD)d Fh(without)0 1133 y(the)k(in)o(termediate)g(step)g(of)f
+(assigning)i(them)e(as)h(the)f(v)m(alue)i(of)e(a)h(named)g(v)m
+(ariable.)28 b(What)17 b(w)o(e)h(need)g(no)o(w)f(is)0
+1191 y Fg(\014rst-class)e(functions)p Fh(.)k(W)l(e)c(w)o(an)o(t)f(to)h
+(b)q(e)h(able)g(to)e(sa)o(y)h(\\the)g(function)h(3)f(times)g
+Fc(x)p Fh(")g(as)g(an)g(input)h(to)f Fd(MAP)p Fh(.)91
+1262 y(First-class)i(functions)h(are)e(one)i(of)e(the)h(cen)o(tral)g
+(ideas)h(of)e(LISP)l(,)i(the)f(language)g(from)f(whic)o(h)i(Logo)f(w)o
+(as)0 1320 y(dev)o(elop)q(ed.)33 b(Logo)19 b(itself)h(do)q(es)g(not)f
+(include)i(LISP's)f(mec)o(hanism)g(for)e(this)i(purp)q(ose,)g(but)g(it)
+f(do)q(es)h(include)0 1378 y(other)13 b(mec)o(hanisms)i(that)e(allo)o
+(w)h(us)g(to)f(implemen)o(t)i(\014rst-class)f(functions)g(within)h
+(Logo.)k(W)l(e)14 b(can)g(put)g(a)f(Logo)0 1436 y(expression)j(in)g(a)f
+(list,)h(lik)o(e)0 1514 y Fd([3)24 b(*)f(:X])0 1600 y
+Fh(and)16 b(then)g(w)o(e)f(can)h(ask)f(Logo)g(to)g Fd(RUN)g
+Fh(the)h(list.)21 b(That)15 b(is,)h(the)g(function)g
+Fd(RUN)f Fh(tak)o(es)g(an)h(expression)g(list)h(as)e(its)0
+1658 y(input,)h(and)f(giv)o(es)h(the)f(v)m(alue)h(of)f(the)g
+(expression)h(as)f(its)h(output.)91 1729 y(It)f(ma)o(y)g(seem)g(that)f
+(this)i(is)g(all)g(w)o(e)f(need.)21 b(W)l(e)15 b(could)h(write)0
+1807 y Fd(OUTPUT)23 b(MAP)g([3)h(*)g(:X])f(:VEC)0 1893
+y Fh(instead)16 b(of)0 1970 y Fd(OUTPUT)23 b(MAP)g("TIMES3)g(:VEC)0
+2056 y Fh(and)14 b(just)g(design)h(the)f Fd(MAP)f Fh(pro)q(cedure)i(so)
+f(that)f(it)h(runs)h(the)f(expression)g(list)h(for)f(eac)o(h)g(elemen)o
+(t)g(of)g(the)g(v)o(ector.)0 2115 y(This)f(is)h(almost)e(the)h(righ)o
+(t)g(thing,)g(but)g(there)g(is)g(a)g(mathematical)g(confusion)g(in)o(v)
+o(olv)o(ed.)20 b(An)13 b(expression)h(is)f(not)0 2173
+y(the)g(same)g(thing)g(as)f(a)h(function.)20 b(In)13
+b(mathematical)g(notation,)g(w)o(e)f(don't)h(sa)o(y)f
+Fc(f)18 b Fh(=)13 b(3)p Fc(x)p Fh(;)g(w)o(e)f(sa)o(y)g
+Fc(f)5 b Fh(\()p Fc(x)p Fh(\))13 b(=)g(3)p Fc(x)p Fh(.)18
+b(In)0 2231 y(this)12 b(particular)g(example)g(the)g(di\013erence)h(ma)
+o(y)d(not)h(seem)h(imp)q(ortan)o(t;)g Fc(x)f Fh(is)h(the)g(only)g(v)m
+(ariable)h(around,)f(and)f(so)0 2289 y(it's)h(ob)o(vious)g(what)g(is)g
+(mean)o(t.)19 b(But)12 b(consider)h(the)f(di\013erence)i(b)q(et)o(w)o
+(een)e Fc(f)5 b Fh(\()p Fc(a;)j(b)p Fh(\))j(=)i(2)p Fc(a)t
+Fh(+)t Fc(b)f Fh(and)g Fc(g)r Fh(\()p Fc(b;)c(a)p Fh(\))i(=)j(2)p
+Fc(a)t Fh(+)t Fc(b)p Fh(.)0 2347 y(These)g(t)o(w)o(o)e(functions)i(are)
+g(not)f(equiv)m(alen)o(t,)i(ev)o(en)f(though)g(they)f(are)g(de\014ned)i
+(b)o(y)f(the)f(same)h(expression)g(2)p Fc(a)5 b Fh(+)g
+Fc(b)p Fh(.)91 2418 y(A)15 b(similar)g(naming)g(problem)h(arises)f(in)g
+(the)g Fd(SCALE)f Fh(problem.)20 b(If)15 b(w)o(e)f(just)h(w)o(an)o(t)e
+(to)h(scale)i(b)o(y)e(3,)g(then)h(w)o(e)0 2476 y(could)h(sa)o(y)f(that)
+f(there's)h(only)h(one)f(v)m(ariable)i(around.)j(But)15
+b(w)o(e)g(are)g(going)g(to)f(w)o(an)o(t)h(to)f(write)h(something)h(lik)
+o(e)0 2554 y Fd(TO)24 b(VECTOR.SCALE)e(:NUM)h(:VEC)24
+2612 y(OUTPUT)g(MAP)g([:NUM)h(*)f(:X])h(:VEC)0 2670 y(END)952
+2779 y Fh(10)p eop
+%%Page: 11 11
+11 10 bop 0 45 a Fh(In)15 b(this)g(situation)f(it's)g(not)g(ob)o(vious)
+h(ho)o(w)f Fd(MAP)f Fh(should)j(kno)o(w)d(that)h(the)g(v)m(ariable)i
+Fd(NUM)e Fh(has)g(a)g(particular)h(v)m(alue)0 104 y(assigned)i(to)f(it)
+g(externally)l(,)i(while)g(the)e(v)m(ariable)i Fd(X)e
+Fh(is)h(the)f(one)g(in)o(to)h(whic)o(h)g(it)g(should)g(plug)g(the)f
+(elemen)o(ts)h(of)0 162 y(the)h(v)o(ector.)27 b(The)18
+b(traditional)h(LISP)g(solution)g(is)f(to)f(represen)o(t)h(a)g
+(function)h(as)e(a)h Fg(lamb)n(da)g(expr)n(ession)j Fh(that)0
+220 y(con)o(tains)11 b(the)h(names)f(of)g(the)g(input)h(v)m(ariables)h
+(as)e(w)o(ell)h(as)f(the)g(de\014ning)i(expression.)19
+b(So)11 b(in)h(LISP)h(w)o(e)e(migh)o(t)g(sa)o(y)0 295
+y Fd(\(DEFINE)23 b(F)h(\(LAMBDA)f(\(A)g(B\))h(\(+)f(\(*)h(2)g(A\))f
+(B\)\)\))0 353 y(\(DEFINE)g(G)h(\(LAMBDA)f(\(B)g(A\))h(\(+)f(\(*)h(2)g
+(A\))f(B\)\)\))0 424 y Fh(\(LISP)14 b(uses)g(pre\014x)g(form)e
+Fd(\(*)24 b(2)g(A\))13 b Fh(rather)g(than)g(in\014x)i(form)d
+Fd(\(2)24 b(*)g(A\))13 b Fh(to)g(represen)o(t)g(arithmetic)h(op)q
+(erations.)0 482 y(But)i(the)g(imp)q(ortan)o(t)g(p)q(oin)o(t)h(for)e
+(our)h(purp)q(oses)h(is)g(to)e(notice)i(the)f(di\013erence)i(b)q(et)o
+(w)o(een)e Fd(F)g Fh(and)g Fd(G)p Fh(,)g(namely)h(the)0
+541 y(list)f(of)f(parameter)f(names)h(follo)o(wing)h(the)g(w)o(ord)e
+Fd(LAMBDA)p Fh(.\))91 599 y(It)h(w)o(ould)h(b)q(e)g(p)q(ossible)h(to)d
+(in)o(v)o(en)o(t)h(this)h(precise)g(mec)o(hanism)g(for)f(Logo.)k(Then)d
+(w)o(e)f(could)h(sa)o(y)0 674 y Fd(TO)24 b(VECTOR.SCALE)e(:NUM)h(:VEC)
+24 732 y(OUTPUT)g(MAP)g([LAMBDA)g([X])h([3)f(*)h(:X]])f(:VEC)0
+790 y(END)0 861 y Fh(The)17 b(trouble)g(is)h(that)e(this)h(notation)f
+(seems)h(needlessly)i(obtrusiv)o(e.)25 b(If)17 b(w)o(e)g(presen)o(t)f
+(this)i(to)e(studen)o(ts,)g(their)0 919 y(atten)o(tion)k(will)i(b)q(e)f
+(fo)q(cused)g(on)f(the)h(meaning)g(of)f(the)g(notation,)h(rather)f
+(than)g(on)h(matrix)f(arithmetic.)36 b(I)0 978 y(w)o(an)o(ted)13
+b(to)g(\014nd)i(a)e(b)q(etter)h(alternativ)o(e.)20 b(A)14
+b(quic)o(k-and-dirt)o(y)h(solution)g(w)o(ould)f(b)q(e)g(to)g(sa)o(y)f
+(that)g(the)h(parameter)0 1036 y(to)i(ev)o(ery)g(function)h(m)o(ust)f
+(b)q(e)h(called)g Fd(X)p Fh(;)f(for)g(t)o(w)o(o-input)g(functions)h(w)o
+(e)f(could)h(reserv)o(e)g Fd(X)f Fh(and)g Fd(Y)p Fh(.)g(That)g(w)o
+(ould)0 1094 y(w)o(ork,)g(but)g(it)h(seems)g(ugly)g(to)f(me.)24
+b(It)17 b(w)o(ould)g(prev)o(en)o(t)f(the)h(use)g(of)f(those)g(names)h
+(for)f(other)g(purp)q(oses.)25 b(\(F)l(or)0 1152 y(example,)16
+b(what)e(if)i(I'd)f(w)o(an)o(ted)g(to)g(call)h(the)f(scale)h(factor)e
+Fd(X)h Fh(instead)h(of)f Fd(NUM)p Fh(?\))91 1210 y(I)k(to)q(ok)f(m)o(y)
+h(inspiration)h(from)e(an)h(earlier)h(problem)f(in)h(mathematics)f
+(education)h(that)e(seems)h(closely)0 1268 y(related.)h(Some)14
+b(of)f(the)h(early)g(New)g(Math)g(exp)q(erimen)o(ters)g(w)o(an)o(ted)g
+(to)f(use)h(algebraic)h(ideas)f(with)h(elemen)o(tary)0
+1326 y(sc)o(ho)q(ol)h(studen)o(ts,)e(presen)o(ting)i(v)o(ery)f(simple)i
+(equations)e(lik)o(e)881 1442 y Fc(x)10 b Fh(+)h(3)h(=)h(7)0
+1529 y(They)f(found)h(that)e(the)h(underlying)i(idea)f(of)f(\\what)f
+(plus)i(three)f(is)h(sev)o(en?")f(w)o(asn't)f(to)q(o)h(di\016cult,)h
+(but)g(that)e(the)0 1587 y Fc(x)i Fh(notation)f(w)o(as)g(a)g(problem)h
+(for)f(some)h(studen)o(ts.)19 b(Their)13 b(solution)g(w)o(as)f(to)g
+(presen)o(t)h(the)f(equation)i(in)f(the)g(form)p 855
+1656 79 2 v 855 1729 2 73 v 932 1729 V 855 1731 79 2
+v 944 1704 a(+)d(3)j(=)g(7)0 1796 y(P)o(edagogically)l(,)k(the)f(b)q(o)
+o(x)h(seems)f(to)f(suggest)h(\\this)g(is)h(a)f(slot)g(to)g(b)q(e)h
+(\014lled")g(without)g(raising)f(the)h(di\016culties)0
+1854 y(ab)q(out)e(names)h(and)f(v)m(alues)i(that)d(studen)o(ts)h
+(\014nd)i(with)e Fc(x)p Fh(.)21 b(Unfortunately)15 b(there)h(is)f(no)h
+(b)q(o)o(x)f(c)o(haracter)g(in)h(the)0 1912 y(ASCI)q(I)j(sequence,)h
+(but)e(I)g(w)o(an)o(ted)f(to)h(come)g(as)f(close)i(as)e(p)q(ossible)j
+(to)d(this)i(ideal)g(of)f(a)f(graphically)j(ob)o(vious)0
+1970 y(slot)15 b(indication.)22 b(My)15 b(solution)h(w)o(as)e(to)h(use)
+g(a)g(question)h(mark:)0 2046 y Fd(?)24 b(SHOW)f(MAP)g([3)h(*)g(?])f
+([2)h(3)g(4])0 2104 y([6)g(9)f(12])0 2162 y(?)h(SHOW)f(MAP)g([?)h(*)g
+(?])f([2)h(3)g(4)f(5])0 2220 y([4)h(9)f(16)h(25])0 2278
+y(?)g(SHOW)f(MAP)g([IFELSE)g(\(?)h(<)g(0\))f([-?])h([?]])f([2)h(-3)f
+(12)h(0)f(-14])0 2336 y([2)h(3)f(12)h(0)g(14])0 2407
+y Fh(An)15 b(expression)i(list)f(with)f(a)g(question)h(mark)e(slot)h
+(to)g(b)q(e)h(\014lled)h(is)f(called)g(an)g(expression)g
+Fg(template)p Fh(.)91 2465 y(W)l(e)f(can)h(no)o(w)e(solv)o(e)i(the)f
+Fd(SCALE)f Fh(problem:)0 2541 y Fd(TO)24 b(MATRIX.SCALE)e(:NUM)h(:MAT)
+24 2599 y(OUTPUT)g(MAP)g([VECTOR.SCALE)f(:NUM)i(?])f(:MAT)0
+2657 y(END)952 2779 y Fh(11)p eop
+%%Page: 12 12
+12 11 bop 0 45 a Fd(TO)24 b(VECTOR.SCALE)e(:NUM)h(:VEC)24
+104 y(OUTPUT)g(MAP)g([:NUM)h(*)f(?])h(:VEC)0 162 y(END)91
+240 y Fh(W)l(e)15 b(ha)o(v)o(e)f(redesigned)i Fd(MAP)f
+Fh(to)f(accept)h(templates)g(instead)g(of)g(named)g(functions.)20
+b(What)15 b(ab)q(out)f Fd(MAP.2)p Fh(?)0 298 y(W)l(e)h(need)h(a)f(w)o
+(a)o(y)f(to)h(express)g(templates)h(with)f(t)o(w)o(o)f(slots.)20
+b(My)15 b(solution)h(is)f(to)g(name)g(the)g(slots)g Fd(?1)g
+Fh(and)h Fd(?2)p Fh(.)0 375 y Fd(?)24 b(SHOW)f(MAP.2)g([?2)h(-)f(?1])h
+([1)f(2)h(3])g([15)f(20)h(30])0 433 y([14)f(18)h(27])0
+511 y Fh(This)12 b(do)q(esn't)g(seem)g(quite)g(so)g(comp)q(elling)i(as)
+d(the)h(unadorned)g(question)h(mark,)e(just)g(as)h(New)g(Math)f
+(equations)0 569 y(with)j(b)q(o)o(xes)f(and)g(triangles)h(seem)f(more)g
+(cluttered)h(and)f(less)h(ob)o(vious)g(than)f(the)g(ones)g(with)h(only)
+f(b)q(o)o(xes.)20 b(Still,)0 627 y(the)15 b(notation)g(clearly)h
+(indicates)h(whic)o(h)f(slot)f(is)h(whic)o(h.)91 691
+y(By)f(the)g(w)o(a)o(y)l(,)f(are)h(y)o(ou)g(tired)h(of)e(ha)o(ving)i
+(to)e(write)h Fd(MATRIX)g Fh(and)g Fd(VECTOR)f Fh(v)o(ersions)i(of)e
+(ev)o(erything,)h(when)0 749 y(y)o(ou)i(really)h(only)g(care)g(ab)q
+(out)f(the)g(matrix)g(v)o(ersion?)28 b(Y)l(ou)18 b(can)f(in)o(v)o(en)o
+(t)h(t)o(w)o(o-lev)o(el)f(mapping)h(to)q(ols)g(that)e(will)0
+807 y(allo)o(w)f(direct)h(de\014nition)h(of)e(the)g(matrix)g
+(functions.)0 884 y Fd(TO)24 b(MMAP)f(:FN)g(:MAT)358
+b(;)23 b(matrix)h(map)24 942 y(OUTPUT)f(MAP)g([MAP)h(:FN)f(?])h(:MAT)0
+1000 y(END)0 1116 y(TO)g(MMAP.2)f(:FN)g(:M1)h(:M2)24
+1174 y(OUTPUT)f(MAP.2)g([MAP.2)g(:FN)h(?1)f(?2])h(:M1)f(:M2)0
+1232 y(END)0 1349 y(TO)h(ADD)f(:M1)g(:M2)24 1407 y(OUTPUT)g(MMAP.2)g
+([?1)g(+)h(?2])g(:M1)f(:M2)0 1465 y(END)0 1581 y(TO)h(SCALE)f(:NUM)g
+(:MAT)24 1639 y(OUTPUT)g(MMAP)g([:NUM)g(*)h(?])g(:MAT)0
+1697 y(END)0 1775 y Fh(The)19 b(de\014nitions)i(of)d
+Fd(ADD)h Fh(and)g Fd(SCALE)f Fh(no)o(w)h(em)o(b)q(o)q(dy)g(the)g
+(mathematical)h(ideas)f(quite)h(directly)l(,)h(with)e(v)o(ery)0
+1833 y(little)c(programming)e(language)h(noise.)20 b(Y)l(ou)14
+b(ma)o(y)f(\014nd)i(the)f(de\014nitions)h(of)f Fd(MMAP)f
+Fh(and)h Fd(MMAP.2)f Fh(a)g(little)i(tric)o(ky)l(,)0
+1891 y(but)i(the)f(structure)g(of)g(nested)h Fd(MAP)p
+Fh(s)f(is)h(exactly)g(analogous)f(to)g(the)g(nested)h
+Fd(FOR)p Fh(s)f(in)i(the)e(sequen)o(tial)i(v)o(ersion)0
+1950 y(of)d(matrix)g(programming.)0 2068 y Fi(More)i(F)l(unctional)i
+(Programming)e(T)l(o)q(ols)91 2187 y Fh(I)h(w)o(ould)g(lik)o(e)h(to)e
+(de\014ne)i(an)f(exp)q(onen)o(tiation)h(function.)28
+b(That)17 b(is,)i(I)f(w)o(an)o(t)f(to)g(tak)o(e)g(a)g(giv)o(en)h(base)g
+(to)f(a)0 2245 y(giv)o(en)d(p)q(o)o(w)o(er,)f(using)i(rep)q(eated)f(m)o
+(ultiplication.)21 b(\(The)14 b(p)q(o)o(w)o(er)f(m)o(ust,)g(of)g
+(course,)h(b)q(e)g(a)g(nonnegativ)o(e)f(in)o(teger.\))0
+2303 y(This)21 b(is)h(an)f(example)g(of)g(comp)q(osition)g(of)g
+(functions,)h(in)g(whic)o(h)g(the)e(function)i Fd([?)i(*)f(:BASE])d
+Fh(is)i(in)o(v)o(ok)o(ed)0 2361 y Fd(:EXP)16 b Fh(times,)g(with)h(the)f
+(result)g(from)g(one)g(in)o(v)o(o)q(cation)h(\014lling)h(the)f(slot)f
+(for)f(the)i(next)f(in)o(v)o(o)q(cation.)23 b(\(The)16
+b(\014rst)0 2419 y(in)o(v)o(o)q(cation)g(is)f(done)h(with)g(1)e(in)i
+(the)g(slot.\))0 2496 y Fd(TO)24 b(POWER)f(:BASE)g(:EXP)24
+2554 y(OUTPUT)g(CASCADE)g(:EXP)g([?)h(*)f(:BASE])g(1)0
+2612 y(END)952 2779 y Fh(12)p eop
+%%Page: 13 13
+13 12 bop 0 45 a Fd(?)24 b(SHOW)f(POWER)g(2)h(5)0 104
+y(32)91 186 y(CASCADE)18 b Fh(is)j(a)e(to)q(ol)g(for)g(rep)q(eated)h
+(comp)q(osition)h(of)e(a)g(function)i(with)e(itself.)34
+b(It)20 b(tak)o(es)f(three)g(inputs.)0 244 y(First)13
+b(is)g(a)g(n)o(um)o(b)q(er)g(sa)o(ying)g(ho)o(w)f(man)o(y)h(times)g(w)o
+(e)g(w)o(an)o(t)e(to)i(in)o(v)o(ok)o(e)g(the)g(function.)20
+b(Second)13 b(comes)g(a)g(template)0 302 y(indicating)i(what)e(the)h
+(function)g(is.)20 b(Third)15 b(is)f(the)f(initial)j(v)m(alue)f(used)f
+(to)f(\014ll)i(the)e(slot)h(in)g(the)g(\014rst)f(in)o(v)o(o)q(cation.)0
+361 y(As)f(another)g(example)g(of)g(its)g(use,)h(here)f(is)h(Newton's)e
+(metho)q(d)h(to)g(appro)o(ximate)f(the)h(square)g(ro)q(ot)f(of)h(a)g(n)
+o(um)o(b)q(er)0 419 y(b)o(y)j(rep)q(eated)h(comp)q(osition)g(of)f(a)g
+(function:)0 496 y Fd(TO)24 b(NSQRT)f(:X)24 554 y(OUTPUT)g(CASCADE)g
+(10)g([\(?)h(+)g(\(:X/?\)\)/2])e(1)0 612 y(END)0 695
+y Fh(Newton's)13 b(appro)o(ximation)g(function)h(tak)o(es)e(the)h(a)o
+(v)o(erage)g(of)f(the)i(previous)g(guess)f(and)g(the)h(quotien)o(t)f
+(of)g Fc(x)g Fh(and)0 753 y(the)18 b(guess.)27 b(In)19
+b(this)f(pro)q(cedure)h(w)o(e)e(start)g(with)h(an)g(initial)i(guess)d
+(of)h(1)f(and)h(w)o(e)g(apply)g(the)g(appro)o(ximation)0
+811 y(function)f(10)e(times.)23 b(This)17 b(constan)o(t)e(n)o(um)o(b)q
+(er)h(of)g(in)o(v)o(o)q(cations)g(is)h(to)q(o)e(simple;)j(few)o(er)d
+(in)o(v)o(o)q(cations)i(w)o(ould)f(do)0 869 y(for)i(small)h(v)m(alues)g
+(of)f Fc(x)p Fh(,)h(while)g(more)f(are)g(needed)i(to)d(get)h(a)g(go)q
+(o)q(d)g(appro)o(ximation)h(for)e(large)i(v)m(alues.)30
+b(\(F)l(or)0 927 y(example,)18 b(try)f Fd(NSQRT)f Fh(of)h(a)f
+(million.\))28 b(T)l(o)17 b(\014x)g(this)g(problem,)h
+Fd(CASCADE)e Fh(accepts)i(as)e(its)i(\014rst)e(input)i(either)g(a)0
+985 y(n)o(um)o(b)q(er)d(or)f(a)g Fg(pr)n(e)n(dic)n(ate)h(template)p
+Fh(,)g(that)e(is,)i(an)g(expression)g(template)g(whose)f(v)m(alue)i(is)
+f Fd(TRUE)e Fh(or)h Fd(FALSE)p Fh(.)g(The)0 1043 y(rep)q(eated)i(comp)q
+(osition)g(con)o(tin)o(ues)g(un)o(til)g(the)f(v)m(alue)i(of)d(the)i
+(predicate)g(template)f(is)h Fd(TRUE)p Fh(.)0 1120 y
+Fd(TO)24 b(NSQRT)f(:X)24 1178 y(OUTPUT)g(CASCADE)g([LESSP)g(ABS)g(\(:X)
+h(-)f(?*?\))h(0.00000001])e([\(?)i(+)f(\(:X/?\)\)/2])g(1)0
+1236 y(END)0 1353 y(TO)h(ABS)f(:X)24 1411 y(OUTPUT)g(IFELSE)g(:X<0)g
+([-:X])g([:X])0 1469 y(END)91 1552 y Fh(It)15 b(is)h(sometimes)f(con)o
+(v)o(enien)o(t)h(for)e(the)h(function)h(b)q(eing)h(cascaded)e(to)g(kno)
+o(w)f(ho)o(w)h(man)o(y)g(times)g(it's)g(b)q(een)0 1610
+y(in)o(v)o(ok)o(ed)g(so)g(far.)k(F)l(or)14 b(example,)h(the)g
+(factorial)g(function)h(is)f(lik)o(e)h(the)f(p)q(o)o(w)o(er)g(function)
+g(except)h(that)e(eac)o(h)h(new)0 1668 y(m)o(ultiplication)22
+b(is)e(b)o(y)f(a)h(larger)f(n)o(um)o(b)q(er,)h(instead)h(of)e(alw)o(a)o
+(ys)f(b)o(y)i(the)f(same)h Fd(:BASE)p Fh(.)e(Therefore,)i
+Fd(CASCADE)0 1726 y Fh(templates)15 b(can)h(include)h(another)e(sp)q
+(ecial)i(sym)o(b)q(ol,)e Fd(#)p Fh(,)g(indicating)i(the)e(n)o(um)o(b)q
+(er)h(of)f(in)o(v)o(o)q(cations.)0 1803 y Fd(TO)24 b(FACTORIAL)e(:N)24
+1861 y(OUTPUT)h(CASCADE)g(:N)g([?)h(*)g(#])f(1)0 1919
+y(END)0 2002 y Fh(The)14 b(template)h(is)g(\014rst)e(in)o(v)o(ok)o(ed)i
+(with)f(1)g(in)h(the)g(question)f(mark)g(slot)g(\(b)q(ecause)h(the)f
+(third)h(input)g(to)f Fd(CASCADE)0 2060 y Fh(is)h(1\))f(and)h(also)g(1)
+f(in)i(the)e(n)o(um)o(b)q(er)h(sign)g(slot)g(\(b)q(ecause)g(this)g(is)h
+(the)e(\014rst)h(in)o(v)o(o)q(cation\).)k(The)c(result)g(is)h(1.)j
+(Next)0 2118 y(time,)c Fd(?)20 b Fh(is)c(1)f(b)q(ecause)h(that's)e(the)
+h(result)h(of)f(the)g(\014rst)g(in)o(v)o(o)q(cation,)g(but)g
+Fd(#)g Fh(is)h(2.)k(The)15 b(third)h(time,)f Fd(?)20
+b Fh(is)c(2)f(and)0 2176 y Fd(#)g Fh(is)h(3.)91 2244
+y(The)22 b(function)g(b)q(eing)h(cascaded)e(is)h(not)g(limited)h(to)e
+(a)g(scalar)g(domain)h(or)f(range.)38 b(W)l(e)22 b(can)f(use)h(list)0
+2302 y(pro)q(cessing)16 b(op)q(erations)f(to)g(generate)g(the)g(v)o
+(ector)g(of)f(all)j(the)e(in)o(tegers)g(from)g(1)f(to)h
+Fc(n)p Fh(:)0 2380 y Fd(TO)24 b(FROM1TO)e(:N)24 2438
+y(OUTPUT)h(CASCADE)g(:N)g([LPUT)h(#)f(?])h([])0 2496
+y(END)0 2612 y(?)g(SHOW)f(FROM1TO)g(5)0 2670 y([1)h(2)f(3)h(4)g(5])952
+2779 y Fh(13)p eop
+%%Page: 14 14
+14 13 bop 0 45 a Fh(Here)18 b(the)g(initial)i(v)m(alue)g(is)e(an)g
+(empt)o(y)g(v)o(ector,)f(and)h(eac)o(h)g(in)o(v)o(o)q(cation)h(of)f
+(the)g(template)g(app)q(ends)h(the)f(next)0 104 y(in)o(teger)c(in)h
+(sequence.)21 b(\()p Fd(LPUT)13 b Fh(means)g(\\last)h(put";)g(it's)g
+(lik)o(e)h Fd(FPUT)e Fh(except)i(that)e(the)h(new)g(elemen)o(t)h(is)f
+(adjoined)0 162 y(on)h(the)g(righ)o(t)g(instead)h(of)f(on)g(the)g
+(left.\))91 224 y(Just)g(as)g(there)g(is)h(a)f Fd(MAP.2)f
+Fh(for)h(t)o(w)o(o-input)g(functions,)g(w)o(e)g(sometimes)h(need)g
+Fd(CASCADE.2)e Fh(for)g(t)o(w)o(o-input)0 282 y(functions.)25
+b(The)17 b(parallel)h(is)f(not)f(exact,)g(ho)o(w)o(ev)o(er.)24
+b(In)17 b(this)g(con)o(text)f(w)o(e)g(need)i(not)e(only)h(t)o(w)o(o)e
+(initial)k(inputs)0 340 y(but)f(also)f(t)o(w)o(o)f(functions,)j(one)f
+(to)f(sp)q(ecify)i(the)e(next)h(v)m(alue)h(of)e Fd(?1)g
+Fh(and)h(one)g(to)f(giv)o(e)g(the)h(next)g(v)m(alue)g(of)g
+Fd(?2)p Fh(.)0 398 y Fd(CASCADE.2)c Fh(therefore)h(tak)o(es)f(\014v)o
+(e)i(inputs:)0 475 y Fd(CASCADE.2)23 b(end.test)f(template.1)h
+(initial.1)g(template.2)f(initial.2)0 551 y Fh(F)l(or)15
+b(example,)g(here)h(is)g(ho)o(w)e(to)h(compute)g(the)g
+Fc(n)p Fh(th)h(Fib)q(onacci)g(n)o(um)o(b)q(er:)0 628
+y Fd(TO)24 b(FIB)f(:N)24 686 y(OUTPUT)g(CASCADE.2)g(:N-1)g([?1)g(+)h
+(?2])f(1)h([?1])g(0)0 744 y(END)0 820 y Fh(The)15 b(\014nal)h(output)f
+(from)g Fd(CASCADE.2)f Fh(is)i(the)f(\014nal)h(v)m(alue)g(of)f
+Fd(?1)p Fh(.)91 882 y(Because)i(I'm)f(presen)o(ting)h(so)f(man)o(y)g
+(examples)h(so)f(brie\015y)l(,)h(I'm)f(afraid)h(the)f(o)o(v)o(erall)g
+(p)q(oin)o(t)h(is)g(in)g(danger)0 940 y(of)e(b)q(eing)h(lost,)f(so)g
+(let)h(me)f(tak)o(e)g(a)g(momen)o(t)f(to)h(review)h(where)f(w)o(e)g
+(are.)20 b(I)15 b(started)g(b)o(y)g(presen)o(ting)h(the)f(idea)h(of)0
+998 y(functional)g(programming,)f(in)h(whic)o(h)g(the)f(fo)q(cus)h(is)f
+(on)g(the)h(input-output)g(b)q(eha)o(vior)g(of)e(a)h(pro)q(cedure)i
+(rather)0 1057 y(than)i(on)g(the)g(exact)f(sequence)i(of)f(ev)o(en)o
+(ts)f(through)h(whic)o(h)h(the)f(computer)g(pro)q(duces)g(the)g
+(desired)i(output.)0 1115 y(I)i(suggested)g(that)f(functional)h
+(programming)f(is)i(m)o(uc)o(h)e(b)q(etter)h(suited)h(to)e(mathematics)
+g(teac)o(hing)h(than)0 1173 y(traditional,)c(sequen)o(tial)g
+(programming.)27 b(If)18 b(this)g(is)g(true,)g(teac)o(hers)g(should)g
+(prefer)g(a)g(functional)h(language)0 1231 y(lik)o(e)13
+b(Logo)e(rather)g(than)g(a)g(sequen)o(tial)i(one)f(lik)o(e)g(BASIC)h
+(or)e(P)o(ascal.)18 b(One)13 b(stum)o(bling)f(blo)q(c)o(k)g(has)g(b)q
+(een)g(the)g(need)0 1289 y(to)h(teac)o(h)h(recursion)h(in)g(order)f(to)
+g(program)f(ev)o(en)h(the)g(simplest)i(mathematical)e(ideas,)h(but)f
+(this)g(obstacle)h(can)0 1347 y(b)q(e)g(a)o(v)o(oided)g(b)o(y)g(pro)o
+(viding)h(to)q(ols)e(that)g(are)h(the)g(functional)h(analog)e(to)g(the)
+h(lo)q(oping)h(construct)e(in)i(sequen)o(tial)0 1405
+y(programming.)91 1467 y(So)c(far)g(I)h(ha)o(v)o(e)f(in)o(tro)q(duced)h
+(t)o(w)o(o)e(suc)o(h)i(to)q(ols,)g Fd(MAP)f Fh(and)g
+Fd(CASCADE)p Fh(,)f(in)j(one-input)f(and)g(t)o(w)o(o-input)f(v)o
+(ersions.)0 1525 y(With)g(this)h(small)f(to)q(olkit)h(I)f(ha)o(v)o(e)g
+(b)q(een)h(able)f(to)g(write)g(pro)q(cedures)h(that)e(are)h(not)f
+(self-referen)o(tial)j(for)d(a)h(v)m(ariet)o(y)0 1584
+y(of)18 b(mathematical)h(functions.)32 b(In)20 b(m)o(y)e(exp)q
+(erience,)k(studen)o(ts)c(quic)o(kly)j(understand)e Fd(MAP)g
+Fh(with)g(hardly)g(an)o(y)0 1642 y(explanation,)e(and)f(can)h(use)f(it)
+h(correctly)f(themselv)o(es.)24 b Fd(CASCADE)15 b Fh(is)i(a)f(little)h
+(harder,)f(p)q(erhaps)h(just)f(b)q(ecause)0 1700 y(it)h(has)f(more)g
+(inputs)h(and)g(the)g(pro)q(cedures)g(are)f(therefore)g(harder)h(to)f
+(read.)23 b(But)17 b(the)f(e\013ort)g(to)f(understand)0
+1758 y(the)f(metaphor)f(b)q(ehind)i Fd(CASCADE)e Fh(\(comp)q(osing)g(a)
+g(function)i(with)e(itself)t(\))h(pa)o(ys)f(o\013)g(in)h(more)f
+(expressiv)o(e)h(p)q(o)o(w)o(er)0 1816 y(than)j(studen)o(ts)g(of)g
+(traditional)g(languages)g(get)g(from)f(similar)j(e\013ort)d(put)h(in)o
+(to)g Fd(FOR)p Fh(,)f Fd(WHILE)p Fh(,)g Fd(UNTIL)p Fh(,)g(and)h(so)0
+1874 y(on.)j(I)15 b(no)o(w)g(w)o(an)o(t)f(to)h(in)o(tro)q(duce)h(t)o(w)
+o(o)e(more)h(functional)h(programming)e(to)q(ols.)91
+1936 y(W)l(e)22 b(w)o(an)o(t)f(to)h(tak)o(e)f(the)i(dot)f(pro)q(duct)g
+(of)g(t)o(w)o(o)f(v)o(ectors.)40 b(T)l(o)22 b(do)g(this,)i(w)o(e)e(m)o
+(ust)g(m)o(ultiply)i(pairs)e(of)0 1994 y(corresp)q(onding)15
+b(elemen)o(ts,)f(and)h(then)f(add)g(up)h(all)f(the)h(pro)q(ducts.)k
+(The)c(\014rst)e(part)h(of)f(this)i(is)f(clearly)h(a)f(job)g(for)0
+2052 y Fd(MAP.2)p Fh(,)g(but)h(w)o(e)g(need)h(a)f(to)q(ol)g(for)g(the)g
+(second)h(part.)0 2129 y Fd(?)24 b(SHOW)f(REDUCE)g("SUM)g([2)h(3)g(4])0
+2187 y(9)0 2245 y(?)g(SHOW)f(REDUCE)g("PRODUCT)g([2)g(3)h(4])0
+2303 y(24)0 2419 y(TO)g(DOTPROD)e(:V1)i(:V2)24 2478 y(OUTPUT)f(REDUCE)g
+("SUM)g(\(MAP.2)g("PRODUCT)g(:V1)h(:V2\))0 2536 y(END)0
+2612 y Fh(Because)12 b(the)f(function)h(I)g(w)o(an)o(t)e(to)h(map)g(o)o
+(v)o(er)g(the)g(t)o(w)o(o)f(v)o(ectors)g(happ)q(ens)j(to)d(b)q(e)i
+(included)i(as)d(a)g(Logo)g(primitiv)o(e,)0 2670 y(I'v)o(e)i(just)f
+(giv)o(en)h Fd(MAP.2)f Fh(its)h(name,)g(as)f(I)h(did)h(in)f(the)g
+(earliest)g(examples,)h(instead)f(of)f(a)h(template)f(with)h(question)
+952 2779 y(14)p eop
+%%Page: 15 15
+15 14 bop 0 45 a Fh(marks.)19 b(W)l(e'll)14 b(write)f(these)h(to)q(ols)
+f(so)g(that)f(either)i(form)f(is)h(allo)o(w)o(ed.)19
+b Fd(REDUCE)p Fh(,)12 b(the)i(new)f(to)q(ol)h(in)g(this)f(example,)0
+104 y(tak)o(es)i(a)h(t)o(w)o(o-input)g(asso)q(ciativ)o(e)g(function)h
+(and)f(applies)i(it)e(to)f(all)i(the)f(elemen)o(ts)h(of)e(the)h
+(indicated)i(list.)23 b(\(W)l(e)0 162 y(insist)14 b(that)e(the)h
+(function)h(b)q(e)f(asso)q(ciativ)o(e)h(to)e(a)o(v)o(oid)g(questions)i
+(ab)q(out)f(the)g(precise)h(grouping)f(of)f(the)h(elemen)o(ts)0
+220 y(of)i(the)g(list.\))91 298 y(It)c(ma)o(y)f(b)q(e)i(time)f(for)g(a)
+g(reminder)h(that)e(functional)i(programming)f(to)q(ols)f(can)i(b)q(e)f
+(applied)i(to)e(non-n)o(umeric)0 356 y(computation)k(as)g(w)o(ell:)0
+434 y Fd(TO)24 b(ACRONYM)e(:NAME)24 492 y(OUTPUT)h(REDUCE)g("WORD)g
+(MAP)h("FIRST)f(:NAME)0 550 y(END)0 666 y(?)h(SHOW)f(ACRONYM)g
+([AMERICAN)g(CIVIL)g(LIBERTIES)f(UNION])0 724 y(ACLU)0
+840 y(TO)i(PIGLATIN)e(:WORD)24 898 y(OUTPUT)h(WORD)g(\(CASCADE)g
+([MEMBERP)g(FIRST)g(?)h("AEIOU])525 956 y([WORD)f(BUTFIRST)g(?)h(FIRST)
+f(?])525 1015 y(:WORD\))310 1073 y("AY)0 1131 y(END)0
+1247 y(?)h(SHOW)f(PIGLATIN)g("SPAGHETTI)0 1305 y(AGHETTISPAY)91
+1398 y Fh(The)14 b(last)f(to)q(ol)h(is)g(used)g(to)f(select)h(a)f
+(subset)h(of)f(the)h(mem)o(b)q(ers)f(of)h(a)f(list,)h(based)g(on)f(a)h
+(predicate)g(template:)0 1476 y Fd(?)24 b(SHOW)f(FILTER)g([EQUALP)g
+(\(REMAINDER)f(?)i(2\))g(0])f([1)h(2)g(3)f(4)h(5])0 1534
+y([2)g(4])0 1592 y(?)g(SHOW)f(FILTER)g([EQUALP)g(\(SQRT)g(?\))h(\(INT)f
+(SQRT)g(?\)])h([1)f(2)h(3)g(4)g(5])0 1650 y([1)g(4])0
+1744 y Fh(Supp)q(ose)17 b(w)o(e)e(w)o(an)o(t)g(to)g(kno)o(w)g(if)i(a)e
+(n)o(um)o(b)q(er)h Fc(n)g Fh(is)g(p)q(erfect.)22 b(W)l(e)16
+b(need)h(to)e(\014nd)h(all)h(the)f(factors)f(of)g Fc(n)p
+Fh(,)h(then)g(add)0 1802 y(them)f(up:)0 1880 y Fd(TO)24
+b(PERFECT?)e(:N)24 1938 y(OUTPUT)h(EQUALP)g(:N)358 1996
+y(REDUCE)g("SUM)525 2054 y(FILTER)g([EQUALP)g(\(REMAINDER)f(:N)i(?\))g
+(0])692 2112 y(FROM1TO)f(:N-1)0 2170 y(END)0 2286 y(?)h(SHOW)f
+(PERFECT?)g(6)0 2344 y(TRUE)0 2403 y(?)h(SHOW)f(PERFECT?)g(7)0
+2461 y(FALSE)0 2554 y Fh(In)18 b(this)g(pro)q(cedure,)g
+Fd(FROM1TO)f Fh(giv)o(es)g(us)h(a)f(list)h(of)f(all)i(the)e(n)o(um)o(b)
+q(ers)h(that)e(migh)o(t)i(b)q(e)g(factors)e(of)h Fc(n)p
+Fh(.)27 b Fd(FILTER)0 2612 y Fh(selects)12 b(the)g(ones)f(that)g
+(actually)h(are)g(factors,)e(b)o(y)i(c)o(hec)o(king)g(the)g(remainder)g
+(of)f(dividing)j Fc(n)d Fh(b)o(y)h(eac)o(h)f(candidate.)0
+2670 y Fd(REDUCE)j Fh(adds)i(all)g(the)f(factors,)f(and)h
+Fd(EQUALP)g Fh(c)o(hec)o(ks)g(whether)g(the)h(sum)f(is)g(equal)h(to)f
+Fc(n)p Fh(.)952 2779 y(15)p eop
+%%Page: 16 16
+16 15 bop 91 45 a Fh(Y)l(ou)15 b(ma)o(y)g(b)q(e)h(w)o(ondering)g(if)f
+(there)h(will)h(b)q(e)f Fd(REDUCE.2)e Fh(and)h Fd(FILTER.2)f
+Fh(pro)q(cedures.)21 b(It)16 b(turns)f(out)g(that)0 104
+y(these)e(w)o(ould)h(not)e(b)q(e)i(meaningful.)20 b(F)l(unctions)14
+b(can)f(ha)o(v)o(e)g(more)f(than)h(one)g(input,)h(but)f(they)g(are)g
+(only)h(allo)o(w)o(ed)0 162 y(one)19 b(output.)31 b(If)19
+b(w)o(e)f(tried)i(to)e(select)h(elemen)o(ts)h(from)e(t)o(w)o(o)f(lists)
+j(in)g(parallel,)h(w)o(e)d(w)o(ould)h(end)h(up)f(with)g(t)o(w)o(o)0
+220 y(sublists.)i(Whic)o(h)16 b(w)o(ould)g(w)o(e)e(output?)0
+347 y Fi(Some)j(Problems)g(Really)h(Are)f(Recursiv)o(e)91
+475 y Fh(Supp)q(ose)23 b(w)o(e)f(w)o(an)o(t)f(to)g(\014nd)i(the)f
+(determinan)o(t)g(of)f(a)h(square)g(matrix.)40 b(The)22
+b(w)o(ell-kno)o(wn)h(algorithm)0 533 y(requires)c(us)g(to)f(select)h(a)
+f(single)i(ro)o(w)d(or)h(column)i(of)e(the)g(matrix,)h(then)g(for)e
+(eac)o(h)i(elemen)o(t)g(of)f(that)g(ro)o(w)f(or)0 591
+y(column)d(w)o(e)f(m)o(ust)f(compute)h Fg(the)i(determinant)f(of)23
+b Fh(a)13 b(submatrix)g(formed)g(b)o(y)g(remo)o(ving)g(the)g(ro)o(w)f
+(and)h(column)0 649 y(con)o(taining)19 b(that)f(elemen)o(t.)29
+b(\(Then)19 b(w)o(e)f(m)o(ultiply)h(b)o(y)g(plus)g(or)f(min)o(us)g(the)
+h(elemen)o(t,)g(and)g(then)f(w)o(e)g(add)g(up)0 707 y(all)f(the)f
+(results,)g(but)g(those)f(are)h(the)g(easy)f(parts.\))21
+b(The)16 b(w)o(ords)f(in)i(italics)g(are)e(a)h(self-referen)o(tial)h
+(part)e(of)h(the)0 765 y(de\014nition)g(of)d(the)h(determinan)o(t.)19
+b(The)14 b(use)h(of)e(recursion)h(to)g(solv)o(e)f(this)i(problem)f(is)g
+(not)g(an)g(acciden)o(tal)h(result)0 823 y(of)g(missing)h(features)f
+(in)h(the)f(programming)g(language.)20 b(It's)14 b(a)h(naturally)h
+(recursiv)o(e)g(problem.)91 896 y(It)e(will)h(turn)e(out)g(to)g(b)q(e)i
+(easiest)e(if)h(w)o(e)g(c)o(ho)q(ose)f(the)h(leftmost)f(column)h(of)g
+(the)f(matrix)g(as)h(the)f(one)h(to)f(treat)0 954 y(sp)q(ecially)l(.)23
+b(If)16 b(w)o(e)f(c)o(hose)h(the)f(top)h(ro)o(w,)e(whic)o(h)i(w)o(ould)
+g(b)q(e)g(more)f(traditional,)h(then)g(for)f(eac)o(h)g(elemen)o(t)i(of)
+e(that)0 1012 y(ro)o(w)f(w)o(e)h(m)o(ust)g(extract)f(a)h(submatrix)h
+(in)g(whic)o(h)g(its)f(column)i(is)e(remo)o(v)o(ed.)20
+b(If)15 b(w)o(e)g(start)f(with)i(a)f(column,)h(then)0
+1070 y(for)f(eac)o(h)i(of)e(its)h(elemen)o(ts)h(the)f(submatrix)g(is)h
+(found)f(b)o(y)g(remo)o(ving)g(a)g(ro)o(w.)21 b(The)16
+b(latter)g(op)q(eration)g(is)h(easier,)0 1128 y(since)f(w)o(e)f(store)g
+(matrices)g(as)g(lists)h(of)e(ro)o(ws.)19 b(The)d(left)f(column)h(of)f
+(a)g(matrix)g(is)h(found)f(with)h(the)f(expression)0
+1206 y Fd(MAP)23 b("FIRST)g(:MATRIX)0 1294 y Fh(whic)o(h)16
+b(selects)g(the)f(\014rst)g(elemen)o(t)h(of)f(eac)o(h)g(ro)o(w.)k
+(Similarly)l(,)e(the)e(expression)0 1371 y Fd(MAP)23
+b("BUTFIRST)g(:MATRIX)0 1459 y Fh(returns)15 b(a)g(\(non-square\))f
+(matrix)h(with)g(the)h(\014rst)e(column)i(eliminated.)22
+b(This)16 b(latter)f(matrix)f(will)j(b)q(e)f(used)f(as)0
+1517 y(the)g(basis)h(from)e(whic)o(h)i(ro)o(ws)f(will)h(b)q(e)g
+(eliminated)i(to)c(form)h(eac)o(h)g(submatrix.)0 1595
+y Fd(TO)24 b(DET)f(:MATRIX)24 1653 y(IF)g(EMPTYP)g(BUTFIRST)g(:MATRIX)g
+([OUTPUT)g(FIRST)g(FIRST)g(:MATRIX])71 b(;)24 b(base)f(case,)g(1x1)24
+1711 y(LOCAL)g("RIGHTPART)24 1769 y(MAKE)g("RIGHTPART)g(MAP)g
+("BUTFIRST)g(:MATRIX)500 b(;)24 b(all)f(but)h(1st)f(col)24
+1827 y(OUTPUT)g(REDUCE)g("SUM)358 1885 y(MAP)g([\(PRODUCT)g(?)h(\(SIGN)
+f(#\))h(\(DET)f(ALLBUT)g(#)h(:RIGHTPART\)\)])453 1943
+y(MAP)g("FIRST)f(:MATRIX)0 2001 y(END)0 2117 y(TO)h(ALLBUT)f(:N)g(:MAT)
+1002 b(;)24 b(all)f(but)h(nth)f(row)24 2176 y(OUTPUT)g(FILTER)g([NOT)g
+(EQUALP)g(#)h(:N])f(:MAT)0 2234 y(END)0 2350 y(TO)h(SIGN)f(:N)24
+2408 y(OUTPUT)g(IFELSE)g(\(EQUALP)g(REMAINDER)f(:N)i(2)g(0\))f([-1])h
+([1])0 2466 y(END)0 2554 y Fh(Ev)o(en)17 b(though)g(recursion)g(is)h
+(necessary)f(in)g(this)h(problem,)f(I'v)o(e)g(con)o(tin)o(ued)h(to)e
+(use)h(the)g(non-recursiv)o(e)h(func-)0 2612 y(tional)h(to)q(ols)f
+(wherev)o(er)g(p)q(ossible.)30 b(T)l(o)18 b(mak)o(e)f(this)i(w)o(ork,)e
+(I)h(had)h(to)e(extend)i(the)f Fd(#)g Fh(notation)f(in)i(templates,)0
+2670 y(whic)o(h)d(I)g(originally)h(in)o(tended)f(only)g(for)e
+Fd(CASCADE)p Fh(,)g(to)h(w)o(ork)f(in)i Fd(MAP)f Fh(and)g
+Fd(FILTER)g Fh(also.)952 2779 y(16)p eop
+%%Page: 17 17
+17 16 bop 91 45 a Fh(Since)20 b Fd(DET)d Fh(is)i(de\014ned)h(recursiv)o
+(ely)l(,)g(it)e(m)o(ust)g(ha)o(v)o(e)g(a)g(base)g(case.)29
+b(In)19 b(this)f(problem,)i(the)e(base)g(case)g(is)0
+104 y(that)13 b(the)i(determinan)o(t)f(of)g(a)g(matrix)g(with)g(one)g
+(ro)o(w)g(and)g(one)g(column)h(is)g(the)f(single)i(n)o(um)o(b)q(er)e
+(in)h(the)g(matrix.)0 162 y(W)l(e)20 b(sa)o(y)e Fd(FIRST)24
+b(FIRST)18 b Fh(b)q(ecause)j(the)e(n)o(um)o(b)q(er)h(is)g(the)g
+(\014rst)f(elemen)o(t)h(of)f(the)h(\014rst)f(ro)o(w.)31
+b(F)l(or)19 b(other)g(cases,)0 220 y(the)d(program)f(is)i(more)e
+(complicated.)24 b(First)16 b(w)o(e)g(create)f(a)h(lo)q(cal)h(v)m
+(ariable)h Fd(RIGHTPART)d Fh(and)h(assign)g(to)g(it)g(the)0
+278 y(non-square)e(matrix)f(with)h(the)g(\014rst)f(column)h(of)f(the)h
+(original)h(matrix)e(remo)o(v)o(ed.)19 b(The)14 b(reason)f(for)g(this)h
+(step)f(is)0 336 y(to)f(a)o(v)o(oid)h(rep)q(etitiv)o(e)g(computation)g
+(of)f(the)h(same)g(matrix)f(for)g(ev)o(ery)h(ro)o(w,)f(whic)o(h)h(w)o
+(ould)g(result)g(if)h(w)o(e)e(just)g(said)24 413 y Fd(OUTPUT)23
+b(REDUCE)g("SUM)358 471 y(MAP)g([\(PRODUCT)g(?)h(\(SIGN)f(#\))h(\(DET)f
+(ALLBUT)g(#)h(MAP)f("BUTFIRST)g(:MATRIX\)\)])453 529
+y(MAP)h("FIRST)f(:MATRIX)0 612 y Fh(without)14 b(using)i(the)e(extra)g
+(v)m(ariable.)21 b(No)o(w)14 b(w)o(e)g(can)g(pic)o(k)i(apart)d(the)i
+(long)f Fd(OUTPUT)g Fh(instruction)h(to)f(see)h(ho)o(w)f(it)0
+670 y(em)o(b)q(o)q(dies)j(the)e(de\014nition.)22 b(W)l(e)15
+b(kno)o(w)g(from)f(the)i(use)f(of)g Fd(REDUCE)g Fh(that)f(w)o(e)h(are)g
+(going)h(to)e(compute)i(a)f(list)h(full)0 728 y(of)f(n)o(um)o(b)q(ers)g
+(and)h(then)f(add)h(up)f(the)g(n)o(um)o(b)q(ers.)21 b(What)14
+b(is)i(the)f(list?)22 b(W)l(ell,)16 b(it's)f(computed)g(b)o(y)0
+805 y Fd(MAP)23 b([...])h(MAP)f("FIRST)g(:MATRIX)0 888
+y Fh(whic)o(h)18 b(means)e(\\compute)h(some)f(function)i(of)e(eac)o(h)h
+(elemen)o(t)h(of)e(the)h(\014rst)f(column)i(of)e(the)h(matrix.")24
+b(So)17 b(far,)0 946 y(so)h(go)q(o)q(d.)30 b(What)18
+b(function)i(do)e(w)o(e)g(compute)h(for)f(eac)o(h)h(elemen)o(t)g(of)f
+(the)h(\014rst)f(column?)32 b(It's)18 b(a)g(pro)q(duct)h(of)0
+1004 y(three)14 b(factors:)e(the)i(elemen)o(t)g(itself,)h(either)g(p)q
+(ositiv)o(e)f(or)f(negativ)o(e)h(1)g(dep)q(ending)i(on)d(whic)o(h)i
+(elemen)o(t)g(it)f(is,)g(and)0 1062 y(the)h(determinan)o(t)g(of)f(a)g
+(submatrix.)20 b(That)14 b(submatrix)h(is)g(computed)g(b)o(y)g
+(selecting)h(all)f(but)g(a)g(particular)g(ro)o(w)0 1120
+y(from)f(the)i(matrix)f Fd(:RIGHTPART)p Fh(.)91 1189
+y(This)k(is)f(a)g(complicated)i(problem,)f(and)f(the)g(complexit)o(y)h
+(of)f(the)g(pro)q(cedure)h(re\015ects)g(that.)28 b(Still,)20
+b(the)0 1247 y(use)d(of)f(functional)i(programming)d(has)i(allo)o(w)o
+(ed)g(us)f(to)g(solv)o(e)h(the)f(problem)h(without)g(in)o(tro)q(ducing)
+h(auxiliary)0 1305 y(index)e(v)m(ariables.)22 b(The)15
+b(pro)q(cedure)h(exactly)g(re\015ects)f(the)g(structure)g(of)g(the)g
+(de\014nition)i(of)e(determinan)o(t.)91 1373 y(Since)21
+b(w)o(e)f(can't)f(a)o(v)o(oid)g(recursion)i(in)f(the)g(de\014nition)i
+(of)d Fd(DET)p Fh(,)g(it)h(migh)o(t)g(b)q(e)g(w)o(orth)o(while)g(to)f
+(compare)0 1431 y(this)e(v)o(ersion)g(with)g(the)g(w)o(a)o(y)e(it)i(w)o
+(ould)g(traditionally)h(b)q(e)g(written)e(in)i(Logo,)e(relying)i(ev)o
+(en)f(more)f(hea)o(vily)i(on)0 1489 y(recursion:)0 1566
+y Fd(TO)24 b(DET)f(:MATRIX)24 1624 y(IF)g(EMPTYP)g(BUTFIRST)g(:MATRIX)g
+([OUTPUT)g(FIRST)g(FIRST)g(:MATRIX])24 1682 y(OUTPUT)g(DET1)g(\(FIRSTS)
+g(:MATRIX\))g(\(BUTFIRSTS)f(:MATRIX\))h(1)h(1)0 1741
+y(END)0 1857 y(TO)g(DET1)f(:COL)g(:REST)g(:N)h(:SIGN)24
+1915 y(IF)f(EMPTYP)g(:COL)h([OUTPUT)f(0])24 1973 y(OUTPUT)g(SUM)g
+(\(PRODUCT)g(\(FIRST)g(:COL\))g(:SIGN)h(\(DET)f(ALLBUT)g(:N)g
+(:REST\)\))286 2031 y(\(DET1)h(\(BUTFIRST)e(:COL\))h(:REST)h(:N+1)f
+(-:SIGN\))0 2089 y(END)0 2205 y(TO)h(FIRSTS)f(:LIST)24
+2263 y(IF)g(EMPTYP)g(:LIST)h([OUTPUT)f([]])24 2321 y(OUTPUT)g(FPUT)g
+(\(FIRST)g(FIRST)g(:LIST\))g(\(FIRSTS)g(BUTFIRST)g(:LIST\))0
+2380 y(END)0 2496 y(TO)h(BUTFIRSTS)e(:LIST)24 2554 y(IF)h(EMPTYP)g
+(:LIST)h([OUTPUT)f([]])24 2612 y(OUTPUT)g(FPUT)g(\(BUTFIRST)g(FIRST)g
+(:LIST\))g(\(BUTFIRSTS)g(BUTFIRST)f(:LIST\))0 2670 y(END)952
+2779 y Fh(17)p eop
+%%Page: 18 18
+18 17 bop 0 104 a Fd(TO)24 b(ALLBUT)f(:N)g(:LIST)24 162
+y(IF)g(:N=1)h([OUTPUT)f(BUTFIRST)f(:LIST])24 220 y(OUTPUT)h(FPUT)g
+(\(FIRST)g(:LIST\))g(\(ALLBUT)g(:N-1)h(BUTFIRST)e(:LIST\))0
+278 y(END)0 352 y Fh(T)l(o)c(someone)h(familiar)h(with)f(recursion,)h
+(the)f(pro)q(cedures)g Fd(DET)g Fh(and)f Fd(DET1)h Fh(in)g(this)g(v)o
+(ersion)g(ma)o(y)f(seem)h(less)0 410 y(in)o(timidating)f(than)f(the)g
+(earlier)h(v)o(ersion.)24 b(It)17 b(w)o(ould)g(b)q(e)h(p)q(ossible)g
+(to)e(compromise,)h(using)h Fd(MAP)e Fh(and)h Fd(FILTER)0
+468 y Fh(to)d(de\014ne)i Fd(FIRSTS)p Fh(,)e Fd(BUTFIRSTS)p
+Fh(,)g(and)h Fd(ALLBUT)f Fh(as)g(in)i(the)f(\014rst)g(v)o(ersion,)g
+(but)g(using)h Fd(DET)e Fh(and)h Fd(DET1)g Fh(from)f(the)0
+526 y(second)i(v)o(ersion.)91 587 y(On)22 b(the)g(other)f(hand,)j(to)d
+(a)g(reader)h(who)f(is)h(not)g(in)o(timidated)h(b)o(y)f(the)f(\014rst)h
+(v)o(ersion,)h(it)f(mak)o(es)f(the)0 645 y(structure)16
+b(of)h Fd(DET)f Fh(more)g(plainly)i(apparen)o(t.)24 b(In)17
+b(the)g(second)g(v)o(ersion,)g(the)g(fact)f(that)g(the)g(determinan)o
+(t)h(is)g(a)0 703 y(sum)g(of)g(pro)q(ducts)h(is)g(buried)h(inside)g
+Fd(DET1)p Fh(,)e(and)g(y)o(ou)g(ha)o(v)o(e)g(to)g(notice)h(that)f(one)g
+(of)g(the)g(inputs)i(to)d Fd(SUM)h Fh(is)h(a)0 761 y(recursiv)o(e)e
+(call)g(in)g(order)f(to)g(see)g(that)g(sev)o(eral)g(pro)q(ducts)h(will)
+g(b)q(e)g(added.)21 b(The)15 b(\014rst)g(v)o(ersion)h(sa)o(ys)0
+837 y Fd(OUTPUT)23 b(REDUCE)g("SUM)g(MAP)h([\(PRODUCT)e(...)0
+912 y Fh(righ)o(t)15 b(up)h(fron)o(t.)91 972 y(Computing)i(the)g
+(determinan)o(t)g(is)g(a)f(hard)h(problem,)h(and)f(the)f(program)g
+(will)i(b)q(e)g(complex)f(no)g(matter)0 1030 y(ho)o(w)13
+b(it's)h(written.)20 b(Here)14 b(is)h(an)e(easier)i(problem)g(that)e
+(is)h(still)i(most)d(con)o(v)o(enien)o(t)h(in)h(recursiv)o(e)g(form:)e
+(compute)0 1088 y(the)i(transp)q(ose)g(of)f(a)h(matrix.)k(That)c(is,)g
+(in)o(terc)o(hange)g(the)g(ro)o(ws)f(and)h(the)g(columns.)21
+b(The)15 b(tric)o(k)g(is)g(to)f(see)i(that)0 1146 y(the)h(\014rst)g(ro)
+o(w)g(of)f(the)i(output)f(will)i(b)q(e)f(the)f(\014rst)g(column)h(of)f
+(the)g(input,)h(while)h(the)f(remaining)g(ro)o(ws)e(of)h(the)0
+1204 y(output)e(will)i(b)q(e)f(the)f Fg(tr)n(ansp)n(ose)g(of)25
+b Fh(the)15 b(remaining)i(columns.)0 1281 y Fd(TO)24
+b(TRANSPOSE)e(:MAT)24 1339 y(IF)h(EMPTYP)g(FIRST)h(:MAT)f([OUTPUT)g
+([]])24 1397 y(OUTPUT)g(FPUT)g(\(MAP)h("FIRST)f(:MAT\))g(\(TRANSPOSE)f
+(MAP)i("BUTFIRST)e(:MAT\))0 1455 y(END)0 1571 y(?)i(SHOW)f(TRANSPOSE)g
+([[1)g(2)h(3])f([4)h(5)g(6]])0 1629 y([[1)f(4])h([2)g(5])f([3)h(6]])91
+1704 y Fh(As)17 b(a)h(third)g(example)g(in)g(whic)o(h)h(recursion)f(is)
+g(helpful,)i(let's)d(return)h(to)f(the)g(question)h(of)f
+Fd(MATRIX.ADD)0 1762 y Fh(and)h Fd(VECTOR.ADD)p Fh(.)d(My)j(\014rst)f
+(implemen)o(tation)i(de\014nes)f(one)g(in)g(terms)f(of)g(the)h(other.)
+26 b(Later,)18 b(b)o(y)f(in)o(v)o(en)o(ting)0 1820 y(a)g(sp)q(ecial)h
+(to)q(ol)f(for)g(t)o(w)o(o-dimensional)g(mapping,)h(I)f(w)o(as)f(able)i
+(to)e(de\014ne)i(the)g(matrix)e(v)o(ersion)h(directly)l(.)27
+b(But)0 1878 y(no)o(w)16 b(supp)q(ose)i(that)e(I)i(w)o(an)o(t)e(to)g(b)
+q(e)i(able)f(to)g(add)g(v)o(ectors,)f(matrices,)h(and)g(ev)o(en)h(m)o
+(ulti-dimensional)i(arra)o(ys.)0 1936 y(I)e(don't)f(w)o(an)o(t)f(to)h
+(ha)o(v)o(e)h(to)e(de\014ne)j(a)e(separate)g Fd(ADD)h
+Fh(pro)q(cedure)g(for)f(ev)o(ery)g(p)q(ossible)j(dimension.)28
+b(Instead,)19 b(I)0 1994 y(w)o(an)o(t)14 b(one)h Fd(ADD)g
+Fh(pro)q(cedure)h(that)f(will)i(w)o(ork)d(on)h(scalars,)g(v)o(ectors,)f
+(matrices,)h(or)f(an)o(y)h(other)g(arra)o(y)l(.)0 2071
+y Fd(TO)24 b(ADD)f(:A)h(:B)24 2129 y(IF)f(NUMBERP)g(:A)h([OUTPUT)f(:A)g
+(+)h(:B])24 2187 y(OUTPUT)f(MAP.2)g("ADD)g(:A)h(:B)0
+2245 y(END)0 2319 y Fh(This)15 b(pro)q(cedure)g(extends)g(the)f
+(pattern)g(of)g(v)o(ector)f(and)i(matrix)f(addition)h(to)f(an)o(y)g(n)o
+(um)o(b)q(er)g(of)g(dimensions)i(b)o(y)0 2377 y(mapping)g
+Fg(itself)24 b Fh(o)o(v)o(er)14 b(its)h(inputs!)91 2438
+y(P)o(erhaps)d(it's)h(time)g(for)f(another)h(review)g(of)f(our)h
+(journey)g(so)f(far.)19 b(In)13 b(principle,)j(there)d(is)g(no)g(need)g
+(for)f(an)o(y)0 2496 y(con)o(trol)17 b(mec)o(hanism)g(other)f(than)h
+(recursion)h(in)f(a)g(programming)f(language.)25 b(An)o(y)17
+b(problem)g(can)g(b)q(e)h(solv)o(ed)0 2554 y(using)d(recursiv)o(e)h
+(pro)q(cedures,)f(without)f(explicit)j(lo)q(oping)f(mec)o(hanisms.)k
+(Ho)o(w)o(ev)o(er,)13 b(the)i(idea)g(of)f(recursion)h(is)0
+2612 y(hard)h(for)f(b)q(eginning)j(studen)o(ts,)e(so)f(in)i(order)f(to)
+f(mak)o(e)g(functional)i(programming)e(practical,)i(it's)f(helpful)i
+(to)0 2670 y(pro)o(vide)g(to)q(ols)f(that)f(are)h(analogous)f(to)h(lo)q
+(oping)h(constructs)f(but)g(consisten)o(t)g(with)h(the)f(functional)h
+(st)o(yle.)26 b(I)952 2779 y(18)p eop
+%%Page: 19 19
+19 18 bop 0 45 a Fh(ha)o(v)o(e)13 b(sho)o(wn)g(four)g(suc)o(h)h(to)q
+(ols:)f Fd(MAP)p Fh(,)g Fd(CASCADE)p Fh(,)f Fd(REDUCE)p
+Fh(,)g(and)i Fd(FILTER)p Fh(.)e(These)i(to)q(ols)f(are)g(adequate)h
+(for)e(man)o(y)0 104 y(problems,)j(but)g(not)f(for)f(all)j(problems.)k
+(If)15 b(a)f(problem)h(is)g(fundamen)o(tally)h(self-referen)o(tial,)g
+(then)e(the)h(studen)o(t)0 162 y(m)o(ust)g(understand)g(recursiv)o(e)h
+(programming)f(to)f(solv)o(e)i(it.)0 279 y Fi(Con)o(tin)o(uing)i(Dev)o
+(elopmen)o(t)91 397 y Fh(Un)o(til)f(the)e(writing)i(of)e(this)h(pap)q
+(er)g(I)g(had)g(nev)o(er)g(written)g(a)g(determinan)o(t)f(pro)q
+(cedure.)23 b(This)16 b(is)h(the)e(\014rst)0 455 y(example)i(I'v)o(e)f
+(found)g(in)h(whic)o(h)g Fd(MAP)f Fh(and)g Fd(FILTER)f
+Fh(templates)h(need)h(the)f Fd(#)g Fh(mec)o(hanism)h(to)e(let)i(the)f
+(function)0 513 y(kno)o(w)g(the)g(p)q(osition)i(of)e(its)g(argumen)o(t)
+g(in)h(the)g(original)g(input)h(list.)24 b(The)17 b(pro)q(cedure)g
+(de\014nitions)h(at)e(the)g(end)0 571 y(of)d(the)h(pap)q(er,)g
+(therefore,)f(are)h(somewhat)f(di\013eren)o(t)g(from)g(earlier)i
+(published)h(v)o(ersions.)k(Because)14 b(these)g(to)q(ols)0
+629 y(are)j(language)h(extensions)g(written)g(in)g(Logo)f(itself,)i(I)f
+(can)g(mak)o(e)f(this)h(c)o(hange)g(without)f(ha)o(ving)h(to)f(rewrite)
+0 688 y(the)g(Logo)g(in)o(terpreter.)27 b(Other)18 b(teac)o(hers)f(can)
+g(also)h(in)o(v)o(en)o(t)f(their)h(o)o(wn)f(to)q(ols,)h(so)f(that)f
+(their)i(studen)o(ts)f(ha)o(v)o(e)0 746 y(exactly)i(the)g(necessary)f
+(to)q(ols)h(for)f(whatev)o(er)g(pro)s(jects)g(are)g(relev)m(an)o(t)h
+(to)f(their)h(topic.)30 b(F)l(or)18 b(example,)i(for)e(a)0
+804 y(computer-based)j(linguistics)j(course)c([Golden)o(b)q(erg,)j
+(1987])c(P)o(aul)i(Golden)o(b)q(erg)h(in)o(v)o(en)o(ted)f(a)f(to)q(ol)h
+(to)f(mak)o(e)0 862 y(systematic)15 b(c)o(hanges)g(in)h(the)f(sp)q
+(elling)j(of)d(a)g(w)o(ord:)0 939 y Fd(?)24 b(SHOW)f(REPLACE)g([M)h(O])
+f([P)h(A])f("MOMMY)0 997 y(PAPPY)0 1074 y Fh(The)14 b(\014rst)g(input)h
+(is)g(a)f(list)h(of)f(letters)g(to)g(lo)q(ok)g(for)g(in)h(the)f(w)o
+(ord,)f(and)i(the)f(second)h(input)g(is)f(a)g(same-length)h(list)0
+1132 y(of)g(replacemen)o(ts.)91 1195 y(Recen)o(tly)21
+b(I)f(ha)o(v)o(e)g(found)g(m)o(yself,)h(in)g(certain)g(situations,)g(w)
+o(an)o(ting)e(something)h(more)g(lik)o(e)h(the)f(LISP)0
+1253 y(lam)o(b)q(da)14 b(notation,)g(with)g(explicit)i(names)d(for)h
+(the)g(slots)f(in)i(the)f(template.)19 b(F)l(or)13 b(example,)i(here)f
+(is)h(a)e(program)0 1311 y(to)i(m)o(ultiply)h(t)o(w)o(o)e(matrices:)0
+1388 y Fd(TO)24 b(MULTIPLY)e(:A)i(:B)24 1446 y(LOCAL)f("TB)24
+1504 y(MAKE)g("TB)h(TRANSPOSE)e(:B)24 1562 y(OUTPUT)h(MAP)g([MULROW)g
+(?)h(:TB])f(:A)0 1620 y(END)0 1737 y(TO)h(MULROW)f(:ROWA)g(:TB)24
+1795 y(OUTPUT)g(MAP)g([DOTPROD)g(:ROWA)g(?])h(:TB)0 1853
+y(END)0 1930 y Fh(Eac)o(h)16 b(elemen)o(t)g(of)f(the)h(pro)q(duct)g(is)
+h(the)e(dot)h(pro)q(duct)g(of)f(a)h(ro)o(w)e(of)i Fd(:A)f
+Fh(and)h(a)f(column)i(of)e Fd(:B)p Fh(.)g(\(The)h(program)0
+1988 y(uses)g Fd(TRANSPOSE)e Fh(b)q(ecause)j(w)o(e)e(store)g(matrices)h
+(b)o(y)g(ro)o(ws,)e(and)i(a)f(ro)o(w)g(of)g(the)h(transp)q(ose)f(is)i
+(a)e(column)i(of)e(the)0 2046 y(original)g(matrix.\))k(The)14
+b(subpro)q(cedure)h Fd(MULROW)e Fh(computes)h(a)f(single)j(ro)o(w)d(of)
+g(the)h(answ)o(er;)f(the)h(en)o(tire)h(answ)o(er)0 2104
+y(is)h(found)f(b)o(y)g(mapping)h Fd(MULROW)f Fh(o)o(v)o(er)f(the)h(ro)o
+(ws)f(of)h(the)g(\014rst)g(input)h(matrix.)91 2167 y(I)f(don't)g(lik)o
+(e)h(ha)o(ving)g(to)e(ha)o(v)o(e)h(the)g(auxiliary)h(pro)q(cedure)h
+Fd(MULROW)p Fh(.)c(I'd)j(rather)e(use)i(t)o(w)o(o)e(nested)h
+Fd(MAP)p Fh(s,)f(as)0 2226 y(in)i(the)f Fd(MMAP)g Fh(to)q(ol.)20
+b(But)15 b(if)h(I)f(try)g(that,)f(I)i(end)f(up)h(with)g(the)f
+(instruction)0 2302 y Fd(OUTPUT)23 b(MAP)g([MAP)h([DOTPROD)f(?)g(?])h
+(:TB])f(:A)0 2380 y Fh(One)17 b(of)f(those)f(question)i(marks)f(refers)
+g(to)f(the)h(slot)g(in)h(the)f(inner)i(template,)e(while)h(the)g(other)
+e(refers)h(to)g(the)0 2438 y(slot)d(in)i(the)e(outer)g(one.)20
+b(This)14 b(can't)f(w)o(ork.)18 b(\(Nor)13 b(w)o(ould)g(it)h(help)h(to)
+e(use)h Fd(?1)f Fh(and)g Fd(?2)p Fh(.)19 b(W)l(e)14 b(aren't)e(using)j
+Fd(MAP.2)0 2496 y Fh(to)h(map)h(o)o(v)o(er)f(t)o(w)o(o)f(lists)j(in)f
+(parallel;)i(w)o(e're)d(using)i(the)f(single-slot)h Fd(MAP)e
+Fh(t)o(wice.\))25 b(T)l(o)16 b(disam)o(biguate)h(the)g(t)o(w)o(o)0
+2554 y(slots,)g(I)g(ha)o(v)o(e)g(to)f(b)q(e)i(able)g(to)e(giv)o(e)h
+(eac)o(h)g(one)h(a)e(name)h(explicitly)l(.)29 b(The)17
+b(notation)f(do)q(esn't)h(actually)h(require)0 2612 y(the)d(w)o(ord)f
+Fd(LAMBDA)p Fh(,)g(whic)o(h)i(LISP)g(uses)f(for)g(historical)h
+(reasons;)e(if)h(the)g(\014rst)g(thing)g(in)h(a)f(template)g(is)h(a)e
+(list)i(in)0 2670 y(square)f(brac)o(k)o(ets,)f(I)i(w)o(an)o(t)e(to)g
+(tak)o(e)h(that)f(as)h(a)g(list)h(of)f(names)g(of)g(slots.)k(Then)d(I)g
+(can)f(sa)o(y)952 2779 y(19)p eop
+%%Page: 20 20
+20 19 bop 0 45 a Fd(OUTPUT)23 b(MAP)g([[ROWA])g(MAP)h([[COLB])f
+(DOTPROD)g(:ROWA)g(:COLB])g(:TB])g(:A)0 118 y Fh(I)16
+b(ha)o(v)o(e)e(written)i(to)q(ols)f(that)f(accept)i(this)f(format,)f
+(but)h(I)h(ha)o(v)o(en't)e(y)o(et)h(tried)g(teac)o(hing)h(it)f(to)g(an)
+o(y)o(one.)91 176 y(Another)j(anno)o(y)o(ance)g(I'd)g(lik)o(e)h(to)e
+(eliminate)j(is)f(the)f(need)h(for)e(separate)g(pro)q(cedures)i
+Fd(MAP)f Fh(and)g Fd(MAP.2)p Fh(.)0 235 y(What)d(if)i(I)f(w)o(an)o(t)f
+(to)g(map)h(a)g(three-input)h(function)g(o)o(v)o(er)e(three)h(lists)h
+(of)e(inputs?)24 b(I'd)16 b(lik)o(e)h(a)f(single)h Fd(MAP)f
+Fh(that)0 293 y(can)d(tak)o(e)g(an)o(y)g(n)o(um)o(b)q(er)h(of)e
+(inputs,)j(just)e(as)g(certain)g(Logo)g(primitiv)o(es)i(do,)e(inside)i
+(paren)o(theses.)k(This)14 b(c)o(hange,)0 351 y(unfortunately)l(,)k(do)
+q(es)f(require)h(mo)q(di\014cations)g(to)f(the)g(Logo)g(in)o
+(terpreter.)26 b(One)18 b(published)h(v)o(ersion)f(of)e(Logo)0
+409 y(\(Ob)s(ject)h(Logo,)h(for)f(the)h(Macin)o(tosh,)g(dev)o(elop)q
+(ed)h(b)o(y)f(Coral)f(Soft)o(w)o(are)f(and)i(no)o(w)g(o)o(wned)f(b)o(y)
+h(Apple\))h(allo)o(ws)0 467 y(user-de\014ned)j(pro)q(cedures)g(with)f
+(v)m(ariable)h(n)o(um)o(b)q(ers)f(of)f(inputs.)38 b(I)21
+b(hop)q(e)g(the)g(idea)g(is)h(extended)f(to)f(other)0
+525 y(dialects.)0 638 y Fi(T)l(eac)o(hing)e(Exp)q(erience)91
+751 y Fh(When)13 b(I)f(published)j(the)d(\014rst)g(v)o(olume)h(of)f
+Fg(Computer)i(Scienc)n(e)e(L)n(o)n(go)h(Style)h Fh([Harv)o(ey)l(,)e
+(1985],)f(I)i(in)o(tro)q(duced)0 809 y(mapping)j(to)q(ols)g(near)f(the)
+h(end)h(of)e(the)h(b)q(o)q(ok,)f Fg(after)21 b Fh(the)16
+b(reader)f(w)o(as)g(familiar)i(with)f(recursion,)g(b)q(ecause)g(m)o(y)0
+868 y(emphasis)k(w)o(as)f(on)g(the)h(implemen)o(tation)g(of)f(the)h(to)
+q(ols.)33 b(I)19 b(w)o(an)o(ted)g(to)g(mak)o(e)g(the)g(p)q(oin)o(t)h
+(that)f(Logo)g(is)h(an)0 926 y(extensible)g(language)e(b)o(y)f(sho)o
+(wing)h(ho)o(w)g(to)f(extend)h(it.)28 b(I)18 b(had)g(considered)i(in)o
+(tro)q(ducing)f(the)f(to)q(ols)f(earlier,)0 984 y(without)f(sho)o(wing)
+g(their)h(de\014nitions,)g(to)f(allo)o(w)g(readers)g(to)f(write)h(in)o
+(teresting)h(functional)g(programs)e(in)i(the)0 1042
+y(early)f(c)o(hapters.)23 b(What)15 b(dissuaded)j(me,)e(at)g(that)f
+(time,)h(w)o(as)g(that)f(I)i(w)o(as)e(trying)h(to)g(mak)o(e)f(the)i(b)q
+(o)q(ok)f(usable)0 1100 y(without)g(a)f(teac)o(her)h(b)o(y)g(readers)f
+(who)h(migh)o(t)f(ha)o(v)o(e)h(an)o(y)f(of)h(half)g(a)f(dozen)i(v)o
+(ersions)f(of)f(Logo)g(at)g(home.)22 b(Eac)o(h)0 1158
+y(dialect)h(is)e(sligh)o(tly)i(di\013eren)o(t)e(from)g(the)g(others.)38
+b(I)22 b(felt)g(that)e(I)i(couldn't)g(use)g(to)q(ol)f(pro)q(cedures)h
+(unless)h(I)0 1216 y(pro)o(vided)16 b(the)f(de\014nitions)i(on)e(disk)o
+(ette,)g(and)h(that)e(seemed)i(lik)o(e)g(to)q(o)f(m)o(uc)o(h)g
+(trouble.)91 1275 y(As)20 b(it)h(turned)g(out,)g(the)g(biggest)g
+(complain)o(t)g(I)g(heard)g(from)f(p)q(eople)i(who)e(taugh)o(t)g
+(courses)g(based)h(on)0 1333 y(that)13 b(b)q(o)q(ok)h(w)o(as)f(ab)q
+(out)h(the)g(di\016cult)o(y)h(their)f(studen)o(ts)g(had)g(in)h(the)f(c)
+o(hapter)f(on)h(recursiv)o(e)h(op)q(erations.)k(Their)0
+1391 y(confusion)13 b(w)o(as)d(not)i(only)g(ab)q(out)f(recursion,)i
+(but)f(ab)q(out)g(the)f(more)h(fundamen)o(tal)g(issue)g(of)g(writing)g
+(op)q(erations)0 1449 y(at)17 b(all.)28 b(They)17 b(w)o(ere)g
+(uncomfortable)h(with)g Fd(OUTPUT)f Fh(and)g(with)h(list)g
+(manipulation.)29 b(The)17 b(reason)h(for)e(this,)j(I)0
+1507 y(decided,)j(w)o(as)d(that)f(un)o(til)j(that)e(c)o(hapter)g(they)h
+(had)f(had)h(v)o(ery)f(little)i(practice)f(writing)g(op)q(erations)g
+(at)e(all.)0 1565 y(Without)f(recursion,)i(the)e(n)o(um)o(b)q(er)h(of)f
+(in)o(teresting)h(functions)g(y)o(ou)f(can)g(compute)h(is)g(small.)27
+b(By)17 b(presen)o(ting)0 1623 y(to)q(ols)22 b(lik)o(e)i
+Fd(MAP)e Fh(earlier,)j(it)d(w)o(ould)h(b)q(e)g(p)q(ossible)h(to)e
+(presen)o(t)h(more)f(and)g(b)q(etter)h(examples)g(of)f(functional)0
+1681 y(programming)15 b(in)h(the)f(early)g(c)o(hapters.)91
+1740 y(In)g(the)g(fall)h(semester)f(of)f(1988)g(I)h(taugh)o(t)f(a)h
+(Logo)f(programming)h(course)f(to)h(a)f(small)i(group)f(of)f(Berk)o
+(eley)0 1798 y(undergraduates)19 b(using)g(this)g(approac)o(h.)30
+b(I)19 b(ha)o(v)o(e)f(not)h(revised)g(the)g(b)q(o)q(ok,)g(but)g(in)g
+(the)g(early)g(w)o(eeks)g(of)f(the)0 1856 y(course)c(I)g(supplemen)o
+(ted)i(it)e(with)h(handouts)f(and)g(class)g(discussion)i(sho)o(wing)e
+(the)g(mapping)h(to)q(ols.)k(\(The)14 b(to)q(ol)0 1914
+y(pro)q(cedures)f(I)g(used)g(w)o(ere)f(the)h(v)o(ersions)g(in)g([Harv)o
+(ey)l(,)f(1987],)f(sligh)o(tly)j(di\013eren)o(t)e(from)g(the)g(ones)h
+(in)g(this)g(pap)q(er.\))0 1972 y(My)e(exp)q(erience)i(w)o(as)e(that)f
+(the)h(studen)o(ts)g(w)o(ere,)h(as)f(exp)q(ected,)h(easily)h(able)f(to)
+e(apply)i(functional)h(programming)0 2030 y(ideas)k(to)e(problems)h
+(that)g(could)h(b)q(e)f(solv)o(ed)g(without)g(recursion.)23
+b(Their)17 b(early)f(e\013orts)f(could)i(fo)q(cus)f(on)g(what)0
+2089 y(it)k(means)g(for)f(a)h(pro)q(cedure)h(to)e(output)h(a)g(v)m
+(alue,)i(without)d(b)q(eing)j(confused)e(b)o(y)g(the)g(additional)i
+(issues)e(of)0 2147 y(self-reference.)h(On)15 b(the)g(other)f(hand,)h
+(I)g(had)f(hop)q(ed)i(that)d(with)i(this)g(basis)g(they)g(w)o(ould)g
+(\014nd)g(recursion)g(itself)0 2205 y(easy)i(when)h(w)o(e)f(got)f(to)h
+(it;)h(in)g(that)f(resp)q(ect)g(I)h(w)o(as)e(disapp)q(oin)o(ted.)28
+b(Recursion)19 b(w)o(as)d(still)j(a)e(big)h(h)o(urdle.)27
+b(By)0 2263 y(the)19 b(end)h(of)e(the)h(semester)g(almost)g(all)h(of)e
+(the)h(studen)o(ts)g(could)h(understand)g(recursiv)o(e)f(pro)q(cedures)
+h(that)f(I)0 2321 y(presen)o(ted,)c(but)h(not)e(all)j(could)f(reliably)
+h(write)e(their)h(o)o(wn)e(recursiv)o(e)i(pro)q(cedures.)91
+2380 y(One)i(mistak)o(e)g(that)f(I)h(made)g(w)o(as)f(to)g(try)g(to)h
+(motiv)m(ate)f(the)h(use)g(of)g(recursion)g(b)o(y)g(starting)f(with)h
+(quite)0 2438 y(complicated)e(examples)g(that)e(couldn't)i(b)q(e)g
+(done)f(using)h(the)f(iterativ)o(e)g(to)q(ols)g(the)g(studen)o(ts)g
+(already)h(knew.)k(I)0 2496 y(w)o(as)12 b(o)o(v)o(erreacting)h(to)g
+(the)g(an)o(ticipated)h(question,)g(\\wh)o(y)f(don't)g(w)o(e)g(just)f
+(use)i Fd(MAP)p Fh(?")f(I)h(w)o(ould)f(no)o(w)g(b)q(egin)i(with)0
+2554 y(simpler)g(examples)g(and)g(announce)g(b)o(y)f(\014at)f(that)h
+(the)g(iterativ)o(e)g(to)q(ols)g(ma)o(y)g(not)g(b)q(e)g(used)h(this)g
+(w)o(eek.)k(I)c(w)o(ould)0 2612 y(explain)g(that)f(they)f(are)h(going)g
+(to)f(learn)h(ho)o(w)g(things)g(lik)o(e)h Fd(MAP)e Fh(can)h(b)q(e)h
+(written)e(in)i(Logo,)e(and)h(to)f(understand)0 2670
+y(that,)i(they)h(ha)o(v)o(e)f(to)g(pretend)i(that)e Fd(MAP)g
+Fh(isn't)h(a)o(v)m(ailable.)23 b(\(By)16 b(the)g(w)o(a)o(y)l(,)f(I)h
+(ha)o(v)o(e)f(of)h(course)g(done)g(something)952 2779
+y(20)p eop
+%%Page: 21 21
+21 20 bop 0 45 a Fh(similar)16 b(in)g(this)f(pap)q(er,)g(in)g(the)g
+(section)h(that)e(explains)i(wh)o(y)f(recursion)g(is)h(still)g
+(sometimes)f(necessary)l(.)20 b(But)15 b(I)0 104 y(trust)f(that)h(the)g
+(reader)g(is)h(not)f(new)g(to)g(Logo)g(and)g(has)g(already)h(seen)f
+(simpler)i(examples)f(of)f(recursion.\))91 162 y(Man)o(y)10
+b(Logo)h(teac)o(hers)g(ha)o(v)o(e)g(noticed)h(that)f(studen)o(ts)g
+(\014nd)h(recursiv)o(e)g(op)q(erations)f(more)g(di\016cult)i(than)e
+(the)0 220 y(command-hea)o(vy)16 b(st)o(yle)h(of)e(programming)h(used)h
+(in)g(turtle)f(graphics)h(applications.)25 b(Some)16
+b(ha)o(v)o(e)g(resp)q(onded)0 278 y(b)o(y)h(restricting)h(their)f(Logo)
+g(teac)o(hing)g(to)g(graphics.)26 b(Others,)17 b(w)o(an)o(ting)g(to)f
+(preserv)o(e)h(the)g(abilit)o(y)i(to)d(explore)0 336
+y(natural)21 b(language)g(issues,)h(ha)o(v)o(e)e(in)o(tro)q(duced)i(w)o
+(ord)e(pro)q(cessing)i(commands)e(in)o(to)h(Logo)f(so)h(that)f(English)
+0 394 y(text)c(can)g(b)q(e)h(pro)q(cessed)g(in)g(the)f(easier)h
+(command-hea)o(vy)f(st)o(yle.)23 b(\(See,)16 b(for)g(example,)h([T)l
+(emp)q(el,)g(1986])e(for)g(a)0 452 y(description)f(of)f(this)g(approac)
+o(h)f(in)i(LogoW)l(riter.\))k(I)13 b(am)g(un)o(willing)i(to)d(withhold)
+i(from)e(studen)o(ts)h(the)g(p)q(o)o(w)o(erful)0 510
+y(idea)k(of)f(functional)h(programming;)f(the)g(w)o(ork)f(describ)q(ed)
+j(here)f(is)f(an)h(attempt)e(to)g(preserv)o(e)i(the)f(functional)0
+568 y(st)o(yle)g(while)h(allo)o(wing)g(studen)o(ts)f(to)f(tak)o(e)g
+(smaller)i(steps)f(than)f(the)h(enormous)g(in)o(tellectual)i(leap)f
+(that)e(seems)0 626 y(to)g(b)q(e)g(required)i(in)f(mo)o(ving)f(from)f
+(commands)h(directly)i(in)o(to)e(recursiv)o(e)h(op)q(erations.)0
+848 y Fi(App)q(endix:)23 b(The)18 b(Implemen)o(tation)91
+961 y Fh(Resist)f(the)g(temptation)f(to)g(use)g(shorter)g(v)m(ariable)i
+(names)e(in)i(these)e(pro)q(cedures.)25 b(It's)16 b(imp)q(ortan)o(t)g
+(that)0 1019 y(these)g(names)f(b)q(e)h(di\013eren)o(t)g(from)f(an)o(y)g
+(v)m(ariable)i(names)e(used)h(in)g(other)g(parts)e(of)h(the)h(program)e
+(that)h(in)o(v)o(ok)o(es)0 1077 y(these)g(to)q(ols.)0
+1180 y Fd(TO)24 b(MAP)f(:MAP.TEMPLATE)f(:TEMPLATE.LIST)24
+1239 y(OUTPUT)h(MAP1)g(PREPARE.TEMPLATE)f(:MAP.TEMPLATE)g
+(:TEMPLATE.LIST)g(1)0 1297 y(END)0 1413 y(TO)i(MAP1)f(:MAP.TEMPLATE)f
+(:TEMPLATE.LIST)g(:TEMPLATE.NUMBER)24 1471 y(IF)h(EMPTYP)g
+(:TEMPLATE.LIST)f([OUTPUT)h([]])24 1529 y(LOCAL)g("TEMPLATE.VAR)24
+1587 y(MAKE)g("TEMPLATE.VAR)f(FIRST)h(:TEMPLATE.LIST)24
+1645 y(OUTPUT)g(FPUT)g(\(RUN)h(:MAP.TEMPLATE\))310 1703
+y(\(MAP1)f(:MAP.TEMPLATE)f(\(BF)i(:TEMPLATE.LIST\))e
+(1+:TEMPLATE.NUMBER\))0 1761 y(END)0 1878 y(TO)i(PREPARE.TEMPLATE)d
+(:TEMPLATE)24 1936 y(IF)i(LISTP)h(:TEMPLATE)e([OUTPUT)h(:TEMPLATE])24
+1994 y(OUTPUT)g(SENTENCE)g(:TEMPLATE)f("?)0 2052 y(END)0
+2168 y(TO)i(?)24 2226 y(OUTPUT)f(:TEMPLATE.VAR)0 2284
+y(END)0 2400 y(TO)h(#)24 2458 y(OUTPUT)f(:TEMPLATE.NUMBER)0
+2517 y(END)952 2779 y Fh(21)p eop
+%%Page: 22 22
+22 21 bop 0 45 a Fd(TO)24 b(MAP.2)f(:MAP.TEMPLATE)f(:TEMPLATE.LIST1)g
+(:TEMPLATE.LIST2)24 104 y(OUTPUT)h(MAP.21)g(PREPARE.TEMPLATE.2)e
+(:MAP.TEMPLATE)358 162 y(:TEMPLATE.LIST1)h(:TEMPLATE.LIST2)g(1)0
+220 y(END)0 336 y(TO)i(MAP.21)f(:MAP.TEMPLATE)f(:TEMPLATE.LIST1)g
+(:TEMPLATE.LIST2)f(:TEMPLATE.NUMBER)24 394 y(IF)i(EMPTYP)g
+(:TEMPLATE.LIST1)f([OUTPUT)h([]])24 452 y(LOCAL)g([TEMPLATE.VAR1)f
+(TEMPLATE.VAR2])24 510 y(MAKE)h("TEMPLATE.VAR1)f(FIRST)h
+(:TEMPLATE.LIST1)24 568 y(MAKE)g("TEMPLATE.VAR2)f(FIRST)h
+(:TEMPLATE.LIST2)24 626 y(OUTPUT)g(FPUT)g(\(RUN)h(:MAP.TEMPLATE\))310
+684 y(\(MAP.21)f(:MAP.TEMPLATE)f(\(BF)i(:TEMPLATE.LIST1\))501
+743 y(\(BF)g(:TEMPLATE.LIST2\))d(1+:TEMPLATE.NUMBER\))0
+801 y(END)0 917 y(TO)j(PREPARE.TEMPLATE.2)d(:TEMPLATE)24
+975 y(IF)i(LISTP)h(:TEMPLATE)e([OUTPUT)h(:TEMPLATE])24
+1033 y(OUTPUT)g(SENTENCE)g(:TEMPLATE)f([?1)i(?2])0 1091
+y(END)0 1207 y(TO)g(?1)24 1265 y(OUTPUT)f(:TEMPLATE.VAR1)0
+1323 y(END)0 1440 y(TO)h(?2)24 1498 y(OUTPUT)f(:TEMPLATE.VAR2)0
+1556 y(END)0 1672 y(TO)h(CASCADE)e(:CASCADE.LIMIT)g(:CASCADE.TEMPLATE)g
+(:TEMPLATE.VAR)24 1730 y(OUTPUT)h(CASCADE1)g(PREPARE.LIMIT)f
+(:CASCADE.LIMIT)406 1788 y(PREPARE.TEMPLATE)f(:CASCADE.TEMPLATE)406
+1846 y(:TEMPLATE.VAR)h(1)0 1904 y(END)0 2021 y(TO)i(CASCADE1)e
+(:CASCADE.LIMIT)g(:CASCADE.TEMPLATE)g(:TEMPLATE.VAR)g(:TEMPLATE.NUMBER)
+24 2079 y(IF)h(\(RUN)h(:CASCADE.LIMIT\))e([OUTPUT)g(:TEMPLATE.VAR])24
+2137 y(OUTPUT)h(CASCADE1)g(:CASCADE.LIMIT)f(:CASCADE.TEMPLATE)406
+2195 y(\(RUN)h(:CASCADE.TEMPLATE\))e(1+:TEMPLATE.NUMBER)0
+2253 y(END)0 2369 y(TO)j(PREPARE.LIMIT)e(:LIMIT)24 2427
+y(IF)h(NUMBERP)g(:LIMIT)g([OUTPUT)g(SENTENCE)g([GREATERP)g
+(:TEMPLATE.NUMBER])e(:LIMIT])24 2485 y(OUTPUT)i(PREPARE.TEMPLATE)f
+(:LIMIT)0 2543 y(END)952 2779 y Fh(22)p eop
+%%Page: 23 23
+23 22 bop 0 46 a Fd(TO)24 b(CASCADE.2)e(:CASCADE.LIMIT)g
+(:CASCADE.TEMPLATE1)g(:TEMPLATE.VAR1)668 104 y(:CASCADE.TEMPLATE2)g
+(:TEMPLATE.VAR2)24 162 y(OUTPUT)h(CASCADE.21)f(PREPARE.LIMIT.2)g
+(:CASCADE.LIMIT)453 220 y(PREPARE.TEMPLATE.2)g(:CASCADE.TEMPLATE1)f
+(:TEMPLATE.VAR1)453 278 y(PREPARE.TEMPLATE.2)h(:CASCADE.TEMPLATE2)f
+(:TEMPLATE.VAR2)h(1)0 336 y(END)0 444 y(TO)i(CASCADE.21)e
+(:CASCADE.LIMIT)g(:CASCADE.TEMPLATE1)f(:TEMPLATE.VAR1)692
+502 y(:CASCADE.TEMPLATE2)g(:TEMPLATE.VAR2)h(:TEMPLATE.NUMBER)24
+560 y(IF)h(\(RUN)h(:CASCADE.LIMIT\))e([OUTPUT)g(:TEMPLATE.VAR1])24
+618 y(OUTPUT)h(CASCADE.21)f(:CASCADE.LIMIT)453 676 y
+(:CASCADE.TEMPLATE1)g(\(RUN)h(:CASCADE.TEMPLATE1\))453
+734 y(:CASCADE.TEMPLATE2)f(\(RUN)h(:CASCADE.TEMPLATE2\))453
+792 y(1+:TEMPLATE.NUMBER)0 850 y(END)0 957 y(TO)h(PREPARE.LIMIT.2)d
+(:LIMIT)24 1015 y(IF)i(NUMBERP)g(:LIMIT)g([OUTPUT)g(SENTENCE)g
+([GREATERP)g(:TEMPLATE.NUMBER])e(:LIMIT])24 1073 y(OUTPUT)i
+(PREPARE.TEMPLATE.2)e(:LIMIT)0 1132 y(END)0 1239 y(TO)j(REDUCE)f
+(:REDUCE.TEMPLATE)e(:TEMPLATE.LIST)24 1297 y(OUTPUT)i(REDUCE1)g
+(PREPARE.TEMPLATE.2)e(:REDUCE.TEMPLATE)h(:TEMPLATE.LIST)0
+1355 y(END)0 1462 y(TO)i(REDUCE1)e(:REDUCE.TEMPLATE)g(:TEMPLATE.LIST)24
+1520 y(IF)h(EMPTYP)g(BUTFIRST)g(:TEMPLATE.LIST)f([OUTPUT)h(FIRST)g
+(:TEMPLATE.LIST])24 1578 y(LOCAL)g([TEMPLATE.VAR1)f(TEMPLATE.VAR2])24
+1636 y(MAKE)h("TEMPLATE.VAR1)f(FIRST)h(:TEMPLATE.LIST)24
+1694 y(MAKE)g("TEMPLATE.VAR2)f(REDUCE1)h(:REDUCE.TEMPLATE)f(BUTFIRST)g
+(:TEMPLATE.LIST)24 1752 y(OUTPUT)h(RUN)g(:REDUCE.TEMPLATE)0
+1810 y(END)0 1918 y(TO)h(FILTER)f(:FILTER.TEMPLATE)e(:TEMPLATE.LIST)24
+1976 y(OUTPUT)i(FILTER1)g(PREPARE.TEMPLATE)e(:FILTER.TEMPLATE)h
+(:TEMPLATE.LIST)g(1)0 2034 y(END)0 2141 y(TO)i(FILTER1)e
+(:FILTER.TEMPLATE)g(:TEMPLATE.LIST)g(:TEMPLATE.NUMBER)24
+2199 y(IF)h(EMPTYP)g(:TEMPLATE.LIST)f([OUTPUT)h([]])24
+2257 y(LOCAL)g("TEMPLATE.VAR)24 2315 y(MAKE)g("TEMPLATE.VAR)f(FIRST)h
+(:TEMPLATE.LIST)24 2373 y(IF)g(\(RUN)h(:FILTER.TEMPLATE\))95
+2431 y([OUTPUT)f(FPUT)h(:TEMPLATE.VAR)406 2489 y(FILTER1)f
+(:FILTER.TEMPLATE)e(BF)j(:TEMPLATE.LIST)597 2547 y(1+:TEMPLATE.NUMBER])
+24 2606 y(OUTPUT)f(FILTER1)g(:FILTER.TEMPLATE)e(BF)j(:TEMPLATE.LIST)e
+(1+:TEMPLATE.NUMBER)0 2664 y(END)952 2779 y Fh(23)p eop
+%%Page: 24 24
+24 23 bop 0 45 a Fi(References)0 190 y Fh(Ab)q(elson)16
+b(H.)e(and)g(Sussman)g(G.)g(1985:)f Fg(Structur)n(e)j(and)f(interpr)n
+(etation)g(of)h(c)n(omputer)g(pr)n(o)n(gr)n(ams)p Fh(.)j(Cam)o(bridge:)
+91 248 y(MIT)c(Press.)0 338 y(Allen)k(J.,)f(Da)o(vis)f(R.,)h(and)g
+(Johnson)g(J.)f(1984:)f Fg(Thinking)h(ab)n(out)i([TLC])e(L)n(o)n(go)p
+Fh(.)26 b(New)17 b(Y)l(ork:)g(Holt,)h(Rinehart)91 396
+y(and)d(Winston.)0 486 y(Bac)o(kus)i(J.)g(1978:)f(`Can)g(programming)h
+(b)q(e)h(lib)q(erated)g(from)f(the)g(v)o(on)g(Neumann)h(st)o(yle?')26
+b Fg(Communic)n(ations)91 544 y(of)16 b(the)h(A)o(CM)p
+Fh(,)d(21,)g(613{641.)0 634 y(Golden)o(b)q(erg)i(E.)f(P)l(.)g(and)g(F)l
+(eurzeig)h(W.)e(1987:)g Fg(Exploring)i(language)g(with)h(L)n(o)n(go)p
+Fh(.)i(Cam)o(bridge:)c(MIT)g(Press.)0 724 y(Harv)o(ey)g(B.)g
+Fg(Computer)i(scienc)n(e)d(L)n(o)n(go)i(style)p Fh(.)j(Cam)o(bridge:)c
+(MIT)g(Press.)91 782 y(1985:)k(V)l(olume)d(1:)j Fg(Interme)n(diate)d
+(pr)n(o)n(gr)n(amming)p Fh(.)91 840 y(1986:)j(V)l(olume)d(2:)j
+Fg(Pr)n(oje)n(cts,)d(styles,)f(and)h(te)n(chniques)p
+Fh(.)91 898 y(1987:)j(V)l(olume)d(3:)j Fg(A)n(dvanc)n(e)n(d)c(topics)p
+Fh(.)0 988 y(T)l(emp)q(el)i(M.)f(and)g(Mic)o(haud)g(N.)g(1986:)e(`Bey)o
+(ond)i(T)l(urtle)h(Graphics?')23 b Fg(L)n(o)n(go)16 b(86)h(Pr)n(o)n(c)n
+(e)n(e)n(dings)p Fh(,)c(Massac)o(h)o(usetts)91 1046 y(Institute)j(of)f
+(T)l(ec)o(hnology)l(.)952 2779 y(24)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF