From 088ec2d6d95e017e377e05eebd3eeef7e8061148 Mon Sep 17 00:00:00 2001 From: Eric Swenson Date: Sat, 19 May 2018 22:26:29 -0700 Subject: [PATCH] Added NGAME and games invoked by it. --- Makefile | 2 +- bin/games/chase.fasl | Bin 0 -> 13101 bytes bin/games/eliza.fasl | Bin 0 -> 28762 bytes bin/games/go1.fasl | Bin 0 -> 18801 bytes bin/games/go2.fasl | Bin 0 -> 31460 bytes bin/games/gobrd.fasl | Bin 0 -> 10597 bytes bin/games/qb.fasl | Bin 0 -> 11408 bytes bin/games/stone.fasl | Bin 0 -> 23289 bytes bin/games/ts.bkg | Bin 0 -> 145170 bytes bin/games/ts.nimlin | Bin 0 -> 148018 bytes bin/games/ts.o | Bin 0 -> 90976 bytes bin/games/ts.sprout | Bin 0 -> 123884 bytes bin/games/yahtze.fasl | Bin 0 -> 8708 bytes build/lisp.tcl | 29 + build/misc.tcl | 17 +- doc/_info_/o.info | 63 + doc/_info_/o.order | 16 + doc/games/go.info | 89 + doc/programs.md | 15 + src/ejs/ngame.272 | 2023 ++++++++++++ src/games/animal.(init) | 158 + src/games/animal.133 | 2113 ++++++++++++ src/games/animal.bare | 1 + src/games/animal.bugs | 3474 ++++++++++++++++++++ src/games/animal.info | Bin 0 -> 964 bytes src/games/animal.news | 9 + src/games/animal.onews | 53 + src/games/animal.origin | 105 + src/games/animal.rules | 13 + src/games/animal.save | 2 + src/games/chase.(init) | 4 + src/games/chase.info | 105 + src/games/doc.(init) | 1540 +++++++++ src/games/doc.102 | 1547 +++++++++ src/games/eliza.(init) | 5 + src/games/go.(init) | 16 + src/games/guess.21 | 105 + src/games/lsrrtn.1 | 140 + src/games/lsrrtn.insert | 135 + src/games/parse.20 | 226 ++ src/games/pattrn.7 | 279 ++ src/games/qb.(init) | 8 + src/games/sprout.rules | 359 ++ src/games/stone.(init) | 7 + src/games/think.(init) | 8 + src/games/think.2 | 491 +++ src/games/wa.(init) | 349 ++ src/games/wa.10 | 6901 +++++++++++++++++++++++++++++++++++++++ src/games/wa.plyrs8 | 703 ++++ src/games/word.3 | 151 + src/games/words.50 | 1463 +++++++++ src/games/yahtze.(init) | 11 + src/games/yahtze.27 | 241 ++ 53 files changed, 22974 insertions(+), 2 deletions(-) create mode 100644 bin/games/chase.fasl create mode 100644 bin/games/eliza.fasl create mode 100644 bin/games/go1.fasl create mode 100644 bin/games/go2.fasl create mode 100644 bin/games/gobrd.fasl create mode 100644 bin/games/qb.fasl create mode 100644 bin/games/stone.fasl create mode 100644 bin/games/ts.bkg create mode 100755 bin/games/ts.nimlin create mode 100755 bin/games/ts.o create mode 100755 bin/games/ts.sprout create mode 100644 bin/games/yahtze.fasl create mode 100755 doc/_info_/o.info create mode 100755 doc/_info_/o.order create mode 100644 doc/games/go.info create mode 100644 src/ejs/ngame.272 create mode 100644 src/games/animal.(init) create mode 100644 src/games/animal.133 create mode 100644 src/games/animal.bare create mode 100644 src/games/animal.bugs create mode 100644 src/games/animal.info create mode 100644 src/games/animal.news create mode 100644 src/games/animal.onews create mode 100644 src/games/animal.origin create mode 100644 src/games/animal.rules create mode 100644 src/games/animal.save create mode 100644 src/games/chase.(init) create mode 100755 src/games/chase.info create mode 100644 src/games/doc.(init) create mode 100644 src/games/doc.102 create mode 100644 src/games/eliza.(init) create mode 100644 src/games/go.(init) create mode 100644 src/games/guess.21 create mode 100644 src/games/lsrrtn.1 create mode 100644 src/games/lsrrtn.insert create mode 100644 src/games/parse.20 create mode 100644 src/games/pattrn.7 create mode 100644 src/games/qb.(init) create mode 100644 src/games/sprout.rules create mode 100644 src/games/stone.(init) create mode 100644 src/games/think.(init) create mode 100644 src/games/think.2 create mode 100644 src/games/wa.(init) create mode 100644 src/games/wa.10 create mode 100644 src/games/wa.plyrs8 create mode 100644 src/games/word.3 create mode 100644 src/games/words.50 create mode 100644 src/games/yahtze.(init) create mode 100644 src/games/yahtze.27 diff --git a/Makefile b/Makefile index 04509f4f..f8ef2eed 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ SRC = system syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \ chprog sail draw wl pc tj6 share _glpr_ inquir mudman system xfont BIN = sys2 emacs _teco_ lisp liblsp alan inquir sail comlap c decsys moon \ - graphs draw datdrw fonts fonts1 fonts2 + graphs draw datdrw fonts fonts1 fonts2 games SUBMODULES = dasm itstar klh10 mldev simh sims supdup tapeutils diff --git a/bin/games/chase.fasl b/bin/games/chase.fasl new file mode 100644 index 0000000000000000000000000000000000000000..29e9cb0b51b0ff485da2d62ba56aa48df9067746 GIT binary patch literal 13101 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 L7XKFiso?(uD!%|U literal 0 HcmV?d00001 diff --git a/bin/games/go1.fasl b/bin/games/go1.fasl new file mode 100644 index 0000000000000000000000000000000000000000..11f1bba2862ec763694a21c0e287bc39f142a0df GIT binary patch literal 18801 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 MRe$0={##4`3skzK4FCWD literal 0 HcmV?d00001 diff --git a/bin/games/go2.fasl b/bin/games/go2.fasl new file mode 100644 index 0000000000000000000000000000000000000000..c21732677b4370dd926ae6832336eee22bfe56dc GIT binary patch literal 31460 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 F{|9~EA20v_ literal 0 HcmV?d00001 diff --git a/bin/games/gobrd.fasl b/bin/games/gobrd.fasl new file mode 100644 index 0000000000000000000000000000000000000000..6b0c43c47b89c2388d186d7307ce2b836757b44b GIT binary patch literal 10597 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 literal 0 HcmV?d00001 diff --git a/bin/games/qb.fasl b/bin/games/qb.fasl new file mode 100644 index 0000000000000000000000000000000000000000..f0051f5584f8de973da8bd07ca370855b3ff6762 GIT binary patch literal 11408 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 literal 0 HcmV?d00001 diff --git a/bin/games/ts.bkg b/bin/games/ts.bkg new file mode 100644 index 0000000000000000000000000000000000000000..a509d2d3980bd767a8154717998a2516986163fc GIT binary patch literal 145170 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 literal 0 HcmV?d00001 diff --git a/bin/games/ts.nimlin b/bin/games/ts.nimlin new file mode 100755 index 0000000000000000000000000000000000000000..cc3347ceb61ba388f192a2faf723a91cef0f572a GIT binary patch literal 148018 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 literal 0 HcmV?d00001 diff --git a/bin/games/ts.o b/bin/games/ts.o new file mode 100755 index 0000000000000000000000000000000000000000..b3253aad1dacd86148a2427ecdb59eb2fbfe5523 GIT binary patch literal 90976 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 literal 0 HcmV?d00001 diff --git a/bin/games/ts.sprout b/bin/games/ts.sprout new file mode 100755 index 0000000000000000000000000000000000000000..543a8972e5c4a1b8a30efb6c6578979933b68477 GIT binary patch literal 123884 zcmce<32;j_f%4&y0 zRqd*w-L4w9pT}W4+zyX}a(F7-E|1&e=c3(imy4?K`1v{94j$p5DL*$&8$pqoh*sfz z-}m3Vxkxvu>WGP_2rl>LJ=?$k=Rf~BH#Dr2Y1FK8ZYZ@k(ys6q+7Q?qu~aEFBj>Xduc{I#PeRDLOc`~Cals$*2CqMJDZ z<;vNG>N&$o&62yDDxgd^^8+fI-IRrfGn5H+(%NsRq9w=nuf_eEQnOO+xKW#yOlwy+ za?&G_@f?ix_kaDLUtNc89C&5gjUUqvME>Aa+b#DiQ$uiOz|@QJo3^82Q^V%MVWpb< zXec~8pepC1ep7IxQn^drOLFe)q)~z>V#53 zmo_vtv+fMK1iDRYZm4PM0>M0>OzkE>w9jNw%3>;sME+p1Doc(+uX4%fotYOm%9*^p zSa@;7F3Oap)QHLQ`+o_T&i{TqVEP~o44X)=_5AHa{`S6Q^=eS~9|ESgo7_qbmJKM= zvinAGC!?Ae4yfGFzo1rLk+{R($PnCaggKu*w$J3_uWv@xJw^F5?DC3OKQz@L-R zKD==bURai)W$8%Xh8|Grt@`2|rRHPQJGI}=22`E}?2ziyqJnwq6jtZ4&C|*RnLn}|P$g$AqKd5iRKUC@qsnO~KTSzsJ zUzxV@w;@ZNQaQY9l^12;p-sCS+3hO)S4v%L1o+!R!^-p#$FfO^+`!20;-4vshu>DJf!UL6KlulScUU6PbUj(k(grqK~0}44B?+Zd0c1iyr|0 z2}-0|vlGB?Vgb;xAC5xg6sTCuN6nQQD8i*_}{!sXM zBm&7Z6-)E-TMzo^2$H_-?aJgC&xbys)V{?&Hame`v#(E?8X>wWGqg;ZUOVVe?JDR9 zq?yPndo8P#smTJoY>CyVyt7rA_HRIY%@z#uehml793dbGLF2*%jxcoq4%HK!h5?2C zQJLPhOdp0A_#g`+1|cY@E-AvxzPMH7hQF*y@Lk)hlK&g#Q|Nc4%Qn!Tiu|##{@h*E~ z)95)Uzoq1~OOZ(AMnCT^vLbaE$E06ylMR&P5rduCU48WAf%_tn-xQo4$4{S;OqVF- zmo|Ep>9EtQ3YK6b1!qyAVCCrOWAZ<%OS>WwXedXe4NWh(uXog3(1~^m9tX_}R`#Iw zN@&}HCqwI1!HXdC*}WGJKFfzj%lc1)yP03@?Q&{Z%0ud22}7I22}7I z22`+~16q%UI_3)oz_|tQ2?jPdjgAF#0z<#Gr77R$(61if{>-=~&~+Ay&bQf?HaHsm zC7!@o1#fa38!g4%u$xt?t8>2TgfbQ8x=PHE?=}{^#eu!dfu*mWtqOKz;0`4PU2@4O z*baIZoKLF&mD0-HUD;{n<^pJ8)pcD#hSUitdhO5Ov3|vdb-b6s;!^O4KG+vC2FFf0 zR%DMI2^JiP+_7ZwaaH!%L*w%TYN@4jaO|`thrg}P9y>nnRBCCk@IYk3GM&Hqvd119 zcd}g9;Mf_4u8zYKY2@j$tbuDdK8>UtFi#j*{cEPYRm$w z=~yT%(XlWVI(sg17y4rR@wy>Zm>+sZ6;@BIz{TSp90fFm*`c#)@T0o>)Zi}M6;|U8 z#YO|ePsS^NK?~C-Rs;&GU4?_Aq2C1HJ#?UKyaM|(QO)H-J#5cQs2XdNoy~}G#mdm| zDU}|%^`Pg~$alXiv;t8DS9qBqP-Kn5Swxu|zo~ToMky#X^HP>ZbC*^<0+dy6ES!Ot zQIt*MkL3d!miP6tGSFRE&6_xmmgqS8*%H8{V`w2UbY!9p5q*0$(Df8L=vqU3Ok>^iY-PJtOK64VfVZw6YUPOcdlzP-EB@5N zYRQ^BZ%qs>%gL<*F150T z7I^pIOk(66k!`$4z{uOc2$11~Sf)9;ff0wdket|cJ+8jib*){~+s9^f6cpvgP(Utt zn=C_TY^XYzi`Ih$sxac-h2fEE$HV+h9yN^ESj3cLy69P6A}CrC%gxJtYL)pL3(ufJlvwacO<%GB)!E@+zF{rzVia4WQ|u)R zeh%iVqNVV{fPrPIs5<=DfugyV4B`T=hRL!5cOZ%HsgxuM7O-v_>VoNu7KJe-Tng}t z%Fs>MYF^e5D=!l(eqv>!m7L1L6r_YA&$7rmDPnbCXmIyXZZuH%?!;ffn}p}6wLEPS z;_m$JAOG9(v4>O<;VHsDRg_EK&L;L8#9nt2s~4@)u-8QFH8{GmZ>(KivB(Eyw$utAKAP77z?MO=)FP6D=~#c3@gfUOy@ zr8Val(b3cu8%xVycmEXFdSkF}<#RvvHY_iPonhuT62M=1-tD;?XO9yG9 ziso4$JG(4BFvbAmO(CnLS9|&}22YH7;vW}1PoUnwMPttg4M_L}fjW?OUpIhSM4;CH zkD?Dzq3gQ%Rsz%s_}9Dfn^G%Qu8k^XfeebKc&858F8~?Gb_EPoJlB#5@C-DtB_kh} zs6Z9>Sh87y2uRkwQE`L4qDze$g{rtNJdLA28Y3S> z&1AvQ=2_ZTqdkQhkg(!;(B;L00yFUwvSjhM0yG74TihG^SAi0D;r~MwTUq3mK#9BJ zF4%BD`Dg6tfmlbxi)Fe4eE>QAu{GNBG!O7U#osVt-T)Goydb_9j7P}^ zP^tuOSZYe)?NLrQfQ}zqrlCgY0_nIGcVy^x%MAW@4GmymU8_MemCZZ$yKN;$O_ObZQ^lz`9Bhk?+E+XM4j(wp)v*t6tSa3+fogk+f%f5@^*mGp6> zJBYnrj0)2x;H8teI!ojTuAby?tN8dN5p0rj+9O`9VBsIiBLQS&XZ!K!qZ)jIb(d?8 zg6A}hO6H)=t5xwnqWF2DuG>w85Z+Q2xl8A+BlH0*Ch^w?V+b2EtV*n{?V^v0FG2yJ z7Vy>WrZEf;y&SDoUx@i8{8^O--i_7*+m^gK?x6Zzrb-4ZVB0j}<~2GduaM;Dbbq0w zKm1Rsj0OlnMV-NYLN8}Ldu%st^E>O}*G#%%qhrHh-Tsw*P`3Nnd22aO3 z5`qScRmsc5!Al7B@ecB82d*{{8_!31^2r3AG(n33Xum4)bEG|?^QdOW-3GUVpl;67 z3+G_qmK+NZ3%b41cocZyAP*2%J^bw@Sn(2n_-LR+*y1p;W+hc$7Ue^rUv8{J%Y3m& z-o`-f9jXUJb-=;;(9?mE=c3$6QlRAo<-;0JhyDS*-5adBB>+n&O38CT7+TiVMnV7p z6LGwFMwL9LGegPA;PgPrdnml^S)e#tm&08fGbLKg43V2D~oWz$rho%abQxVdmFD>Amc=S2+VLP4{Gg4YMvFvGR9G@zk z7Jd}$OUMpP`~X@Accr-?SZSH34sVI-i`F@4RC_@O5?orE7v2&mE#q%FmVEK2Ya(~+ z?&};yf1DH1lxU%r8v5Do;+iJDm{{>H-07bLO1>>C1S-T$p6FPF-=4x^URj3zTli7n zlB2jCA0E5S7MDGAb|$;6*19FYdC_j+%GcdTndErlFD90;i@#E(nPoY87Zb}kl)nm; z=9W#@fAhfQp~#nJ$AO2OmgX%41rEi3bIn#=%VR8|x%Yqg?$3YF8u`Pi(pfiv*4KHV zkD<~qWh*TqOJK^DuQW#=+)!G~OHtbPZj>1s21^XBE`?Rq9etIB`*@t9qqA>WY{FYs z1lWYYV?a{r!n!4hkjAvdBB}?mc7|RBBdKS`=hK&3i#rHsnHHM?h09Ekg)&p2yxg}zGeDO<J<=kFX1{REB?QJ20rUzIMw;$GPd68~9xQY7}H0son%6{>VU&{2A~48muEf+@WU zPAk15&Eryfib`Vy7N9gj=za!lAXJYhcCnM4dC<@HE~5Af95WE{V?YD%tSp@aeQ0xz zD*fAixY2_-8kw*1+vWs4!LQ@e?r7|1F`5#rvwUzVya~+ zmom}-W?32(O6lF;E5H23ow1SbvP?cw)0ED~Mdd=tlog2G!IRXWrpYP04(m`>mNvpU z%nn4=ZfyKnX$U0}?M^&k54%%#Js%e(cPGF?Gp5)b|H@9WJ4%^LPot@lT|lPT9dk@A zox_OB<64Ob-AaVIfKcPPPRlT~2ryN)kcBmROmij3BQ8S64rs*l{rr|F}zT7 z83=4H3qjFR)XZfNFmv9$rWWQr&nmP68kA98l{s739{WvDR~*40hg-+tQeBlX{#WJ# z|Dd-NGm>7`aI%Irdn2FGCZa}6!Ewwb`ee>LExZ|HX3M>hU~@@SDY(YYaJu0L=}I9J zvJ9~D0OcetC3A1l<)i_W2WEai`{?G?%1o&$oevFQo>4ah$$kbR&b~U~8k$QWtmt18 z)=s^{;(#Ws8N@&r;jxF#&ZTD9plgN{(O=S`gxH@Z*!S!y)7vayo3LdPXuBK!J5}~P zyhZc0(7)mZbe4G z9uLs2Bm^}=!yym#hhLeehkg<;7YW;tV`hctpmY#ev^2+csY(fo75Z zp9+CE(h8x2=U|LV2+x{iW*9nKK~%Mlrley`xnoSCy30NxwAT^#L9YPnI)NGz0>Sd4 zuX_*((sm!=`J)7aazn9alm>Q1)QrZ6PBU5$)dAZP06vHX&z|^OJd%7FLw5LEt6+7W z!X$$Do3%JYm2HCl7LnNYZ1~1}2|JWU!Z(!656dFS^jJuGR0=)t!kjyO#bD0ju`~P3 z496C|0V9us2Qactd~%382Vz8?u2&qz4C`8s_%nHB*$C{T~e0GOOdWN z&E=ESCN!oQ9(|6vB;7OuwRse4X*Y)c+B_50jMe7v)4==@ToyoMn#-nWOoW7VPuH0=To3QtyoE}!pB%Ea-mO%-rBM9v zxpaJ2PxZIyTf-8X9dX~9w%Qc@k$RvXQ%3VvxVC0%PzB6e+47)K+@|mm~Adr&<<{oys?JGN<9^Fpwnq2Ig0ZntVQLUO%z&3h)E0 z3CT>EZ`4uti+1H(%YlSq+$1Y`)ug^8T+rB;Z-8+uSP3t_+zH2{ydT=GykFF&(L(R| zJWQq7g9KEUNy}iQ()r-d@?P+1`8+gVJ`YTYM-mA5Enh(PE@Qvb;%~`+64-=Rrvyax z9$Kzag%$dvF^@xgbC3bhD>VCLq|rulY(Zl(M}h}#v4O|* zy2glwHPZ(9FnoaWO<|@15;?oU{#}cCcL2^kUKqG6!Sva(Hd0zJ>5|_N&8z z(O=^*9^o)1$F>u+6tT;44-ww0+L&b(Gaua4*saRzITl7rXEF4F$0)T1uvD)GF6+$? zTw*JSr2&>(Am!vSrRsw~lrKPfY1d*lzc$EJ=pgzP;`PU1+XP90(m)hra!Lf0Q2Byj z0ph{XE5MZjZveZ#H}our@=fpseQyw==mj8r$$>wJkxI6~tYI?ECT;Y1`#IkpARNMz z2_p2TLP;`iF(hLK#_Z_EJj>FJusK{al$%CTOJ1Q0LXSTh%(sE&r~y%%iU^A77RM?y zHGcKa5xUS(vV~GHpB&b26xN65i5GcnFF8&Tp8+_a6>~eM!7NMoAE+yzhrERHI+E-$ z;6M+?#KeFI+e6;?tzeCp2^K!Z7tFO9_z=HgoqPtVzdlO+vEVdPzZfWCAJ#ba`B)I= zShfNhse$ua^SGNN$$tv#5!suJkZn<9DI%Ntc~c5xgQZq+Etp&fb%V$0q>RDJ2~oVs z0Xv>+S&KzaAfg zMrq&;Hn5SsO~BnN@Ap8&okTHnDavbcF`wccU6+Ag)_7HVW04J$3~lJpH(PH<{=K_= zE3BpYAT8}x+=-(TCUF8HS4?jAvgTXDW8X{xgVS;zHh}P-qH7cDLTckxL~!Q2&VWIdo0Xm%@0(3 z3>Nk=8Mb`gWUNxUu-sU&7Xh}4Jp`NCeqtX=u|!ml2&{SM2R6A z*uX|#Ad(GZrI6N&k5gJq-KbXVwmL9wuvf)zIgB?T#;9h*V`)D@(tr~d1T)`?-N8Hz z7mBXpw-B+4-5s2UkrOmGjNpF;(nF&{swb!1KrYZ*aX?i7XBGR#9m*7Ov{MBjY@p!K zS9~lBjN`uxpbuFqH>rxxQiw^#1zk+gCE&OKF#%40jk+A^9@shz7bE?c0Dd2rid-3U zxaiMi{#<^9h@~Qdc?C|n?lKTtcNut^k3QmABZbw?K^ChD<`tGlU|%YByZy*8C#4?> zg7=UgAA6gIx8Z!KOTIlWi~N|pN9)ElTk;6bvdh&vX(y?kirv~sIUtr>$uV;74cOQrLs0_*=eU(0xFH?#O6O zp|QxUpCFy7VjrfP6`w#2f_L-CaLJZNBI3-zK2ARPlyF!$@aW@%Fv#`fQG6G z@2AA%VQ9dLPs5Fx=Tvc+zis2tG$l!}_F&+{BW!>Zf6b0R3Fb#N1LhB%MeYasNN@ug z7#?6?7!-`rE&4chZI;r5mcibWO*n+)QzIdfwPW%1g}#~zzYOp#E0ByrY%GP5q1Y33 zQ&MD&^})oGFr{K{qKP(GuMmYt3_Tymkf2i!1VG^(0>aoOk|F}ynj2T3rzkwk?JJfM z8=Asnk?llr1MxyHX#kG58rT-cTAY3OVhfAVkBmw!33`G3ZY5&+@uK;*sR6KA4N@goB z$DyMnJ*eUln#gWGYBPCQvkD|mXH;BHU+h4cx!st_&-GU9M2TpONS5vpMz1(B$uPzr z<8RrrTEC`u!&;icSVCXL&!QIcMLm;An>V9K#RI&^2pNW%oi^2o&&F7DFu0}AwdqT- z=zO!`FFsv4cDQ@CN?$TkfhAU&b6mB*j`eFd$5t3CXHm4pINR|W+RV2>j2zt5g7vTv z1<%o&dL3IeM#E0f8045;f~CdLFw#zoz$3G-6Z4$)!a1Qfkd<5%t4!A!xiZ6ZNY;F2 z*MaXO?of#|4j|cxvtT1CGsKXA6DqTfWRxM?bTMSo9t>z@E`%~=90R=-LgJwEDszog z9@JK4t|Y$3+RIBhKJYtw({f-j(r`ZdC05pfQ!j)M>ixb{z<#fZ*n^-RDtybm% zzm?NrV=FUm*92x)KuuTX8Tk}2&6QcALt;qG#J~Zxk;j>j!ogzBO3{3#p?E61(9-PE zc()9(5Z&Y!Jc&I#qu_>uRa8@qrBpIFAz4ZAt#jC>fdZ6;Sc+(Jc%(8L;gL$NLsnw# z0z^eq5}vD^Nz6S@4ziJhxcehoMAubQC+jG;oHgd?MfCVy)Fw==LAC^5eQy}ym0U4X z&!j>T18j;HBU3^h^}dZ@1M)8}lPwFxEjBsyZA`%dzBk0O0F%Cr<4#zIPDD)8ge%~Z z5xZ=8Qj#V(Ak&zCk(#M3_0K?ij`f^&UV&T-STVZ23Cc_fup)YO5Ar|?d~X^_X)vEz znHd4Tor(jih025}oUzV-4hHivaNzs75lXC7Kl&^gMGTmW0m+RHpHf^&^1X@uVKXC~ z$7OX+hvI`M_X_o7#XaGA~30>w=? zl{Hh1K;=vrfy&DC9_rclcFdDTiYvKOYLXGCoEg{pY)`FOzoxIVW8F&L=SYomNyE>C zwXPhC>0W4Vc*zH_VBUizF5XS>?lkZ2@a`1ExL_rsl$93|udF;Io->ST0152qJESeLL5nxMG`BQgIDlZ2Waos@-rxW%0*CKaM%me8Z*5o93@!OQ$Z`Q zu%jB{?~tK-V-7mm>QM6os*)>a2~=%lN99^a!1$qXZzpGQI$2+?}p4Xet9 zw8xkE_Fzo<@8jOG+&}!>d-&?u!`+p~6y8z=R5IUNq9j!&k$(K95O+|rSEF)*(tj)c zelN=S=>qz_l?U-MD*b>6#7uQjd?8+9TsK7Ea7@S}-r+=xHS1TbS;0Fp19d}HY^&3Y zDYoK>1McYNG_6=wEe+p?u>#mC?x9Y=+kE1!RPct>3nt!F&7h@~Xc8B~B*t1*Wx-}s zBQ^_W{0&S?9cOfB1KN&L(mXNq+LD2)4AM+mHK|*IfE*Y*I*Wy_s9FlbR5f!*g&agJ zA33AZ6G1c!t_G|uQovDbVT2d~6SkxPTb0K^rz+XE%^g!!vSTWrc#OI4RdYeRs&(nR zsJVyTpxv;!stP3%H8*RhzD?aLS8V9RU5p6N@Q%*$&oG>s9C5W^jF{xmw{e))`8yYF zG)%6DdQMfVSYp40nVHN7z`Csk#t3D(8ZWt>AUl*$m>x8 zDEK{5@kk3)J&y;C6i9o;U5pghbW*%HV{kOO9cOT~`H-p_Bp`VNDNBgJ;a?2Wd|-N7 zHA2RQ-K_cwu1D2ZMtmyf5pkxf%i$xK>Jakn6v4~1ksU~is2T}f4UmcfEeOK1H>&1A zx1l{FKZT25u$EO{K_{T@uTd9jt!l)xT4Ni=!m7SN0%a9#XVrmZ!lV%%5?g}wRotSP z7-Sakj0h9i`-?lKvEz=aBfy(RogN_!e446|0by>EFk|V5%plAIAk2-&eo%E0bqxt~ zGp?;DC`b-NNu4^?Cw1!lVi;};hFHy|!hZ0)8qoIO0nqAZFfW{#B2|4Dj9N{>@8`-~ zKUe19q0{q5l)U;unRBqlG)q3p8TkUD{>E*p>v(fF%EeL0M!#mGI6nm_g#Ba#XnC@m z9#d@Kj_M2yYcp*9nmYa&Td$w;t^PM2896R{|DdQ|RquBCLRSD4YugTks@X zX#{Ix2De&OGcMTw1+j5ZP~3`gUKZX7)~xm#DV@++C>>2}gYhPZ)L-MK`KT#&aBlVY zw5Z2%vhQIU<-^|UW|Yvk!ltR}?+Mc)!9IG2x0-U%G6zUn8e1E3=`=n6BF^^!g9dEp z;YQfDhu;lUGoszUn|Qn+V+ZzZZ&}@F240gr7vhP(YZN57M!{|Ju~3+#t- zQ~e+Ckz1;4hoqc5^2NKXaliIRsbmo@EbF>wl1UL3GpwSsV5q_RB>$+BGq;Vmv05!+QG zVb;$Ausy_bwcq{alWX&SsVv-BVWCFvf0aY&L$^cKkV4zTELMd11zLxhnUc(r#(q*6 z7t3nwXJyOR5!GNhHZUnx5Z%xTSU{|+M#O^8Y&$GbFU+`XSBXt3A!`9!E+ZbUVt!$J zI3>)Yz+gCS%!IB!NnnPdj%?S6uWM{73z`Uz25`ufQj$ZUr) zU=Z>K%1z}Ba>O+woXXOV9!IhrkH?WD>`0)$C6^qxMi+9Ugd$2_fUtl7`M?Wc!}4Y- z*f5h6Dp;NtbP^j#ydvFFfO<)|oxprc-VlCHJ$hNVf_Gs%&dUjFJz0uup|g}_met`l3niHML*&u}cupUUYoxqeD${Tv(nh_4-u^2%FDScD4KLtk{ zB>TOLSd1nWV@A>=lor7u{tm=2`3TX38dGUbIXa|~5lZ?k=6O*Z$A&%=aK4{_VBi50_0HPymUEb1B!Qde5nh=T^!$f4R?OW}N0bZ5-oJ_0Ug z?3<&XG!ud;pXglv0>pk6T|Sxn7cK>)<+f(=RV$+)$1hojNaPF(U;>=y_ZVxo-+l!{X1ptNNyQhwpIUAv{MK^!LWOLG{k6mC0njx z%R4cLuwCYFT`{~c_F-K|5x-0cI6}pE#7HNS`j@n1Cn&8$GRGhP9l{>kvH{*6F~mj| z*jr-PikQ}j+czFUU+&I|Ja*wmzGGQ7@{1Ib5z$&I5M6q3_90@vKrEy>; zon{=`+1~f1OEj90A%K-@lrvHap|gmaNCT|K+=D5Z1Z23&hA57nYN3tghwS_$fmwp4 zc$$e&W~$^#0;otHDWd^HR@rwiVEUPM(66N(kWVigsT*y7U2GX1HKs&p$fBsrQKfK1 z7>cuQA{^ZMBhxbg1L}i24TP9m!u2eKC@|!!JNE)6i84@gmyP&7bQTAC{1M84`9W2V zD*5~yOY~?DjWQR>n8VT(!D2!~{{fPlOVEG~Vl_-p^76eYtw-k3<+ExI6YGpwPZ|Xd z=5TJEIJ+W8Y)`3+v5JSc?*!&pll2P|Df%Umf_c0s;#aowY@R7+bBb_R%}w)jn4sU! zNLRmGM!@L*cEmGmJFInLT$SxZ3hXe=><1K~4^Yi^AL~{T7)~`bIfBon`nTdy%fk8| z8cp0t&l(G;mOe1TeL^k>S`kKKUZK`h!hUaxBpM(mCfjLj7&j$PcK)QiU@J@nw;$Rr za4xWiwEVzGYU7rjM*U-&_g#d@OVr`a6xGj^INJ_rYVA-h!z~OFb0W!hw+^EL(&KZI zXP1#&>gzJLFH^o1MN3bCF@ibIas<0#^l)%gJ%U6I5}UwO|2jT0wZ`_Pl#4#9ey+{- z*UBSW!O;K-`XGfGCip$9R>PJ%+4*h(KmME6JjI3MdzD2VlyYod3!qT70KloLMW(+z zKN8c2fK3u=*0Rgpv?N>;o3mLSX$&tKDH+aB@q#TIBy5h?1iFrs9WTgivvUUKn9=DH zs!^~nAW~yvg3cVA2CFj&7FTS$^~Dw2ZhHE=jQB+l|7cvYkmP1^b?k1gP<3!p&fK**r$|ArP-zq94${L)QpkiEQmgtG zYm`Z4VbOpbDib|<5rySY8Qc5B>BqF)yJA6-eRQ@zp-;UZ0M=x)c`hRKbKwYaKgud+ zntQ`T0UI+bYu-+YHIXvP)&oX3O_ssW*%bY?1eT8nKLpeSmS?#KFrfIhfypdyN_sox z91zOP=fq1w@&oc7Y}>HJZhH?v+uj4vwrxPWBtO`AuCo?AItbqp&a9C;4Vv%Q$Own( zprIImy|D`iN5N1HA0+O1K$wjoKTYqNiSY(JYVs{<^@4`Y=lR?xmQMG0pnN?djCouV>zG#67s*HW9H0CFw1WAQY$nvqw+5S8>P^Pn) zL1azY-ba_vq8_di0G+wG;7nGqUJVuKC$O+cLYgB6H-Hef4GBoBVS-u2!ON(T&M~i% z8XUo8+*RGiMqbHl!IlW=aouRkxU+o{19dg1D%%Qe_fsz4B_g;HqMr+5{qVl< z8y@ji6NuENt>z4?p(6#z#e&7^q7O~PKi#tP(G}Ci9`f3_h9K!vw$D<|T&X)h)s9XD z3w)M}Y4$t(oTdR`AC5Z^2bD~4VWgl6p!xiO?Lz|n8Ac^p+WqMqDJ{040!V^)iURl) z1CJ>H)yFlRey-_g(c}GEANRx+TqfU3bc#NsRD1@y*?2N19t{+pzFX18%wwBH3iHm! z*~w?Atsir!7-#s5h0EyyNJn%bbhM{Y#~KI;{R5yK3X}x+%*Y{t8{m6M-xLHCwr45HJ0wqn;=F@g{DIL( zC3{%RJ3Suy*>lY3V@gsN&CXV`_dDe0chIGch|qZQBS8tnR6Fmc-i!X!?l7qk$d3~TV|X;=L~W#eYh;Qz@F*v;sfXDVBe%% z%ACOB(~UE;ZEvAieDSH)giYeLrkmiX_mS>Vn=WfnCkjDwZB;5mMSsKkRIN$-4dwD8 z8G+jAI9jqcJCYfwof*kexMZu^0<8#?;g@p9@u`mW9cwr7_;VZ&HO=-8{;!n7IjH{Z z9|84R`hu~uX8(D8mFj8-%H&8M`^J`b}a~>P7 zLuw$LPW#(%O6)^GgME|69e{(&p?&m?WailS86WBQ2^ZPl*2?h_FQ(WqHbsFJzp4+B z71j5tG-XuS8V!@%-{Ci5xO!!;!oke7jDPg~mi_J}n%ZzT$ZZmX@AD41{)q=5PDuy@ zT5^K{Wq$|8(tbabkbTHV3DJn+ggl&34H_xsSb=p?-G{PoMI^J9YsL0TLc}S#7>d4+ zIjY?P5r#3vtAU=fZ-ld9-wOR>e^;YXy0X7(qe(PhS!>ab1IMD2p(}q6TyzvAcrx1lT#-w@B zGM@U?M`hY4(H3O*1iBsuHil-f+*<5mk^zDGQR`@b4@R0Z5Q-HKJ%?Q4+;<4ONvxTk znQMQ~&;o-az!s2Nrsw8@E#%BeJE!0FJUEl~%|;9YYioZ`Qg$iRn^VekN51N6i%-AV z=rm&TJ(ywpn?XFjM_Jemn`7Ui&%Eth1R^)}Rd^Oit7)3^%Kmdpdp>kY77A;JJ5n}k8j0fLDF07{9em;PFDLilN97cO>g|1zfr3UKS_ZAzX1F=M;H-`V}9qhEl_)a zC>b(BNnB+rD?sV0Zl+j22!@h=P{#t1v9D(L3p@mC~W$XO2=nBkXHRWpeZQ(9)Kakt=;iB zF$dX0guNU^SPD0qs6$f$aGk-#1)l|($sLp^@^=CI_u`0P^Xu9C^BN+6&P|@RFh#_{ zPW%*V`fVK9}5_cS_mSF7~~GWZTnh6P1ZxhZf? z9P>B=oSw!J==PUEslMeLJym_*_xaetM_L@mT&)}*`C>7PoYdc{?ButL`1ZKGCAl)< zZ&R`!Seav{7$k?zEzs=6F7V1CJ&%dR15Zq{6)CAY@fXb3kq8Vwh9TyJnB1O{Mwps7 zto74CDB|84Bh*&NDhXvMtB#o>er$Og0v?W;un^!njD9Ah(UDJ#4?^LAEsRFbbvJA> z@1pXUdpOQlL^f0D;0ROiLNT%djv#sMTU&v%B5d5eO3hsk@0I*VG)>tjYRs5M`$ReB zZZcf05zu6_S|c_Ka)YJ|mUEG;=aRH2$1x|9R>E-(KZ588!8(e<#V8_O0&Bj((62Ch zDzZU1n*SSU4t?(^ghqGF^mIuw?A$kr>vy539W&YO)?}b|6UR7_y?|uf zB4i`qiPwslt&48j{ja}#^x1z_juHjKx(#N|{yFYsdhY0; zt?TBamKzE)=a`KIQAcZL+D7QT2f1DAxjsh)N+ccW5A!k`2V6L2i*dtj-BBqQ%+?)? zPvirwY*cmk`?Xy3Sh};5E2%QE#%XTY2c&0UIy2#>IMxY60x8aPg3?2LaC>Z@wmnwk z+qKGxy`0L49eT>i-Ji}(OpTn}b?VGBB9MqPX0t4Uaz+HwH#IrSpx~Xkz`p%+L|~je z$saY06kZnF0W^|$LOsjCpNBE&K!>ZgLw07S*9LbCxg2WtmPPE z4XPdZ>~Q~?nELKJi_uZWHEkzQVkX@EX6cNRe>U}kRMN&XRvanqK} z*GRD11L7qKSJY*> z#EmPN&^&T3iW@^h7ou89E)72v&aU+ApxTX56W3gDTv@qkNH>Ftc7ob!p(8!eHZxs@3)LS zUz}146)SF zDL>_T+#rc#Io*^4n0-1ALLE83;P7~?xN~V#A3AAtdk>P3U-EYk?)2R?cyWj?E=4&( z^>TfpS6iQ;yl^fA-2wrT6|#h+EDqv}_*+yW*J8&Lo z0G27)&S&U%G1JERV~YHK!7{<}(O`UTB!Gf>ZDvB;(sPjpULn$eY6@WTBsJxzCVogw zMhhn1N3ej$1cJvt!&;N`01O&v52pH(quL+#)1$yhU+3kmmUjHck#3Hw03w@5CHDT7 zXqw>L8rt{=knY9z?xUh09*4fzJ6dO)8xE>t}cTw;yc3loS3S=ilh9-PGQ1Pe+v#r{jKmq zjYH=1ptO2ynj%?~ZKuqDF_Eml3Yyj5(!X7YyJ6+L1Hz%2ktdRPx?cUmpl$slkns9z z!Swk!y`czAfl?U3B6NwS=37CFdc&O#x(uUk25QJB&=50{5zH?Ns`)ti0kGWyMbMr% z+Fk?rvHlT5DWMOHC?^I4pl`{(VFE~q=GPEPYq^BlpXTD1p_Fz5z5q?lnCW<11R|&LJZ?xP~Iez$L|T{qd1P& z_dKz70rFR{NvmA0dVYh@scDmLb2OAmL569aKg)jZh~RL%t~@NBikt zpsF89i8{=!cWw7_teRXP5 zFa<^vCGr67qzR?03`W24h@d!ZD28I-tHNEu3xnCBhREOOh>U|vo$xIVeXc*wA=iM$ zl9Wo}MqxwDk+*bTAO%Js;XoD1ksK|Oq-`8SiOCDkWP@-+6BxitPWjdlKz`CTnuncA z-xZ=!EsO->e`^RrbdOE_7^!Wz&r*-i)}M%>Yh>kNh30nTDOh(+@e%H%r6}v9&I2Kjg%Ukdi%CM^EcMk)X^tp zDW5#~EhbF$-27ViMhx=DKqEkIz=X6!H}!Rg|DafkM#BlYz?FD&9I25WqcA?EC-v4p zX2@$8_?T>ZBxi3SOWjU2+%Zuv@IdR2BfMXKf;A4u$Q}CsOBPNVvIPbnim`mih%Gqq z6T)Ofa@Dj~J|@d)v_9t=QuW7>D_Q?FzWY{x44-_fKN@;EP=AG* z^kGZ4sy}UI#tz-W2@2Wi@Ce*EHgCp+y8blP0oDYm1dQfQx<`1Lz|>INoJRDy{tWr| z3}z_xcMWw%^a~30XGkKR7O;S4@-L|71)o?Auo|Rql6JMiHsjOQFc6rQ)pP!`fS-oK zm<^;<-xcptIP|?<#>Xv6@u+Pt4wY5CS~!MHc_`Ntso3wdp;qE2oP{rmx`z?bckx8N z1>EF=JDq8`!?O4LLRF4nAp{Rj1t(N75yY`V|K&y6o|@UBduG0FQVJ727K-pdoMdl&JM$B-taitrX0nMG|esj#TTwI}9fFnHu(c`Mw2h%NktICKZG6uK(#EituWzS`HN^4mdzvw!*X8Q3TTbVm=9&$_*sDkcAfbX*Uc{H3*`) zYjUaqUc?X*1Nf`eML_;UTHViP&MPa*iO6pJyKD25->qRRCN$s^DRtPy}7 zNS>G^Y!L^8?gpduHnMM-&2HtROCQScgsz=jv152$=>%gXIX5ahXr-UkWSNbv4AS7m zzn-p_(`<1Pn^R(vBrt_#B`>5@YKA&EE}vismr4722{MxL9ds!G$rVvo1d9kUWzA#361RivO9Gh479%er^i81a zNq%26W7^3@2fHKR{munImGePF37t1_Cy_(ff>;^_Z{*xdS0!>OTzQ!zXeHBSLFCYt zQ$K>2`U!Ci@T*jpq{zRkQjhYxs*zvevc@Bf+Fe=zFVL;Fw_(y9yHV@9)@>M&gLJXg zq5cYfsl86aK?UM+^G;4`lusl>CN}VA2zkJ@j(6DT8E|#+t`?$Hu##{o|-}Slp z6+G7U zaEjqd*hC3A?Cl`LR)H9bzrj%PN9X5(hV*cs=BK&1(cg8^f?(SzJ>|}Q3d$Bm47HNx zW;LW4y^ZBz&P4>KCb zyf@c1eQC{ov(>^ecb|rJa!(k|x@38gpx(u-%gs*|yUU4#Gbz0_H@J?x<}N34c;<{d0XcD$ zXh74`V7cVugnBE;ovp%{t$0h4xd+K`XTsoTE{nOD84FMi7*1oU9=w%uIt9@{7Mr?? zF5!KPMeUx;T<91^A&GCQ6*s&EsEoHe(EdzQQ z$C8JpCRucl-S@N}!D~R!K>3~~!6w3e0S$X+3F^y4^+ZZklLaT5b}2Wqtys4Q;=pR$ zOqnn}pGBIA&&VTO+^0joCTzg`X>v;eM-R>oV35f%*yu-S_|_k7naAF`hoHyZw|O^d zNfa4{QE!wPPwtb^I5h7tsxn@#X@;{3ikqTzizXEGbTz}kxE~7!@DuOi)V?OvX4z2q zzX#kOM}46vFJL_m3lD}Of$x#@(31nT6{$^%wS(IF2eI6@VjPe={yRVq4j{Ez4jiCu zZXx477UO_)mP;T1H_%v{yMvEI#xhUxa(@$DY=_a? zBm>rf)DhLNo$W2*Wf@&K3xA4ws~8li_W=d254o}p??J9`fdg?qC90uh@U{muWt*LX zA1Hu^^SpaXLl^a=95W14=<~DO0%#gg_s!zFP!`N)JOnGH33jy#Hn&$4EF zp+gFhRGwAnXxNIEiPEY0ooRuF&#{53;XnjT@`VT?GRyIZmb8ot5k1OUCI;?t=~6ew zN!`;NEkZ^CPYoa~dP5vh(KNb>^c2Ej;O9V;r&d2b$JYaDdkpurOkN|_5|tWi;rF1W zWw^k~uqv4}S=Mxi-&2c&4GVbkpocLq&rC3ihkKzsd2yPO8rMmo3ZW?&#n+>oBwr7q zIu1UTuRMBYqMD~r2+JA;tjoMfjj(xq%;IBe!b0tO3OS(s7-6-!1gPeF`aoaNwpC*% z&7LAqs9`5BhjEb^m`D4TIUltN1=Oym9MttRX3ZgWt8zfy$`MaKN*GTlNWa)z!qcwP z?C4c z+IUQ*w1dR~4^}}aEe0xG4${QL#B&B~>K=Mxo-Mo}n*)u4rzJJGH(?f@R&D@4O%N!as8h&?VJ{W0uKV#n*VPMyh# zeD_~GccCRTo?J;SpADtoICCmHHUi|F#>_0&2-wkqI761B+j9~XlGH+4pi%R|$dba7 z2_F(6Ps)Z_hNoV{w^HB$HO{x%Q4({e#z9!tM(w+J0Jd=xjAdgTWU3KczEmT>W!yLj z1T+>yC>!gHNCO9^ag&e$h{xS}mNQ!J%SXRPdPPoF+>B}qKts<;%(EKt!DUXbGgu?l zd{E%VuZlZ*&mrM;!xhktq_jJ0_gO{t-*XI z+JJqw7_pB`1_c;~zBpu>>PC8PjaxY6*OF;@i?rkyJ7h~{ zi({XN=TSWVD}sF>9*r6zUSA^FcHaWW?y-~ZCgcRDCI|VL`IC*UP&G|FGan!rXbSnD zG#C}lr*cCiC9)G!*Nk93HpoI}urN(dvPqPA3=v!F@k?N}sS;2%QByS40+CIH$?!4z z-G52oBbpDUL^F&WD8|fhm~G!HY;+~Ghwl|511D1xsM4l&FmNowfhNa9I1PNo2%ARR zo6wY)rKVD-sirP=9$z5PywHq+N7~F+bDFp+(D*Kxv2m}?*-f5FoDHUKa>M^@+LpD_ z49;Fm&i=&P#28c}XJfM8dKGxg@u&Z0T^ z86HO~f3MJ+OMec(<5VDI#^LMdMD{Z=Jrdi$LWHQMdAv08mJVjq01++cU})1gBD$ZK zzN|IFK=i8BK=h}7-SiBKAsya^|KxH4H`*Un2yl!_#4H`m=7Tzp`DwQ3he$NmeuvD< z@7(yc@7%OtErvWkj2a2n@FSMsDZIn@JQ3WgRALjAnC9G6Us%(VF`6&H7B}w}p91bg z^B!oP=G{hupr07r{M(do^^bBi@74EsG<}miex^tGB|TyS>alq*L1cy!209&`>lu$2 z#xxEiZ>njK*#lG(-u9~I3nb}nw!-f@HgRW8^B$fG#h`aH5g(6v`VkRO{&zIw<+B`* zZIaG;$>z|QH|=NMG`C}9o@Sy$^EO@0H-7+a)Vw_!L22HBX=L;E`Z;I>`X0Y$Aogse z)?>K-h`8Pf52ksikpY(I6p4UCf2n1XJ#cv|8(rc1HGhm_BAREBScb z0$oQ`J8+HVf$$`wDJ9zB>yn{SfJ}Lhx-yQ&$Gr)S+`581~&Nc)=t%RfNUUG<3TmeA2uFRUCpfV zs@0vAsc!AU+h8#-8F=gQU_czkCaWbaUBRHCl>p$l6#x#jyBAg0ez-nbqxV~FD0gc+ z9<6rV%|54J_l%z>$)*zNGyoO@mM~ElnO!w+SR^N!K-0i@U{w7yK>T>c;3G zL@iD5t6G{Gv39Uz~5^G zzUUB4eOmUih2*_um=@a=^_ky9o?quc$E^ z*s+~m@=PVa>@H@6*?*kB-G{eYk|HAxJH+y(j!S~qwU*s6USG~lwx&?=&D_fWx4VUj z4Z`ou-w3NC^w4rzSe=it6o;1MV0Cc$o{hNNk26NI?)SF1Q6hfEXv=ZoXl$E}-r+6T z8V-xFH7?!;-f5XJFr!4-Q}{)WP?i(hy(@_YXdifGfKGx_{$m8YjbIBMc=i!y9vT+l z>Lg@prckWt$GZ|2-w#3CCVXlFt;>oaZ8_?@8p3}WXnBPriG8`*e}KKVu$u|&nkry@ zXj3UtrJNPy7pnZK+n78Q$gnqIV0yM7kGBQOduv#Z>sUso;(F&GJ=43KAoDaw?{ajB z-%{C!coBe+*t`r)@W3(ilp;TQjnSwS7=dHq>&KFdw-a*YxTk+2U8Y-=JFZ_ko4tXZB#sWxitg$113pm0tiu4{@qak zm7kkl{cb)&3}SpE?12~mac<$N$FuBqxwQ@q48`j0f@4y!60t1rJSY%v4^YsG6b5z% z4F4E?7ff&zbsX8I=*Uu_z7^=>VQa06f*H!&W8}63wa~iq_Um63^v(wg@KHgqU-EhW zUMpFsg9GB>EPkHt1K$J8#M~de)zFe+Eb(%}QBYFeUfju!E3Xp<8IfCq`2ZA`w^u)V z&FeIFPy@i4Y=s8*IAM3av9ChmF^w%7a1WeEv>g3<09rP(Vqo2K`t}$!g$T(x3*xi` zda9Cd06}UX)+kWLAhrI58*fkZF4gKKPUBK9-jAJFW8m7`19PNNtBok;yrQ*|#9J&E zVw_(S@pqzzd~vyTxdB^PSfu0LY=O7U-;e<7M4zyur`QLR*8G)hfZ6GA$FSD96t>Vy z*SGa6%HcYXQ?uW#&j`oD3`XC=#ucoxLrt5)KMAxxFBa?8F4O?lyz5}Uub+bb_BzCV z-x|hmw_ZfySy1aO@V{wKwd;vD<9Rot0=Hzs8^BPp{i!@fo;s5M3k zO8bm8(tasvYf_BS*DvG2{K4A^hV}Kw@KBpl{)yq5*vJr11coOae}X~zUX96rE#?2! zRzxb-fhOJsV2$cgB-n|$MVJK2>=3?)tbMM*gttX+Af}?d<(abL7huXBWrN|G%`M8? zgmT+x0=zsGKl&K+pR^#)c)_6s-;0d@$h!#=($dV!QhH2WyYb3gAvx0HZGr>kZOqQ> zh6A;abA`Pl-fC2c&K1;j+~e3&?@C#<$ArP#gvo)oS-S&XTKL$c%^LVt?obII5%zD2 zW+UG~A07C`Wv0Ez1Xyi@yrauC7Cj;dIZe@YsD{IkpSH^I{{%Y_dynJNwx9*bWCom< zVw|8FnIPfU5+tM?-cE69V2s)p;=KR1*(lsL8yW$R(WCy`c$m8vvscg*2o~RNa4yOX z7US_A&I-5%X={anwne&ngYSY|r*lwrz5#1J;DuH8y}-*$kVjuPoSL>p805mO;FdP5 zO;d=HKc1%B*tQOiig~lqok@g}nH_#Tvm=G>B5pf)X-3_)a^5xa4r(yaMnAXB49E+1 zLekqhnf$qwIOV1q? zb&aFoQpZ}RD&}zhoE~Ufi9@pS+j{UZ%Vj6zt>H1f(*b&5;MlVtb(UL}LSwbr7eZ|v zfx>9(S_r+u$ic#XlBcu7tyDfHm~FL!E1X`esv*{Gos!PwXvYBMGw8v5)wYJ!_(6d9 zImZ4n;%}Pp5VwhQ(Pq1CQwv+kC5wzqi|(_xEh1m_LyL=qLSQMJ5XrVG zs_6B^cq6F=g{%D8AlXp0$SPk9-CI_Pl4>%DVXBF&>`1Z$ImfVwp6K4Tl*n0RXtknA z490Kuguylo3Z)9pw!?7275vW)CUv1)lB@`izmI`;0&1eC-o<=JL6VenP4OIq6)>fql zQQE46P%>Qd-$xu!6@bygohA}bOBMkwdrsrA=Z`e6w3KvTW}X^Pc&d|FQ|z|r$9 zACKRAq#PA3Nn0rka|N=8E0FMvk?c$x(6*Q?wU`6HMV4A@r2Zw#KqC(t_=-(&hcBj( z(iGSX)kt511;iMeNgtOug3sB&0j;j$_k|!c+Aug$oH@it16NK?{YyOzuoRwS#0x@CP*;e- zwly*^mEcz)2HUokmo3>gtdeDC^W!&{|DU!6D3<6~MH3-a+g3!Uq8H>qwz=hkTxI+Q zou_3((wiD!N(TP&+bVGNiZoM}I_80YV*xCgiZ27Yy~pvco!?%8dpQHj4=S(yLDA&F zV%2`Jbr_FC#S2hi?H5D80ZE~!+L_bR{-6iBX{vNnVxs+={f{WXCskt zPoRTo2W?XLHf%{p^=)gQ?F)z}8u&G;!P#xU0+ozbh~4n!=k!*lLlU6q&~MQ*$bkp@ zd`_0SBFai%R___A$2wMq)dJoP=FdgB|BtqJfsU&>(?oYkvK}SNmN9-|z(=;QWl7e< zFWLB^Dyd3RJyh>fmEMvcU><%!0E594!{jOn&GoQon#tnkCK-~US#*Y^6Nd44SU_kl zA!$0D%P@qSl||?@12he`psI`!9^LQz_c^B|VUw(N*VTgZIcM+v?|=XMfA4+vQB0C_ zDEGokjz|~|KBNCBAcQV2rgh2z;9^`d^)0;cZty(>b87=qg>YG1htJh!u6-HWSm?Zi zZrcnxr%C6Z2%YVTg8IN<#5`~+c%oADN38O7Uj2~I^uikIUEGjq<}w!;qu*zXr~u$q zh)}-6+e>H6#d#r19n>#`L6Q&W2f?x6_MM!!9i12l1i}nqqC5j6%B+YW`Q@_$s!`d> z<3W;-s2yu(6M|oDk3K>GSb+z(Qz;x4uFLnY(-Z$t?nSuZmy~n!C4>hs(?!blCWI3J zH0OZ-9D7u>8;2aJqMAl>#NuU`tp%*Y@H#*Egw@AOSf|YY28LEJMxxy;2SpfxN*(bys2r-5-mGAX;8lkh!W{LP9M2^q)D6 zs5ifc%bPSVC7*szxtCZOIQJ5)py8PTpl~AGON302OZQ4534&qDF6MMX%U^<=MQHnH zNiAOEBsJu)J7zz29Fd;_x04W9`c~1~G$C+xl+U*FmJ;P=df-nkNnvK*n#q6W%(Us5 z0b4A|UJfRNUUM(OYNLxQ4m-|(BCf-ROSx`=HUnKcPylTP=JF}m?}_Pg%Ew{oV%NJ6 z13-Z={eJ5hWfcIh;xm(3qMlIf|uf`Si z&SlgIH;X*v`ybHqI!;kIX!M{C$IQ8NwappJoFUlQGe0rI72x>}Q90j1us?W7XHWE^ zjBWb@wPPiuS%|xH_UoNdu0m);so9boRy{KNr89=AwmmU5{o%r|lLzY&LogOJ765@cq24A*fE)TgBd9W~{*da67pd z0=-RSMmC{ecLfxZ>jM(Dl|S_3%u;w2?!|WLRtpV!A1cb%hNJqmVP<@J&JC34kP_PO zyq^<#ljz0#kgd1>jslNQBUa=iYeY5eyboLp9Zg;}eFRJ>CJH(lK7xa+i^IdN<% zUtmYo&V$6X$%@H#ev=4oAwnxB;m6uBJ7G>%V4nnVDAS#!jX zr@cwI9p$=8bQ9?!PEa%Fe7TSb^~@7UEvj8&y+y##AR18XoV^u#8GOq!wBzO@5u0l9Zep$X#gHClL2Nge;kBhi*sw#&ey>A zt|J=_6X+75IDbT#nE8!L=6A{{LOtRqonK#53u@5hRoV`~JURgMz;-o@hf{E_HB;Np zHP-87l)IYXO}i^CZyI(PSlv{R1=B zd)gFHpd>p#CEz+@^W=Q;B)y}tuX8?rm){7@#d^CSjR@{c-ktgRP=c>uv&F)!tSp(@ z<0wGRmSWE;Pz5T=ljtSy$$`MHA0Zlnd`8!cFo_a5FZDQHW>OYEEoYNrS;)N%xAGl4*UJpmewV)t z9TC*y_;Iz>G?Hx>L)BA~ORVU@U2H`UyGDhPOkTqdXw53%wG#11rC{!A7eDwUN#rdd zwQE?ul|a4AQ!RFlOnrlz%Z1*^#l`2=WOhAKvzlnYjFn-4?h4}f3I^@w>4>{t;Q%K= zlE|GhN~r=+yDKr%?h?6@)dQ#pAl{FuMYG*Ys3>kWLlW$e7R1S6#lm5i^x`D}oqtH} zUQFgM%l#5u0jLOltVTe`W*0BUcoDil z8UdxChcrT#9x67)6hdMaKuEGBPXGWFl-OVLxc-oYI8?S8aZnQ$o2XS}Nx3H8O%ZKkL|4~wQ)8PYT`e9_z zV)7sL#%?ag?A~4|H9C~L$S$o1sDis1`8~lO1{7py$U|hQdHDe)>6hI{$y`XBpulFX z)52VsH*^`tG!mD?RI13Hur2JbBR^#7&Y>I`DO-|Z0cemPGPNxVEJi|t#a$%aL{LY` z-t*3_R=blN2Upy7(^-t%#F=@M#91X{lW~wFt;mYF{>Xamtam-@{aWf-;s?(I;>R4( z?jKS7kWeC${igVx7V*oSM9dErdD%)r)(#aF@*AYVoD{&2qyWVAtMkLn1424o$1RTb z`oOGn7_A^0pe_|e&)8223}%74gt`Xb!#}7|yYCez8rvoob>TSk-9P!_pOJsa20?Lb zsC3;1fx!2GT!=8*z@m)dcE8BBm(G{cr#Tn|t!`t^lbdyRKO>w?Iv<9HbKS-(W=39R2>4k=eg%?*;mP?YzKfMmf;CXu)W6SRm zH8K(p%yGRfE-_K#VMXoyOq}a)LuUOdh!LLuJvcObIj(5v?nczI`va1Nc@q!~qx8(cB+I>&zPDz(r)`DYFWpli@ICY(E?DlV z>%v#LrvPtDpBThK3Tu{o>eA;hNfub_o@9YJ!zWDL@h99<0MJ@fzXVlqPXWM*iOLWB z3HQ{-z*LyFdun4~s@RLTr>+y&Akcm_vhuDAq%*UuGju+)tP#nw(me(3>7J6O$(JqyQOF9I zPEweT5!1I><#`IuxqQNG@q89sJem6iQA52+I1jFK8&_k{B;p=A59g>C?__r3*tyzF z`=gYPPaz+&n>Nx-xjd;w5{OUcTQSq@=uOs}{4+$7mEZcZNJhMbEGc7Aj&v=s>BrQh z7gvs)&`&oV0J;DQml`uDdNC);huNpQBp%1uT+6;X9?!=CiuIOKH|1>Ilp`T7o~A*) zyF^l^|9k6yZ##3#5to{ifj0vxs@PI`p+Hxk%p@V5b~fS0GNc12TV~9H%0RuC?)J6vYZmi^f zz){A+^)Ax8MLD%$Y6=-NM~Fhex)Gd zt2YW&F0$-yEq1v+x>%{T&%?zn8DV>^fIh5@j^4J~W24~nGYuu^m* zQgkC+H{ic{1Dj*<4Vt{2SP~BQ_db{bRA)4J+hquzK*Np8azvKo3WTX z3p|^Vh!2t2vIPoW$}AV|B7JNuRAwJDeV78`7DApvQ~El>I-Y z0A!CM{CWR(gyQ^>jWJwhZ*C>8ow1aH|2ueV!}UC>%-~pLkLgVd$3hdHnG?5TJEs}O z+j|l^<#ib78Mosse|UxeRUn8Te-b~guc5&80e{}ZPvG15@jtw-XHW6*|69R*RqEPx z{MmvZ*{9%MUxKR$s$pe_KiHz+-hlm|`0q0Ol&w90eF`7^wd-XRnlI3l!(QAt34QVg zuWsVio4mT2S3FM5y#f0_-OKb3qGWxX8eS)Jue6`(b8Y$TD*X&stK>?yHxzyf&#(i+ zy-W(^s&HF)rmqm0t}T>uSgOMtPvF>B`73wbfbm|-6_xb2WllH~d&vRhw;=|veB(z& zM)|D8=uiQEZgHrr35OS#>RCiV6RQl*DaEaSpsoW!3v`x$K(?Hqnc`cre!O4{y+Z&x z`XKlQLP?PgpmHvuV=M>T|84FW4e_TJo`L_dslQ-WC4!{`7+wFPyb1!;WfSa!%MRAJ zkP2QXdW*B)dej?vm0doJTPyu_>3S+s#%4SdAFl^*1SJvr_~UR7{B)JWCoqoi1t}%1 z>ads0e=n4ezkLAPpxZZll$$4Q`R`o@j&rnlu=5hS$o)h7_)`GjZwCPXy@bM3Pr~%X z#{-)YT=(-Cw_k<1{R*8!k8vFd)acR~GWR0|0IYW>TZrEv0LJ(XL8J{ z%qYx+!pa}AnP}1g#Mk{ApS{OtU(-+?0PSIBfCe`AGEp}Z0PEet7Vp~QppFS2;j?%2 zI2bk+=5h`I)?@Y{%|OchVhud+d0jsl@E5dF*Ym>Az`+Y>0LLcm<0;pl>wQ|lf#hImmhuwgCTY8`#Sh^F> zKMZue+~3&IXV2<)=gcZg zseD7U{UKQ;=IU<;10Xbm__brxO-CQA&@P0?gt9=~ap%-ufI)J9nel(U5qg*F!2aE$ zKTon)1%_vdSQTcp`$IFRlBx z^Xe$Cw(;sPul7h=Zn!&*&O5Q@{rt7Uiz6(|0ADl)! z=|4rUV1!~iObhW`4Wv^UpfgV`)}vfc{J2^h;%cqQaBYyhA)@i5QN+qe0FSrBJn6;2 zhsOLvP~3reY`dOqxoRp*Gj@cxi&?Oaw0gjR#Wr#;5}`$zKqY7@i^1~w!_XR5zD(-r z&VhkeH&7XY3X~SUb~UtWBeV~bV4dr!D2C{NpC&aUMSK-nRT#dEoIH7I6KFNU+u6&I7%!St5^=tE4U&*dd{#zK z+!SC^gSQ+(~MXz2^X+_ih2eWS$$DI{&bBf_MO3 zS~O)xGic9c2Y2r0Ac^^%MHS%7x#o8&+2y4t074fi2E3UQkdL4vQscYOwwwUYD){dd zy`T}Y9wvZnM*Bh5GkFL{lN94%#{d`iI)7MTLZLGUILQGr^J4NJxo&h*hY8>(6phjR zQA{^m{KPi?qsS}xU))5gV8Qcbh8Od<04upAM~spqa9(l7|2#Qj93i`ZEDO{2lFbLB zzNPnKu1SRVR{v`D&+Qh-zAc_%A6y8<$s>|jkBZQ6zZ|cO&rmiQqLBbQ9h&N z)q6u>;`!_qK9h5eL{h*TfLxeRR(YOP#$@)<*3v2#Z!q)Ut26&H-AJqW$L#6m+fC+l zquy-Z03%`j-v5$(U;t*PV_^i~ru3h7zzMP1J#{Zp*mXHN`IGBiIVi)OPvh=pkzEtIku zeac??l#p=zOaVXmPLS&nB;SRtyj#fKc%xAHKjr3RW?nsyQ}9M8c-U+KxrX2c6a{Y_ zf)_yA7mN+T3m^#&cao%Q$d;gTK7mr+Hi5+hYSS31$SpWI;K;cM4;t42NeejY@xzzR z0MC&@=TJFwH*;F&iTls<9q6O<#IaVOaErHvz9z4t5%DQXr#kGt}V zm27VG@MTla<5ECu`6Y?~Kg)+^&?$dQqRX9BBaWY5EbS+6fYBB+>FZfdj+Co}fpJuD z1a}d@k2s9G^3^&V@cgI-c7s#mziTV2ux%Rkz$2U-n!~&5x&Xm43jQ1^|I9`h#zDe6 zO`fYI&+*kn&vU$@L(_W|ujrTdGAZyCc?d}FA}{CaxPjOer)FjR=dfi&RITTAlHj-` zg6F)zYH+hPO~G+&#q{i>D}s7ts5!eyxh`QH1B^Z}CwEhO@&!@GdghRAIo6gN^qOIoCAb0dU*hJVKYB- z*?!sI?V~oXpw^f_<=!zpjVy|{YFWtB5R;L();&;bDW zq@1^AS-Ay(3sT%y>b;z-^0KwahbzM4c-L{f-1|1PY5=0(&V2}UXCWysi0UuV&1cd_ z51&AbNzOL3MR+C}7Plk3dX5EHWu@W454XGqm^Q7SM83znhPU?eX75$RU?ECP1<6~c zoiT5wuiy>f3ejH^xD)X77wbAO==zl{uo+ZxUY=v(?Po%pZ{%TYeES|h*R13!w+=lq z=ngs{%byZ>=ws&lVSsn-7UH+b&bx%|w)+W`(H{cXjV2luGOXEXY{#B9-5XyA>@DM9 zbV^MC*!b@-kM}0XB{`QT|EWDBel?Fv%+X=(+z+>#J1$JE_3&A@9tW6u9*Y zsDF~3x7&kxl7e$5WJUroFS7;yC&@!?z&SVtoP#HTp9IrE`lUhbmr`}!NgeOl>{s3} zD}TyTsw!`USI78ll5OeJ2H)Ycqvq|Ua-WT=h=Q}|F&n?9vkmBjK-1RNwMBek*L#F2 z2q{VEeA}}-M!L{Scwd5U^dFP;N9x#PGz(`gwyI*Sx%kfz=%77iZ*qFV1oawK&@nEk z@Kk^AYaGXZj_6ms{WWh9tg7J4ykf>K$c)`rY1TT9^0Jwu{JrdxCI*MIq$vU%bCgv7 zg2o>Kboo=FTBwx|$&stn%D=M-@d}6k3ZQh&&z5BTuUt&;$_EuOzjy(7_KFNC&YfM} zdoT`j#fY~|N(Eo!*v2nCc~AxSQ4_jIHBL`g30nA>p7P&^W<#quABXJu;42cq?<>~8 zP)dYA;;toMyn`?#>jPbwI^r|$2V~nrvt9|;981F&9FYm&)gZBd_R@$GHCyTbo}S7R zRNMthUP;^k``oYCIf(sx>TwWOLBM98+#rUJ?8svvyP!`|*_NZ95SM-%E51M${Lxoq zMay{zJG;>NzoK)|lT>)3X?$oaCzJV4&Uz=&-%UD;ws=Kc2wKw*$iRohQ^4LWRm|ye z(-9F&dB#LR0|%cZrb(j4&n5Z0X)8WxVHPw$V7@f?klwKcTD@|yH!`xtI9VA-t-}O@ zbSFu$4_X)?+B@00^-eZIUJJ;M7TU`^-a2w%MLPIH09f>x5p)s2CHkybix2|)HoLgoBzqHJ8UX8bpy8TLwI zCr<8dli?Rvz|PpULxoE&oua>vdA&+oT3Jz%aF%@&8eS=T<_1>Z!DGdB+AC zCeXR>)UYihWj|hk%J?N)dfIMLK!cv!@cni||JE%%s=Hdc1LWq5Tc_YygRF9>Bj5F~Tsdzn-rR!rQ; zK{3IHIeb5EwShdzTXspCcL^g$b$wgw5mnAJce@u-&Tq^8JvwUMh-dO?YW7hfeGs09 zbpEFF!CQKaLD~Iq={~YmnE;)!(Qng!+{%uI0o4Bvp2;3p|A$ns@3P?XIi(DvZkJNb zU^fqs(dwaxowu{|dx^^wOE<9IhrGIPuDbb>M0MXM3Z;dSO}>Azxr-XPMfrrB|HF;` zYPh-pbuWL!WBd>uX*%D@&UdljuM>mYcuT)Yw&VNFEfAXQ@G@AsT}r7zPEsFy(1IvN z1Ny~LDJhe44M3Kv7|7n-~ER<_G}@R4Cm_y@Wu0tNpVZ!yX6Fr+c}L9VQPF|QZrYCtbDuvj0?E#c6l?DBQK#X`$)f0g<*X} zt~&>o$3{&S)Ph!$94Z5niyr4VZfiCG6g#+-ux-RZyn0(RZY5jKRD56@I$~&n@Bt&& z+o@hZq*lJ26MBk2KP3|uX7zd!VlyY|PtNKkW`^*n<^<^Qr*ccNCr1o3(C+4oSpIi} zi}|e8@=&_R*?9}+gO1G%^~LC<07{PH9R9S1(?j>e^gMp9pdS7O!^gQrlJDx_hY)VG zLLpke?m1kiJ1@nE8g~QT0u7imIXTA-aLA4@sLi6!Z`k(l4*#~g2WKn6;!7(5jF)=4 zX-K|g5lD4>Kv+8&5CCYZ4QMv{ZBpcrgq-xi-p0#ki@H|B(>+Y-ds~hRgoad()ey2H ztH+?SK^yBuGr*%=3D$A+!b}0)uI23m;u(&HTnouPocrgD|81aa zo`}u1YlvjG4bRPIH3ConpmZ0XaUDUcA^jqf+!_#>BU}|_=+bjF>(Sv3w(%C0QU#m& zOusOPelM|B2Kwy>yv0wGr+EPH;-|4fHuKmxj*a^f{BCM`MhZwcz_)vv1563q^G7_F z26nlW_)&QyeE^`$eO_?~bv{=4GqQ-G9qCo9tdIY?B!0rq?1*XNAYOx1!9{?l)!NgP z|5rtBn5Nm!;N(?Se#CC}P4d>O7t7k@PU3Sca|HnMg~~uuUWf({&U_Dg#>)dU(z2Hz zEO~9eb*_+qKjrY%i@oP0hck=*q+S&4#beqJ)HInYIr37{lnLY@y{%v|Z!c|}QL6nj z>@vY%&|>C$#xiB3_`~?|@8uk|@=BD{X|j*rS%hYV7h3!+KnVVswMFQL{LipRDicot zvY1tHjJgUj1CqdgZiCe(eue|Zf(L2xo~BW|QC|Pxguc$y9A9Dc?br$)x{(t)V?6{| z1ulRPfit85_eA?2;3U6Z*mF!pBQL&iJE~tFB{FA1<%=)b%k*YYRH=jhA&i60gsG3G6gqw8dMNXq)ec&evn3&X*U%@^SsXw69t4 zqvxkjsIWpI6F>TZ`kj00r5+Z*k@%7ZhBp)!Fci@w#E0{MMI+B0BV_Y z7^r=uEnR^dWgLjodS0=a|5q1de&KszN3uLaQ-3qBhSBU|FLL>tP#`aI`414adsz8F zKKnjd??EhEAaek#{f7RY1UT`H!oj3ckj3J_8`(503EJYv^f&{|W(DLEPGU}GWI#ls zbiJ>X^VaK>gJ$2in-lOxb3JbPV*4~Z(jf%$0dvE+xhMLx_?hJFoAL=9Yr@`sV`+Zh^CaR;LPSDl+ALtD z&1O099NzO3Dbo&e;GP+;@5_{Fg3SsIIC8Gb{;A!)bhEptjBYlCM4wKBKIq}l zR@`igJ)#ziTq9N&f6Aioc(=S^H{}yQ>Ho(+jUw%uFki~6(O=e-H zs+u(mxs!N5Kq^~2eb=T;TqiiVur>!(*0z`BSE zJSU|#O(jnuBpyTo96r=znlQjLAr`A}8|Up4x*7KUo;H;7`&wKui0#3euZDQ_EPw9hZ8E$4isbbZ2mBs9a^SlsSdPKfqQ}mh z@K$e`p8jnB60A4F<6rz0;~eC`AaV|>TJHJd!2dXwkAD?N>Z(tAKmRvZojKNmE$~Hn zb__nk$JlHhSTXI$1Xg0>yZ-@ff%kXu>OpLQ4{(2bUCpjE~0L)Sw=gCMDY=9J2a!kJQZ1aPkDW}5j;Hl~9PyUb7fBEiNb)_nsp8kUG zM$G4Dt*ey-1>=vfA>1VV5geGxz#0zz=JB?SSGa9a#b;Hcs^l%&;tia$>T*_r7sy*d z1ywZ5DaXOUz<+BwyN-_{~hGRx|*hqv8w-NHDj8r%l^fWa!vBp9&@8fle zaKarl;>pfVZ#<5j4j3DoCY;{Ra4_7BkDG>5H8lpF%U=x(Q_lMTPk&B=A`UAFZM3e_ z9SVgLhBuV(#*AKH2pzGT}Cp3GGD0MNc4DF+lT7DaLDNL z1-$}Um9qW;PqH_{YTy^c1XRH>zrioe>8Awl;Ip^Z;7b0=*!GaK*PZC>xz;dxdp0)9 z^D0(*$LaF|19TSlct}l8O$|#+S@>QZNlYvRaX#mPo`Ks9U&7luCV_qZ09}UG# zC>2gp+Js_Y0^A1pBk1i+0F);g)AM11bN0C7JrxzccsPie3Wwq{EgWF5#+it@J9TYH za(9o+B5`O0=43_PicrIexUmaJVB~DNA(RXTt>GzE$!D!bov+E;)M&)Pu3(Qy(B1Ei zk&QW|CB*znt4fzIMv~h#qzXAA*zQdELLqN#mpr0i1UqNr(I^xmxLUBOhxn&_i5>%; z;7`!&CBi~YU71j#P9bs19ftt2Cgh$#8otEKac{6|L(uDvg$Nr;t~=%iM9|q57K(JR z)ugS_nKF#dpkegj-=3gU5;Sgb3VVZXiSi<1aj>p4nGlJ=ocFkcT_WZvrTq%tiiwPQ zHIrMj@Q~k~+MtBE~6$-yVn?iI~sp0ajALet(Jyo+BCS|)4mo?0y>9YH9K@$? z@M>lzN~?(7A5GaY+`*K)AGLg;xB)0L@Nh$ogC5dQ3y9S#$t%<)>UWAL60mS!P75#Z z`6m-_UW-4mV6$c-aKY&VTE0-g@Bz&}FK^?TsX9Y32^K$uRoENh979P6o9q(M0QXgKMCB`kS0GhJ_eI@5gnVUBeB# z8Nn>BCzk8j*Q$6JbL)v=a($gfM-m38vonbg-+3Ahu)Vh%I!?Z1!4@moVtt+UytBs* z?MU1pslD!az|v%-Q*W!YUK5czr1y%Lx7Q7wj7bL%ggkEWW*invSJ}k|J6eriuN$)j zDGPeL60|5J1keHM9IKEKxTZplMoXb`%-7vxI$2ta_FiLw!lZ-6jCe0e9t?*gg@zzJ z%P=eq&GB7gkaXI;fR{tsT(~WS`-zw@LEYDAbh?vq4u%M7V+C7i#3Mmp0@T1|A{A~# zNi^vbYeT?N!Q1KU>NmQ;^F&D)&{?2}wsRK9MkCeZ>+FHQ(_z^%^w)1-hEcIeuodML zk7%%NnFbQB1Bf=l^m}E$SCF9@}8lwE;P#qW?;0$P~cbZk>)Ch1WF!y3JNQN1ssPm@DXabcuVDzvAn8gBFZCb83+>r=OiG_u&gN>jM zOd0A1ALGwKE=ulh;Whq*#eQT^cNn}Uds1ii{=^9;uBp*a)iOSMrct;Dej6wk^8t;n zSh$xn1j7--EYs*WIx(@hHULPVUB#v^!antaRJI2f^kF!_oz{~z)#a@AD#er(19@a> zt%1_hLv4%f(uDS@_jOXzbOiy0=+krQy_x6}jA>LGp(sL-L3eKl6oxO+FM5Ez1G2~0 z)dhVHH>yB;08-1@!+T$XWO^NJZ1zk)mQ%;+)JV{H^?pkGv@Ri3BZIWJw`(IT3gEm= zO$-`b0F4e@yl^nU4I*x);F4AavT}&DHlbptkl&&ppVK)ERT9h$O0j@GQK;M*Pq<^2 zOHd%1P;CvHE}KgNlJSZDL6IVM_T}NT;4u`v-2=S2pkex!;I9<5JUlDt~oV+E4 zq)DiO6Q;#cW6)?wUCw`~)iUTNe~UFCVLD^sxabKtxH;q%DlTA)9d$Z}5T`N-o{VEo zs38s87!(=f!qfwmfKYbgiu44g4<+}9mKEnk;(m~xB%4!rps zLP|nXOhcQ;*}2@Z_nRb0e#^TOv_lH_*l!7Bxj<y@aEodu{*XT=LncPKa; zsZiLU?S{T}2k~8T_(oj?r9*bt8y^am?cgz{K`IrWV);usR1Z@ zdKryq=V$0D9EYqzvbO_DO7u@FIlK)5)8h@noWn4d6QkiCk9 zeZN)39>Z`tL@`4PGxDQJ*3cnit&JNS;c7O*L^H^i3Xm$c>-Bj&U@8!Z`oL`0(AsE( z8a6i4KQ)@1v>+lH&?bG}kk1?HWW0&iCjMw$aHq8L0INWBJJGo>gh6W(8y#djFVX9w zn>HH+?|_=_ZvmsvS3viI2px0>4Q5PkP;B9TriHZm5 ziczhgM0_?hmbesl1ipvS;Z3Bxm<)C~1FIRLr>Rgdc0%?7V&coj&{wz@ptXA<9R%IX zT*M>5tI!S5=xr3w#tm{ZDYF3xh7!ImpEri~(5u80%mO_JlJka>)+Fw^Eos7AqU+&B zfJP#-bb45~;Cam)g(jMbV278EgT`8G?k12o?0^&7;{d%A~-3F!@Y7Vv(Dlh;`gSp}J zcpxrl*rw!K9ceIp4}ZTds3qIz5S162X=1}qK+?5kV5AyO+LfUlP|-5Q;isWE^ew}e zaDScF)-ym#CM^7H0^p<>U5oIrSx-Zw%<7C;`1u6DNj-r#UKb9~ZYANrq?&_bmMQDu zSE%Bo8S{$a{j3L_EODV#k;U{7!Uw2Jb!E1Fy$~{(OC(9K-4x0gtKVKFf{xTnQSA$FqIcR#wx9a zDtvYqt4L1*M?f zgkjYvQE;>YSfs+@W$i6c@{>UbA$6Qtn_&`?GVx9*ItpLs26&?}A6(Ezqjme%HfZo* zf3rK;-N-yAgcgF(39G}b1f;p2+zICp_c0IBVogq~%NgQhc4dnZ6bS>LIV|p!*|Tf` z&=SKni|@hnf;*Lgt&N>?$l;z#5Yx)cg@pd-shP;k0;wUgHz8b|wpQyeilGjW$OW9! zND@IWCqU=MBaN8Ngb(!6Dkg2`$;iWzW+d$x1DkEfdm-?Q1+=h`t0MdP1UXvmzDG89 zGT}h)!S=(bh|CsDh(!*g2njiZZScpqEOM&^s_q1m%LokF!q9z4i#xS4BO`Jg4BI02 z)R{_A2WHemVz_mctB8HarY0B^x_`_gbn%2Wbh^@!9)#xb z$u8lN7=7+w5>}T7DzO={Vni5uY~xpUiE4Vhk3)jlSPu+k`%IRiXz zxfWo>6jl#=2|#)f4tf=JqvO6obe!vmpr9FVHQ8~DaA zx!q{%u*HH5=%QEj4Qe0~sYlzKJsT@3nAAs3A1Qrg^hu8;Y`Kd|P9So@(T%u$qCHrJ z$=m2^i!IPIQ|lct3gWa$T9OkV4QPcud*TUz{27gU;#gtl?RvtiHzPdC7=i$wC?}Jr zpl9OXFC;WO6G6NIq?=JAMMud!T&0WfvH1GYy^**tEs!e+d6O`hk5$;)B0k$9B#Rix zenP;oq*j9xmeQ_Aw^7={xYO`%MZjn9PJPVM9gCHV?_le-AzTbIa_F%X6?I;;i>W&-e@O3IlSF$`!BkKl$SglBrR-Mt zEWpufx<$-ZdK8aEtW^}QRYsYfwerGNrd%lcxaLAIfHdctSM&)6(lF1+tj*AQrh(El zOF`HWJ~4zMF4XMNezXB=h~ovput*@-c|8Ss4+|C8OgQ5?-0In&j*pI+O)<*|T@qnr zXv1O2jIafjNc0t?+4 z#jPbxvw@BAJBDQ^>1{=CncaS!?orYK0~mrGbx7`4lJvYl9n5yQ=T zG8yOGrnxkyhy_CK6L=os3OYS2sG-7~QGjH8R9>+nuxf7@R!ttMT0Se0c&H2Ot6?Mp z%&($>6mxd%1w1v0($`%ZdL!=st)tgnYHh@So9=X;q zOS#+<+u+oW`P`mS$E4jjO&wBUK#9q4DUcCv>V!MaWNV|r&g9va=H{M_yLc<;9mFy| z{PzgfK(z0O0@{h#_GXh-VvJ+AX&kNPT1Hs0JB<}94Aj@jz}Rk`-X=v&7l=v`>>^Py zodZ*WvU3?)r*@6)M4CIu@S$JKrPczm2kRoiq^Wn&jE+X^q2^{I6yq!*%82z_86Ht^ zu}AAR=uk==u2^qfGO}KC6PtcVmh!dlf?!4HATuBJ^+uTAWttGn@p@j_;t6;{NYcr6 z1FJw7xUVN@8df3X)6}?Fu457(DHE-G^(F$~Eu-}U?nef zDkbRa^2V=3fJb^UaUFYUF8r(T<~~d5&coG1|h2exvKnq@4`trf|>$ zq5_=!$+LqZUEMZ#D*W1dRa07AmQn(~GR zew|RX!;9#V)QZTOF0rdBq_hJm!a4YmW^qTI6eGw*F*112 zdg};W)Kk37F14n>EGDDHtF%XI*vd~D;)e<-zF04Q$XYO{p?4e5+r)rq08x)4AbZ6Z zXysI(7Yev|6t6M65OZs`pxy&?0j#N^7bvJG;|+uqD-4xg&`F3dF95fnT|tH`%&FA7 z()6nI?g#Bt$Y^&(QZc;*)TQ+>Aj=;ef_SI&+oAa?0&4GSDa=sZ*9otm3ylTDbX&T# z@vv2@ThC+=vkP%)<0&$e*Rx@URYq>#E2+1DXhp>pmpD#!#L@{OnO@|^5H3Q+(Xd1A z;5%uEw59Ruox#CiZw$QH*fMObvaH+Og1=V%3l~fx>L8X;p-;G9M%vSXfL-=^v=XF4 z62AkvIA51M5CZerac2aaWob%k#rVBgrEQj(7jlCWxE91JY(>2n?~Fs+K+!PWNu`K% zM+Y+2W}rr4jz8$^4M_B1i;5nItm5iKxG6ha+(0@PIhaH&*%`q2ZR{S?ZDyhOU64X= zHxl%s&ekR)$dG`oxGgRouQOK{ser^=wfW!F%;EvZQ+0aL<`UHikCr4ph;54+JU!L; zDKYzkBTGkSEfZbIM`KQgVblwx05aZ|?*ZoGii$04jpFme$S}MUGeEFH;_JcQqM{%` zaT$c>EsY2@cKi)(E@_V~3W=VMAFRVx2#MkBz%72*sq^mCuJnum9_=_V{BdC}{;qyx ztl0<^#%xnu=1S*NMG4&QVR8)oQWsxOZYHwSVDU*Ok{>fz)e6`I&2u8xpaYh^ksgK) zgYeml=Q4>uXRrhf67*ddd1}}6OUn}q_4Og$zIvAB%`WJ`oXG5^4*lxO|D4nbN6|rJt2p z%w>?do!Uq(O(BWjT}aqLh%C1jeN&MoHf?M&Jqf+V%akjnma=p^0yi_kWDDk8PoZp5g~oNCyTkaWLG(y+vl>8=El_v8*_ib9^*%t!h#O_8W~ zT6MUwgvll3yU>PdFHK*@*NG-fH}Mhd7&z*Ctl|@r%+ z$vPENei)G67DGs~_cpP;^%8`mFOb;D!4~wNu*hyB)`^(fR7J7Q(OBn(R$H2w#!1{y zoUMj>*IZ&kHe*s-W6anwqHQyx}6aXL1_FQX6A5l*CI zGc<0ZSCm9VTQ)!&eW)xF*m$CS*G(I+!OSpympG6iDl{dDrvw02 zXnJF!O=Me^z_Zl0xSxri%A!A;i5Luu&mlW-?2W#RRTHOsl05{rv4dO5CE`syZ}`kE zsW%hjD>-VGN{g4JU#ZN}eRZtNKN_dRuLPJ)K5E*;uVXA00BmsstH|a|IueOD4Boe} z39B%tlz7W&(iWj@M9(8FVd8KEBqlID$af-WscFN~TM(d;>os#t5r_HJP;h{q3SF`a;sB(Ele(Z)p|CL z43g31j%mw93!S_c$#&U*53A>A1Op$CFes17U4tudNi><+NZ!N5yeMp`B8fSR<&hloHjqxE@zhN{iID9sodpGlJ7Y+rUgOwukpa z1SzdA41i6(ooCcF8kaa_FJ-VI>+tW(~9dM2%vL zwJ+|QgEnW*4m{3+Yl!nTD3CSanQ9ZJFCHP0WMc>RQ0PDExxRX%^-64GNg$Q8-7pJi zvitfy*jL*lzP?a|&xWnRYXY^bmtwS{M(*3&6bVQCSl@xuU5AHkMj`0ite;U9`AkT^ zRb-mCLX5+(OZwFerWg9Q&)&W!FJ?)-J7nP;t(3ufyCf!do7yo4ox85>w z3DU!Njmxs34xT_dk0JO7;BQJeOMIwm`(S3xcTHdm&7hS|U*AK%5Eg9hg&KNaeUDhd zyMD_8uYEAl$=H3pK~(W4{Pmr>h`tju+ZTx><2`feCG~!2uo`ixAub8a^3#J!Vq>|r z-Jgr4VdQ{W+hmNNP+Taybo6w6L%e?h{4A>yF8%JlVK^P87P4xxl_r%|oK*3B<1qTd zXxiFveW`D+ywpV{!X4^}dOQ2jj(lbX;i{VTu9tmjx*oG4?gV_Z)|D+7gya^8IR1p= z-h|g#V%?|LWfcrk; znCE13n2R(04^l~Jmc#isGx+xIW&;j@T{)(Wb7?L5Cpxdcb5VjshlcvGD9YBm2o-?*&<8sB#WG?v^+4$Kc!a8(#j(H zdYiqC57lz2M&`|&dCM)Pp9a4e;U33Ca;Mgdj^QmeOlqlfma9pRl!9j41W2yMWi-aA zm0%4N5)GSHt%SS7$z62Z0Gx)})YHcW0cMAL_qgoO$s@f0Kp{+Z+aMV( zNiti{32jCSdlsxbt>$8&&Nv~p9-I=Fxf3W!ODkxWm1q4nZEcPbD&Ex6x^dIyEnC~RZD%#+;!=m9{PmI-qrlX5TZZQJO(mMz ziN5U$(zDq&3(Z~g08E}u-AA(~e=_b4>UX)7(urXXSXh{Cy@M>`Eu}E^putrWyR^sb z%7px|t9V~MZ`qO z_zM*aDK-;PndYaVW@myznV6f@0C$nlK#H94vG@|HQ%*CJiR6O3q6v#&u__IIYD`wF zW#~ldrA9WjDY3VOxBL@2y-HTF>8uM%{?~Z6wG*#4r+$qGj{VcqpZ(;9i6g0-03^V@ zYJryN>3?$HiRY;g*`$a+cp3Yh(HAGiQhakdK!uh16`!-~)YO@~7cW{o5lJ1#-9Cbq z=lfn};W^yw8|Bsc_ap7|r>Fmru2_I)W0h5DHO{NcC-?lNdTA^6tfXbuX!Zu&WHZ)oa#~1YfsQ%E+hpMLkmnVHggHq|XuuG+mT)!L^ zKO4dbvrAR#?cCFu^mi)8(3`PbrDJ%eYK*JVhYOVtZrG{P2XUTO`lfV;Qg!&SM|z8a zE1rx#_!Lf5O1m0YsWcC$8+@^9txBgR(b4zIi&Q$2&#P2UPE0Va0H`)Ri%xa%8I*Eq z?jL|bn+F{eHUD5KZd*-CL2$rLzEH(@ zr59VUx?n!Bc*WgBe2)S;nMn=VCmT=n2fcV_&nja*kGB(A8a4!~+7~mlbaMMT^7`BY zg6-T~QAUb@nUZ+23!5XkNs{}7yx8i9wQoRyLWWe~&C5={_Xh_Dd42A{#(S%H=QoZK zH0AzK^xn7MJdi%9zfd!gxo(}qP=jkR&;8wC3gs|72h=#{r3?pTrRzScZpXn$C7IMD zj=)Ntz=~n&M7F9{Rkej8ASYOG8P0}L^TrRAD0S`{m7ZMIs0OQZivbE}i>1pV3tAuq zO*lkg%ClTK_8n4&YN`geWXqqI198&lTO(rvDm^V{DQ-=hJaRl+{@;{C&~Ul%?6Yb} z!sqCxZ0fi8$(G{QSc-zpO{%|g>F^1dy|f|E+RxSnsvPdW3WP7v_Iat9kQQ zqXgqPf3{rxirjarv0O+uhBLBH{#ea(xp4JawMy5tQ7YN_vPoZNa22Fz@bW4H6q4IK z9KinbXHl=!gS}+uT)2X0rWfV2nnL}1Yl^_vUsMCN{4Y>SP*+y11%3puj+5v6+{mcn zsd0$S<}TI00b+=QJkmgja}*dT!By*8r~sLGsVoPk<9sH3sR&hin_2ofZi{gcisJVl zuWNu54IXS_fmDGGxNaSvb&uatq-Q^Bct969x^?^(s43P<;q)+7tUq%xyPT>f_6V!ZdCt;-BX_k+2H6 zgoncRKgFvh_SHS4P@J5@kH+*TT56FG$RmrioworP1XWav8JyR&cG>&Zqx2%7A^K58 zyV;|3#%Ie|#g|={ffd-T(u?cyb49i+Gq}RQq*j0Off~GK%u{ye7!f#?J5t_%s)qG) zVGuVr?n=i&wEkB)+dQ;!;3HfO+`_9REcg{~Yxu+Cfcjr$!JEA0K~4QU7)_q_ze-$= zqmKaxtjgd5n5Ds$!YRaHO|Akmj6>DZ_>9&s2Cm`Ps7SQbQJAXKQ5hRKYWb8a1BBj( zP_Uyn^6z8biTK+rZNP|92M3DEp}1baBuEu$s|!lXRY~4gB43mlTn3&=uVLGB{5)HG zn}N>RZ}Vgi!0RchP-?sx^snX=d5L{DC#D`W9avMvB?Xx$%K92kQ5E4$@uLC@^ryL5W%+k9gG)Y{1VYl5 zEe55YzNK$ezZ6()Nvnaau-bzkm*Z!C14hc@ZwJyaOrpUDM#!Se@&HvyD7TTYr($CY zt{3W!K(XSCZ4}(cA@IrvcTnaOT@OIvo)wrc_)@0F- zBl|)|6?cO!%L{#QQVtE4ptuU~9D?b12b4arN-s7jgV(?ZQa7TRBj?80a*l=5!|Ydw z19K{`tt}D#tQ-ewi_+@A+M=!MQ?N?$C+}wl*BGAi^kPjbMiB$s4ye29w;gaevZe4n zX==53s?h};;CqnE1_ufx?wAT~b}VFzj|)&fKZIww5GJeeEV3M~Kzf@RT)J#I`oTH2$W}f)R1p zR>|NvD41>lld0_g2JYK{3;Ma3@xKF+nyMF0w%Z?}Z2Y%MsQXlq3rx9E<8G;Uv)?uzuaFmdrm4T-eNGHVJDggrW#*O(N6mmYY zb_0CmuowwFbQ%&c2}xbg7`1!%p{lJdw=ZgBAU-%Q&#rGrLH>{4gA>yivV+$*I#&l* zGq&Nv5HXTmRst^+0*EKpA452V^_H2K&5Gan!UuQLA=AN@jJc4yiXq@a-nbjDNFu+2 z>?ku*AR)#R!sZ<8lhCgRBi?FlY7s(#64dpE!R78`sbr3)4Kk0LZ2k_AMZG8|;h?>o8GINuzTx*fr~k;Z7#PAg11p z4QhB+%N&DW8jaOnA&u9AjSSA!X?-KR8dk^U#_Uljjvq#K4w0DrBs^Y->)`V=adL(@ zVwMaX+fp3%X4D~2`@DWJ*!w@ARKET2c|EQ^tH!gO-=*el^?Ni=O3J8^7 zg3ciW4nE`Qt$RP(3>$vbK)=W9@mscRj~cxDlg~1P=d&f15>287O3&qbtWs9F2LM!Y z&CZEC>yaETgZdcMdJ4b?@2UcJ3=Id5E<`n|%fX}U@hv=8$b%Y6eg1ssQ#;O_7#qC( zEFLWsE5JfEi4z2wr%?Q$%;3=l1}=GZ*oO-wh%n~K!#I9-^6-Cyl7uFZpLtXa#gyH{ zx9`8@x|mlNf*_+mo?wd(f;`t9It>m095!# zezr1ZgLN95M^n2o_m2$behW2@XZyNW%d?Ye=!wRimKx7*g%PVV(4|zSS=~7G?|?XF zY2a^Q=lCVBp|-4}9j0a}h#_@1aa7=eA@?#GgmXq_C_tlVR-TthhpXxUvjz3$u?uq8 z&~Sb!IvYzXhf8jyt-#w}q=xE^GziWDw}6t~r1SG<@135mswa*t{j3_dKyRpiPCe;T zFl8xoHUoEOfs34V+7@iB9Xur zawWgl(p1p?;eVcYVYF^DtIO+FaegsUq4l<`(_p11->?MuMdau{lO!$5smM1A&eGH_@8 zJ*s@)0^EMF5_urUYBgMEgdne3=MTWE6PbOtQL>6zuxaW#xMwv@(60HV#l73}TZ^l< zccXIIQ~+&Vt{&xBRuYYTaPN)gBGP}-ZrGwUVc_# zxK}2XoG{It&%A6U;OX0c#jO#SyvRPa5EDJ{|15|9f`kZy12pv^=p1h0&o2JdieR*& zlwT?wx~*ai11Dz1Q=PRybPs+u2i5SB%{^*(0Y0v}a5`S3xo~*NXVtZkI}`cgC6dWX zqtvnUW;I;SaTgh;F&VDRIshtL{SDmHU4&^i9_jS`i8XtR1z7BV3l!^s9U27>}pxH-f%`G3^2H*9cP?hZ%1 zA?#!~-9%aH>aVm>82BDzq{fj08c1cEF*?Djr?REZ$PS0p@Y5TQso}JKwxChX`+URC z)MWiubRiKFsH7kTUbsMlf+n`47fm=5+m|p-J0F+0rF^VS6;ep~areaE?1s$%myN8ae7`2-qU*5UCRda6^;tFK zwm>tIg|X(yhD*?FBPsRljXe?vj9l}{Z);V>=QTf26-FJ%HANS$bstDWd@nE1EcXJ` zeC{3aYeNSqg;IWtcceM@OE};{pXMr%OK3)$H81xYKqisS$S|9s@f}l(OcU`p)Og|v zapGGzrfE$&&c2QMY8l;b!^GBY_kHyje*mJN`~i4ptAD1>v!CxRRU`Gx)x$VHPa4i3 z;7Db*3ti;@lNw3wE}!@fhFWUCYeG&jGtzIAs1c@F={f*Qs6_=GE+<;!NNiD_q$~X- z3eCV%9+IF3KZv>MKj4p7@Z)hsVbRZcrJw0~*J6iEH-rFNkwv0pheV@($CQhFHk3b6 zQP=Z9K~pCiayD}Z4raz_p^(6Jt()~fINOR^(?ab_wKq4S1hYaM%8{lWV@}Z zZX`U&p9TePo4o6LBc~?s`sLhk7U1rw8N+PV)Rnz3<=hN2b_8~}{(u_kLm)CT)#_Ix30|FRT6=)0;Qyi=Mio9i zLAHJNlYas$ON(=Vof&zCAm4*}M9@;q6^3%f1rgZMchty*?D|>H&Yvw&D`z*zE;1jT zIe&JuLkiDKb?unGusN+p4hTEuPU2R6DAeHpk)Emaj_K)h@8bv1M(`OBaP6|?7=^Gd z>rTlJ2t3k5tbfzYunk|t9+{TdO(-u?Bm#s*T4YjTPZ#2Q9wR4=Mof-)aPTHZ9oYr< zPcP0Esgd(6z5BD3^h2opSz0NPol$o{eH^VT`;mx71G&5nFc_+juAr-+#Q)&ff9^4$ zKBI87z0J7tHrF<&Zh1C|XOhyH<{t$L_JOig(mp+na~oz`fA}L-Y70pkY}u4Emc>ht zdnrwF#v2ayndyqp2BH28w;gNgct^Jvxfr*chJ7)p=uH2S{IUjsui`u}W_@%?A;}?g zAmpENJwH9&W-OeLm8Pk8U{=?Rp((PSV^=k;UN(_+PnheH^vt+|I_4GN(OM{=rnS|u zHa?t>FUb>$s3is7v>F9X;>W ?~6vX4vMQ-$PmxzJ;jqZg+<=i4+rJy2_aQ^%kiuU zhNzTX6gPusnWh=NwsC|M!83;hV*{S+C-U!uG*jOM%?yx7V*seOM9PbQ`?A%+@jFs_V%yIgSIrVPwX?iDh zypYrGh|&l&UyYyq*8qwWT0F1-(P>)*tO>e|IWU7`+w(0MwGbaS8aeB_3S8Us zf2GED#6pNAkk;0yeQmiTt9)n$Cl?l2EB40WkBJzVD>5R(-5q#pTgf7hUK5~(h+_Q zw*sip6;(#bH2yBg4!0%@w`9sil?l{qrv6}EnfZRK0(9{G9mPLn{$pY6=C&6;@CS*;v`KE*r2A|40^}o)kQy0PEqf zDsK#1a%EGjRSWy_v1g1&r5ZRf9IGS&^9&2(jFkbLT{q*kb8$6Czke1}_qhG@Bw&y7 zD?g)PPc?cYuYSs_n|URbFZ#nOWBAd3MW_sh8a39P{3VnN?;I>~@T!lS$m|f_x1U zGvTn8r0IsWYV1b+Y<5;T_m37NgK6$%kWz<+vIn~&j6QTBE0bJoEEdmK;_SwuJ0|$Q z+|1|!-r#iZe*i;LVV|-5j*0PO#gtvhGan`CFHXZ>9K%QOSeHM>wmZ(8$o=nXd~qWP z!w7inmYMZfuoDG^c@yi_1em4SrJI#><`d*V=V)+L%_6bPX(_slEIlxO6|3+iDW$IEPa}V>=1(<$@bM+=N4j6BO4)}(nJP_;Vda3$7G)Oz zD6eX>M0|(^MCcl})C+vV!y*G4J4_lk%3zEuz>R3y@X7xK^iN>rs$`u5fzNn6|BcLe zKNnS$IH6>f^^GS4Dt-$5QV=tpgE|R(BuRQMZ7svlJZtZY%&=9~Vq_^qruHnvQPhx* z7r|@eA%+z5w${oNwyzlj*4avYuS(z&<96|H?W+H8X>T4KS9RqJ-cdBnT?AM*2f z&5~zCcZp|0mfpX;dtAk%rKQp5m5$f~gk6Wn_?dP>(Ie+{3|&_Bnf?slc56CoBaK_ESdAp-<7%5`00Q zOGEj~X6{7VLovsRr*#;TdJ)?i?jb zA<7n7J{Ih8`B@=K9KTL4eHm@ZP0joFyX8rr%+6Ov_W$X9W#pY~SHO94l`RYLf*MFM z#j7Li;kWOKeAfoK=iPAgGCWnU5u@}A%Dk(>6*QWod=zJs;fg^HF}4&Vf|#h_xCZpZ zC1d9J)5}+I=~E83^b@Pmh?`$IGiqX!4Wo^ak)qs*b;C?*h(D4 z%_SSwGb<~Z5+N83S^1hWYTbe+7-EM1^9N3~M?+v@qalKX{qpN)FbrT*!OMSy>y^tY zw;o1E;Qr2NnAk~o4cfdEjRrx2-s>W`%Y|-|ul(6Ho_>ucQRdrx58VIPldaWI&X*84 z*5(YJE=ly7lgTGy6s+UNVlh}lSmeZ3c0Js%SrA?r9S|9B-mi>S`rk*E*k+i`%@@v$ zmPw@U^GrA@zBm?Ok20x@;#b0yzpABJjNSIJ2EUJ~! zTse!*Er%70Z>kzqMzaGvuYba;N0^1USb}7V5ykErASO*OpSKt-(Z&qEPT&2Cq3SJ> zuWTbvibjv6STQWiobW>2lp1jXY_y`pjSmWBC}o1P1|KUwIx~8V#|iAi(OQlpUPu_N zrB5&~Q;*Jwd~f5@Wg3R*Uf5XU86~(JgG4Dx&Ga@(W~peC6~*MjTX_glQ;d+{uHWH7 zxK=L_e#Vv7=7q;78l{Ge|5=H*zKkp!QYO*l^6ybEFO)?U*C?Yqb#FTAS^2s$dY)FW zQ5-I_#0k3j^E0F0<6wJAzEb0!VwW=7{+Z0VXr*X_?ZDv(+AD&y<%W_RSXCYzu1VDC z3SU*zfS|Hr=#Rw)iZk)C(u=b4)rovY`gqQd-qL(`zLsxdGg!%;xLBIcF=n1(&rC_P zR(=T+AkA9^O-?MC@HM{~Vn{yOWP`J}j4k>oe^0r%DenR8iXj^<6Vc6ILJaJEM=yP0 z4w61%*^kRu`OWVuqwlQzrQ)5D#<(Dvvhr2Md&rZ6z9@k7Y>c-uov4BCb-D1~JD;rl zoih3!xBgCX8r*4bEM;N&y7DmCFBhVtSkZ@I(EE#F_O=0gJH-FJ!7DE)qqh;4LvRk& z$c4?&mICw}~GUzn0;>{%V1SPPu36{?^ zff`~$`rRfJP_&!hKjW>+uK^;z#(*L+Gee*(_6%nmZzvTjYHyczNU@tgLRpc3oYTJ0 z1eRD}LUN$Xh7h;#77K0V@6LFKr1|po^U`OenKQk$!(&ETgbPNK4CPcAfzoYLSP*wr zpTXSsnP2-fC>TZ4PW<8LOYwXU`tu|JTo+ZGxU~<%b^`;120(;0tRvx13s9 z*toBHWnyAtGV{c&=V)>1fr_!^LGRBWyjlF?CvUFIe`R@^j43=O0Q`}O=`cRX$Q0Cu zReOySE1?*d5<5Mj81}=V+uCBsm={{Xb+zwtcZDl#FCm_vu6UMH0!MRoRZi7+l_4T>KM1 zrtoohb7?45y!*A)eC8SNZ)8oq_;n~{`5)y2p={g~=xCAfiQGnI)I`GbO5;X8?k30o z+GB2rljwH@6r~oY_c&nYWmNrI>u1iH7M~dV_J`L`JG}=z>y@4Pa!rP<{HT;SBt#5q z(qM2Z-s^%8o%DVpg6FPLyr;O#Fs%4oc*>A_o0Uwg#p%oDWUaFDYb4zI3MN%a<%5@D z6#?P&JE7WD2<2|Vp^A>VwZDoRQ*eML$J}fzuQF(=#HTExTyXQp{}ffM+#ot38*fHr z^%Dm827Wd3Bj{FlITEn!@?<-~fKM$gI&n|xxD!jy69sjkRVZiYSGNIN8ZaiR*~1`t z${y@AvX#N!`7qa5w97?Anzl0gC8~%uV&5$^W{IS$iDF2T``9tNGfEjNm<&gsN-972 z#K~Cv@NDp`5{m|MaWWRO^4yuR#4j*Fzl;@039U+s!Fr?QtJI-=1=AEfz&BR5@-VpM zgXzLb5&WU#lgFV1Ej6L*=&Pbu;?5{TtT)}68+mdo&XL0G~3$KP4z@zmWNJgaQTW2j}R zo0h_8*OGzh{C08~9`H6B%Wcg9$rn_4`S?EC~juGCnIbZuYKy;oN8`0w=Fo zslzaRoWES-fld5U<3o3@m82_UHS)L|!t~v6B~!|wUMy`*e3EC_Sp!Kq#y)fwPGKr} zNIQ%ezqGQ1=>VNKo^fjzw6T2lntUC@lP%9HFH5w5LXL3A-6&WOC&He-taaJa^Q&sV z<$4OyAum3d${WdJH>zN|y^*rjX=SH||N_k{}`e6&0&5GMHLfE>_-_ z+WI2epr(-TArPOt^(^%|Ev2*q7nQLOBpc5agO}~_ZWMkoAiU-`aX^n2d_x&eyH#UW z41+=ViU&!@POsd5X6)9=33fhCh0*zE#$Wri8d+|ID&sH4ViXwiLXfcZRoH^uyyGFb zAs3^?(7O#>I4BH~nvQ&jm;W33lY7Z)g_&>(D__c2;>q+CoJQkJf$N$w7Z4gb9^Mz{ zgjBopVVwNB;sJv6dB{sHu`Zb@X^0a`z5j(KfZzCrzHqdLvZV2ArhHwQkJIE^ zOIl7*F+H6FAIul0?c=Kv8l-Y8TAIrai)$-;vZ|{wdIBgtr z=#NJKAK(f6elWQCf-;UbXE5RGXU4~u%->QBP6sS%$;e`VcwYHXB#?UL`Ja*+Wjw#a z2tQp!-@*i38$d`$W&nO&>x=_~;F>8=+f7%oa(%rSkK}4iy^N-ENJr+Hrwm4p|In4E zmGPIfu?`pU@TdF4`GB9)i+fPKOgDb--8BejxUl6%al+(5l;7CHM{v6ljK}&Bx8CpO zlg@XRB4H^ACCZQm7vbhG#yaz4D2$)&jbmAuhL)hm62{wB0wZ50>Q8rL@ZI$Rn{$=% z9iw$H2zfeP?1(1$sO}BM&#`h%bEWH{4DmCPS)Oi_uWWPh@^%~{OH0v9;D?om;#AOY zQ3~7yYxw_9k@raW;5u%Q7vwUU%oYNUzH9QV(cPml+*4}bxr?cHY3&W|&Dw3i&(T)j zmH!#quAMs?YFYOGHOP%yn(}LicMGjn_}K?}KKJm^YR-*(dm*^vX(GObv;nWQ4eG+H&o&H~V6h`SaM&U6HD?S(-v^cY-lzrVbnfUr^sK(=l&ZR$Yc@hvx zjmDvDDdv`a9(H#xuVnOM=GiA%c=|JwRgO_AUrT!thQ-jDu*un(+!pRzgGqdF|shD4rV#R=ax(%nCx=mF#d;?i8n-H z+Vzmj&J~p#b*FTLn{k#okZK07tqSW3C;0OxU>?3;F7Zi z`V$W#?a1w(!{|nT1oc7>Tw0IMEx(L>!daf$AZ@jy#DhS-I5y!*&S31>yK7=W5O4g> z@~`3))5?BGOHmr6ZmDc3^tn5?+4-iWZTOJ7sqkrGC$?}`56ftasf?0w29;gMd&0hq zrfYC2lSa{;Xlbb$dSHakB%N9WOWBJo6ElUh%RoPQ?)H0}H!sSfdSZSC3g!)j& z#062%pVNpq(Uo5nD_4v5!o->RrIK!CqQ_aT1pnW|kd}vuMtoC@JYNoy9J%FCx|jl6 z`X<94wz~u4i(>*jJM>0Q?3LDk-t@;;cC)z#e31Ps@|Fp)(uS?Ld!e}}=uAnbaf?Pi zje(6Y^H$w?ZG^9Cuiu&8yrT(^p&&E9NSMgdKKDF3V-+~vz!gjQLcu{;$OHC`T`}6S_{)i4QfY;zjnHv0T8Qw&LD-K^` z-awn_pdqb1|H-E$l%Q{MXP)|(@){)Jjrygz9X(vl{ zq4yh=w-TuRsS&Ee!oL(y<>K#)1OR!7z&tEr}_E}hnd zpqEx+uvn*^Zr5q{Kzr*Em(lVyZ_-gyjfQq*uIk12<7ZCZb9PuU+Ij8Bhx4)Le82e9 zNAK_or^OHSG1MA8?%UPwvf}+zpaH4OcSo(mVg<;SWXx^KIi;mGJ$V6#Y>F*0kb1zp zrK_PxOMU2>SNE~R1NPP#t?bk0_U0@F0+<}_JEEOTe9M#`JCLLm*!{rO7Sdh{6u4ua zQQNcvGXn=%zdgaXCo6U4&Yj;vI-vV#2x0b^WW2-yC|rsXCHbH0`U4L{?OT06xc{$E zf^7tn64^oK`T30+?edn}l+%8%uj|e5$g^!&kprZWbWsg$Kj9*~F<;j||LPvC0MI$6 zKIeO^_4M_#*!%e(YrV%p(oMC#`A`Uuqf4#dhd?J#j#@vHO4%Jf#-X%^S}D-=&#yj6 zQi>X~Wv67z3KZ>7i*}c|STx%>l%AS>=gzMode@t&1EASw?V}~73}4!BsP&0XVeC=s zr}Kr&23zx%W}&qkcl73mK-m_5`-S`xvO8qiA2cz?Muhq=-8-q0cF_0c@BXRrtWz=j z0XittJC32qZYPlXv}(=ux{yunaGV&GPE?<Kv|K_#7XGlX$hE=@G0_}EFiEW7J zn4=v(p3Ov$Z76jw8>arihSxcQq^LV>U2XY7d(yaO!--VU?6z-yx(|sCw{5&uY)n0` z8-?0t%Wa(BMJ7)eJqv9qni=id_UjIo*raw2l?%J?+FBxKyIDnRpxxgy#ujEM(igVa z!kjU3xuSE933J3ph<;*X9qDz$D5}JStK)Ma)M#v|`9R_U&5jQw9%a#(tsos9W?uyR zAKS6?0ciuiu_ymG2E*?`1KLR1J^EOU4OVxqt(XJjSTkFj6=*H9_1KE0N1RMl^wAS* zQQI6P!=#yf_x|uq89LeI2WVk|%W8iql7LRD`v-;veRJomH3*5ZCR=H+i=czCazh z_Oc4;?YIG7*K2#>w|~zO`r2OVC+?8Vk(Db_owILB6$6cX)KYw+7bBVZE>!gnFyBuD z5=;m3y>0H8$pV*yF|QfvE)$>|MVyl1K^7bQ_kXbeBvH1%;mT|>E9kN%t(nE6k;e(;sQEkV0XegI}$bFU>Ly3j?ptVTqa zvrE?Wz%3tU{)9J!^7q7}!!U|s^7kZ3>a=F;)+bedPu(}U$H~OqzH|2^ARZKysl63u9g#RXbosPrkzT2y0Yu+YMYxHe7<0t(yCd{%wJNDMZ`E|iQ@Fei8IUTv88m&8pbThj@+ zfyW{7*pr{0XVGl6#1Q2qdI!jgl1k!!ThX3Ep#QkgggmYv~T zasdLT9_L)z30mq6V?uscu!yB?YU1#=s7=<;I^@T4roGj@og^$T{`*Db za;9Nutna5D!u;FbUr*tj9yK(=dYBc=`M=+~hfiv!E+SvsDa^Rk&kL*h7F)oehT2rt4ezE-0Jlc#U^zuubWs-x$K{4A=NZSAh^=l>6mXP0)iULXR z>MN+!!}|Q0`k}tkNt@xvR-{`roJz>LGcb+_VpeVcM+`a>+f-ra|O!o!@H1X6%)!H z0_u2=_Yv-%X7`kuX}oY|Dr1Dpj6 z+6c!ipn|r(7ut@Bg0?Xoy&py6TwkG22dTf)2WRR&ROa9SOMS=O-m-a0>)Aj4{Z$l5 zsWN5m+A($K&M&a8-IKM0J)07y?#$5&yr>&i>KX3q<66GAr3%va zqKZmv^SDm_<{vMeXNe}?*YdA^7w?IIpg^>!^|$o}W9lV!&rEnW^J$wGa+&l$@xX6) zllF!h6pJggKvTLOP5q6UT;l*qNyWH7ZFDi;o6tpcG}{pjWki=Cb$z@V7NV6M^MC&z zyM^Ctj;P-XyK!|-e5YvTbz9+3r?8uFbf;(yx?(vPduY4N;qWKt$xT%|hi6637ieZu z>&uSFWQPl>siSIgktWG2{>P90gf}o!z4lE5^W~K8RoF!fw%S}yZToEt2S(BZ>fW$W z&ibjt`k+m{9MJa&*0Z;;!KNO8*xzZ*&~1MReH(TA|By@CA||vfHY5E-bB4QIOdczj zEj0PGGDpYEmSLduL`Ozrub=^-{x%l4dQGRA_swWx}WN9-J?P7U`}h{i1z*nmm;BJ}}c7zV+IUcoVa~-IX9}bb-h_9#b z3B0cwMFFVoj9T#sK$&*gduraAn@^?|7}JaQ&Yk6y-}s$%2!0P_%OgWWW8q8_Vs+R)s5J++@X zqxK$s)gzZ&MqdeoTSiba5vT7OEm0$C}d zbuyXu|IM$G>6EhG)_rx>UQD@f3GH{jq58N;ksTnB1qLh;c$M?2oqR>1in9`RkCC-o zBqqBz;T_)D&D1@DNPElNle?60VP7{V2%9*s$(rg3Os#_I97#7wv+|Kv7k z8{>VCpFg{(^)=8kxNL0jegDzPr!^YTMdr))y>Q~@Yn;IS0B@1huZPNVugTy*(L9R` zHCASll>uqNzQ=al`C!#1cHEI_+ieBLQ^=;|8Q~`Ljap^*e~@oQiQF#BuC=k{*H1^G zkryLk&mmvVVJtVB=$vxjSIa84@};b~A5hu-M4#v@v)p-EeUNrbwa2mwCHJ(t-s_dJ zx79VX!BeE21K`pm_l{b!u#u!ZMK{zugKbYnxQjF*+c5IwnM}uU%)-8~ADiAZMjpF; z5B>OB>zzBZa1=n}$dSmmKglLMikBHdt+@sW)&^{&-8bU-8HOjrd>XdTl zs824ka~Fv=v*d9JcaV0&)?#U`CGCVD(w23nlzUQlRJk{SO6!>KlzB^U1Qtoy@;J8i zA{2;*m8f`3o_~3nw)8lsLYhYpOyzB`rBBE{FRxufRLqy|l;} zQ9XzOeexm`j~kn}p2qyhKtX%be{js?mFX@h?_o#d97`&BZp(z(;F5LI3x8qY(md~H z{^z%wGl<@i4Gd6$Nw=*6qwi}4&rFN=0-(>xyB$b0Sehf#B&r+ie=hik7N$N+wY$i~ zAR~(A7OD@a{A}MN-XH!HqFej`uOM5#*PP~Xtxj?GyItoYW`4ficv7^J|A1}V>=74e z1&Wc{k#%iGt^@}2qa8hY8Qo;^fOHwrZJV08uYpX?Mdp~DB;7Gm*Ia@G+tP!=%%6rytwdX7Em6Xx$t&v);nQ0*~*x|9J2v z%~JrqMOv+NEYT~<%=$QJ3|$vBlkzx8$EAQ6f}VdmUCVr(27-3}M+zhEQm z%IGDkfn9AGCX<(uub2xp6S7s%$rco;o+x7h(K%!*cd@{*3|-PLJ5o>Z@qeXYgssNW ziQa0aZje?Jy(q(;`G)-WSLHI$UGNf1Y>{EIs-}WtAgxEcFiafXc^P9Ya6ngGp-uNE zg=yLdqvu~8VTHB2+bgWZw6JqEKnO&SU${fa+Oblin#seMG|eXVSGy?bl*1um#B3MFkXL382m1 z#Tov`l)_+0Qrzm8Rr2YKi!;%R9h*t>eE!UZiLr3wa$Hi}LP=KR1wi}AcsF}?JM*Ox z6_ZI5Q9o(vl$iO7OQ^+eq82#RQL&U@Tl3aQT1s&s)KYRqUm%xE8nX}0jA?VK`;+Te zz`4X^K9JKpEZzf4G_DMa#~eJ8Vqz#Y>jJF=fjceMQu4ZPf+Z6{TWe%(ZT7$Mo~*4) z;`LEhGNy0TOI{1wx@8tYFGg+Ocz2ctRT3OvEL(PJyW~})b2d9ylWu!?_Bd%z8F5N6 zd6pA?dxMVyA2Jz^#BzX^T(;$>tpzuwWW-)KJ1i2v%r0}0HY(E>^Sxs3tC+*lB2W7s zxjOeCQj2?NDbFIcbhq!3e|?Zgh9*A%*Ayj3gSu_2F`<76m6%Wor_UawDW%1}@4WiM z>zbHAx5=Z(2kBlGXSgb6X_BL(E?){1=~G+jq`9wZp?uXXpe_pck-lLs_3HC&X`#9` zeIJ`sI&R*A*X>a_$Cg8KI#~K$U%M;2T`U{m2u12~q}h$kUtVimQxc2e&Lfv?-+7d7 zx%3@ww{kS$u-zi*O*MS9(8U5>YRLRV9hj8oh>3H>&CR9670Uvrp5@j0uD-lo0XHhD$`ZtVhmA6>-2OD7Ge~rGrbnlmG z;-zQRk~M}JrfyW5)@Cv`P+qUc?aNd2z;bzmXodVzMJvqL2$9_&DdlNuXxM`2tjTxD zyggJb1|X5y?(@Cy@kD}12T(%N1Gc)&E|#oVtLv_!#n-#3@*{01^lsX0VZPV&J$glx z9{#RK_kArV^chV(K=gd&ck~E!MXIB`+d2zcMWf80tb>!l!D)$TVHWUT1+Ba@W{Xvp zV-?l9X;mcaOSy_#eJNM5URQTTy}p#INRib7>u5k|y>(0+#QB+4I*3ih2(e_IVzmjn z8Y`02w#YHsV8vF5XK^yssYPcvGp$BvHtkgn`!-OE6;-}V_x{CIZ7=|R09yG;-M3UE z>Vu}DQr#O(&!<$Z^R*|PdtLMnzycM=VYKBBbBdtRmS1GHF@3dCaZ?Y_RVV64fz^@v zVPka?=AQC)E!@Sj;8%IlG1x6@xymOT18XK&ZFQJ!C{vtEb*!3RC39JIcz|=fW7;(< z`4;r`cXfi^k<}5ti*IM$g2-n7#kaH38_H%L8E$uJ%Z~%=c5q!$xk+q`m08vBq-N@; zTJ=5B|D&ziPzIvg+?;JL?`gxznbD@N<@~yYw9Qa~y9uVp^8@z)NxAk-)s8x{3ymqt ztg9nCJF1O2bv8<}#nNauKPWpuCR%Nt+9>2#s)KFrNv*Mw_NHcy7NUFC>S#;xQ7fW% zbT1bwzqC;*!%&{ZkArb<`HJ0FMcR};Y^#Ix>kVcHuQ%YY%I+I}djiKRoDYENNef(R zsJ7U9lOcC$suXKs-E;L_yklC7iUoGzchE_k&lcY76XX5MVB2hy^wv(j&2n3aT zHLK|Q=bv9i6RUop51(pNpoU<3k_GwEY_lyD_DofTYU*ULc2%8Q*86*w{_SBVnrxH1 zGk6?TZPZ6?wFOa;P}%KMC!tlyx23?|ZOvgXy6)J!+7g^Bq1bzhw@4KRd(Wu}p&8IA zGn4S;tZasZcFWP2wb6%}==v|5g{7}Wb>OzO!CbX<%~6hWv;U!??<}*xtRSXt(wpcy z5-yOe|zTzk`4zXIT5H~Ssb|5DXSiQYeOL4TtMPQk(1RP7uhNC z4d3)LZxv`!V<76-)g)mC=G(2N#ma2v`Y0gsQQd>PKGxll>sX8Hux^AvciA%XY zufQ{X-Se#uaH$vs`k$dpEpu#cz)c6BJ&w)WbDBweOLugx>6oIH6zSWy_4&fJ7YdSv zn(KGAT(_Z;W%uJE#&t##Tvr3FoUwP6Y5nqUpkHR~V?|oOyccNs0Y|qpW|(E)cT}%S z7JdhTl7!y}w(a$YMZQC}Qat9veAn!bj1xjTY@6@P7utt0Im3ftl;w!8=}80h#|1AC z$7qGN<7VnUeP`l&hf7K>bDDyTL$@Lzdnv~ zwK=|jDoMmbjg9`Nl64&EwXu${F7fY8p^mUV2S`ej#Su0TL4`Gi`JUhZ>P@&3lONzV z3p9O(DJyvrPH6<^Fl2h6`8}>kYX^iWS($_>Sp^GI(##M)$Dxa#)4~!z`+P+p)me;J zvxZr=L`VR_{g-u~4MMtOtMinw zY?ETEPpB9D8Gt-OGni+)s~Eb$ekrHwK}zz9z9)5`l<~m2ZtCks_bKkz!bJ7huO)(S zz1fEt-&rjLyc+GROLp|+2XQ{DFTtgm2`b86tuGbaH}nvP`veZKmbt!mFZ+&7{rw?L z{XkSez0(I%eL|zH8g0D?tK^N98m-;6ai00|vDDspDL}hIS}AFlHLC>@T2(-TMSTI| zKE7H9t($eQY)>HH^+3KkZXI6Lmh;*Ur~V_|v$Z5XTDbzpn_zE@9P%6OynV?o<0S)Wbz4ndWNOT{=c}Q_Hs|dw;$n!6(d$!A5 z?S9{}Cqm|G_d$KGc7LGH)$T)%>4P$VyRSL+R>=JA*5)}%`k~rpr&1L65sTr-TJ4_R z<0l^5M^UVS-k#ATr0#e1@Vk4~cYY@170smpT}6rd_x+DHf66Dr-R~f5_E(&b-TNJV z$!-~YSFvoUh!?YXthJ(^Rm>Q7M-I3|wYwv|w2DUT?6Kn0RQp(KY$9me$0fc_zQ5Dg zsP26h-k}rK;$B&09m{6OLX+%dorwaCPe^YIX|=N(_nMCkY^KXKJB|#cIGO8RRO&>3 za%1;ctCRCV<9%2))o{Duo(7ubeCmEXQ2kyse+QQEG*qCA%xCmnu2kx> zNts0-a7;(+A7-{~c3ZPqH1c4;rMww%Gkain4*s^g`z_19E>G{BJKw@syfpor7eU+J z73h<(z^Hr;=gM(xzk57jD6a<$Wg=iGR|1AI88DPL0){dbFqGc}3}rVKuHVK*8BV7_ ziImD?N{=uNUq9u-W##mUPBdWtufB>t zH?>m=l@i@XNk&)p0V>{ zH_;^`9!uB_ysq$pa)$Z9jB8S-%fZ7SM>&vs3aWYr9H}*aFVy{sMEC;``}bF z^_LiJ=S?=E3?dGI#A}EiEOBMN&ZHiUJsd_<4RnZMfpr^*yreyZd@FgRc|bdwLfZSJ z^%319js2E%2zP#3B8bisMFOQRL;93{ptJ;{8KCr+RG#+}y+w2gC^H)~-6uTw&8!9O zIJKJ8V@ZgWqXDvFm^h_2ZHIGMYve3*c;2|4zke7pi?dcGr5~4_= zCWQObd5(~`i-^5dfHR1^^nCCuND~^-t3d0Ks1(cqWpKY&n1S%{PL?QKi#c{Dr7GME znkST~9yCuF(O)vOjsiu|AhmfxD#~SKnd&Pl1Fb!UXppo%qDj)IzT$SBR$L@Bq!#aR zFvLpKMbrRPGUZ^j6D3Nn5j6poPOA*hA+>ZX(Iim$Mg;2qg0o)vG0==ub44q+QEQP} zQ9{H)R-Np>=!mZZtvcIo$}V7B+}$NNmqByascoTKS%>?6`hfdLtM^~B^s_77-@rlR z^E0G1+SY8Cp*M9ujPtGP0@B>v;@n5tIdxZNA=}|@a%3mZI!SxfQMHwC=uzCw*lK^5 zaU%D({oDTV{+CH>!8N9uF4Dg1zcl^khotS`S@>(DomUydAgvX$Y;Ga#d$>>(M91oG z1F{J1343ltH%OQj>>Fq5T+H_aAonn7JN-Q)Q?iR~q2*#BaPh*I z=`WRF|HU7l-AEc@YCm4bZc{?l&f0jI6{gpVPyF>gq=j{K_5>%87G%pg)JC8LfpeYI zYrQ+6v=7d28f0onM`w3ZH_JwMboLpfY$#~!M5?Hc&Zc4$QV&}#h-lj08tmD=bHxcR4(L;k`n!D zr@LQtaM^$H$$rV_Mc6eyj$B?x3BG>-FIQGOy;1ByWtvDd^fsg#k`^8EUwroK^nS`m zphZLzeXMr&?xle#xZ77PJ3ZxG=dOHd_#IT+FpES3RNs^xKtcJdv>p9avjN@lmgcf`?M8la$tb#Y9^WxNJwH<6R5hpE;6i%;jX+YF6rXGhu|re><0yGl>% zsO;n_Y7I(XMa}y-@(r2(i_aUYSk|LqI=cO{%I+T?if8O zQr!ocpN}M$S|SVcokhMQ!$eQ3hPgJ5B14Di*g!G@dN9}kGMRGr#Z3M&3U3vfUwEP( z*_05V@4ZbFxj274;#s1ouw(s`+rdsrj(PnXXh>hgv-vLeW<%nOcPc9dwpT z734J1RgpGmbOI{AKH|yvn0bsZHBnz}4akGXN|81f04W?$0orWM?E*JPp zCi0yQpjwQAdNe3etu^OXdut%GOH>mJI|bzou3fjQRO^?umk{G%itTnJC{m`VB|yr;#^DY)yxxstMU+pH4_Ayid&T4Ym_ ziEgCZ9@(@xcaA6_Vr!N|VQOo{))VVM!plq|T<%Pvc_OOU6bfxaL`d|ollj`ebb2_1 zpkuM2^dCN8ft-aVV^a-Lapao%SS}R1zrFa!wqdR=y3dCnO|7V8YAgCBhha`2ED!57 zbp6VvBSiZmo3=@Cv**G>Q$ouyXuYQvaD+HZ^i{YW24DLOix^7U6PUi!^f z&J%53m`MrY(y0F)A{S}Z;Rh>ZOV@vC@k0IUTwDwkglCQz=KEYS_?I_nXp4u(dQY^xLe(=CP3p(}EP7C90|)J7C;{pL|J8EIOGut(A6Mh2{&jdHDPq|EBc zNTNZG9K#SxH4xK>aL}TF_N;=5KI{`_f97G4hdv=}T@brGTxF;(rf#~DK zvA?Q)18B?==5Sfq^06Zeox`cAME5OT{Oh)hC_B~wSK(xn#)gQ}nEFzrJ99@b(JPT# z(<^rpy#ZA1VZNz_9bM&hppC;FO*Q5a-Mi3Pn|Olgp~aSO{R{o(_%3Tp=&nA{CNdV= z>;Ay-;6(PKXWg0yN$at;SmU`TnRpnfe@mY`aT%u3$l);=8NR-}%_V4|_{0u+_{qox z#umV3(rRrR{E-Iw2g*5RO!} H!Tx^$sFH%e literal 0 HcmV?d00001 diff --git a/bin/games/yahtze.fasl b/bin/games/yahtze.fasl new file mode 100644 index 0000000000000000000000000000000000000000..8a072c09fff3955f6ffe4f3b147d6e64a07dd1ab GIT binary patch literal 8708 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\r" expect ":KILL" -respond "*" ":midas sys1;ts quote_sysen1;limeri\r" +respond "*" ":midas sys2;ts limeri_sysen1;limeri\r" respond "Use what filename instead?" "eak; lims >\r" expect ":KILL" +respond "*" ":link sys2;ts limmer,sys2;ts limeri\r" + respond "*" ":midas sysbin;_eak;limser\r" expect ":KILL" respond "*" ":link device;chaos limeri,sysbin;limser bin\r" @@ -434,6 +436,19 @@ type "beg7\033g" respond ". words" ":pdump sys1;ts jotto\r" respond "*" ":kill\r" +# ngame +respond "*" ":midas games;ts game_ejs;ngame\r" +respond "Star Trek: " "ts,trek,games\r" +respond "Adventure (2): " "ts,adv448,games\r" +respond "Adventure (1.5): " "ts,adv350,games\r" +expect ":KILL" +respond "*" ":link sys3;ts game,games;ts game\r" +respond "*" ":link info;o.info,_info_;\r" + +# guess +respond "*" ":midas games;ts guess_games;guess\r" +expect ":KILL" + # ten50 respond "*" ":midas sys3;ts ten50_mrc; ten50\r" expect ":KILL" diff --git a/doc/_info_/o.info b/doc/_info_/o.info new file mode 100755 index 00000000..60f058ab --- /dev/null +++ b/doc/_info_/o.info @@ -0,0 +1,63 @@ +O info - 12 Feb 1978 (AS@DM) + +O is a program that plays the game of Othello. To run O, type O^K on +DM or AI or ML, type :SYS2;O on MC. Type ? to get a list of the +commands. Moves are typed as two digits, giving the vertical and then +the horizontal coordinate of the square in which you wish to place a +token. For example, 81 means move in the lower-left corner. + +The two players are designated white (@) and black (*). Black always +moves first. The machine and the person alternate playing black. +Which one plays black in the first game is selected at random. + +A brief description of the game of Othello follows: + +Othello is played on a board containing 64 squares arranged in 8 rows +of 8 columns. There are two players, designated white and black. The +two players alternate making moves. A move consists of placing a +token of the player's color on an empty square of the board. A move +is legal if it CAUSES one or more of the opponent's tokens to be +surrounded on a line, either horizontal, vertical, or diagonal. For +example, considering the position shown in the first board below, +legal moves for white (@) are marked W in the second board, and legal +moves for black (*) are marked B in the third board: + +- - - - - - - - - - - - - - - - - - B B B B - - +- - - @ @ - - - - - - @ @ - - - - - - @ @ - - - +- - * * @ * - - - W * * @ * W - B - * * @ * - - +- @ - - * * * - - @ W W * * * - B @ - B * * * - +- @ * - @ * - - - @ * W @ * W W B @ * B @ * - - +- @ * * * * * - - @ * * * * * W B @ * * * * * - +- - * * @ - - - - W * * @ - W - B - * * @ B - - +- - * - - - - - - W * W W - - - - - * B B B - - + +When a player moves onto a square, all of the opponents's pieces that +are surrounded (as described above) are changed to the player's pieces +(in up to 8 different directions). This rule is NOT transitive. For +example, if black makes the move indicated by X in the first board +below, then the result is as shown in the second board. + + - - - - - - - - - - - - - - - - + - - * - - - - - - - * - - - - - + - - * @ - - - - - - * * - - - - + - - * @ @ - - - - - * @ * - - - + - - * - - @ @ - - - * - - * @ - + - - - - * @ @ - - - - - * @ * - + - * @ @ @ @ @ X - * * * * * * * + - - - - - - - - - - - - - - - - + +If a player has no legal moves, his turn is forfeited. If neither +player has any legal moves, then the game is over. The object of the +game is to end up with more of your pieces on the board than your +opponent. + +The 'L' command will cause the program to list your legal moves. It +does this by drawing a new board and marking the positions of legal +moves with '?'. The 'A' command is similar, except that the moves are +marked with letter values that indicate some measure of goodness or +badness ('A' is very good, 'Z' is very bad). Please note that these +values are only rough estimates. The analysis is NOT the same as +that used by the program. If you follow the anaysis blindly, you will +lose almost every game. Using the 'A' command is a good way to get +started playing Othello, but to win, you must begin to use your own +judgement. diff --git a/doc/_info_/o.order b/doc/_info_/o.order new file mode 100755 index 00000000..3d388070 --- /dev/null +++ b/doc/_info_/o.order @@ -0,0 +1,16 @@ +Othello Commands + +Moves are entered by giving the vertical and horizontal +co-ordinates of the position where the token is to +be placed. For example, 81 means place a token in the +lower left-hand corner. + +Other commands are: + ? - print help file + ?? - print info file + r - resign + l - list legal moves + b - print board + s - print score + h - set handicap (-4 .. 4) + a - analyze position (A=best) diff --git a/doc/games/go.info b/doc/games/go.info new file mode 100644 index 00000000..f38820a1 --- /dev/null +++ b/doc/games/go.info @@ -0,0 +1,89 @@ +;;; THURSDAY FEB 02,1978 14:17:46 + The program consists of GOSET1 FASL and GOSET2 FASL in my +directory in ML. After FASLOADING them, set the size of the +board to whatever you like (standard game is 19). This is controlled +by the variable SAIZ; e.g, (SETQ SAIZ 19). + These commands are available to the player: + +(RICEIP) Clears the board for a new game. Type this before + your first game. + +(PLAY x y -1) Plays a white stone on point (x,y). + +(PLAY x y 1) Plays a black stone on point (x,y). + +(PLAY x y 0) Removes any stone from point (x,y). + +(PORTREI) Shows you the board. + +(BLEK) This is the program that plays against you. If you + call this, it will make the best move for black + that it can think of. + + White stones are represented by O, black stones by X. + Here's the beginning of an example game: + +(setq saiz 10) +10. +(riceip) +NIL +(portrei) + + +0. 1. 2. 3. 4. 5. 6. 7. 8. 9. + . . . . . . . . . . 0. + . . . . . . . . . . 1. + . . . . . . . . . . 2. + . . . . . . . . . . 3. + . . . . . . . . . . 4. + . . . . . . . . . . 5. + . . . . . . . . . . 6. + . . . . . . . . . . 7. + . . . . . . . . . . 8. + . . . . . . . . . . 9. +NIL +(blek) + + +0. 1. 2. 3. 4. 5. 6. 7. 8. 9. + . . . . . . . . . . 0. + . . . . . . . . . . 1. + . . . X . . . . . . 2. + . . . . . . . . . . 3. + . . . . . . . . . . 4. + . . . . . . . . . . 5. + . . . . . . . . . . 6. + . . . . . . . . . . 7. + . . . . . . . . . . 8. + . . . . . . . . . . 9. +My move is 2 3 +NIL +(play 6 2 -1) + + +0. 1. 2. 3. 4. 5. 6. 7. 8. 9. + . . . . . . . . . . 0. + . . . . . . . . . . 1. + . . . X . . . . . . 2. + . . . . . . . . . . 3. + . . . . . . . . . . 4. + . . . . . . . . . . 5. + . . O . . . . . . . 6. + . . . . . . . . . . 7. + . . . . . . . . . . 8. + . . . . . . . . . . 9. +NIL + +. . . and so on. + If you want to play with a handicap, you must place the stones +yourself. The program knows when the game is over (when neither it nor +you desires to play a stone), but it does not know how to score: you +must do that yourself. The program will say "Atari" to warn you when it +endangers some of your stones. It automatically removes dead stones +from the board, and will not play illegally in a KO situation. It will +let you cheat in many ways, but is that what you're here for? + The program mutters to itself while it thinks--do not be alarmed by +this. It may take as much as two minutes for a move. Once again, I +invite comments on playing ability and program bugs. + + Richard Ware \ No newline at end of file diff --git a/doc/programs.md b/doc/programs.md index 44954741..6dc649ab 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -6,6 +6,7 @@ - ADVENT, (Colossal Cave) Adventure by Will Crowther. - ADV350, 350-point Adventure. - ADV448, 448-point Adventure. +- ANIMAL, an animal guessing game. - ARCCPY, copies and old-format archive, converting to new format. - ARCDEV, transparent file system access to archive files. - ARCSAL, archive salvager. @@ -19,11 +20,13 @@ - BDAY, happy birthday demon. - BINPRT, display information about binary executable file. - BITPRT, print JCL as bits. +- BKG, a backgammon game. - BYE, say goodbye to user. Used in LOGOUT scripts. - CALPRT, decode a .CALL instructions CALL block. - CC, C compiler (binary only). - CHADEV, Chaosnet jobdev (binary only). - CHARFC/CHARFS, Chaos RFC. +- CHASE, a 2-player maze game. - CHATST, Chaos test. - CHESS2, Alan Baisley's Tech II chess program. - CHTN, CFTP, Chaosnet TELNET and FTP support. @@ -45,11 +48,13 @@ - DIRDEV, list directories, sorted or subsetted. - DIRED, directory editor (independent from EMACS DIRED). - DMPCPY, crach dump copy dragon. +- DOCTOR, KMP's psychiatrist game. - DP Device, 7-bit conversions? - DQ Device, for doing hostname resolutions. Used by COMSAT. - DSKDEV, D - short disk device. - DSKUSE, disk usage information. - DUMP/LOAD, tape backup and restore. +- ELIZA, the original psychiatrist game - EMACS, editor. - EXECVT, convert 20x.exe (SSAVE) file to ITS BIN (PDUMP) file. - EXPN/VRFY - query remote SMTP server. @@ -66,6 +71,8 @@ - FTPU, FTP Client. - GCMAIL, delete old files from .MAIL. - GETSYM, copy all symbols from running ITS to a file. +- GO, the Go board game. +- GUESS, a very silly game. - GMSGS, copy system messages to mail file. - H3MAKE, a job that requests DRAGON to build host table. - HEXIFY, convert COM file into Intel HEX format. @@ -114,6 +121,7 @@ - NAME, Shows logged in users and locations, aka FINGER. - NETIME, network time dragon. - NICNAM/NICWHO, look up someone in the ARPAnet directory. +- NIMLIN, a game of unknown features. - NODIPS, SUDS wirelister (without DIP definitions). - NUDIR, create user directory. - NWATCH, small watch display. @@ -121,6 +129,7 @@ - OCM, Richard Greenblatt's Mac Hack VI chess program. - OCTPUS, print character representations. - OS, realtime TTY spy. +- OTHELLO, the original Othello game -- simpler than Go. - PALX, PDP-11 cross assembler. - PANDA, user account management program. - PC, SUDS printed circuit board program. @@ -139,6 +148,7 @@ - PTY, pseudo-tty. - PWMAIL, a limited version of MAIL when not yet logged in under PWORD. - PWORD, replacement for sys;atsign hactrn that requires registered logins. +- QB, the game of Qubic. - QUOTE, prints out a random quote. - REATTA, reattaches disowned jobs to terminal. - REDRCT, redirect IP routing. @@ -158,11 +168,13 @@ - SN, snoop terminal. - SPCWAR, Spacewar game. - SPELL, ESPELL spell checker. +- SPROUTS, the topological game invented by Convay. - SRCCOM, Compares/merges source files, compares binary files. - SRDATE, set reference date on a file. - STINK, linker. - STINKR, new linker (binary only). - STTY, set terminal parameters. +- STONE, the old African game of stones. - STY, pseudo-terminal for multiple sessions. - STYLOG, convert PTY output file into ascii file. - SUPDUP, Supdup client. @@ -178,6 +190,7 @@ - TELNET, Telnet client. - TELSER, Telnet/Supdup server. - TEN50, TOPS-10 emulator. +- THINK, think-a-dot game. - TIME, displays date/time/uptime and other info. - TIMES, TCP time server. - TIMOON, displays the time and phase of the moon. @@ -197,6 +210,7 @@ - VERSA/SPOOLR, Versatec/Gould printer spooler. - VV/VJ/DETREE, list jobs. - XHOST, tool for replacing host nicnames with real hostnames. +- WA, a Wumpus advisor game. - WHAT, humorous quips to various "what" questions. - WHO%, list index/uname/jname/%time in sorted list. - WHOLIN, mode line for display terminals (with date/time/job/etc info). @@ -205,3 +219,4 @@ - WUMPUS, Hunt the Wumpus game. - X, Y, Z, remember DDT command and re-execute it. - XXFILE, feed scripted input to a STY session. +- YAHTZE, the game of Yahtze. diff --git a/src/ejs/ngame.272 b/src/ejs/ngame.272 new file mode 100644 index 00000000..099050ad --- /dev/null +++ b/src/ejs/ngame.272 @@ -0,0 +1,2023 @@ +;-*-midas-*- + +.symtab 2000,15000 ;allocate some space for symbols + +if1 TITLE GAME -- I wouldn't assemble this if I were you +if2 TITLE GAME -- You might really create a mess + +;;; Here is the imfamous GAME program munged by EJS +;;; Please don't fool with it unless you know what you are doing. + +.qmtch==1 ;make "" handle text + +a=1 ;temporary +b=2 ;temporary +c=3 ;temporary +d=4 +e=5 +f=6 +t=7 +chr=10 ;character being read +ea=11 ;effective address of UUO's +opc=12 ;op code of UUO's +ac=13 +u1=14 ;uuo temporary 1 +u2=15 ;uuo temporary 2 +u3=16 ;uuo temporary 3 +sp=17 ;stack pointer + +dski==3 ;dsk input channel +dsko==4 ;dsk output channel +usrc==7 ;usr input and utility channel +uout==10 ;usr output and fucked channel +tyic==13 ;can't use channel 1 +tyoc==14 ;establish an output channel +lsrc==15 ;channel for LSRTNS to hack + +lsrpag==100 ;moderately moby pages for INQUIRE (20 of them) +intval==30. ;# of seconds between real-time interrupts +pdleng==100 ;lots of PDL space +dsklen==1000 + +opcode=.bp <777_33 0,0> ;opcode field +accum=.bp <0 17,0> ;accumulator field +index=.bp <0 0,(17)> ;index register + + +argi==1000 ;immediate argument +val==2000 ;value return +errret==3000 ;error return +cnt==4000 ;control +cnti==5000 ;control immediate + +call=pushj sp, ;make things easier on ourselves +ret=popj sp, ; ditto +tyi==.iot ; likewise +tyo==.iot ; and once again + +loc 100 +gloss: jrst gloss1 ;our loss handler +ttyint: jrst tyint ;tty interrupt handler +loss= ;loss handler stuff + +;;; Date and time handling routines + +$$abs==1 ;want the absolute time routines +p==17 ;RMS's convention +.insrt DSK:SYSENG;DATIME > + +;;; Inquire database hacking routines + +$$ULNM==0 ;don't want LSRLNM +$$ULNP==0 ;nor last-name-prefix matcher +$$UNAM==0 ;don't want LSRNAM either +.insrt DSK:SYSENG;LSRTNS > + +;;; Here are the variables for the load check feature + +mvsldu==40. ;minimum fair share is 40% +mvusrs==18. ;maximum number of users is 18. + +;;; Some handy macros + +define save locs + irp foo,,[locs] + push sp,foo +termin termin + +define restor locs + irp foo,,[locs] + pop sp,foo +termin termin + + +define terpri chan=tyoc ;terpri on channel + tyo chan,[^M] + tyo chan,[^J] +termin + +define text *string* +!.length |string|,,[asciz |string|]!termin + +define ascnt *string* +![text /string/]!termin + +define type *string* + sioto tyoc, +termin + +define death *string* + die +termin + +define norm7 c ;normallize a 7-bit byte pointer + skipge c + sub c,[430000,,1] +termin + +define decbp c ;decrement byte pointer + add c,[70000,,] ;back up the byte pointer + skipge c ;did we cross a word boundary? + sub c,[430000,,1] ;then fix it +termin + +;;; Some macros for uuo handling + +define tabdef name + define name cruft + cruft + termin + + + define a!name more + name [define name cruft + cruft + more] + termin + termin +termin + +;;; Very useful DO statement + +define do stuff,else,\label + define ddoo exit + jrst [stuff + jrst label] + !else! + +label:: + termin +ddoo +termin + +;;; For evaluating system variables + +define seval a,b ;get value of symbol B in A + move a,[squoze 0,/b/] + .eval a, + loss +termin + +define eval a,b + seval a,b + hrl a,a ;move to left + hrri a,a ;destination is a + .getloc a, ;get it into a +termin ;done! + +;;; The next macro is for making system calls + +define syscal a,b,c= + .call [setz ? sixbit/a/ ? b ? setz++c] termin + +;;; Some cruft for uuo hacking + +tabdef utab +uuonum==1 + +define uuodef name,op,oper + define uuodex [op1=[pushj sp,]] + autab [name=<.-uuotab>_33 + op1 u!name] + termin + oper + uuodex op +termin + +.fooo==. +loc 40 +UUO: 0 ;traping UUO goes here. + jsr uuoh ;go handle uuo's + -intlng,,tsint ;abjon ptr to interrupt table + +loc .fooo + +intspc=100*100+5 +tsint: intspc,,sp + 0 ? 1_tyic ? 0 ? 0 ? ttyint + %piioc ? 0 ? 0 ? 0 ? ignore ;for unknown IOC interrupts + 0 ? -1,,0 ? 0 ? 0 ? dhandl + %pirlt ? 0 ? %pirlt ? -1 ? realt + ;don't allow recursive real-time interrupts + ;if we get them we must be screwd +intlng==.-tsint + +ignore: type /AGot an unknown IOC interrupt. Continuing...A/ + +disbye: syscal dismis,[cnti,,intspc ;just go back to what you were doing + sp] + loss + +dismis=jrst disbye + +;;;Here is the UUO handler + +uuoh: 0 ;saved PC + save [uuo,uuoh,ea,opc,ac,u1,u2,u3] ;save our AC's + ldb opc,[opcode uuo] ;get the opcode + cail opc,utabl ;is it legal? + die [text /BAD USER UUO/] ;nope + ldb ac,[accum uuo] ;yep + hrrz ea,uuo ;get the effective address + xct uuotab(opc) ;and dispatch on it + restor [u3,u2,u1,ac,opc,ea,uuoh,uuo] ;restore our AC's + jrst @uuoh ;return + + +;;; Here are our UUO definitions + +uuodef sioto,,[ +usioto: hrli u1,440700 ;ascii string pointer + hrr u1,(ea) ;get address of string + hlrz u2,(ea) ;get length of string + movem u2,siotl ;move it to memory so it can be cleared + syscal siot,[ac ;ac has channel + u1 + siotl] + loss ;lost. + popj sp, ;return +siotl: 0 +] + +;;; This UUO types text and kills job, unless in debug mode, in which +;;; case it types out the text and .values + +uuodef die,jrst,[ +udie: caie ea,0 ;if typing + sioto tyoc,(ea) ; type it + skipe debug ;are we debuggin? + .value ;yes, just return + .logout 1, + loss ;how the hell did this happen? +] + +;;;Output sixbit as ascii on specified channel + +uuodef 6type,,[ +U6type: setzb u1,u2 ;u1=u2+1 + move u2,(ea) ;get our operand +U6toa1: lshc u1,6 ;isolate off character + addi u1,40 ;make it ascii + syscal iot,[ac ? u1] ;print it out + loss + jumpe u2,cpopj ;if nothing left, return + setz u1, ;clear it + jrst U6toa1 ;go back for more +cpopj: + ret ;and we're all done +] + +;;; print out a decimal number + +uuodef deca,,[ +udeca: move u1,(EA) ;get number in U1 +decpnt: idivi u1,10. ;figure first digit + push sp,u2 ;push remainder + skipe u1 ;done? + pushj sp,decpnt ;no compute next one +decpn1: pop sp,u1 ;yes, take out in opposite order + addi u1,60 ;make ascii + syscal iot,[ac ? u1] + loss + popj sp, ;and return for the next one. +] + +;;; Convert number to ascii rep of octal and print it out + +uuodef 8type,,[ +u8type: move u1,(ea) ;get number in U1 +octpnt: idivi u1,10 ;figure first digit + push sp,u2 ;push remainder + skipe u1 ;done? + pushj sp,octpnt ;no compute next one +octpn1: pop sp,u1 ;yes, take out in opposite order + addi u1,60 ;make ascii + syscal iot,[ac ? u1] ;type it out + loss ; huh? + popj sp, ;and return for the next one. +] + + +;;; Some random locations + +debug: 0 ;is in main block so user can reference +tyo1c: 1 ;will be reset to one on every tyo +calerr: 0 ;error return code + +;;; Here is our PDL + +pdl: [.status tyoc,a + skipn a, + type /APDL Underflow.A/] + loss + block pdleng ;PDL area + +;;; Inferior hacking stuff + +c1.cnt: %pival+%pic.z+%pibrk+%pidcl +c1.ded: %pi1pr+%pib42+%pipar +class2: %pitrp+%pifet+%pitty+%pidis+%piilo+%piioc+%pioob+%pimpv+%pimar +c1.2: %pi1pr+%pibrk+%pib42+%pipar+%pival+%pic.z+%pitrp+%pifet+%pitty+%pidis+%piilo+%piioc+%Pioob+%pimpv+%pimar+%pidcl + +dhandl: + syscal usrvar,[argi,,usrc ;get his interrupts + ['PIRQC '] + val,,a] + loss + syscal usrvar,[argi,,usrc ;get mask for type 2 interrupts + ['MASK '] + val,,b] + loss + and b,class2 ;b<-class two which are enabled + tdz a,b ;remove them from our interrupt word + and a,c1.2 ;remove class 3 interrupts + move b,a ;get a copy + tdz a,c1.cnt ;remove ones we'll handle + jumpn a,fatal ;go handle fatal variety + trne b,%pibrk ;is the a .BREAK + jrst break ;go handle + trne b,%pival ;is this a .VALUE? + jrst [.dtty + jfcl + jrst value] ;go handle + tdne b,[%pic.z+%pidcl] ;control-Z ? + skipa + jrst [.dtty + jfcl + type /ABug in Inferior Interrupt HandlerA/ + loss] + syscal usrvar,[argi,,usrc ;reset his PIRQC + ['APIRQC'] + b] + loss +goback: syscal dismis,[cnti,,intspc + sp + argi,,retloc] + loss +retloc: type /AReturned from your game.A/ + .dtty ;take tty away from inferior + skip + setzm ttyflg ;remember we have it back for good + ret + +define usrmem usrc,dest,a,b + syscal corblk,[cnti,,%cbwrt ;may as well get write if we can + argi,,0 ;no XORing in my program! + argi,,%jself + argi,,377 ;mega moby page + argi,,usrc ;from usrc channel job + a] ;at location a + loss + move dest,(b)<377*2000> ;and get it +termin + +define uread usrc,loc + .access usrc,loc + syscal iot,[argi,,usrc + loc] + loss +termin + +define uwrite usrc,loc,dat + .access usrc,loc + syscal iot,[argi,,usrc + dat] + loss +termin + +define addrup ind,rh,index,\foo,foo1 + jumpe index,foo1 ;if non-zero index + uread usrc,index ;get value of index + add rh,index ;and add it in +foo1:: jumpn ind,[uread usrc,rh ;if we're indirecting + jrst foo] ;do the indirection +foo:: +termin + +define pagmak a + andi a,-1 ;clear left half + lshc a,-12 ;split off page number from rest + lsh ,12-44 ;and make remainder +termin + +break: syscal usrvar,[argi,,usrc ;turn off the interrupt + ['APIRQC'] + [%pibrk]] + loss + syscal usrvar,[argi,,usrc ;get location of break + ['UPC '] + val,,a] + loss + subi a,1 ;back up to the .BREAK + move e,a ;move to where we have two adjacent ac's + pagmak e ;a <- page#, f <- loc in page + usrmem usrc,a,e,f ;a <- contents of memory + ldb b,[accum a] ;b <- accumulator + ldb c,[index a] ;c <- index + ldb e,[opcode a] + hlr d,a ;clear d, getting left half of a + andi d,(@) ;and with indirect bit + andi a,-1 ;a <- address field + + cain e,<.ldb opcode,.logout> + caie a,33 + caia + jrst brdie + cain b,12 ;is it a .BREAK 12, ? + jrst brk12 ;yes + caie b,16 ;is it garbage? + jrst unbrk ;go handle unknown break +brdie: .uclose usrc, ;it must have been asking to die since we + ;told it we weren't a DDT + jrst infdon + +define JCL *lcj* +move a,[text /lcj/] +movem a,jclptr +termin + +jclptr: 0 + +brk12: addrup d,a,c ;ind,addr,ix + move e,a ;move to where we have room + move c,a ;and hold in C for error messages + pagmak e ;e <- page #, f <- loc in page + usrmem usrc,a,e,f ;get from his memory the location pointed to + jumpl a,[hlrz a,a ;if writing + caie a,400005 ; if clearing JCL + jrst [setzm jclptr ;clear it and + jrst infdon] ;be done + type /ABarf: Inferior trying to write!A/ ;complain + jrst infdon] ;and be done + hlrz b,a ;get operation + hrrz d,a ;and address + trne d,200000 ;is it block mode? + jrst [type /ABarf: Inferior trying to use block mode .BREAK 12, +.BREAK 12,/ + jrst addprt] ;go print out err message + cail b,brktbl ;is it out-of-range? + jrst unbrk1 + xct brktb(b) + +addprt: 8type tyoc,c ;type address + sioto tyoc,[text "/ "] ;"open" location with form + 8type tyoc,b ;and type the contents + type /,,/ ;in halfword mode + 8type tyoc,d ;so we can read it easier + terpri tyoc ;CRLF + jrst infdon ;and give up + +unbrk1: type /ABarf: Inferior trying to use a .BREAK 12, I can't handle. +.BREAK 12,/ + jrst addprt + +brktb: jrst unbrk1 + jrst unbrk1 + jrst unbrk1 + jrst symptr + jrst unbrk1 + jrst getjcl +brktbl==.-brktb + +symptr: caig d,17 ;is it an AC? + jrst [uwrite uout,d,[0] ;yep, do it the dangerous way + jrst infcnt] + move e,d ;get more space to work in and save d for error + pagmak e ;compute page in a and word in f + syscal corblk,[cnti,,%cbndw ;need write access + argi,,0 + argi,,%jself + argi,,377 + e] + jrst jclovf ;go gripe + add f,<377_22> ;make absolute in our space + setzm (f) ;and set the appropriate word to 0 + jrst infcnt ;and continue + +getjcl: move e,d ;get more space and save d for error + pagmak e + syscal corblk,[cnti,,%cbndw ;need write access + argi,,0 ;no XORing, please + argi,,%jself ;map into ourself + argi,,376 ;at the highest possible location + argi,,usrc ;our inferior's + e] ;page which is contained in A + jrst jclovf + aos e ;get next page too + hlrz a,jclptr ;get length pointer of JCL + addi a,4 + idivi a,5 ;(ptr+4)/5==length in words + add a,f ;the final loc + cail a,2000 ;overflow? + jrst [syscal corblk,[cnti,,%cbndw ;need writing + argi,,0 ;barf, no XOR, please + argi,,%jself + argi,,377 ;very moby + argi,,usrc ;our very inferior inferior + e] ;and the next page + jrst jclovf ;complain of indigestion + jrst jcljcl] ;go write JCL + +;a -- absolute ending address +;b -- operation +;c -- effective address of .BREAK +;d -- right half of contents of ea of .break +;e -- page number in inferior of JCL buffer +;f -- loc in that page + +jcljcl: addi a,<376_12> ;make end addr. point into our page map + addi f,<376_12> ;make the dest. address point into our map + hrr e,f ;and put in right half for blt + hrl e,jclptr ;get our source for the BLT from the JCLPTR + blt e,-1(a) ;and perform the transfer + skipe ttyflg ;if it had the tty + jrst infcnt + jrst infdon ;else just dismiss + +infcnt: setom ttyflg ;remember where the TTY went +; .atty usrc, ;give it to him +; jrst [.dtty ;get it back +; .atty usrc, ;and try again +; loss ;nope, we're screwed somehow +; jrst infcn1] ;good, one with the show + + call start + +infcn1: syscal dismis,[cnti,,intspc + sp] + loss + +jclovf: type /AInferior tried to read into pure or non-existant memory +.BREAK 12,/ + jrst addprt ;tell him about loss + +unbrk: type /AInferior gave an unknown .BREAK +.BREAK / + +addrtp: 8type tyoc,b ;type out the address stuff + tyo tyoc,[","] ;type out the comma + caie d,0 ;indirect? + tyo tyoc,["@"] ;type it + + caie a,0 ;rh nonzero? + 8type tyoc,a ;type the right half + + jumpn c,[tyo tyoc,["("] ;type the ( + 8type tyoc,c ;type the index + tyo tyoc,[")"] + jrst ubrk1] + +ubrk1: type / >>> / + addrup d,a,c ;compute effective address + 8type tyoc,a ;and print it + terpri tyoc + jrst infdon + +value: syscal usrvar,[argi,,usrc ;turn off the interrupt + ['APIRQC'] + [%PIVAL]] + loss + type /AInferior .VALUE'd...Continuing...A/ + jrst infdon + +fatal: .dtty + jfcl + type /AInferior got a Fatal Interrupt.A/ + .uclose usrc, + jrst infdon + +infdon: setzm ttyflg ;remember we have it back for good + syscal dismis,[cnti,,intspc + sp] + loss + +start: syscal usrvar,[argi,,usrc ;copy his old state + ['OPTION'] + val,,a] + loss + tlz a,optcmd+optbrk ;clear the OPTCMD bit (+ the OPTBRK since LISP + ;demands it!) + skipe jclptr ;if there is JCL + tlo a,optcmd+optbrk ;set it again + syscal usrvar,[argi,,usrc ;and set it up + ['OPTION'] + a] ;write it back again + loss + + syscal usrvar,[argi,,usrc ;GO! + ['USTP '] + argi,,0] + loss + + ret +ttygo: + call start + setom ttyflg ;remember we gave it away + .atty usrc, ;give up the TTY and wait for return + skipe ttyflg ;what? + .hang ;until return of TTY + .dtty ;make SURE that we have the TTY + ret + ret + +nttygo: + syscal usrvar,[argi,,usrc + ['USTP '] + argi,,0] + loss + ret + +istrt: 0 + +define infcr chan,name,fn1,fn2,sname,device,f.loss=loss,page=-1,handle=dhandl + push sp,a ;save a for local use + .status usrc,a ;look at the channel + caie a,0 ;if there is nothing open + .uclose usrc, ;kill it + + syscal open,[cnti,,0 ;create a job + argi,,usrc + ['USR '] + myunam + [sixbit /name/]] + loss + syscal open,[cnti,,.uio ;and an output channel to it (ugh!) + argi,,uout + ['USR '] + myunam + [sixbit /name/]] + loss + + syscal open,[cnti,,.uii ;open a file to load into it + argi,,dski + [sixbit /DEVICE/] + [sixbit /FN1/] + [sixbit /FN2/] + [sixbit /SNAME/]] + f.loss + + syscal load,[argi,,usrc ;load it + argi,,dski] + loss + + syscal iot,[argi,,dski ;get starting address + argi,,a] ;in a + loss + andi a,-1 ;ignore the JRST part + + syscal close,[argi,,dski] ;close it + loss + + movem a,istrt ;and save the ADDR in ISTRT + + syscal usrvar,[argi,,usrc ;make it start there + ['UPC '] + a] ;a has address + loss + + syscal usrvar,[argi,,usrc ;get what bit to enable + ['INTB '] + val,,a] + loss + + syscal usrvar,[argi,,%jself ;and enable it + ['IMSK2 '] + a] + loss + pop sp,a + +termin + +infkil: push sp,a ;get A free + .status usrc,a ;is there an inferior? + jumpe a,[type /AYou don't have a game to kill.A/ + pop sp,a ;restore A + ret] ;and give up. + pop sp,a ;restoer a + setzm ttyflg ;remember we have it back for good + .uclose usrc, ;kill it + type /AGame Killed.A/ ;say it + ret ;return + + +uuotab: loss + utab +utabl==.-uuotab + consta ;dump out constants table + +popj.1: aos (sp) ;increment return address + popj sp, ;and return +popj1=jrst popj.1 ;and define our symbol + + +%sllog==1 ;bit to indicate not-logged-in +%sldil==2 ;bit to indicate coming in from a dialup line +%sload==4 ;bit to indicate over-stepping a load boundary +%slcls==10 ;bit to indicate closed +%sldet==20 ;we've been detached + +;;; When he types an undefined character execute this + +uhuh: type /AType ? for list of commands.A/ + move sp,[-pdleng,,pdl] ;reset the pdl + jrst cloop ;back to cloop + +huh=jrst uhuh ;throw to top level loop + +;;; Here is where we tell it where star trek is + +if1,[ +printc /Star Trek: / +.TTYMAC notty=notty,pine=pine,dir=games + +;;; Here is the star trek macro + +define star + type /CStar Trek +Please Hold On.....A/ + infcr ursc,.mctrk,notty,pine,dir,dsk,jrst strlos + syscal tranad,[cnti,,3 ;input and output + argi,,usrc ;do it to our inferior + [-4,,['DSK ' + ' ' + 'DAT ' + ' ']] + [-4,,['AR8 ' + ' ' + ' ' + 'GAMES ']]] + loss + + jrst ttygo ;go do it +termin +termin + + +printc /Adventure (2): / +.TTYMAC notty=notty,pine=pine,dir=games + +define ADVENT + type /CAdventure.... +Please Hold On....A/ + infcr ursc,.ADV.,notty,pine,dir,dsk,jrst advlos + jrst ttygo ;go do it +termin +termin + +printc /Adventure (1.5): / +.TTYMAC rotty=rotty,rine=rine,dir=games + +define ADVNBS + type/ CAdventure.... +Please Hold On....A/ + infcr ursc,.ADV.,rotty,rine,dir,dsk,jrst advlos + jrst ttygo +termin +termin +] + +;;; Our log file routine + +Define tattle [FILE],&MESS + push sp,[[file ? text mess]] + call asshol + pop sp,nulll +termin + + +;;; Here is the start of the game program + +go: move sp,[-pdleng,,pdl] ;initialize our push stack + syscal open,[cnti,,.uii ;open tty for input + argi,,tyic + [sixbit /TTY/]] + loss + syscal open,[cnti,,<.uao+%tjdis> ;open tty for output + argi,,tyoc + [sixbit /TTY/]] + loss + call ldcal ;get initial numbers + .suset [.runame,,myunam] ;get our name + move a,myunam ;move it into a + camn a,[sixbit /EJS/] ;if we're EJS, must be debugging + do [move a,logfld ;switch all the tattle files + movem a,logfil+1 ;to test files. + move a,delfld + movem a,delfil+1 + move a,badfld + movem a,badfil+1] + camn a,[sixbit /TEST/] ;if we're TEST, must be debugging + do [move a,logfld ;switch all the tattle files + movem a,logfil+1 ;to test files. + move a,delfld + movem a,delfil+1 + move a,badfld + movem a,badfil+1] + call fndfil ;check to see it he was bad + .suset [.roption,,a] ;get current .OPTION var + ior a,[(optint+optopc)] ;we want new interrupts and + .suset [.soption,,a] ;and backed up pc + syscal usrvar,[argi,,%jself ;enable IOC errors to ignored them + ['IMASK '] + [%piioc]] + loss + +begin: setzm initld ;this is first time through + call ctmf ;has he altered things + call whois ;check for reasonable user + call dbging ; we're debugging + call sttw ;enable loadchecking + setom initld ;ok, we've gone through once + syscal close,[argi,,1] ;close 1, incase we were re-loaded + skip ; ignore any errors + .suset [.rjname,,a] ;see what we are. + camn a,['ADVENT'] ;are we a substitute ADVENT? + do [.suset [.rsuppro,,a] + jumpl a,[syscal usrvar,[argi,,%jself ;if top level become + ['JNAME '] ;a HACTRN + ['HACTRN']] ;but don't allow + ;duplicates + jrst [tattle logfil,/ AHG/ + death / +You seem to be already logged in with a GAME.A/] + exit] ;exits all the way to the top ... + type /AChanging name of job to GAME!A/ + ;if not top level, gotta hope it's a DDT + .value [asciz /gameJ.gameJP/]] + + syscal ttyset,[argi,,tyic ;and store it + ttyst1 + ttyst2] + loss + .suset [.simask,,[%pirlt]] ;enable timer interrupts + .suset [.simsk2,,[1_tyic]] ;enable interrupts on the channel + skipn pzhjkw+10. ;has he cheated us + jrst mechan ; yes, he has, kill him + + type /CGame selection program version / ;type out this greeting + 6type tyoc,[.FNAM2] ;and type out the version number + terpri tyoc ;do a CRLF + + tattle logfil,/+ STG/ ;log him in! + + syscal open,[cnt,,inctl ;try to open notes file + argi,,dski + ['DSK '] + ['GAME '] + ['NOTES '] + ['GAMES ']] + jrst cont ; not there, skip it + + call [move a,[notcbl,,copblk] ;print out notes file + blt a,copend + jrst copy] + +cont: type /AType ? for help.A/ ;help him out a bit +cloop: type /A>/ ;prompt him + skipn pzhjkw+10. ;is he cheating? + jrst mechan ; yes, flush him + tyi tyic,chr ;read a chr + caile chr,140 ;is it uppercase? + subi chr,40 ; no, convert it to uppercase + skipn wkjhzp+5 ;is he cheating? + jrst mechan ; yes, flush him + xct optab(chr) ;and act on it + call ctmf ;check things out + call whois ;check for reasonable user + call dbging ;we're debugging + call sttw ;enable loadchecking + jrst cloop ;and go back for more + +;;; ***************************************************************** +;;; OPTAB +;;; ***************************************************************** + +optab: huh ;^@ + call gdoc ;^A -- List games + call [.status usrc,a + jumpe a,[type /AYou do not have a game to continue!A/ + ret] + type /AReturning to your game...A/ + jrst ttygo] ;^B -- Back to previous game + call pdoc ;^C -- List program commands + call del ;^D -- Delete GAME program + huh ;^E + huh ;^F + huh ;^G + huh ;^H + call instal ;^I -- Install new GAME program + huh ;^J + call infkil ;^K -- Kill previous game + call ctype ;^L -- Clear screen + huh ;^M + huh ;^N + huh ;^O + call [.status usrc,a ;is it open + jumpe a,[type /AYou don't have a game to proceed.A/ + ret] + type /AProceeding the game. I won't know if it needs the TTYA/ + jrst nttygo] ;^P -- Proceed previous game + call [type /AAre you sure you want to quit? (Y or N) / + tyi tyic,a ;get a character +;;; tyo tyoc,a ;and echo it + caie a,131 ;is it Y + cain a,171 ;or y? + jrst [type /Yes./ + tattle logfil,/* QTG/ + death /AQuitting...bye!A/] + type /No.A/ + ret] ;^Q -- Quit the GAME program + huh ;^R + call [setzm ttyoff ;^S -- turn on our TTY when it get's read + ret] + huh ;^T + huh ;^U + huh ;^V + huh ;^W + huh ;^X + huh ;^Y + type /CYou are at the top level of the GAME program.A/ + ;^Z -- Get to top level of GAME + huh ; + huh ;^\ + huh ;^] + huh ;^^ + huh ;^_ + huh ; Space + huh ;! + huh ;" + huh ;# + huh ;$ + huh ;% + huh ;& + huh ;' + huh ;( + huh ;) + huh ;* + huh ;+ + huh ;, + huh ;- + call [type /CThink +Type "?" for help. +Please Hold On.....A/ + jcl /DSK:games;THINK (INIT) +/ + infcr usrc,.THNK,ts,q,sys,dsk + jrst ttygo] ;. -- Play Think + huh ;/ + huh ;0 + huh ;1 + huh ;2 + huh ;3 + huh ;4 + huh ;5 + huh ;6 + call [type /CGuess! +Please Hold On.....A/ + infcr usrc,.guess,ts,guess,games,dsk + jrst ttygo] ;7 KMP's crock + huh ;8 + huh ;9 + huh ;: + huh ;; + huh ;< + huh ;= + huh ;> + call help ;? -- List help documentation + huh ;@ + call [ADVENT] ;A -- Play Adventure + call [type /CChess +Please Hold On.....A/ + infcr usrc,.ches2,ts,chess2,games,dsk + jrst ttygo] ;B -- Play Baisly's Chess program + call [type /CChess +Please Hold On.....A/ + infcr usrc,.chess,ts,ocm,games,dsk + jrst ttygo] ;C -- Play Greenblatt's Chess program + call [type /CDOCTOR +End your input with two carriage returns. +Please Hold On......A/ + jcl /DSK:games;ELIZA (INIT) +/ + infcr usrc,.doc.,ts,Q,sys,dsk + jrst ttygo + ret] ;D -- Play Doctor + call [type /CChase... +Do you want documentation? (Y or N) / + tyi tyic,a + tyo tyoc,a + caie a,131 + cain a,171 + call [move a,[chacbl,,copblk] + blt a,copend + jrst copy] + call [type /AHold on a sec....A/ + ret] + jcl /DSK:games;CHASE (INIT) +/ + infcr usrc,.chas.,ts,q,sys,dsk + jrst ttygo + ret] ;E -- Play Chase + call [type /CBackgammon +Please Hold On.......A/ + infcr usrc,.backg,ts,bkg,games,dsk + jrst ttygo] ;F -- Play Backgammon (an F?) + call [type /CGo +Please Hold On........A/ + jcl /DSK:games;GO (INIT) +/ + infcr usrc,.go,ts,q,sys,dsk + jrst ttygo] ;G -- Play Go + huh ;H + huh ;I + call [type /CJotto +Please Hold On.......A/ + infcr usrc,.jotto,ts,jotto,sys1,dsk + jrst ttygo] ;J -- Play Jotto + call [type /CAnimal +Please Hold On........A/ + infcr usrc,.animl,ts,animal,games,dsk + jrst ttygo] ;K -- Play KMP's Animal + call [type /CYou dirty Old Man You.A/ + infcr usrc,.SEX.,TS,LIMMER,sys2,dsk + jrst ttygo] ;L -- Print out a Limerick + call [ADVNBS] ;M -- Play Adventure 1.5 + call [type /CNimlin +Please Hold On.....A/ + infcr usrc,.nimln,ts,nimlin,games,dsk ;create + jrst ttygo] ;N -- Play Nimlin + call [type /COthello +Please Hold On......A/ + infcr usrc,.orth.,ts,o,games,dsk + jrst ttygo] ;O -- Play Othello + call [type /CKMP's Psychiatrist +Please Be Patient, the Doctor will be right with you.....A/ + jcl /DSK:games;DOC > +/ + infcr usrc,.psych,ts,q,sys,dsk + jrst ttygo] ;P -- Play KMP's Psychiatrist + call [type /CQubic +Please Hold On......A/ + jcl /DSK:games;QB (INIT) +/ + infcr usrc,.qubic,ts,q,sys,dsk + jrst ttygo] ;Q -- Play Qubic + huh ;R + call [star] ;S -- Play Star Trek + call [type /CStone (This only works on a display) +Please Hold On.....A/ + jcl /DSK:games;STONE (INIT) +/ + infcr usrc,.stone,ts,q,sys,dsk + jrst ttygo] ;T -- Play Stone + call [type /CSPROUTS! +Do you want documentation? (Y or N) / + tyi tyic,a + tyo tyoc,a + caie a,131 + cain a,171 + call [move a,[spdcbl,,copblk] + blt a,copend + jrst copy] ;JRST hack + call [type /AHold on a sec...A/ + ret] + infcr usrc,.sprt.,ts,sprout,games,dsk + jrst TTYGO] ;U -- Play Sprouts + huh ;V + call [type /CWumpus +Please Hold On.....A/ + infcr usrc,.WUMP,TS,wumpus,sys1,dsk + jrst ttygo] ;W -- Play Wumpus + call [type /CWumpus Advisor +Please Hold On......A/ + jcl /DSK:games;WA (INIT) +/ + infcr usrc,.WA.,TS,Q,SYS,dsk + jrst ttygo] ;X -- Play Wumpus Advisor + call [type /CYahtzee +Please Hold On.......A/ + jcl /DSK:games;YAHTZE (INIT) +/ + infcr usrc,.yahtz,ts,q,sys,dsk + jrst ttygo] ;Y -- Play Yahtzee + call [type /CZork?? (Ha!)A/ + infcr usrc,zork,ts,zork,sys3,dsk + jrst ttygo] ;Z + huh ;[ + huh ;\ + huh ;] + huh ;^ + huh ;_ + huh ;` + huh ;a + huh ;b + huh ;c + huh ;d + huh ;e + huh ;f + huh ;g + huh ;h + huh ;i + huh ;j + huh ;k + huh ;l + huh ;m + huh ;n + huh ;o + huh ;p + huh ;q + huh ;r + huh ;s + huh ;t + huh ;u + huh ;v + huh ;w + huh ;x + huh ;y + huh ;z + huh ;{ + huh ;| + huh ;} + huh ;~ + huh ;Rubout + +;;; ****************************************************************** +;;; END OF OPTAB +;;; ****************************************************************** + +;;; Now here comes the Delete Routine + +del: call turstp ;is he a turist? + caia ; no, skip + huh ; yep, make believe we don't know + ; what he's talking about + type / +Note: A record is kept of those who use this command. This command +deletes the GAME program. Do not use it unless you have a very good +reason. Randoms should not use it at all. Are you certain that you +want to delete the master copy of the GAME program? (Y or N) / + + tyi tyic,a ;read a character + caile a,132 ;is it uppercase? + subi a,40 ; no, make it then + caie a,"Y" ;is it a "Y" + jrst [type /ASo what are you playing around with fire for?A/ + ret] ;tell him he's an asshole + type /ADeleting...A/ ;make him think that the process takes + tattle delfil,/Deleted the game program / ;a long time to + syscal delete,[[sixbit /DSK/] ;do. actually we just want to rat + [sixbit /TS/] ;on him! dirty of us isn't it? + [sixbit /GAME/] + [sixbit /GAMES/]] + jfcl + tattle logfil,/ DFL/ ;well, as long as the bastard deleted the + death /ASo long, it is deletedA/ ;game program, we might as + ;well kill him +pzhjkw: block 15 ;one of our nasty locations + +;;; here is the code for installing a new version of game + +instal: call turstp ;is he a turist? + caia ; nope, skip + huh ;yep, we don't know this command + type / +Note: A record will be kept of those who use this command. Don't use it +unless you have a good reason. Randoms are not to use it at all. Are you +certain that you want to clobber this version with maybe a bad one? +(Y or N) / + + tyi tyic,a ;get his response + caile a,132 ;is it capitalized? + subi a,40 ; no, well capitalize it! + caie a,"Y" ;if it is not y + jrst [type /ASo what are you playing around with fire for?A/ + ret] + type /AInstalling new version of the GAME program.A/ + ;let him know we're working on it + tattle delfil,/Installed new version of Game/ ;rat on him + move a,[instbl,,copblk] ;well let's copy it in now + blt a,copend + call copy ;ok, let's copy it in + type /AOk, done!A/ ;let him know we're finished. + ret ;and return to cloop +wkjhzp: block 12 ;here is another nasty location + +;;; Ok, here are the all important Help routines + +hlpflg: 0 ;flag to tell if he's seen it yet + +help: skipn hlpflg ;only if this is the first time + type /C +Type A to list games that are available. +Type C to list the program commands +/ + + skipe hlpflg ;from now on, be brief + type /C +^A -- List games +^C -- List program commands +/ + + setom hlpflg ;he's seen it once--let's be brief + ret ;go back to command loop + +;;; Here is the Documentation for the Games + +gdoc: type /CYou choose a game by typing a single character as follows: + +A -- Adventure II M -- Adventure I.V +B -- Baisley's Chess Program N -- Nimlin +C -- Greenblatt's Chess Program O -- Othello +D -- Doctor P -- KMP's Psychiatrist +E -- Chase (W. Kornfeld's) Q -- Qubic +F -- Backgammon S -- Star Trek +G -- Go T -- Stone (for displays only) +J -- Jotto U -- Sprouts +K -- Animal II W -- Wumpus +L -- Limerick X -- Wumpus Advisor +. -- Think Y -- Yahtzee +7 -- Guess! Z -- Zork! +^A -- Lists games available +^C -- Lists program commands +/ + ret + +;;; Here is the documentation for the Program commands + +pdoc: type /CProgram commands: +^A -- List games available +^B -- Back to previous game +^C -- List these commands +^G -- Revert to command loop +^K -- Kill previous game +^P -- Proceed job without the TTY +^Q -- Quit the GAME program +^S -- Stop typeout +? -- List help commands available + +/ + ret + +;;; Here is the routine to write out the log files + +asshol: move d,-1(sp) + move a,(d) + syscal open,[cnti,,.uao+100000 ;open in write-over mode + argi,,dsko + [sixbit /DSK/] ;DEV + 0 ,(a) ;FN1, on the stack + 0 ,1(a) ;FN2 + 0 ,2(a)] ;DIR + jrst [syscal open,[cnti,,.uao ;this time we'll create it + argi,,dsko + ['DSK '] + 0 ,(a) + 0 ,1(a) + 0 ,2(a)] ;it's all done with mirrors + ret ;something's screwed, oh well + jrst barfln] ;go continue barfing + +barfln: syscal fillen,[argi,,dsko ;find length + val,,a] ;in a + .lose 1000 + syscal access,[argi,,dsko ;and go to end of file + a] ;(which is in a) + .lose 1000 + .suset [.runame,,a] ;get our UNAME + 6type dsko,a ;write uname + tyo dsko,[^I] ;write a tab + sioto dsko,1(d) ;write message + sioto dsko,[text / at /] ;write " at " + .rdatim a, ;get time in a, date in b + 6type dsko,b ;write date + tyo dsko,[40] ;write a space + 6type dsko,a ;write time + sioto dsko,[text / == /] ;type this divider + move a,frshr ;get fair share in a + deca dsko,a ;type out the fair share + sioto dsko,[text /\/] + move a,mxsldu + deca dsko,a + tyo dsko,[40] ;type a space + move a,nusrs ;get number of users + deca dsko,a ;type is out + sioto dsko,[text /\/] + move a,mxusrs + deca dsko,a + sioto dsko,[text / -- /] ;type out this divider + movs a,load ;get load in a + 8type dsko,a ;type out the load + terpri dsko ;crlf + syscal close,[argi,,dsko] ;close the file + ret ;and even this is to be ignored + ret ;return + +;;; Here is the code for going back to a Game + +back: .status usrc,a ;check status of inferior + jumpe a,[type /AYou don't have a game to go back to!A/ + ret] ;he didn't have one + type /AReturning to game.A/ ;tell him we're going back to it + jrst ttygo ;go back and play + +;;; Here is the loss handler stuff + +gloss1: skipe debug ;debugging? + .value ;yes....give warning + ;^G quit's enter here +pdlfix: .dtty ;make sure we have the TTY + jfcl + setzm ttyoff ;turn on the TTY + setzm ttyflg ;keep the TTY + move sp,[-pdleng,,pdl] + move a,[-2,,[.sdf1,,[0] ? .sdf2,,[0]]] + .suset a ;undefer the world + jrst cloop + +;;; Interrupt handler stuff +tyint: push sp,a ;must save regs since we might not do it + movei a,tyic ;get our interrupt char + .ityic a, ;into a, but don't flush it + jrst tycnt ;huh? just ignore the interrupt, we'll get it + ;again soon if we really should + cain a,7 ;if char is a ^G + ;this will restart with a message + jrst [.reset tyoc, ;reset the output + .reset tyic, ;reset the input + type /AQUITA/ + jrst pdlfix] + caie a,^S ;check for spurious + jrst tycnt ;yep, ignore + .reset tyoc, ;throw away typeout + setzm siotl ;and stop typeing + setom ttyoff ;turn off the TTY + skipe ttyflg ;are we copying to TTY? + do [setzm outcnt ; clear SIOT count + setom remain] ; claim last input SIOT didn't fill buffer +tycnt: pop sp,a ;get them back + syscal dismis,[cnti,,intspc + sp] + loss + loss + +ttyoff: 0 +ttyst1: 020202,,020202 +ttyst2: 030202,,020202 + + +quit: move sp,[-pdleng,,pdl] ;reset PDL + .reset tyic, ;reset the input + type /AQUITA/ ;tell him what he hit + jrst cloop ;and go back to the command loop + +;;; This is for the clear screen, display version stuff + +ctype: type /CGAME./ ;clear screen and type our name + 6type tyoc,[.fnam2] ;type version number + terpri tyoc ;do a carriage return + ret ;and return + +;;; Some hacker tried to assemble it, or somebody deleted Star Trek + +strlos: type / +Someone is hacking. I don't know where Star Trek is. Sorry!A/ + ;tell him about it + jrst quit ;and quit + +;;; Some hacker tried to assemble this, or deleted Adventure + +advlos: type / +Someone is hacking. I don't know where Adventure is. Sorry!A/ + ;tell him about it + jrst quit ;and quit + + +;;; This is the copy data + +copblk:: + +bytlen: 0 ;size of bytes to XFER + +inctl: .uii +INDEV: 'DSK ' +INFN1: 0 +INFN2: 0 +INDIR: 0 + +outctl: 0 +outdev: 'DSK ' +outfn1: 0 +outfn2: 0 +outdir: 0 +copend==.-1 + +;;; Copy stuff for the GAME NOTES file + +notcbl: offset copblk-. + +bytlen: 7 + +inctl: .uai +indev: 'DSK ' +infn1: 'GAME ' +infn2: 'NOTES ' +indir: 'GAMES ' + +outctl: .uao +outdev: 'TTY ' +outfn1: 'FOO ' +outfn2: 'BAR ' +outdir: 'BAZ ' + +offset 0 + +;;; Copy stuff for the Install routine + +instbl: offset copblk-. + +bytlen: 44 ;length of bytes to XFER + +inctl: .uii +INDEV: 'DSK ' +INFN1: 'NGAME ' +INFN2: 'BIN ' +INDIR: 'EJS ' + +outctl: .uio +outdev: 'DSK ' +outfn1: 'TS ' +outfn2: 'GAME ' +outdir: 'GAMES ' + +offset 0 + + +;;; Copy stuff for the Sprouts documentation + +spdcbl: offset copblk-. + +Bytlen: 7 ;length of bytes to XFER + +inctl: .uai +INDEV: 'DSK ' +INFN1: 'SPROUT' +INFN2: 'RULES ' +INDIR: 'GAMES ' + +outctl: .uao +outdev: 'TTY ' +outfn1: 'FOO ' +outfn2: 'BAR ' +outdir: 'BAZ ' + +offset 0 + +;;; Copy stuff for the Chase documentation + +chacbl: offset copblk-. + +Bytlen: 7 ;length of bytes to XFER + +inctl: .uai +INDEV: 'DSK ' +INFN1: 'CHASE ' +INFN2: 'INFO ' +INDIR: 'GAMES ' + +outctl: .uao +outdev: 'TTY ' +outfn1: 'FOO ' +outfn2: 'BAR ' +outdir: 'BAZ ' + +offset 0 + +constants + +;;; Here is the actual copying routine + +copy: syscal open,[cnt,,inctl ;open input file in appropriate mode + argi,,dski + indev + infn1 + infn2 + indir] + jrst [type /ANo new version available. Forgot to assemble it?A/ + ret] ;lost, tell him + syscal open,[cnt,,outctl ;open output file in apprpriate mode + argi,,dsko + outdev + ['_GAME_'] + ['_COPY_'] + outdir] + jrst [type /ASituation somehow screwed on output. Barf!A/ + syscal close,[argi,,dski] + .lose 1000 + ret] ;what happened? + save [a,b,c,d] + move a,outdev ;get where it's going to... + camn a,['TTY '] ;TTY? + setom ttyflg ; then set the flag + move a,bytlen ;get our byte length + move b,[440000,,dskbuf] ;shell of a byte pointer to DSKBUF + dpb a,[.bp (7700),b] ;fill it in + movem b,bytdst ;save our byte pointer for later + movei b,44 ;36/bytesize*wordsize is buffer size in bytes + idiv b,a + imuli b,dsklen + movem b,bufsiz ;and save it for posterity +morcop: move a,bytdst ;get our byte pointer + move b,bufsiz ;and our buffer size + syscal siot,[argi,,dski + a + b] + do [syscal close,[argi,,dski] + jfcl + syscal close,[argi,,dsko] + jfcl + jrst copret] + move c,bytdst ;get another copy of our byte pointer + move d,bufsiz ;lets figure out how many were moved + sub d,b ;look MA, no random +1 or -1 's! (ITS WINS!!) + movem d,outcnt ;move these out to storage so we can win on + movem b,remain ;output resets + call c.cadj ;check for teco cretinism + + syscal siot,[argi,,dsko + c + outcnt] + do [syscal close,[argi,,dski] + .lose 1000 + syscal close,[argi,,dsko] + .lose 1000 + jrst copret] + move b,remain ;how much do we have left? + cain b,0 ;zero? Are we really done? + jrst morcop ; nope, copy some more + syscal close,[argi,,dski] + skip ;ignore + syscal renmwo,[argi,,dsko + outfn1 + outfn2] + jfcl ;ignore + syscal close,[argi,,dsko] + jfcl ;ignore + +copret: setzm ttyflg ;we aren't typing now. + restor [d,c,b,a] ;restore our accumulators + ret ;and continue letting him play with us + +bufsiz: 0 ;size of buffer in bytes +bytdst: 0 ;byte the dust. pointer to buffer start +remain: 0 ;# of bytes unused in buffer +outcnt: 0 ;# of bytes remaining to be SIOT'ed +ttyflg: 0 ;set non-zero when we do a TTY output +dskbuf: block dsklen + +;;; This part checks the time file to see if it's been long enough since +;;; the time when the last person who was kicked off, tried. The rationale +;;; behind this is that the system load will probably vary within the +;;; 10 minute interval, so let's just assume that it is loaded. + + +constants ;nonsense + +rltclk: 60.*120. ;every two minutes + block 3 + +flushp: 0 ;set to count of times till logout +warned: 0 ;set to count of times till end of probation + + +;;; ********************************************************************** +;;; Here is the real time interrupt routine +;;; ********************************************************************** + +realt: .dtty ;get the TTY back + jfcl + save [a,c,siotl,ttyoff] ;save the ac's and siot count -- we may have + ;been typing. Also save ttyoff so we can + ;it on now + setzm ttyoff ;turn it on! + call ctmf ;has he tried to cheat us + call chkit ;let's check the load + + movei a,30.*5 ;continue playing, at least in + .sleep a, ;five seconds. + restor [ttyoff,siotl,c,a] ;restore everything +ttydis: skipe ttyflg ;did the inferior have the bastard? + .atty usrc, ; yep, hack away + jfcl ; ? + dismis ;back to whatever depths we came from + + +timfls: skipn initld ;don't print # if not initial try + do [tattle logfil,/# SLD/] ;note the fact--he was not allowed on + skipe initld ;don't print - if initial time + do [tattle logfil,/- SLD/] ;note the fact--he was thrown off + call chkopn ;open the check file + syscal dskupd,[argi,,dski] ;set the creation date to now + loss ; huh? + syscal sdmpbt,[argi,,dski ? argi,,1] ;make it look dumped + loss ;huh? + .close dski, ;close the file + skipe initld ;is this the first time around? + death/ +I'm afraid the system has become too loaded to continue playing games. Please +try again later. Goodbye. +/ ;no + skipn initld ;is this the first time around? + death/ +I'm afraid the system is too loaded for playing games. Please try again later. +/ ;yes + loss ;we should never get here + + +;;; Here are the definitions of the log files + +delfld: sixbit /DELTST/ ;we're debugging, don't use +logfld: sixbit /LOGTST/ ; regular log files +badfld: sixbit /BADTST/ +delfil: sixbit / ASS/ ? sixbit / DEL/ ? sixbit /EJS/ +logfil: sixbit / ASS/ ? sixbit / LOG/ ? sixbit /EJS/ +badfil: sixbit / ASS/ ? sixbit / BAD/ ? sixbit /EJS/ + +myunam: 0 ;place to put his UNAME +initld: 0 ;flag to see if initially thrown off +load: 0 ;place to put load +nulll: 0 ;junk location + + +whotab: sixbit /hic/ + sixbit /cstacy/ + sixbit /chris/ + sixbit /rwk/ + sixbit /kmp/ + sixbit /don/ + sixbit /bern/ + sixbit /ejs/ +wholen==.-whotab + +ctmf: save [b,c] ;save these ac's + movei c,0 ;clear accumulator + movsi b,-wholen ;get or aobjn pointer +whofoo: add c,whotab(b) ;add them up + aobjn b,whofoo ;and repeat + movem c,summ ;store sum + came c,flunk ;is he trying to cheat us? + jrst [tattle badfil,/Tried to patch the GAME binary/ + call wrtfil + death / +It is exceptionally distasteful to patch programs to get past attempts at +security. Because of this, you have lost the privilege of using the GAME +program. Your actions have been recorded and if they persist, they might +result in some action being taken towards taking away your account here +on MC. Good bye.A/] + restor [c,b] + ret + +summ: 0 ;place to store accumulated total + + +whois: movsi b,-wholen ;AOBJN ptr to table of winning users + move a,myunam ;get his uname +whois0: camn a,whotab(b) ;is it a winner? + ret ; yes, skip the load checking + aobjn b,whois0 ;no, maybe try another + popj1 ;no good, skip upon returning + +turstp: movei a,lsrc ;tell what channel we can hack. + move b,[-20,,lsrpag] ;and what pages it can hack + call lsrtns"lsrmap ;map in the INQUIR database + jrst lsrskp ; Well, can't, pretend he's a T + .suset [.runame,,a] ;get our uname + .suset [.rxuname,,b] ;who the fuck we aren't + move t,b ;save the beggar + tdz t,a ;heuristic test for hackers + caie t,0 ;is he obviously not who he claims? + jrst lsrskp ; yep! + movei a,lsrc ;channel it's open on + call lsrtns"lsrunm ;find the turkey + jrst lsrskp ; not found, boy, what a turkey. + movei a,lsrtns"I$GRP ;hack his group + call lsrtns"lsritm ;find his group + jrst lsrskp ; no group! + .close lsrc, ;don't need it any more + ildb b,a ;get his group + caige b,40 ;is it printing? + popj1 ; no, total turkey + caie b,"O" ;does he claim to be non-human? + cain b,"o" + jrst [tattle logfil,/ NHF/ + death /AYou claim to be non-human. And at least where +I come from non-humans don't play games. So I'm afraid I'll have to say +good-bye to you. Please update your inquire entry.A/] + + caie b,"T" ;is it a T? + cain b,"t" ; Does INQUIR ever generate this? + popj1 + caie b,"R" ;is it a Random? + cain b,"r" ; or very Random? + popj1 + ret ;not a tourist, (he claims) + +lsrskp: .close lsrc, ;close the channel! + popj1 ;skip! + +dbging: setom pzhjkw+10. ;set this flag + setom wkjhzp+5 ; and this one + skipe dbg1 ;do we want discrete load checking + call chkld ; yes + skipe dbg2 ;do we want continuous load checking + call onint ; yes + skipe dbg3 ;do we want both? + skipe dbg1 ; do we need to turn on discrete? + caia ; no, skip and continue + call chkld ; yes, turn on discrete + skipe dbg3 ;do we want both? + skipe dbg2 ; do we need to turn on interrupts? + caia ; no, skip and continue + call onint ; yes, turn on interrupts + popj1 ;and skip return + +dbg1: 0 ;these are the debug flags +dbg2: 0 +dbg3: 0 + +flunk: 735370,,712671 ;what it should be + +onint: push sp,a ;save it just in case + move a,[200000,,rltclk] ;get our interrupt intervar + setom wkjhzp+5 + .realt a, ;turn it on + pop sp,a ;restore the ac + ret ;and return + + +mechan: tattle badfil,/Was hacking the GAME program/ + call wrtfil + death /C +I'm becoming rather irritated with your hacking. The games are only to be +used during certain times of the day when the system is not loaded. Because +of your hacking, you will be restricted from using the GAME program for a +few days. Sorry, but playing games is a privilege. +/ + +kldcp=setom pzhjkw+10. +pcdlk=setzm pzhjkw+10. +delta=setom wkjhzp+5 +atled=setzm wkjhzp+5 + +wrtfil: syscal open,[cnti,,.uao ;try to open our rat file + argi,,dski + ['dsk '] + ['_game_'] + myunam + ['.temp.']] + jfcl ;if it fails don't worry about it + .close dski, ;close the channel + ret ;and return + +fndfil: syscal open,[cnti,,.uai ;check to see if the file exists + argi,,dski + ['dsk '] + ['_game_'] + myunam + ['.temp.']] + ret ;if not, don't worry about it--he's ok. + tattle badfil,/Tried again after being warned/ + death /C +You have been warned--you are not to play the GAME program any more. +Any further warnings will result in reconsideration of your account here +on MC. A/ + +;;; Routine for goddamn fucking TECO that doesn't set FILLEN for end of file +;;; like it ought to. This means it writes out cretinouse ^C's at the end +;;; to pad the word! Also, the ERR device ends off with a ^L, so we flush +;;; those too! + +c.cadj: save [a,b,c] ;save our ac's + move a,foobp ;get the possibly cretinouse byte pointer + tlne a,004000 ;is it a full-word pointer? + hrli a,010700 ; yes, make it a ascii pointer + movei b,5 ;at most 5 of the losers + setz c, ;count the beggars + norm7 a ;back up to last one +c.caj0: ldb chr,a ;get the possibly offensive character + caie b,c.caj0 ;find another? + exch c,outcnt + subm c,outcnt + restor [c,b,a] ;restore our ac's + ret ;nope that's all + + +;;; For the normal user, these start up the load checking stuff + +sttw: call chkld ;check the load + call onint ;enable the interrupts + ret ;and return + +;;; Here is the load checking scheme. It uses the loadch routine. + +chkld: call chkopn ;open the time file + ; or create it if necessary + syscal rfdate,[argi,,dski + val,,a] ;get it's reference date + loss ;got a problem, no? + .close dski, ;don't need the channel any more + setom pzhjkw+10. ;he's got this far + move b,[3.*60.] ;get interval + call datime"timadd ;calculate end of period + syscal rqdate,[val,,b] ;get current time + caia ; not available + camn b,[-1] ; not available? + jrst [tattle logfil,/? TNA/ + death /AYou can't use GAME just yet, please wait a bit./] + +;;;that wasn't very nice but oh well, hopefully it won't happen too often + + camg b,a ;has somebody been thrown off recently? + call mbyfls + call chkit + ret + +;;; This part tries to open the file to see if someone has been thrown off +;;; within the past 10 minutes. + +chkopn: syscal open,[cnti,,.uai ;let's try to open the time file + argi,,dski + ['dsk '] ;yep, this is where it is hackers + [' tim'] + [' chk'] + ['ejs ']] + jrst [syscal open,[cnti,,.uao ;unfortunately, somebody + ;tried to delete it + argi,,dski ;oh well, just create another + ['dsk '] ;one. It won't hurt us any + [' tim'] + [' chk'] + ['ejs ']] + loss ;if we can't, then we have a problem + jrst .+1] + ret ;return + +mbyfls: skipn initld ;is this the first load check? + jrst timfls ; yes, kill him without countdown + sosn flushp ;are we at end of final countdown? + jrst timfls ; yep, kill him + skipl flushp ;are we in the middle of final countdown? + ret ; yep, just return + sosn warned ;is this the end of probation period + jrst warn1 ; yep, give him final warning + skipl warned ;are we in the middle of warning period? + ret + type/A +The system is becoming loaded. If this continues for another couple minutes, +I'm afraid I will have to ask you to leave.A/ + + movei e,4 ;four interrupts is 8 minutes + movem e,warned ;save for count down + ret + +warn1: type / +I'm sorry but the system has become too loaded, I'm afraid I can give you +only a few minutes to save your game or finish up.A/ + + movei e,2 ;two interrupts is it (4 minutes) + movem e,flushp ;let him be flushed + ret ;and return + +chkit: call ldcal ;get the data + setom pzhjkw+10. ;set some flags + setom wkjhzp+5 ; ditto + move a,load ;get our load flags + tlne a,%sllog ;is he logged in? + jrst [tattle logfil,/ NLI/ + death /AYou must log in to play games!A/] + tlne a,%sldil ;is this a dialup line? + jrst [tattle logfil,/ WOD/ + death / +Due to the scarcity of dialup lines, we do not permit playing games from +them. If you are not an authorized user, you are not to use them at all. +/] + tlne a,%slcls ;are we closed? + jrst [tattle logfil,/ WTD/ + death / +Games are not to be played at this time of day. +Please give up. Our hours are: + +Mon-Fri 8:00 pm to 8:00 am +Saturday and Sunday all day. +Holidays all day. + +See you then! +/] + tlne a,%sldet ;are we detached? + .logout 1, ; yes, kill this job + tlne a,%sload ;are we loaded? + call mbyfls ; yes, maybe flush him then + tlnn a,%sload ; + call mbybet ;maybe tell him that things got better + ret + +mbybet: skipe warned ;if we have been warned + do [type / +The load has gotten a little better now. So you may continue +for a while.A/ + setzm flushp ; then reset flags + setzm warned] + ret ;and return + +ldcal: save [e,f] ;save our ac's + call loadch ;set our flags + movem a,load ;and store away the flags + eval e,SLOADU ;Get inverse fair share + movei f,10000. ; fair share = 10000./sloadu. + idivm f,e ; calculate it + movem e,frshr ;store this as frshr + eval e,SUSRS ;Get the number of users + movem e,nusrs ;store this as nusrs + restor [f,e] ;restor our ac's + ret ;and return + +;;; A routine to check the system load. Right half of A gets load units +;;; left half gets flags for dialup lines, detached tree, or not logged in + +loadch: save [b,c,e] ;save our accumulators + setz a, ;clear a to receive our results + .suset [.runame,,uname] ;check our UNAME.... + hllz e,uname ;look at left half of uname for '___' + camn e,[-1,,0] ;are we logged in? + tlo a,%sllog ;no, note the fact + .suset [.rcnsl,,ttynum] ;we have to check for detached or dialups + move e,ttynum ;get our tty num + caig e, ;do we have one? + tlo a,%sldet ;no, note the fact + movei b,1 ;let's figure out which we are + lsh b,(e) ;as a bit in the word + tdne b,dilmsk ;are we a dialup? + tlo a,%sldil ;yes, note the fact + move e,frshr ;get the fair share + camg e,mxsldu ;is it greater than the max? + tlo a,%sload ;note the fact + move e,nusrs ;get the number of users + caml e,mxusrs ;is it greater than the max? + tlo a,%sload ;note the fact + .rtime e, ;get time + camge e,t.open ;if before 8:00 am + jrst gobak ;it's OK + camle e,t.clos ;if it's after 8:00 pm + jrst gobak ;it's OK + .ryear b, ;get date stuff + ldb e,[.bp (003400),b] ;this byte + cain e,0 ;if not Sunday + jrst gobak ;it's Sunday, let him go. + cain e,6 ;if not Saturday + jrst gobak ;it's Saturday, let him go. + call holdyp ;is it a holiday? + jrst nopen ; tell him we're closed! + +gobak: restor [e,c,b] ;restore our ac's + ret ;and return it + +nopen: tlo a,%SLCLS + jrst gobak + +holdyp: movsi e,-hldys ;aobjn ptr + .rdate b, ;get the year +holdy1: camn b,(e)hldy ;is it a holiday? + popj1 ;yes, skip + aobjn e,holdy1 ;no, loop? + ret ;no, not a holiday + +hldy: + '801013' ;Columbus day an *MY* birthday + '801111' ;Veteran's Day + '801127' ;Thanksgiving Day + '801225' ;Christmas Day + '810101' ;New Year's Day + '810216' ;Washington's Birthday + '810420' ;Patriot's Day + '810525' ;Memorial Day + '810704' ;Independence Day +hldys==.-hldy + +t.open: sixbit /080000/ ;opening time +t.clos: sixbit /200000/ ;closing time + +mxsldu: mvsldu ;maximum fair share +mxusrs: mvusrs ;maximum number of users +nusrs: 0 ;running number of users +frshr: 0 ;running fair share +uname: 0 ;save the UNAME here to check for login etc. +dilmsk: 1_1+1_3+1_4+1_5+1_6+1_7+1_10+1_11+1_12+1_13+1_14 +ttynum: 0 ;save our TTY number here to check for dialup + +;;; More random locations + +foobp: 0 ;location for byte pointer +versio: .fnam2 + + end go ;can you believe it, we are done! + + diff --git a/src/games/animal.(init) b/src/games/animal.(init) new file mode 100644 index 00000000..1f0de644 --- /dev/null +++ b/src/games/animal.(init) @@ -0,0 +1,158 @@ +;;; -*- LISP -*- +;;; +;;; KMP's ANIMAL Init File +;;; +;;; Created 2:14am Saturday, 23 September 1978 +;;; + +(COMMENT) + + ;; Temporary measures ... + +(PROGN (CLOSE (PROG2 NIL INFILE (INPUSH -1))) + (CURSORPOS 'A TYO) + (PRINC '|The All-New ANIMAL program. (Old one temporarily out of order)| + TYO) + (TERPRI TYO) + (PRINC '|Please mention you're using ANIMAL version 2 in any bug notes.| + TYO) + (TERPRI TYO) + (PRINC '|End all input with a period!| TYO) + (TERPRI TYO) + (LOAD '((PIQUE) ANIMAL FASL)) + (NOINTERRUPT T) + (SSTATUS TOPLEVEL '(ANIMAL)) + (SETUP-FOR-ANIMAL)) + +(PROGN + + ;; Fix QUIT for KMP... + + (COND ((MEMQ (STATUS UNAME) '(KMP TNP)) + (DEFUN QUIT N + (CURSORPOS 'A TYO) + (PRINC '|Do you really want to kill this job? | TYO) + (CLEAR-INPUT TYI) + (COND ((MEMBER (TYI TYI) '(89. 121.)) + (PRINC '| [Yes]| TYO) + (VALRET '|:KILL |)) + (T + (PRINC '| [No]| TYO) + NIL)))) + (T + (TERPRI TYO) + (PRINC '|There is an all new, very experimental Animal game| TYO) + (TERPRI TYO) + (PRINC '|by doing :KMP;ANIMAL. Please specify in any notes to| TYO) + (TERPRI TYO) + (PRINC '|BUG-ANIMAL which game you are using.| TYO) + (TERPRI TYO))) + + ;; Turn off interrupts while this loads + + (NOINTERRUPT T) + + ;; Turn off load messages + + (SSTATUS FEATURE NOLDMSG) + + ;; Send KMP a message if he's logged in. + + (DEFPROP IOTA ((DSK LIBLSP) IOTA FASL) AUTOLOAD) + + (COND ((AND (NOT (EQ (STATUS USERID) 'KMP)) + (PROBEF '((USR *) KMP HACTRN))) + (LET ((BASE 10.) (*NOPOINT T) ((HOUR MIN) (STATUS DAYTIME))) + (ERRSET + (IOTA ((STREAM '((CLI *) KMP HACTRN) '(OUT))) + (MAPC (FUNCTION (LAMBDA (X) (PRINC X STREAM))) + (LIST + '|/[Message from The Animal Game at MIT-MC | + (COND ((ZEROP (\ HOUR 12.)) '|12|) (T (\ HOUR 12.))) + '/: + (COND ((< MIN 10.) (IMPLODE (LIST '/0 (+ MIN 48.)))) + (T MIN)) + (COND ((ZEROP (// HOUR 12.)) '|am|) + (T '|pm|)) + '/] (ASCII 13.) (STATUS UNAME) + '| is gonna play against me!|)) + (TERPRI STREAM)) + NIL)))) + + ;; Turn off ^S interrupt - trap it manually + + (SSTATUS TTYINT 19. NIL) + + ;; Allocate core - load it in... + + (ALLOC '(LIST 150000)) + (LOAD '((DSK KMP) ANIMAL FASL)) + + ;; to indicate we are doing something... + + (TERPRI TYO) + + ;; Close this file + + (CLOSE (PROG2 T INFILE (INPUSH -1))) + + ;; Is animal locked for some reason? + + (COND ((PROBEF LOCK-DATA-FILE) + (PRINTC '|ANIMAL will not be available for a few minutes.| TYO) + (PRINTC '|I working on the data base. If you get this| TYO) + (PRINTC '|message and I am not logged in, please do :BUG ANIMAL| TYO) + (PRINTC '|Sorry for the inconvenience.| TYO) + (QUIT)) + ((PROBEF LOCK-PROGRAM-FILE) + (PRINTC '|ANIMAL will not be available for a few minutes.| TYO) + (PRINTC '|I am testing some new features. If you get this| TYO) + (PRINTC '|message and I am not logged in, please do :BUG ANIMAL| TYO) + (PRINTC '|Sorry for the inconvenience.| TYO) + (QUIT)) + ((PROBEF LOCK-RANDOM-FILE) + (PRINTC '|ANIMAL is out of service for an uncertain amount| TYO) + (PRINTC '|of time. Send mail to KMP@MC for explanation.| TYO) + (QUIT))) + + ;; Offer to print news if any... + + (COND ((PROBEF NEWS-FILE) + (PROG (CHAR INFO *NOPOINT TIME DATE) + (SETQ *NOPOINT T) + TOP (TERPRI TYO) + (SETQ INFO (CAR (DIRECTORY (LIST NEWS-FILE) '(CREDATE CRETIME)))) + (SETQ TIME (CADR (MEMQ 'CRETIME INFO))) + (SETQ DATE (CADR (MEMQ 'CREDATE INFO))) + (PRINC '|News last updated | TYO) + (DATE-AND-TIME-PRINC DATE TIME) + (PRINC '|.| TYO) + (TERPRI TYO) + (PRINC '|--Read News?-- (Y OR N)| TYO) + (CLEAR-INPUT TYI) + (SETQ CHAR (TYI TYI)) + (COND ((MEMBER CHAR '(89. 121.)) + (PRINTC '|(Type a | TYO) + (PRINC '| to flush rest of output)| TYO) + (TERPRI TYO) + (CLEAR-INPUT TYI) + (APPLY 'PRINTFILE (NCONS NEWS-FILE))) + ((= CHAR 12.) + (CURSORPOS 'C TYO) + (GO TOP)) + ((MEMBER CHAR '(2120. 63.)) + (PRINTC '|Information about latest improvements.| TYO) + (GO TOP)) + ((MEMBER CHAR '(78. 110.)) + (TERPRI TYO)) + (T + (PRINC '| ?? Type "?" for help.|) + (GO TOP)))))) + + ;; Run the game... + + (ANIMAL)) + + + + \ No newline at end of file diff --git a/src/games/animal.133 b/src/games/animal.133 new file mode 100644 index 00000000..11d208b8 --- /dev/null +++ b/src/games/animal.133 @@ -0,0 +1,2113 @@ +;;; -*- Mode:LISP; Base:10 -*- +;;; + +(COMMENT Initialize Environment) + + ;; Allocate storage + +(ALLOC '(LIST 130000.)) +(ALLOC '(SYMBOL 60000.)) +(ALLOC '(FIXNUM 30000.)) + + ;; Turn off autoload messages + +(SSTATUS FEATURE NOLDMSG) + + ;; Init interesting lisp variables + +(EVAL-WHEN (EVAL LOAD COMPILE) + + (SETQ BASE 10. IBASE 10. *NOPOINT NIL)) ; I/O Base 10 anytime + +(NOUUO T) (*RSET T) (SETQ PURE 1.) ; Debugging enabled at runtime + + ;; Declare imported things ... + +(DECLARE (*EXPR INTERJECTION? PREPOSITION? PRONOUN? NOUN? PERSON-NAME? + VERB? ADJECTIVE? ADVERB? MODIFIER? + PART-OF-SPEECH PART-OF-SPEECH? IS-A? FEMALE-NAME? MALE-NAME? + VERB-SING? VERB-PLURAL? VERB-PP? + MATCH + LOWERCASIFY CAPITALIZE UPPERCASIFY DIGIT? + PARSE$MAKE-WORDS EXPAND-CONTRACTIONS EXPAND-ABBREVS)) + + ;; Declare special types of functions... + +(DECLARE (*LEXPR DISPLAY)) + + ;; Load supporting packages + +(EVAL-WHEN (EVAL LOAD COMPILE) ; Always + (LOAD '|GAMES;PARSE FASL|) ; Load lexical parser + (LOAD '|GAMES;WORDS FASL|) ; Load dictionary stuff + (LOAD '|GAMES;PATTRN FASL|) ; Load pattern matcher + + (DEFUN CONCAT X ; Pname concatenation + (IMPLODE (MAPCAN 'EXPLODEN (LISTIFY X)))) + + (DEFUN PARSE-INPUT (X) ; Parser -- assembles + (EXPAND-ABBREVS ; hacks from several + (EXPAND-CONTRACTIONS ; packages + (PARSE$MAKE-WORDS + (COND ((FIXP (CAR X)) (MAPCAR 'ASCII X)) + (T X)))))) + + (DEFUN PARSE-/" () ; Define our very sophisticated + (DO ((C (TYI) (TYI)) ; doublequote macro + (L () (CONS C L))) + ((= C 34.) (PARSE-INPUT (NREVERSE L))))) + + (SSTATUS MACRO /" 'PARSE-/")) ; Enable doublequote macro + +(EVAL-WHEN (EVAL COMPILE) ; Setup + (LOAD '|LIBLSP;IOTA FASL|) + (SETQ ANIMAL-VERSION (CADDR (TRUENAME INFILE)))) + +(INCLUDE ((DSK GAMES) LSRRTN INSERT)) ; Include support for the + ; LOOKUP-INQUIR-INFO macro + ; and GET-USER-NAME subr + +(DEFUN *VERSION MACRO (()) `',ANIMAL-VERSION) + +(DEFUN VERSION () (*VERSION)) + +(EVAL-WHEN (EVAL LOAD) ; Runtime + (LOAD '|GAMES;WORD FASL|)) ; Load string hacks + + +(COMMENT Useful Macros) + +;;; (DO-FOREVER . ) +;;; Like a DO with no termination condition. Clearer to read. + +(DEFMACRO DO-FOREVER (BVL &REST BODY) `(DO ,BVL (NIL) ,@BODY)) + + +(COMMENT Data Structure) + +;;; Database structure +;;; +;;; is a or a +;;; +;;; has components QUESTION, NO-BRANCH, YES-BRANCH, AUTHOR +;;; has components TERMINAL, AUTHOR +;;; +;;; There are EXTRACT- operators for all components. +;;; +;;; The predicates QUESTION-NODE? and TERMINAL-NODE? may be applied to any +;;; node to find its type. +;;; + +(DEFMACRO CONSTRUCT-QUESTION (QUES NO YES &OPTIONAL (AUTHOR '(STATUS USERID))) + `(LIST ,QUES ,AUTHOR ,NO ,YES)) + +(DEFMACRO CONSTRUCT-TERMINAL (TERM &OPTIONAL (AUTHOR '(STATUS USERID))) + `(LIST ,TERM ,AUTHOR)) + +(DEFMACRO COPY-NODE (NODE) `(SUBST NIL NIL ,NODE)) + +(DEFMACRO EXTRACT-QUESTION (NODE) `(CAR ,NODE)) +(DEFMACRO EXTRACT-TERMINAL (NODE) `(CAR ,NODE)) +(DEFMACRO EXTRACT-AUTHOR (NODE) `(CADR ,NODE)) +(DEFMACRO EXTRACT-NO-BRANCH (NODE) `(CADDR ,NODE)) +(DEFMACRO EXTRACT-YES-BRANCH (NODE) `(CADDDR ,NODE)) + +(DEFMACRO TERMINAL-NODE? (NODE) `(ATOM (CAR ,NODE))) +(DEFMACRO QUESTION-NODE? (NODE) `(NOT (ATOM (CAR ,NODE)))) + + +(COMMENT Variable Initializations) + +;;; (INITIALIZE ...) +;;; +;;; ::= ! ( ...) +;;; +;;; Expands to: +;;; +;;; (PROGN 'COMPILE +;;; (DECLARE ( ... things with that attribute ... ) +;;; ( ... things with that attribute ... ) ...) +;;; (SETQ ) +;;; (SETQ ) ...) +;;; + +(DEFMACRO INITIALIZE (&REST INFO) + (DO ((L INFO (CDDR L)) + (INITS ()) + (NAME ()) + (ATTRIBUTES (NCONS NIL))) + ((NULL L) + `(PROGN 'COMPILE + (DECLARE ,@(DO ((A (CDR ATTRIBUTES) (CDDR A)) + (L () (CONS (CONS (CAR A) (CADR A)) L))) + ((NULL A) L))) + ,@(NREVERSE INITS))) + (COND ((ATOM (CAR L)) (SETQ NAME (CAR L))) + (T (SETQ NAME (CAAR L)) + (MAPCAR #'(LAMBDA (X) + (PUTPROP ATTRIBUTES + (CONS NAME + (GET ATTRIBUTES X)) + X)) + (CDAR L)))) + (PUSH `(SETQ ,NAME ,(CADR L)) INITS))) + +(INITIALIZE + + ;; Random ... + (*PLAYER-NAME* SPECIAL) (STATUS USERID) + + (*PLAYER-OBJECT-PRONOUN* SPECIAL) '|| + (*PLAYER-SUBJECT-PRONOUN* SPECIAL)'|| + + (*FULL-NAME* SPECIAL) '|| + (*LAST-NAME* SPECIAL) '|| + (*NICK-NAME* SPECIAL) '|| + (*FIRST-NAME* SPECIAL) '|| + + ;; Data-structure stuff + (*NEW* SPECIAL) (NCONS (GENSYM)) ; For debugging + (*OLD* SPECIAL) (NCONS (GENSYM)) ; For debugging + (*MEMORY* SPECIAL) (CONSTRUCT-TERMINAL 'DOG '|No one|) + (*CURRENT-NODE* SPECIAL) *MEMORY* + + ;; Display Features + (*DISPLAY* SPECIAL) '|** Tell KMP I have a display bug **| + (*FILL-COLUMN* SPECIAL FIXNUM) (- (LINEL TYO) 15.) + + ;; Filenames + (*SAVE-FILE* SPECIAL) '((DSK games) ANIMAL SAVE) + (*NOTES-FILE* SPECIAL) '((DSK games) ANIMAL NOTES) + (*NEWS-FILE* SPECIAL) '((DSK games) ANIMAL NEWS) + (*INSTRUCTION-FILE* SPECIAL) '((DSK games) ANIMAL RULES) + (*MEMORY-AREA* SPECIAL) '((ARC games) * *) + + ;; Debug options + (*DEBUG* SPECIAL) NIL + + ;; Random flags + (*WATER-FLAG* SPECIAL) NIL + (*FOUL-FLAG* SPECIAL) NIL + (*FOUL-COUNT* SPECIAL) 0. + (*FOUL-COUNT-MAX* SPECIAL) 3. + (*APOLOGY-FLAG* SPECIAL) NIL + (*FORGIVE-FLAG* SPECIAL) NIL + (*DOT-WARN* SPECIAL) NIL +) + + +(COMMENT Utility Routines) + +;;; (PRINTF ) +;;; Prints out to the already-open . +;;; Expects that will end in a carriage return. + +(DEFUN PRINTF (IFILE OSTREAM) + (IOTA ((ISTREAM IFILE '(IN ASCII SINGLE))) + (DO ((C (READLINE ISTREAM 0.) (READLINE ISTREAM 0.))) + ((NUMBERP C) (TERPRI OSTREAM)) + (TERPRI OSTREAM) + (PRINC C OSTREAM)))) + +;;; (CREATEF ) +;;; Creates a file named clobbering if it already +;;; exists. + +(DEFUN CREATEF (X) (IOTA ((STREAM X 'OUT)) T)) + +;;; (ADDPROP ) +;;; +;;; CONS's onto the head of 's property. + +(DEFUN ADDPROP (SYM VAL LAB) + (PUTPROP SYM (CONS VAL (GET SYM LAB)) LAB)) + +;;; (SWAP ) +;;; +;;; Swaps object1 and object2 + +(DEFUN SWAP (X Y) + (RPLACA Y (PROG1 (CAR X) (RPLACA X (CAR Y)))) + (RPLACD Y (PROG1 (CDR X) (RPLACD X (CDR Y)))) + T) + +(DEFUN CLOCK-TIME () + (LET ((BASE 10.) + (*NOPOINT T) + ((HOURS MINS) (STATUS DAYTIME)) + (A/P) + (DIG)) + (SETQ A/P (COND ((> HOURS 11.) '/p) (T '/a))) + (SETQ DIG (COND ((< MINS 10.) (NCONS '/0)) (T NIL))) + (SETQ HOURS (\ HOURS 12.)) + (IMPLODE (NCONC (EXPLODEN HOURS) + (CONS '/: DIG) + (EXPLODEN MINS) + (LIST A/P '/m))))) + + +(COMMENT Rule Definitions) + +;;; DEF-DEF +;;; +;;; A macro-defining macro! See documentation on next page... + +(DEFMACRO DEF-DEF (CLASS HEADER DATABASE-NAME) + `(PROGN + 'COMPILE + (DECLARE (SPECIAL ,DATABASE-NAME)) + (SETQ ,DATABASE-NAME ()) + (DEFMACRO ,(CONCAT 'DEF- CLASS) (RULE-NAME ARG-LIST LOCALS &REST STUFF) + (LET ((CONDITIONS) + (BODY) + (LOCAL-NAMES (DO ((L LOCALS (CDR L)) + (LN ())) + ((NULL L) (NREVERSE LN)) + (PUSH (COND ((ATOM (CAR L)) (CAR L)) + (T (CAAR L))) + LN)))) + (DO () ((NOT (ATOM (CAR STUFF)))) (POP STUFF)) + (DO ((L STUFF (CDR L))) + ((ATOM (CAR L)) + (SETQ CONDITIONS (NREVERSE CONDITIONS)) + (SETQ BODY (CDR L))) + (PUSH (CAR L) CONDITIONS)) + (LET ((COND-ID (CONCAT ',HEADER '$ RULE-NAME '/?)) + (RULE-ID (CONCAT ',HEADER '$ RULE-NAME)) + (DRIVER (CONCAT ',HEADER '$ RULE-NAME '/!))) + `(PROGN 'COMPILE + (DEFUN ,COND-ID ,ARG-LIST + (DECLARE (SPECIAL ,@LOCAL-NAMES)) + ,@ARG-LIST + ,(COND ((> (LENGTH CONDITIONS) 1.) + `(OR ,@CONDITIONS)) + (T + (CAR CONDITIONS)))) + (DEFUN ,RULE-ID ,ARG-LIST + (DECLARE (SPECIAL ,@LOCAL-NAMES)) + ,@ARG-LIST + ,@BODY) + (DEFUN ,DRIVER ,ARG-LIST + (LET ,LOCALS + (DECLARE (SPECIAL ,@LOCAL-NAMES)) + (COND ((,COND-ID ,@ARG-LIST) + (NCONS (,RULE-ID + ,@ARG-LIST))) + (T NIL)))) + (SETQ ,',DATABASE-NAME + (NCONC ,',DATABASE-NAME + (NCONS ',DRIVER))) + ',',DATABASE-NAME)))))) + +;;; (DEF-DEF
) +;;; +;;; Initializes a global variable to NIL and +;;; defines a macro DEF- which is callable via the syntax +;;; +;;; (DEF- . ) +;;; +;;; ::= (IF THEN ) +;;; +;;; which will define three more functions when called... +;;; +;;; Predicate... +;;; +;;; (DEFUN
$? ) +;;; +;;; Action... +;;; +;;; (DEFUN
$ ) +;;; +;;; Driver... Calls action if predicate wins +;;; +;;; (DEFUN
$! (LET ...)) +;;; +;;; and will NCONC the driver's name to the list via NCONC. +;;; + +(DEF-DEF EXIT EXIT EXITS) +(DEF-DEF TRANSFORM TRANSFORM TRANSFORMATIONS) +(DEF-DEF INTERPRETATION INTERPRET INTERPRETATIONS) +(DEF-DEF QUESTION QUESTION QUESTIONS) +(DEF-DEF STATEMENT STATEMENT RANDOM-STATEMENTS) + + +(DEFUN TRY-RULES (RULE-SET EXPRESSION) + (*CATCH 'DONE + (DO-FOREVER ((FLAG NIL T)) + (DO ((R RULE-SET (CDR R)) + (TEMP)) + ((NULL R) (*THROW 'DONE EXPRESSION)) + (SETQ TEMP (FUNCALL (CAR R) EXPRESSION)) + (COND (TEMP + (SETQ EXPRESSION (CAR TEMP)) + (RETURN T))))))) + +(DEFUN TRY-RULES-ONCE (RULE-SET EXPRESSION) + (DO ((R RULE-SET (CDR R)) + (TEMP)) + ((NULL R) NIL) + (SETQ TEMP (FUNCALL (CAR R) EXPRESSION)) + (COND (TEMP + (SETQ EXPRESSION (CAR TEMP)) + (RETURN EXPRESSION))))) + + + +(COMMENT I/O Routines) + +(DEFMACRO CATCH-ROUND-EXIT (FORM) `(*CATCH 'EXIT-ROUND ,FORM)) +(DEFMACRO ABORT-ROUND () `(*THROW 'EXIT-ROUND NIL)) + +(DEFMACRO OUTPUT-BIND (&REST FORM) `(LET ((*DISPLAY* (NCONS '||))) ,@FORM)) + +(DEFUN READ-SENTENCE () + (LET ((RESULT (LET* ((S (READ-A-SENTENCE)) + (P (PARSE-INPUT S))) + (COND ((FOUL-ANSWER? P) + (HANDLE-FOUL-LANGUAGE P) + (DISPLAY *DISPLAY*) + (READ-SENTENCE)) + (T + (HUNK (CAR P) (CXR 2. S) (CDR P))))))) + (COND ((HANDLE-RANDOMNESS RESULT) + (DISPLAY *DISPLAY*) + (READ-SENTENCE)) + (T + RESULT)))) + +(DEFUN REDISPLAY (L) + (DISPLAY *DISPLAY*) + (MAPC #'(LAMBDA (X) (TYO X TYO)) (REVERSE L))) + +(DEFUN WARN-/. (()) + (SETQ *DOT-WARN* NIL) + (NOINTERRUPT NIL) + (OUTPUT-BIND (DISPLAY '|Type a '.' to terminate your input.|)) + (*THROW 'SMART-TYI #\FORM)) + +(DEFUN SMART-TYI (INSTREAM) + (COND ((AND *DOT-WARN* (ZEROP (LISTEN INSTREAM))) + (LET ((ALARMCLOCK 'WARN-/.)) + (*CATCH 'SMART-TYI + (UNWIND-PROTECT + (PROGN (ALARMCLOCK 'TIME 11.) (TYI INSTREAM)) + (ALARMCLOCK 'TIME NIL))))) + (T + (TYI INSTREAM)))) + +(DEFUN READ-A-SENTENCE () + (DO-FOREVER ((C (TYI TYI) (SMART-TYI TYI)) + (L NIL) + (TYPE) + (*DOT-WARN* T)) + (CASEQ C + ((#\FORM) (REDISPLAY L)) + ((#/. #/? #/!) + (COND (L ; Only if there was input do we return... + (SETQ TYPE (CASEQ C + ((#/.) 'STATEMENT) + ((#/!) 'EXCLAMATION) + ((#/?) 'QUESTION))) + (SETQ L (NREVERSE L)) + (RETURN (HUNK (CAR L) TYPE (CDR L)))) + ((= C #/?) ; Maybe he's confused... + (REDISPLAY L)))) + ((#\RETURN) + (COND ((= (CAR L) #\RETURN) + (OUTPUT-BIND + (DISPLAY '|Terminate your input with a '.' please.|)) + (POP L) + (REDISPLAY L)) + (T + (PUSH C L)))) + ((#\RUBOUT) + (COND (L (RUBOUT (POP L))))) + (T + (PUSH C L))))) + +(DEFUN SENTENCE-TYPE? (X) (CXR 2. X)) + +(DEFUN SET-SENTENCE-TYPE (X VAL) (RPLACX 2. X VAL) VAL) + +(DEFUN MAKE-WORD (X) + (COND ((NULL X) '||) + ((ATOM X) X) + ((NULL (CDR X)) (MAKE-WORD (CAR X))) + (T (CONCAT (MAKE-WORD (CAR X)) '| | (MAKE-WORD (CDR X)))))) + +(DEFUN READ-NOUN () + (LET ((A (READ-SENTENCE)) + (BAR) (FOO) (MOD) (MODS) (NOUN) (NOUNS) (PREP) + (PUNC) (REST) (STUFF)) + (DECLARE (SPECIAL FOO BAR STUFF NOUN PREP MOD + MODS PUNC REST PREP NOUNS)) + (COND ((INDETERMINATE-ANSWER? A) + (DISPLAY '"Oh well. Let's start a new game, then...") + (ABORT-ROUND)) + ((I-DONT-CARE-ANSWER? A) + (DISPLAY '"Hrrmmf! Then neither do I... I quit!") + (ABORT-ROUND))) + (COND ((MATCHES A + ((?= INTERJECTION? ) + (*= DELIMITER? ) + (* FOO ) + (?= NOUN? NOUN ) + (* BAR ))) + (SETQ A (APPEND FOO NOUN BAR)))) + (COND ((MATCHES A + ((* STUFF ) + (*= NOUN? NOUN ) + (?= DELIMITER? PUNC ) + (*))) + (SETQ A (APPEND STUFF NOUN)))) + (COND ((MATCHES A + ((*= MODIFIER? ) + (?= NOUN? ) + (?= STATE-OF-BEING-VERB? ) + (* REST ))) + (SETQ A REST))) + (COND ((MATCHES A + ((* STUFF ) + (?= NOUN? NOUN ) + (?= PREPOSITION? PREP ) + (*= MODIFIER? MODS ) + (*= NOUN? NOUNS ))) + (LET ((ANSWER (MAKE-WORD + (LIST* NOUN PREP (APPEND MODS NOUNS))))) + (PUTPROP ANSWER STUFF 'MODIFIERS) + ANSWER)) + ((MATCHES A + ((*= COMPARATIVE-ADJECTIVE? FOO ) + (*= COMPARATOR? BAR ) + (*= MODIFIER? MODS ) + (?= NOUN? NOUN ) + (* REST ))) + (LET ((ANSWER (MAKE-WORD (CONS NOUN REST))) + (REPLY (APPEND FOO BAR MODS))) + (COND ((MEMQ (CAR REPLY) '(A AN)) + (PUTPROP ANSWER (CDR REPLY) 'MODIFIERS)) + (T + (PUTPROP ANSWER REPLY 'MODIFIERS))) + ANSWER)) + ((I-DONT-CARE-ANSWER? A) + (DISPLAY '"Well, since you're so indifferent... I quit!") + (ABORT-ROUND)) + ((OR (NO-ANSWER? A) (YES-ANSWER? A)) + (DISPLAY '"That doesn't make any sense! I quit!") + (ABORT-ROUND)) + (T + (DISPLAY '"I don't understand.") + (READ-NOUN))))) + +(DEFUN QUERY (X) + (DISPLAY X) + (LET ((REPLY (READ-SENTENCE))) + (COND ((INDETERMINATE-ANSWER? REPLY) + (DISPLAY '|Please just answer 'YES' or 'NO'...|) + (QUERY X)) + ((QUIT-ANSWER? REPLY) (SUICIDE)) + ((YES-ANSWER? REPLY) T) + ((NO-ANSWER? REPLY) NIL) + (T + (DISPLAY '|I don't follow.|) + (QUERY X))))) + +(DEFUN PRINTC (X WHERE) (TERPRI WHERE) (PRINC X WHERE)) + +(DEFUN DELIMITER? (X) (MEMQ X '(/. /? /! // || /, /-))) + +(DEFUN NON-DELIMITER? (X) (NOT (DELIMITER? X))) + +(DEFUN OPEN-QUOTE-MARKS? (X) (MEMQ X '(/" |``|))) +(DEFUN CLOSE-QUOTE-MARKS? (X) (MEMQ X '(/" |''|))) + +(DEFUN END-OF-SENTENCE? (X) (MEMQ X '(/. /? /!))) + +(DEFUN DISPLAY-VERSION () + (CURSORPOS 'A TYO) + (PRINC '|Animal II (Version | TYO) + (PRINC (VERSION) TYO) + (PRINC '|)| TYO) + (TERPRI TYO)) + +(DEFUN DISPLAY1 (X SPACE-FLAG CASE-FLAG WHERE) + (COND (SPACE-FLAG + (COND ((< (CHARPOS WHERE) *FILL-COLUMN*) (TYO #\SPACE WHERE)) + (T (TERPRI WHERE))))) + (COND ((ATOM X) + (LET ((ALIAS (DISPLAY-ALIAS X))) + (COND (ALIAS (DISPLAY1 ALIAS NIL CASE-FLAG WHERE)) + (T + (PRINC (COND ((EQ X 'I) 'I) + (CASE-FLAG (CAPITALIZE X)) + ((PERSON-NAME? X) (CAPITALIZE X)) + (T (LOWERCASIFY X))) + WHERE))))) + (T + (DO ((SFLAG NIL T) + (CFLAG CASE-FLAG (COND ((END-OF-SENTENCE? (CAR L)) T) + (T NIL))) + (L X (CDR L))) + ((NULL L)) + (COND ((DELIMITER? (CAR L)) + (SETQ SFLAG NIL))) + (DISPLAY1 (CAR L) SFLAG CFLAG WHERE))))) + +(DEFUN DISPLAY-ALIAS (X) + (AND (SYMBOLP X) + (SELECT-ONE-OF (GET X 'DISPLAY-ALTERNATIVES)))) + +(DEFUN SELECT-ONE-OF (X) + (COND ((NULL X) NIL) + (T (NTH (RANDOM (LENGTH X)) X)))) + +(DEFUN SEND-MAIL (HEADER-INFO TEXT) + (LET ((TERPRI T)) + (IOTA ((OUTSTREAM '|.MAIL.;MAIL >| 'OUT)) + (PRINC '|From-Job:Animal II, Version | OUTSTREAM) + (PRINC (VERSION) OUTSTREAM) + (PRINTC '|Sent-By:ANIMAL| OUTSTREAM) + (PRINTC '|Header-Force:RFC733| OUTSTREAM) + (MAPC #'(LAMBDA (X) + (COND ((MEMQ (CAR X) '(TO: CC:)) + (TERPRI OUTSTREAM) + (ADDRESSEE-PRINC (CAR X) + (CDR X) + OUTSTREAM)) + (T + (PRINTC (CAR X) OUTSTREAM) + (DISPLAY1 (CDR X) NIL T OUTSTREAM)))) + HEADER-INFO) + (PRINTC '|Text;-1| OUTSTREAM) + (TERPRI OUTSTREAM) + (DISPLAY TEXT OUTSTREAM)))) + +(DEFUN ADDRESSEE-PRINC (TYPE X STREAM) + (LET ((MODES (CDR (ASSQ TYPE '((CC: (R-OPTION CC))))))) + (MAPCAR #'(LAMBDA (X) + (TERPRI STREAM) + (PRINC '|TO:| STREAM) + (PRINC (CONS X MODES) STREAM)) + X))) + +(DEFUN REMEMBER (X) + (CREATEF (MERGEF `(,(STATUS USERID) ,X) *MEMORY-AREA*))) + +(DEFUN REMEMBER? (X) + (PROBEF (MERGEF `(,(STATUS USERID) ,X) *MEMORY-AREA*))) + +(DEFUN FORGET (X) + (SLEEP 3.0) ;Sigh. Make sure archive device has enough time to get closed + (DELETEF (MERGEF `(,(STATUS USERID) ,X) *MEMORY-AREA*))) + +(DEFUN FORGIVE (X TEXT) + (COND ((REMEMBER? X) + (FORGET X) + (SEND-MAIL `((TO: KMP) + (CC: ,(STATUS USERID)) + (SUBJECT: (,(CONCAT *PLAYER-NAME* '|'s|) + "foul language!"))) + `("I have decided to forgive" ,*FIRST-NAME* + "for" ,TEXT "."))))) + +(DEFUN FRESHLINE (WHERE) + (COND ((NOT (= (CHARPOS WHERE) 0.)) + (TERPRI WHERE)))) + +(DEFUN DISPLAY (X &OPTIONAL (WHERE TYO)) + (SETQ *DISPLAY* (COND ((ATOM X) (NCONS X)) (T X))) + (FRESHLINE WHERE) + (DISPLAY1 X NIL T WHERE) + (PRINC '| | WHERE)) + +(DEFUN SLOW-PRINC (X) + (MAPCAR (FUNCTION (LAMBDA (C) (TYO C TYO) (SLEEP .15))) + (EXPLODEN X)) + T) + +(COMMENT Main Program Stuff) + +(DEFUN ANIMAL () + (*CATCH 'ANIMAL-SUICIDE + (PROGN (DISPLAY-VERSION) + (OFFER-INSTRUCTIONS) + (DO ((AGAIN (PLAY-AND-OFFER-NEW-ROUND) + (PLAY-AND-OFFER-NEW-ROUND))) + ((NOT AGAIN) (SUICIDE)))))) + +(DEFUN OFFER-INSTRUCTIONS () + (COND ((QUERY '"Do you want instructions?") + (PRINTF *INSTRUCTION-FILE* TYO)))) + +(DEFUN ABORT-ROUND-IF-NULL-ANSWER (X) + (COND ((NULL-ANSWER? X) + (DISPLAY '"Oh, well. Thanks anyway.") + (ABORT-ROUND)))) + +(DEFUN PLAY-AND-OFFER-NEW-ROUND () + (CATCH-ROUND-EXIT (GUESS-HIS-ANIMAL)) + (DISPLAY '"Thanks for the game.") + (QUERY '"Another game?")) + +(DEFUN INIT-MEMORY () *MEMORY*) + +(DEFUN GUESS-HIS-ANIMAL () + (LET ((MEMORY (INIT-MEMORY)) + (RESULT NIL)) + (COND ((SETQ RESULT (FAIL-TO-GUESS? MEMORY)) + (LEARN RESULT) + (COND (*SAVE-FILE* (SAVE *SAVE-FILE*))))))) + +(DEFUN FAIL-TO-GUESS? (*CURRENT-NODE*) + (COND ((TERMINAL-NODE? *CURRENT-NODE*) + (LET ((*OLD* *CURRENT-NODE*)) + (FINALLY-GUESS *OLD*))) + ((QUERY (LIST (EXTRACT-QUESTION *CURRENT-NODE*) '?)) + (FAIL-TO-GUESS? (EXTRACT-YES-BRANCH *CURRENT-NODE*))) + (T + (FAIL-TO-GUESS? (EXTRACT-NO-BRANCH *CURRENT-NODE*))))) + +(DEFUN FINALLY-GUESS (X) + (LET ((GUESS (EXTRACT-TERMINAL X))) + (COND ((QUERY `("I bet it's" ,(@ GUESS) ,GUESS ?)) NIL) + (T X)))) + +(DEFUN LEARN (X) + (DISPLAY '(WHAT ANIMAL WERE YOU THINKING OF ?)) + (LET ((NEW-ANIMAL (READ-NOUN))) + (ABORT-ROUND-IF-NULL-ANSWER NEW-ANIMAL) + (COND ((EQ NEW-ANIMAL (EXTRACT-TERMINAL X)) + (OUTPUT-BIND + (DISPLAY + '|That's what I just guessed. Stop fooling around.|)) + (ABORT-ROUND))) + (DISPLAY `(WHAT DISTINGUISHES ,(@ NEW-ANIMAL) ,NEW-ANIMAL FROM + ,(@ (EXTRACT-TERMINAL X)) ,(EXTRACT-TERMINAL X) ?)) + (LET ((NEW-QUESTION) + (OLD-NODE (COPY-NODE X)) + (NEW-NODE (CONSTRUCT-TERMINAL NEW-ANIMAL *PLAYER-NAME*))) + (LET ((*NEW* NEW-NODE) (*OLD* OLD-NODE)) + (DO ((N (READ-SENTENCE) (READ-SENTENCE))) + ((NOT (HANDLE-RANDOMNESS N)) + (SETQ NEW-QUESTION N)))) + (DISPLACE X (CONSTRUCT-QUESTION + (MAKE-QUESTION OLD-NODE NEW-NODE NEW-QUESTION) + OLD-NODE + NEW-NODE + *PLAYER-NAME*))))) + +(COMMENT Answer Types) + +(DEFUN NO-ANSWER? (X) + (MATCHES X ((*) (?= NEGATIVE?) (*)))) + +;;; Bug: (YES-ANSWER? ...) on "Sure, why not?" returns NIL. --Cstacy 7/11/82 + +(DEFUN YES-ANSWER? (X) + (AND (NOT (MEMQ 'NOT X)) + (OR (MATCHES X ((*) (?= AFFIRMATIVE?) (*))) + (MATCHES X ( (*= PREPOSITION?) SOME (?)) ; in some ways, + ; respects, ... + ; by some standards + ( (*) OF COURSE (*) ) + ( (*) (*= PRONOUN?) (?= DOES?) ) + ( (*) + (*= PRONOUN?) + (*= ADVERB?) + (?= STATE-OF-BEING-VERB?) ))))) + +(DEFUN NULL-ANSWER? (A) + (COND ((MEMQ A '(NOTHING NONE NIL)) + (DISPLAY '"OK, then. Just testing me, huh?") + T) + ((ANIMAL-PRONOUN? A) + (DISPLAY '"Grumble. Let's try to be more specific in the + future, ok?") + T) + ((MEMQ A '(|FORGET IT| |NEVER MIND| |SKIP IT|)) + (DISPLAY '"OK, be that way!") + T) + ((MEMQ A '(STOP QUIT DONE EXIT THROUGH BYE ABORT)) + (DISPLAY '"All right, but I win this one...") + T) + ((MEMQ A '(DOPPLEGANGER DOUBLE SAME TWIN IDENTICAL ALIAS)) + (DISPLAY '"Well, then, *I* win!") + T) + ((MEMQ A '(GOD JESUS CHRIST)) + (DISPLAY `(,A "is not an animal! Better luck next game.")) + T) + (T NIL))) + +(DEFUN HANDLE-RANDOMNESS (REPLY) + (OR (QUESTION-HANDLE? REPLY) + (STATEMENT-HANDLE? REPLY))) + +(DEFUN STATEMENT-HANDLE? (X) + (TRY-RULES-ONCE RANDOM-STATEMENTS X)) + +(DEFUN QUESTION-HANDLE? (X) + (OUTPUT-BIND + (COND ((QUESTION? X) + (COND ((TRY-RULES-ONCE QUESTIONS X)) + (T + (DISPLAY '"Sorry, I don't understand your question."))))) + (QUESTION? X))) + +(DEFUN QUESTION? (X) + (AND (OR (EQ (SENTENCE-TYPE? X) 'QUESTION) + (AND (INTERROGATIVE-WORD? (CAR X)) + (CDR X))) + T)) + +(DEFUN FOUL-ANSWER? (X) (MATCHES X ((*) (?= FOUL?) (*)))) + +(DEFUN HANDLE-FOUL-LANGUAGE (()) ;REPLY + (OUTPUT-BIND + (DISPLAY + (CASEQ *FOUL-FLAG* + ((0) '"Please watch your language.") + ((1) '"Hey! Watch your tongue. I warned you before.") + ((2) '"Will you watch it with the dirty talk? Thanks.") + (T '"Aw, come on. Stop talking so dirty..."))) + (SETQ *FOUL-FLAG* T) + (SETQ *APOLOGY-FLAG* NIL) + (SETQ *FOUL-COUNT* (1+ *FOUL-COUNT*)) + (COND ((> *FOUL-COUNT* *FOUL-COUNT-MAX*) + (SEND-MAIL `((TO: KMP) + (CC: ,(STATUS USERID)) + (SUBJECT: (,(CONCAT *PLAYER-NAME* '|'s|) + "Foul language!"))) + `(,*FIRST-NAME* "said terrible things to me. + I'm going to be pretty mad at" + ,*PLAYER-OBJECT-PRONOUN* "until" + ,*PLAYER-SUBJECT-PRONOUN* "apologizes.")) + (REMEMBER 'FOUL) + (DISPLAY '"I give up. You're hopeless!") + (SUICIDE))))) + +(DEFUN I-DONT-CARE-ANSWER? (X) + (MATCHES X + (YOU (*= MODIFIER?) (?= DOES?) NOT CARE (*)) + (YOU (*= MODIFIER?) (?= DOES?) NOT (?= WANT?) TO (?= DECIDE?) (*)))) + +(DEFUN INDETERMINATE-ANSWER? (X) + (MATCHES X ( (*) NOT KNOW (*) ) + ( (*) NOT SURE (*) ) + ( (*) NOT REMEMBER (*) ) + ( (*) NOT (?= UNDERSTAND?) (*) ) + ( (*) NOT SURE (*) ) + ( (*) (?= MAYBE?) (*)))) + +(DEFUN QUIT-ANSWER? (X) (MEMQ 'QUIT X)) + + + +(COMMENT Special part-of-speech predicates) + +(DEFUN INTERROGATIVE-WORD? (X) + (OR (VERB? X) (MEMQ X '(HOW WHAT WHEN WHERE WHY)))) + +(DEFUN STATE-OF-BEING-VERB? (X) + (LET ((PART-OF-SPEECH (PART-OF-SPEECH? X))) + (AND (NOT (ATOM PART-OF-SPEECH)) + (MEMQ 'BEING-VERB PART-OF-SPEECH)))) + +(DEFUN *OLD*-CK? (X) (EQ X (EXTRACT-TERMINAL *OLD*))) +(DEFUN *NEW*-CK? (X) (OR (PRONOUN? X) (EQ X (EXTRACT-TERMINAL *NEW*)))) + + +(COMMENT Clever A/An Hack) + +;;; (@ ) +;;; +;;; This is a carefully devised technique for telling whether to say +;;; A, AN or nothing before a given noun or string of words ... +;;; Returns A, AN or || ... + +(DEFUN @ (@-X) + (LET ((EXPLODED + (EXPLODEC (CAR (SETQ @-X (PARSE-INPUT (EXPLODEC @-X))))))) + (COND ((OR (= (LENGTH EXPLODED) 1.) + (APPLY 'OR (MAPCAR 'DIGIT? EXPLODED))) + (COND ((MEMQ (CAR EXPLODED) '(F H L M N S X)) 'AN) + (T 'A))) + ((AND (MEMQ 'THE @-X) + (DO ((L @-X (CDR L))) + ((NULL L) T) + (COND ((PREPOSITION? (CAR L)) (RETURN NIL))))) + '||) + ((MEMQ (CAR @-X) '(MIT $MAKE-COMPILER-HAPPY$)) 'AN) + ((OR (MEMQ (CAR EXPLODED) + '(B C D F G H J K L M N P Q R S T V W X Y Z)) + (AND (EQ (CAR EXPLODED) 'E) + (EQ (CADR EXPLODED) 'U)) + (MEMQ (CAR @-X) '(UNICORN UNIQUE UNICYCLE))) + 'A) + (T 'AN)))) + + +(COMMENT Making a Question) + +(DEFUN MAKE-QUESTION (*OLD* *NEW* SENTENCE) + (COND ((TRY-RULES-ONCE INTERPRETATIONS + (TRY-RULES TRANSFORMATIONS + (TRY-RULES EXITS SENTENCE)))) + (T + (OUTPUT-BIND (DISPLAY '"Sorry. I don't understand. Try again.")) + (MAKE-QUESTION *OLD* *NEW* (READ-SENTENCE))))) + +;; Person says he wants to quit, or doesn't know +;; what's going on, or otherwise seems lost -- Abort round. + +(DEF-EXIT APATHY (X) () + IF (MATCHES X ((?= FORGET?) IT) + (NOTHING) + (NONE) + (NEVER MIND) + ((*) + (?= *NEW*-CK?) + (*) + (?= STATE-OF-BEING-VERB?) + NOTHING)) + (INDETERMINATE-ANSWER? X) + (QUIT-ANSWER? X) + THEN (DISPLAY '"Well, all right. I guess I win...") + (ABORT-ROUND)) + +;; New animal means same as old animal? Abort round -- no new +;; animal to be learned. + +(DEF-EXIT SAME-MEANING (X) () + IF (MATCHES X + ((*= MODIFIER? ) + (?= ANIMAL-PRONOUN? ) + MEANS + (*= MODIFIER? ) + SAME + (*= COMPARATOR? ) + (*= MODIFIER? ) + (?= *NEW*-CK? ) + (* )) + ((*= MODIFIER? ) + (?= ANIMAL-PRONOUN? ) + (?= STATE-OF-BEING-VERB? ) + (*= MODIFIER? ) + SAME + (?= COMPARATOR? ) + (*= MODIFIER? ) + (?= *NEW*-CK? ) + (* ))) + THEN (DISPLAY '"If it means the same, then you shouldn't have + told me I hadn't guessed it.") + (ABORT-ROUND)) + +;; We do lousy with AND'd traits, so just give up if we see +;; that word lying around... + +(DEF-TRANSFORM MULTI (X) () + IF (MATCHES X ((*) AND (*))) + THEN (OUTPUT-BIND (DISPLAY '"Please, just tell me one of its traits.")) + (READ-SENTENCE)) + +;; Strip leading interjections, delimiters, etc. and reparse. + +(DEF-TRANSFORM STRIP-INTERJECTIONS (X) (FOO BAR) + IF (MATCHES X + ((?= INTERJECTION? ) + (*= DELIMITER? ) + (?= NON-DELIMITER? FOO ) + (* BAR ))) + THEN (CONS FOO BAR)) + +;; Simplify DO/DOES+ + +(DEF-TRANSFORM DOES+VERB (X) (FOO BAR VERB) + IF (MATCHES X ((* FOO) DOES (?= VERB? VERB) (* BAR))) + THEN (APPEND FOO (NCONS (VERB-SING? VERB)) BAR)) + +(DEF-TRANSFORM DO+VERB (X) (FOO BAR VERB) + IF (MATCHES X ((* FOO) DO (?= VERB? VERB) (* BAR))) + THEN (APPEND FOO (NCONS (VERB-PLURAL? VERB)) BAR)) + +;; Remove redundant negations + +(DEF-TRANSFORM NOTNOT (X) (FOO BAR) + IF (MATCHES X ((* FOO) NOT NOT (* BAR))) + THEN (APPEND FOO BAR)) + +;; New animal is a superclass of the old animal. +;; Swap the two animals and reparse (so that the new +;; 'new animal' will be a subclass and can share rules +;; with the other case (see next clause)). + +(DEF-TRANSFORM SUPERCLASS (X) () + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (*= MODIFIER? ) + (?= OKA? ) + OF + (*= MODIFIER? ) + (?= *OLD*-CK? )) + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (*= MODIFIER? ) + (?= AKO? ) + OF + (*= MODIFIER? ) + (?= *NEW*-CK? ))) + THEN (SWAP *OLD* *NEW*) + (TRANSFORM$SUBCLASS `(IT IS A KIND OF ,(EXTRACT-TERMINAL *OLD*)))) + +;; New animal is a kind of the old animal. Try to create +;; a balanced tree by finding another animal that's a subclass +;; of the old animal, and making them each hang off of one +;; side of the superclass. If the guy can only name one subclass +;; of this animal, then get snotty -- we only want proper +;; subclasses. + +(DEF-TRANSFORM SUBCLASS (X) () + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (*= MODIFIER? ) + (?= AKO? ) + OF + (*= MODIFIER? ) + (?= *OLD*-CK? )) + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (*= MODIFIER? ) + (?= OKA? ) + OF + (*= MODIFIER? ) + (?= *NEW*-CK? ))) + THEN (DISPLAY `("What's another animal that's a kind of" + ,(EXTRACT-TERMINAL *OLD*) ?)) + (LET ((OTHER (READ-NOUN))) + (ABORT-ROUND-IF-NULL-ANSWER OTHER) + (DISPLACE *OLD* (CONSTRUCT-TERMINAL OTHER *PLAYER-NAME*)) + (DISPLAY `("What distinguishes" ,(@ (EXTRACT-TERMINAL *NEW*)) + ,(EXTRACT-TERMINAL *NEW*) + "from" ,(@ OTHER) ,OTHER ?)) + (READ-SENTENCE))) + +;; If the guy just gives adjectives, he's probably implying +;; a verb as in "IT IS ..." Assume the implied pronoun is +;; the new animal and proceed. + +(DEF-TRANSFORM MISSING-VERB (X) (MODS) + IF (MATCHES X ((*= MODIFIER? MODS))) + THEN `(IT IS ,@MODS)) + +;; Reject overly short answers that haven't been +;; recognized by this point. + +(DEF-TRANSFORM INPUT-TOO-SHORT (X) () + IF (< (LENGTH X) 2.) + THEN (OUTPUT-BIND (DISPLAY '"Please be more explicit...")) + (READ-SENTENCE)) + +;; Don't let a comparative adjective slip by without a comparator + +(DEF-TRANSFORM MISSING-COMPARATOR (X) (ADJ) + IF (MATCHES X ((* ) + (?= (LAMBDA (X) (OR (COMPARATIVE-ADJECTIVE? X) + (EQ X 'MORE))) ; Funny comparatives + ADJ) + (*= (LAMBDA (X) (NOT (COMPARATOR? X))) ))) + THEN (OUTPUT-BIND + (DISPLAY `(,ADJ "than what?")) + (LET ((COMPLETION (READ-NOUN))) + `(,@X THAN ,(@ COMPLETION) ,COMPLETION)))) + +;; A IS THAN +;; + +(DEF-INTERPRETATION COMPARATIVE-ADJECTIVE (X) + (VERB ADJ MAYBE-ADJECTIVE X1 NOUN X2) ; Locals + IF (MATCHES X + ((*= MODIFIER? ) + (*= *NEW*-CK? ) + (?= VERB? VERB ) + (?= COMPARATIVE-ADJECTIVE? ADJ ) + (? MAYBE-ADJECTIVE ) + THAN + (* X1 ) + (?= NOUN? NOUN ) + (* X2 ))) + + ;; *** VERB should get looked at somewhere here + + THEN (FUNCALL (COND ((NOUN? MAYBE-ADJECTIVE) 'HAS-POSSESSION) + (T 'HAS-STATE)) + `(,ADJ ,MAYBE-ADJECTIVE THAN ,@X1 ,NOUN ,@X2))) + + +;; Input = A is NOT +;; Reverse the roles, remove the negation, and reparse. + +(DEF-TRANSFORM REMOVE-NEGATION (X) (FOO) + IF (MATCHES X + ((*= MODIFIER? ) + (?= ANIMAL-PRONOUN? ) + (?= STATE-OF-BEING-VERB? ) + NOT + (* FOO )) + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= STATE-OF-BEING-VERB? ) + NOT + (* FOO ))) + THEN (SWAP *OLD* *NEW*) + `(IT IS ,@FOO)) + +;; Input= A IS +;; Assume the all describes animal, and +;; attach it + the adjective as a general property. + +(DEF-INTERPRETATION HAS-PROPERTY (X) (ADJ) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (?= ADJECTIVE? ADJ ) + (* ))) + THEN (HAS-PROPERTY ADJ)) + +;; Input= An IS +;; Swap the and and retry the +;; parse since we already have rules for this case for +;; . + +(DEF-TRANSFORM OLD-IS (X) (ADJ FOO) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (?= ADJECTIVE? ADJ ) + (* FOO ))) + THEN (SWAP *OLD* *NEW*) + `(IT IS ,ADJ ,@FOO)) + +;; Input= IT HAS +;; Give a possession of + +(DEF-INTERPRETATION HAS-POSSESSION (X) (MODS NOUN) + IF (MATCHES X + ((*= MODIFIER? ) + (?= ANIMAL-PRONOUN? ) + (?= HAVE? ) + (*= MODIFIER? MODS ) + (?= NOUN? NOUN ))) + THEN (HAS-POSSESSION `(,@MODS ,NOUN))) + +;; Input= A NOT +;; or +;; A DOES NOT +;; +;; Assume that means that an does. +;; So swap the two names, and reparse without the NOT. + +(DEF-TRANSFORM INVERTED-DESCRIPTION (X) (VERB GUNK) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= MODAL? ) + NOT + (*= ADVERB? ) + (? VERB ) + (* GUNK )) + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= DOES? ) + NOT + (*= ADVERB? ) + (? VERB ) + (* GUNK ))) + THEN (PART-OF-SPEECH VERB 'ACTION-VERB) + (SWAP *OLD* *NEW*) + `(IT ,(VERB-SING? VERB) ,@GUNK)) + +;; Input= An DOES NOT +;; +;; Assume this means a does and reparse. + +(DEF-TRANSFORM OLD-ANIMAL-DOES-NOT (X) (VERB THING) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (?= DOES? ) + NOT + (*= ADVERB? ) + (? VERB ) + (* THING ))) + THEN (PART-OF-SPEECH VERB 'ACTION-VERB) + `(IT ,(VERB-SING? VERB) ,@THING)) + +;; Input= An NOT +;; + +(DEF-TRANSFORM OLD-ANIMAL-NEGATED-DESCRIPTION (X) (VERB BODY) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (? VERB ) + NOT + (* BODY ))) + ;; *** This might want to check NO as well -- eg, + ;; "A dog has no feet" or "A bird eats no wheat" + THEN `(IT ,VERB ,@BODY)) + +;; Input= A LIVES +;; +;; Attach as 's habitat. + +(DEF-INTERPRETATION HABITAT (X) (WHERE) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (*= ADVERB? ) + (?= STATE-OF-BEING-VERB? ) + (?= LIVES? ) + (* WHERE ))) + THEN (HAS-HABITAT WHERE)) + +;; An LIVES +;; +;; Swap old for new and reparse since there's a rule for +;; that case already. + +(DEF-INTERPRETATION OLD-ANIMAL-LIVES (X) (WHERE) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (*= ADVERB? ) + (?= STATE-OF-BEING-VERB? ) + (?= LIVES? ) + (* WHERE ))) + THEN (SWAP *OLD* *NEW*) + (HAS-HABITAT WHERE)) + +(DEF-INTERPRETATION HAS-STATE (X) (DESCRIPTION) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (* DESCRIPTION ))) + THEN (HAS-STATE DESCRIPTION)) + +(DEF-INTERPRETATION OLD-ANIMAL-HAS-STATE (X) (DESCRIPTION) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (?= STATE-OF-BEING-VERB? ) + (* DESCRIPTION ))) + THEN (SWAP *OLD* *NEW*) + (HAS-STATE DESCRIPTION)) + +(DEF-INTERPRETATION RANDOM-ACTION (X) (VERB OBJ) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (? VERB ) + (* OBJ ))) + THEN (HAS-ACTION `(,VERB ,@OBJ))) + +(DEF-INTERPRETATION OLD-ANIMAL-RANDOM-ACTION (X) (VERB OBJ) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *OLD*-CK? ) + (? VERB ) + (* OBJ ))) + THEN (SWAP *OLD* *NEW*) + (HAS-ACTION `(,VERB ,@OBJ))) + +(DEF-INTERPRETATION MAKES-NOISE (X) (NOISE) + IF (MATCHES X + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= MAKE-NOISE? ) + (?= OPEN-QUOTE-MARKS? ) + (? NOISE ) + (?= CLOSE-QUOTE-MARKS? )) + ((*= MODIFIER? ) + (?= *NEW*-CK? ) + (?= MAKE-NOISE? ) + (* NOISE ))) + THEN (MAKES-NOISE NOISE)) + +;;; Look for personal pronouns and confirm them... + +(DEF-TRANSFORM PRONOUN-CHECK (X) (FOO PRONOUN BAR) + IF (AND (MATCHES X ((* FOO) (?= PRONOUN? PRONOUN) (* BAR))) + (MEMQ PRONOUN '(HE SHE))) + THEN (LET ((FLAG (OUTPUT-BIND + (QUERY `("Does" ,PRONOUN "refer to" + ,(EXTRACT-TERMINAL *NEW*) ?))))) + (COND ((NOT FLAG) + (OUTPUT-BIND (DISPLAY '"Then I don't understand ...")) + (READ-SENTENCE)) + (T + `(,@FOO IT ,BAR))))) + + + +(DEFUN MAKE-INTO-AFFIRMATIVE-STATEMENT (X) + (RPLACA X 'YES) + (RPLACD X NIL) + (SET-SENTENCE-TYPE X 'STATEMENT)) + +(DEF-QUESTION HOW-MANY (X) (DFLAG) + IF (MATCHES X ((*) HOW MANY ($= DISTINCT? DFLAG) (?= ANIMALS?) (*))) + THEN (OUTPUT-BIND + (LET ((*NOPOINT T) (BASE 10.)) + (COND ((NOT DFLAG) + (LET ((N (COUNT-ANIMALS *MEMORY*))) + (DISPLAY (COND ((ZEROP N) '"None.") + ((= N 1.) '"Only one.") + (T `("I know of" ,N "animals.")))))) + (T + (LET ((N (LENGTH (LIST-DISTINCT-ANIMALS)))) + (DISPLAY (COND ((ZEROP N) '"None.") + ((= N 1.) '"Only one.") + (T `("I know of" ,N + "distinct animals.")))))))))) + +(DEF-QUESTION WHAT-ANIMALS (X) () + IF (MATCHES X (WHAT (?= ANIMALS?) DO YOU (*))) + THEN (OUTPUT-BIND + (LET ((LIST-OF-ANIMALS (LIST-DISTINCT-ANIMALS)) + (*NOPOINT T) + (BASE 10.)) + (DISPLAY-ANIMAL-LIST LIST-OF-ANIMALS)))) + +(DEFUN DISPLAY-ANIMAL-LIST (ANIMAL-LIST) + (SETQ ANIMAL-LIST (SORT (APPEND ANIMAL-LIST ()) 'ALPHALESSP)) + (COND ((NULL ANIMAL-LIST) + (DISPLAY '"I know of no animals!")) + ((NOT (CDR ANIMAL-LIST)) + (DISPLAY `("I only know of" ,(@ (CAR ANIMAL-LIST)) + ,(CAR ANIMAL-LIST) "."))) + (T + (LET ((TEMP (MAPCAR #'(LAMBDA (X) (LIST X '/,)) + (NREVERSE ANIMAL-LIST)))) + (RPLACD (CAR TEMP) NIL) + (RPLACD (CADR TEMP) (NCONS 'AND)) + (PUSH (NCONS '/.) TEMP) + (SETQ TEMP (APPLY 'NCONC (NREVERSE TEMP))) + (SETQ TEMP (APPEND '"I know the following animals:" TEMP)) + (DISPLAY TEMP))))) + +(DEFUN ELIMINATE-REDUNDANCY (L) + (COND ((NULL L) NIL) + (T (CONS (CAR L) + (ELIMINATE-REDUNDANCY (DELETE (CAR L) (CDR L))))))) + +(DEFUN LIST-DISTINCT-ANIMALS () + (LET ((*LIST* ())) + (DECLARE (SPECIAL *LIST*)) + (LIST-DISTINCT-ANIMALS-AUX *MEMORY*) + (ELIMINATE-REDUNDANCY *LIST*))) + +(DEFUN LIST-DISTINCT-ANIMALS-AUX (X) + (DECLARE (SPECIAL *LIST*)) + (COND ((TERMINAL-NODE? X) (PUSH (EXTRACT-TERMINAL X) *LIST*)) + (T (LIST-DISTINCT-ANIMALS-AUX (EXTRACT-YES-BRANCH X)) + (LIST-DISTINCT-ANIMALS-AUX (EXTRACT-NO-BRANCH X)))) + T) + +(DEFUN COUNT-ANIMALS (DATABASE) + (COND ((TERMINAL-NODE? DATABASE) 1.) + (T + (+ (COUNT-ANIMALS (EXTRACT-YES-BRANCH DATABASE)) + (COUNT-ANIMALS (EXTRACT-NO-BRANCH DATABASE)))))) + +(DEF-QUESTION WHO-SAID (X) () + IF (MATCHES X (WHO (*) (?= SAID?) (*))) + THEN (OUTPUT-BIND + (DISPLAY `(,(MAYBE-PRONOUNIFY (EXTRACT-AUTHOR *CURRENT-NODE*)) + "said that.")))) + +(DEFUN MAYBE-PRONOUNIFY (NAME) + (COND ((EQ NAME *PLAYER-NAME*) 'YOU) (T NAME))) + +(DEFUN MAYBE-UNPRONOUNIFY (NAME) + (COND ((EQ NAME 'I) *PLAYER-NAME*) (T NAME))) + +(DEF-QUESTION DID-I-SAY (X) (NAME) + IF (MATCHES X (DID (? NAME) (?= SAID?) (*))) + THEN (OUTPUT-BIND + (LET ((AUTHOR (EXTRACT-AUTHOR *CURRENT-NODE*)) + (NAME (MAYBE-UNPRONOUNIFY NAME))) + (COND ((EQ NAME AUTHOR) (DISPLAY '"Yes.")) + (T (DISPLAY + `("No," ,(MAYBE-PRONOUNIFY AUTHOR) "said that."))))))) + +(DEF-QUESTION MY-NAME (X) () + IF (MATCHES X (WHAT IS MY NAME (*)) (WHAT DID YOU CALL ME)) + THEN (OUTPUT-BIND + (DISPLAY `("Your full name is" ,*FULL-NAME* + "... I just call you" ,*NICK-NAME* "for short.")))) + +(DEF-QUESTION IS-GRASS-GREEN (X) () + IF (MATCHES X (IS ($= DETERMINER?) GRASS GREEN)) + THEN (TERPRI TYO) + (PRINC '|/Green,| TYO) (SLEEP .30) + (PRINC '|/ green,| TYO) (SLEEP .30) + (PRINC '|/ the| TYO) (SLEEP .15) + (PRINC '|/ grass| TYO) (SLEEP .15) + (PRINC '|/ is green...| TYO) + (TERPRI TYO) (SLEEP .50) + (PRINC '|/ On| TYO) (SLEEP .15) + (PRINC '|/ the| TYO) (SLEEP .15) + (PRINC '|/ far| TYO) (SLEEP .15) + (PRINC '|/ side| TYO) (SLEEP .15) + (PRINC '|/ of| TYO) (SLEEP .15) + (PRINC '|/ the| TYO) (SLEEP .3) + (PRINC '|/ hill...| TYO) + (MAKE-INTO-AFFIRMATIVE-STATEMENT X) + T) + +(DEF-QUESTION IS-THE-POPE- (X) () + IF (MEMBER X '((IS THE POPE CATHOLIC) + (IS THE POPE POLISH))) + THEN (TERPRI TYO) + (PRINC '|(You may have faith in it!)| TYO) + (MAKE-INTO-AFFIRMATIVE-STATEMENT X) + T) + +(DEF-QUESTION IS-THE-SKY-BLUE (X) () + IF (MATCHES X (IS THE SKY BLUE)) + THEN (TERPRI TYO) + (PRINC '|(When it isn't cloudy!)| TYO) + (MAKE-INTO-AFFIRMATIVE-STATEMENT X) + T) + +(DEF-QUESTION LISP-TRUTHS (X) () + IF (MATCHES X + (|(| NULL NIL |)|) + (|(| NOT NIL |)|)) + THEN (PRINTC '|TTTTTTTTTTT| TYO) + (PRINTC '|T TTT T| TYO) + (PRINTC '| TTT | TYO) + (PRINTC '| TTT | TYO) + (PRINTC '| TTT | TYO) + (PRINTC '| TTTTT | TYO) + (TERPRI TYO) + (MAKE-INTO-AFFIRMATIVE-STATEMENT X) + T) + +(DEF-QUESTION IS-WATER-WET (X) () + IF (MATCHES X (IS WATER WET)) + THEN (COND (*WATER-FLAG* + (TERPRI TYO) + (PRINC '|I guess i decided it was...| TYO)) + (T + (PRINTC '|(An interesting philosophical question!)| TYO) + (SLEEP 1.) + (SLOW-PRINC '|... hmmm ...|) + (SLEEP 2.) + (PRINTC '| If a drop of water falls in a forest| TYO) + (SLOW-PRINC '| and|) + (PRINTC '| no one feels it before it evaporates| TYO) + (TERPRI TYO) + (SLOW-PRINC '|... thinking ...|) + (SLEEP 5.) + (SETQ *WATER-FLAG* T) + (PRINC '| Yeah, I guess it usually is thought| TYO) + (TERPRI TYO) + (PRINC '|of as such...| TYO))) + (MAKE-INTO-AFFIRMATIVE-STATEMENT X) + T) + +(DEF-QUESTION IS-SNOW-WHITE (X) () + IF (MATCHES X (IS SNOW WHITE)) + THEN (TERPRI TYO) + (PRINC '|(Not in Boston, but most places it is!)| TYO) + (MAKE-INTO-AFFIRMATIVE-STATEMENT X) + T) + +(DEF-QUESTION WHAT-TIME-IS-IT (X) () + IF (MATCHES X (WHAT TIME IS IT)) + THEN (DISPLAY `("It is now" ,(CLOCK-TIME) ".")) + T) + +(DEF-QUESTION APOLOGY (X) () + IF (MATCHES X (WILL YOU (*) FORGIVE ME (*)) + (WILL YOU (*) ACCEPT (*) (?= APOLOGY?) (*))) + THEN (RECEIVE-APOLOGY) + T) + +(DEF-QUESTION WHEN-NEWS (X) () + IF (MATCHES X (WHEN (*) NEWS (*)) (WHAT TIME (*) NEWS (*))) + THEN (DISPLAY-NEWS-DATE)) + +(DEF-STATEMENT NO-APOLOGY (X) () + IF (MATCHES X ((*) (?= NOT?) (*) (?= APOLOGY?) (*))) + THEN (OUTPUT-BIND (DISPLAY '"Hmmmm....")) + T) + +(DEF-STATEMENT MISTAKE (X) () + IF (MATCHES X + ((*) I (*) MADE (*) (?= MISTAKE?) (*)) + ((*) I (*) (?= SCREWED?) UP (*))) + THEN (OUTPUT-BIND + (DISPLAY '"Well, let's forget this round and start anew, then.") + (ABORT-ROUND))) + +(CONTRACTION '(MIS-SPELLED MISSPELLED)) +(CONTRACTION '(MIS-SPELED MISSPELLED)) +(CONTRACTION '(MISPELLED MISSPELLED)) +(CONTRACTION '(MISPELED MISSPELLED)) +(CONTRACTION '(MISSPELED MISSPELLED)) + +(DEF-STATEMENT CORRECT-TYPO (X) (WHO WORD) + IF (MATCHES X + ((? WHO) MISSPELLED (? WORD)) + ((? WORD) IS MISSPELLED (*)) + ((? WORD) IS SPELLED (?= WRONG?) (*))) + THEN (LET ((B1 (CORRECT-TYPO-IN-CODE WORD (LIST *OLD* *NEW*))) + (B2 (CORRECT-TYPO-IN-CODE WORD *DISPLAY*))) + (OUTPUT-BIND + (DISPLAY (COND ((OR B1 B2) '"Ok. I'll remember that.") + (T '"I don't see it ..."))))) + T) + +(DEF-STATEMENT TWO-WORDS (X) (WORD PHRASE) + IF (MATCHES X + ((? WORD) SHOULD BE (*) TWO WORDS) + (THE WORD (? WORD) SHOULD BE (* PHRASE))) + THEN (*CATCH 'EXIT-TWO-WORDS + (COND + ((EXPAND-WORDS-IN-CODE + WORD + (OR PHRASE + (OUTPUT-BIND + (DISPLAY '"What should it be?") + (LET ((PHRASE (READ-SENTENCE))) + (COND ((OR (NULL-ANSWER? PHRASE) + (QUIT-ANSWER? PHRASE) + (YES-ANSWER? PHRASE) + (NO-ANSWER? PHRASE)) + (DISPLAY '"Oh, well...") + (*THROW 'EXIT-TWO-WORDS NIL)) + (T PHRASE)))))) + (OUTPUT-BIND (DISPLAY '"I'll remember that."))) + (T + (OUTPUT-BIND (DISPLAY '"I don't see it..."))))) + T) + +(DEFUN EXPAND-WORDS-IN-CODE (WORD PHRASE) + (*CATCH 'ABORT-CORRECTION + (LET ((WHERE (FIND-TYPO WORD *DISPLAY*))) + (COND (WHERE + (RPLACA WHERE PHRASE) + (COND (*SAVE-FILE* (SAVE *SAVE-FILE*))))) + T))) + +(DEFUN CORRECT-TYPO-IN-CODE (X WHERE) + (*CATCH 'ABORT-CORRECTION + (LET ((TYPO (FIND-TYPO X WHERE))) + (COND (TYPO + (RPLACA TYPO X) + (COND (*SAVE-FILE* (SAVE *SAVE-FILE*))))) + T))) + +(DECLARE (SPECIAL *TYPOS*)) + +(DEFUN FIND-TYPO (X WHERE) + (LET ((*TYPOS* NIL)) + (FIND-TYPO-AUX X WHERE) + (SETQ *TYPOS* (SORTCAR *TYPOS* '>)) + (COND ((AND *TYPOS* (> (CAAR *TYPOS*) 0.5)) + (CDAR *TYPOS*)) + (T + (*THROW 'ABORT-CORRECTION NIL))))) + +(DEFUN FIND-TYPO-AUX (X Y) + (COND ((ATOM Y) NIL) + ((ATOM (CAR Y)) + (PUSH (CONS (TYPO-MATCH X (CAR Y)) Y) *TYPOS*) + (FIND-TYPO-AUX X (CDR Y))) + (T + (FIND-TYPO-AUX X (CAR Y)) + (FIND-TYPO-AUX X (CDR Y))))) + +(DEFUN GET-CHARN (X I FLAT) + (COND ((OR (< I 1) (> I FLAT)) -1.) + (T (GETCHARN X I)))) + +(DEFUN TYPO-MATCH (X Y) + (LET* ((FACTOR 0.0) + (RATING 0.0) + (XEND (FLATC X)) + (YEND (FLATC Y)) + (QTY (//$ 1.0 (FLOAT (MIN XEND YEND))))) + (SETQ FACTOR + (-$ 1.0 (//$ (ABS (FLOAT (- XEND YEND))) + (FLOAT (MAX XEND YEND))))) + (DO ((I 1. (1+ I)) (YC)) + ((OR (> I XEND) (> I YEND))) + (COND ((= (GETCHARN X I) (SETQ YC (GETCHARN Y I))) + (SETQ RATING (+$ RATING QTY))) + ((OR (= (GET-CHARN X (1- I) XEND) YC) + (= (GET-CHARN X (1+ I) XEND) YC)) + (SETQ RATING (+$ (*$ QTY 0.6) RATING))) + ((OR (= (GET-CHARN X (- I 2) XEND) YC) + (= (GET-CHARN X (+ I 2) XEND) YC)) + (SETQ RATING (+$ (*$ QTY 0.3) RATING))))) + (*$ FACTOR RATING))) + +(DEFUN INTERJECTION-ONLY? (X) + (AND (NOT (AFFIRMATIVE? X)) + (NOT (NEGATIVE? X)) + (INTERJECTION? X))) + +(DEF-STATEMENT INTERJECTION-ONLY (X) () + IF (MATCHES X ((?= INTERJECTION-ONLY?) (*= INTERJECTION-ONLY?))) + THEN (OUTPUT-BIND (DISPLAY '|Yup. That's life...|)) + T) + +(DEF-QUESTION MAD (X) () + IF (MATCHES X (ARE YOU (*) (?= ANGRY?) (?= PREPOSITION?) ME (*)) + (ARE YOU (*) (?= ANGRY?))) + THEN (COND (*FOUL-FLAG* + (COND (*FORGIVE-FLAG* + (COND (*APOLOGY-FLAG* + (DISPLAY '"Yes, I am still a bit mad.")) + (T + (DISPLAY '"Yes, I am very mad. Your + language has really been in the + gutter today.")))) + (T + (DISPLAY '"Yes. Your language has been atrocious.")))) + (*FORGIVE-FLAG* + (DISPLAY '"No, but I was earlier!")) + (*APOLOGY-FLAG* + (DISPLAY '"You should really see someone about this. No, + I'm really not mad at you. I wish you'd stop + apologizing for nothing...")) + (T + (DISPLAY '"I have nothing to be mad at you for."))) + T) + +(DEFUN NOT? (X) (EQ X 'NOT)) +(DEFUN NOTNOT? (X) (NOT (EQ X 'NOT))) + +(DEF-STATEMENT APOLOGY (X) () + IF (MATCHES X (I (*= NOTNOT?) (?= APOLOGY?) (*))) + THEN (OUTPUT-BIND (RECEIVE-APOLOGY)) + T) + +(DEFUN RECEIVE-APOLOGY () + (COND ((AND (NOT *FOUL-FLAG*) (NOT *FORGIVE-FLAG*)) + (COND ((NOT *APOLOGY-FLAG*) + (DISPLAY + (SELECT-ONE-OF '("I don't know why you are apologizing." + "You don't owe me an apology.")))) + (T + (DISPLAY + (SELECT-ONE-OF '("All right! Stop apologizing." + "You got some sort of guilt complex?" + "Perhaps you should see a priest."))))) + (SETQ *APOLOGY-FLAG* T)) + ((NOT *FOUL-FLAG*) + (DISPLAY + (SELECT-ONE-OF '("I forgave you already!" + "Yes, yes. I forgave you!"))) + (SETQ *APOLOGY-FLAG* T)) + ((NOT *FORGIVE-FLAG*) + (DISPLAY '"All right. I accept your apology...") + (SETQ *FOUL-FLAG* NIL) + (SETQ *FORGIVE-FLAG* T) + (FORGIVE 'FOUL '"using foul language")) + ((NOT *APOLOGY-FLAG*) + (DISPLAY '"Sorry, I gave you your chance and you blew it.") + (SETQ *APOLOGY-FLAG* T)) + (T + (DISPLAY + (SELECT-ONE-OF + '("OK. Since you're being so insistent. I accept + your apology" + "OK. That sounds sincere to me."))) + (SETQ *APOLOGY-FLAG* NIL) + (SETQ *FOUL-FLAG* NIL) + (SETQ *FORGIVE-FLAG* T) + (FORGIVE 'FOUL '"using foul language")))) + +(COMMENT Meanings) + +(DEFMACRO DEF-MEANING (MEANING &REST WORDS) + `(PROGN 'COMPILE + (DEFUN ,(CONCAT MEANING '?) (X) + (MEMQ ',MEANING (GET X 'MEANINGS))) + ,@(MAPCAR #'(LAMBDA (WORD) + `(ADDPROP ',WORD ',MEANING 'MEANINGS)) + WORDS))) + +(DEF-MEANING DISTINCT + DISTINCT UNIQUE INDIVIDUAL SPECIFIC) + +(DEF-MEANING SAID + TELL TOLD SAY SAID TEACH TAUGHT SHOW SHOWED) + +(DEF-MEANING MISTAKE + MISTAKE ERROR) + +(DEF-MEANING MALE + MALE GUY MAN BOY MASCULINE) + +(DEF-MEANING FEMALE + FEMALE GAL WOMAN GIRL FEMININE) + +(DEF-MEANING WRONG + WRONG INCORRECTLY BADLY POORLY) + +(DEF-MEANING AKO ; A-Kind-Of (Subclass) + CLASS SUBCLASS KIND TYPE VARIETY SUBSET VARIATION MUTATION + SORT DESCENDENT BRANCH SPECIES BREED OFFSPRING CHILD BABY) + +(DEF-MEANING OKA ; Opposite of AKO (Superclass) + ANCESTOR SUPERSET PARENT SUPERCLASS PREDECESSOR) + +(DEF-MEANING SCREWED + SCREWED LOUSED MESSED BOTCHED) + +(DEF-MEANING LIVES + LIVE LIVES FOUND LIVING) + +(DEF-MEANING UNDERSTAND + UNDERSTAND FOLLOW SEE COMPREHEND) + +(DEF-MEANING FORGET + SKIP FORGET) + +(DEF-MEANING LEARN + LEARN FIND GET HEAR SEE) + +(DEF-MEANING DOES + DO DID DOES) + +(DEF-MEANING WANT + WISH WANT DESIRE CHOOSE) + +(DEF-MEANING DECIDE + DECIDE CHOOSE PICK SAY ANSWER) + +(DEF-MEANING MAKE-NOISE + SAID SAY SAYS GO GOES) + +(DEF-MEANING ME + ME) + +(DEF-MEANING HOST + TIP SITE HOST SYSTEM TERMINAL TTY CRT) + +(DEF-MEANING WINNING + WINNING SMART GOOD) + +(DEF-MEANING LOGGED + LOGGED LINKED ATTACHED) + +(DEF-MEANING TAUGHT + TAUGHT TEACHES TEACH SAYS SAY SAID TELL TELLS + TOLD EXPLAINED EXPLAIN EXPLAINS SHOWED SHOW SHOWS) + +(DEF-MEANING ERROR-WORD + MISTAKE TYPO TYPOS MISTAKES ERROR ERRORS GOOF GOOFS + PROBLEM PROBLEMS) + +(DEF-MEANING KIDDING + KIDDING JOKING) + +(DEF-MEANING HAVE + HAS HAD HAVE) + +(DEF-MEANING MAYBE + MAYBE PERHAPS SOMETIMES OCCASIONALLY POSSIBLY) + +(DEF-MEANING ANIMALS + ANIMALS BEASTS CREATURES) + +(DEF-MEANING ANIMAL-PRONOUN + IT THEY ANIMAL BEAST CREATURE THAT THOSE THIS THESE THAT ONE) + +(DEF-MEANING NEGATIVE + NO NEGATORY NAH BAD HUH-UH HUHUH UNTRUE SELDOM NOPE NOT + FALSE NEGATIVE NA NEVER NIL N) + +(DEF-MEANING AFFIRMATIVE + YES SURE YEAH COOL FINE TRUE RIGH UHHUH YEP P T Y + ROGER YEA YA GOOD PROBABLY CORRECT HYPOTHETICALLY OK OKAY + UHHUH UHUH UH-HUH OUI DA PROCEED GREAT CONTINUE DO MORE ABSOLUTELY + UNQUESTIONABLY APPROXIMATELY MOSTLY PRACTICALLY DEFINITELY + CERTAINLY POSITIVELY SURELY AFFIRMATIVE) + +(DEF-MEANING APOLOGY + SORRY APOLOGIZE APOLOGY APOLOGIES) + +(DEF-MEANING ANGRY + ANGRY SORE ANNOYED MAD UPSET PISSED) + +(DEF-MEANING FOUL + ANUS ANUSES ASSHOLE ASSHOLES + BASTARD BASTARDS BITCH BITCHES BOOB BOOBS + COCK COCKS COMMIE COMMIES CRAP CRAPPY CROTCH CROTCHES + CRUD CRUDDY CUNT CUNTS CUNILINGUS CUNNILINGUS + DAMN DAMNED DAMMIT DICK DICKS DILDO DILDOS DILDOES DOPE DOPES + DUMMY DUMMIES DUMDUM DUMDUMS DUMBDUMB DUMBDUMBS + DUM-DUM DUM-DUMS DUMB-DUMB DUMB-DUMBS + FAG FAGS FAGGOT FAGGOTS FART FARTHEAD FARTS + FELLATIO FELATIO FORNICATE FORNICATES FORNICATED FORNICATING + FORNICATION FUCK FUCKS FUCKED FUCKED-UP FUCKING + FUCKER FUCKERS FUCKHEAD FUCKHEADS FUCKWAD FUCKWADS + GAY GAYS GODAM GODAMN GODAMNED GODDAM GODDAMN GODDAMNED + GOD-DAM GOD-DAMN GOD-DAMNED + HELL + KIKE + LICK LICKED LICKING + MOTHER-FUCKING MOTHERFUCKING MOTHERFUCKER MOTHERFUCKERS + MOTHER-FUCKER MOTHER-FUCKERS + NIGGER + ORGASM ORGASMS ORGASMIC + PENIS PIMP PIMPS PIMPING PIMPED PINKO PINKOS PISS PISSES PISSHEAD + POLACK POLOCK POLOK POLLACK POLLOCK POLLOK PRICK PRICKS PROSTITUTE + PROSTITUTES PROSTITUTION PUSSY PUSSIES + QUEER + SCREW SCREWS SCREWED SCROD SCREWED SHIT SHITS SHITHEAD SHITHEADS + SIXTY-NINE SIXTYNINE /69 SOB SONOFABITCH SON-OF-A-BITCH + STUPID SUCK SUCKS SUX SUCKING SUCKED SUCKER SUCKERS + TIT TITS + WHORE WHORES WOP) + + +(COMMENT Display Definitions) + +;;; Database constructors + +(DEFMACRO DEF-CONCEPT (FORM &REST DISPLAY-FORMS) + `(PROGN 'COMPILE + (DEFUN ,FORM (X) + (COND ((ATOM X) (LIST ',FORM X)) + (T (CONS ',FORM X)))) + (DEFPROP ,FORM ,DISPLAY-FORMS DISPLAY-ALTERNATIVES))) + +(DEF-CONCEPT MAKES-NOISE + "Does it say" + "Does it go" + "Does it make noises like") + +(DEF-CONCEPT HAS-PROPERTY + "Is it" + "Would you say it is" + "Is your animal" + "Can it be described as") + +(DEF-CONCEPT HAS-STATE + "Is your animal" + "Is it") + +(DEF-CONCEPT ARE-YOU-THINKING-OF + "Are you thinking of" + "Were you thinking of" + "Is your animal" + "Is the animal you are thinking of") + +(DEF-CONCEPT HAS-POSSESSION + "Does it have" + "Has it got" + "Does your animal have") + +(DEF-CONCEPT HAS-ABILITY + "Can it" + "Does it have the ability to" + "Could it normally" + "Does your animal commonly") + +(DEF-CONCEPT HAS-CLASSIFICATION + "Is it a kind of" + "Is your animal some type of" + "Is it some class of") + +(DEF-CONCEPT HAS-ACTION + "Is it true that it" + "Could i say it" + "Would you say that it") + +(DEF-CONCEPT HAS-HABITAT + "Is it found" + "Does it live" + "Is it at home" + "Is its habitat") + + + +(COMMENT Saving and Restoring Database) + +(DEFUN SAVE (FILENAME) + (IOTA ((OUTSTREAM (MERGEF '|_ANIM_ OUTPUT| FILENAME) '(OUT))) + (PRINT *MEMORY* OUTSTREAM) + (RENAMEF OUTSTREAM FILENAME) + (CLOSE OUTSTREAM) + 'DONE)) + +(DEFUN UNSAVE (FILENAME) + (IOTA ((INSTREAM FILENAME '(IN))) + (SETQ *MEMORY* (READ INSTREAM)) + 'DONE)) + +(DEFUN DUMP (FILENAME) + (SSTATUS FLUSH T) + (GC) + (SSTATUS TOPLEVEL '(ANIMAL)) + (NOINTERRUPT T) + (SUSPEND '|:KILL | FILENAME) + (SETUP-FOR-ANIMAL)) + +(DEFUN SETUP-FOR-ANIMAL () + (COND ((NOT (SETUP-USERNAME-VARS)) + (PRINC + '|Hey! You should run :INQUIR. I don't play with strangers.| + TYO) + (SUICIDE))) + (CLEAR-INPUT TYI) + (PRINTC '|Howdy, | TYO) + (PRINC (CAPITALIZE *NICK-NAME*) TYO) + (PRINC '|. Welcome to the ANIMAL game.| TYO) + (NOTES) + (LET ((INIT (PROBEF `((DSK ,(STATUS HSNAME)) ,(STATUS USERID) ANIMAL)))) + (COND (INIT + (PRINTC '|Loadin' up your init.| TYO) + (LOAD INIT) + (PRINC '|.. All set.| TYO)))) + (COND ((SETQ *FOUL-FLAG* (REMEMBER? 'FOUL)) + (DISPLAY '"By the way -- we weren't + on good terms the last time we played. + I hope you have learned your lesson now."))) + (UNSAVE *SAVE-FILE*) + (NOTIFY-KMP) + (DISABLE-INTERRUPTS) + (NOINTERRUPT NIL) + (NEWS)) + +(DEFUN SETUP-USERNAME-VARS () + (*CATCH 'EARLY-EXIT + (PROGN + (OPEN-INQUIR-FILE) + (LET ((((LAST FIRST MIDDLE) TITLE LINEAGE NIL NICKNAME) + ;((LAST FIRST MIDDLE) TITLE LINEAGE ALIAS? NICKNAME) + (LET ((VAL (GET-USER-NAME (STATUS USERID)))) + (COND ((NOT VAL) (*THROW 'EARLY-EXIT NIL)) (T VAL))))) + (SETQ *PLAYER-NAME* (STATUS USERID)) + (SETQ *FULL-NAME* (CONCAT (CAPITALIZE FIRST) '| | + (CAPITALIZE LAST))) + (UPDATE-NAME-DATABASE FIRST MIDDLE LAST TITLE LINEAGE) + (SETQ *FIRST-NAME* FIRST) + (SETQ *NICK-NAME* (OR NICKNAME FIRST)) + (SETQ *LAST-NAME* LAST)) + (CLOSE-INQUIR-FILE) + T))) + +(DEFUN UPDATE-NAME-DATABASE (FIRST MIDDLE () () ()) ; Last Title Lineage + (LET ((FIRST (UPPERCASIFY FIRST)) + (MIDDLE (UPPERCASIFY MIDDLE))) + (COND ((REMEMBER? 'MALE) (PLAYER-IS-MALE)) + ((REMEMBER? 'FEMALE) (PLAYER-IS-FEMALE)) + ((NOT (PERSON-NAME? (UPPERCASIFY FIRST))) + (COND ((PERSON-NAME? MIDDLE) + (COND ((MALE-NAME? MIDDLE) + (PLAYER-IS-MALE)) + (T + (PLAYER-IS-FEMALE)))) + (T + (ASK-SEX FIRST NIL)))) + ((AND (MALE-NAME? FIRST) (FEMALE-NAME? FIRST)) + (COND ((PERSON-NAME? MIDDLE) + (COND ((MALE-NAME? MIDDLE) + (PLAYER-IS-MALE)) + (T + (PLAYER-IS-FEMALE)))) + (T + (ASK-SEX FIRST T)))) + ((MALE-NAME? FIRST) (PLAYER-IS-MALE)) + ((FEMALE-NAME? FIRST) (PLAYER-IS-FEMALE)) + (T + (BUG '"My sex-determination algorithm fell through." T) + (PLAYER-IS-MALE) ; Highly chauvanistic but prevents + ; more lossage later... + )))) + +(DEFUN BUG (TEXT RECOVERABLE?) + (OUTPUT-BIND + (DISPLAY '"Hang on, I seem to have a bug...") + (SEND-MAIL `((TO: KMP) + (CC: ,(STATUS USERID)) + (SUBJECT: "A bug!")) + `("Ooops, I have a bug..." ,TEXT)) + (COND (RECOVERABLE? + (DISPLAY '"Ok, all set. I sent KMP some mail about it.")) + (T + (DISPLAY TEXT) + (DISPLAY '"Looks bad. I better quit. I sent KMP mail about + it but if you noticed anything odd about this + circumstance, maybe you could send him mail, too. + Thanks.") + (SUICIDE))))) + +(DEFUN ASK-SEX (NAME AMBIGUITY) + (OUTPUT-BIND + (COND ((NOT AMBIGUITY) + (DISPLAY `("Gee, I've never met anyone with the name" + ,NAME "before. I'm afraid that means I also don't + know if you are a guy or a girl... which are you?"))) + (T + (DISPLAY `("Hey, I hate to ask this because you probably + get asked all the time, but a name like" ,NAME + "is kinda ambiguous... Are you a guy or a girl?")))) + (DO ((ANSWER (READ-SENTENCE) (READ-SENTENCE))) + (NIL) + (COND ((HANDLE-RANDOMNESS ANSWER)) + ((MATCHES ANSWER ((*) NOT (*) (?= FEMALE?) (*)) + ((*) (?= MALE?) (*))) + (REMEMBER 'MALE) + (PLAYER-IS-MALE) + (RETURN T)) + ((MATCHES ANSWER ((*) NOT (*) (?= MALE?) (*)) + ((*) (?= FEMALE?) (*))) + (REMEMBER 'FEMALE) + (PLAYER-IS-FEMALE) + (RETURN T)) + ((YES-ANSWER? ANSWER) + (DISPLAY '"Can you be more specific?")) + ((NO-ANSWER? ANSWER) + (DISPLAY '"I find that hard to believe...")) + ((INDETERMINATE-ANSWER? ANSWER) + (DISPLAY '"You can confide in me...")) + ((I-DONT-CARE-ANSWER? ANSWER) + (DISPLAY '"Well, I care! Please tell me.")) + ((QUIT-ANSWER? ANSWER) + (DISPLAY '"Well, if you insist...") + (SUICIDE)) + (T + (DISPLAY '"I don't follow."))) + (DISPLAY '"Are you male or female?")))) + +(DEFUN PLAYER-IS-MALE () + (SETQ *PLAYER-OBJECT-PRONOUN* 'HIM) + (SETQ *PLAYER-SUBJECT-PRONOUN* 'HE)) + +(DEFUN PLAYER-IS-FEMALE () + (SETQ *PLAYER-OBJECT-PRONOUN* 'HER) + (SETQ *PLAYER-SUBJECT-PRONOUN* 'SHE)) + +(DEFUN DISABLE-INTERRUPTS () + (COND ((NOT *DEBUG*) + (DO ((I 0. (1+ I))) + ((= I 127.)) + (SSTATUS TTYINT I NIL)) + (SSTATUS TTYINT 7. 7.) + T) + (T NIL))) + +;; Die quietly -- Lisp seems to do it wrong + +(DECLARE (*EXPR QUIET-DEATH)) + +(LAP QUIET-DEATH SUBR) +(*LOGOU 1) +() + +(DEFUN SUICIDE () + (COND ((NOT *DEBUG*) (QUIET-DEATH)) + (T + (SSTATUS TOPLEVEL NIL) + (LET ((ERRSET NIL)) + (OR (ERRSET (*THROW 'ANIMAL-SUICIDE 'SUICIDE) NIL) + (^G)))))) + +(DEFUN NOTES () + (COND ((PROBEF *NOTES-FILE*) + (DISPLAY '"Special notice...") + (PRINTF *NOTES-FILE* TYO)))) + +(DEFUN NEWS () + (COND ((AND (PROBEF *NEWS-FILE*) + (PROGN (DISPLAY-NEWS-DATE) + (QUERY '"Read news?"))) + (LET ((OLD-^S (STATUS TTYINT #/))) + (*CATCH 'FLUSH + (UNWIND-PROTECT + (PROGN + (SSTATUS TTYINT #/ + #'(LAMBDA (() ()) (*THROW 'FLUSH T))) + (PRINTF *NEWS-FILE* TYO)) + (SSTATUS TTYINT #/ OLD-^S)))) + T))) + +(DEFUN DISPLAY-NEWS-DATE () + (LET ((*NOPOINT T) (BASE 10.) (FILE-INFO)) + (IOTA ((INSTREAM *NEWS-FILE* 'IN)) + (SETQ FILE-INFO ; 4th word has file credate info + (NTH 3. (SYSCALL 4. 'FILBLK INSTREAM)))) + (CURSORPOS 'A TYO) + (PRINC '|News last updated | TYO) + (PRINC (LOAD-BYTE FILE-INFO 23. 4.) TYO) ;Month = 3.9 - 3.6 + (PRINC '// TYO) + (PRINC (LOAD-BYTE FILE-INFO 18. 5.) TYO) ;Day = 3.5 - 3.1 + (PRINC '// TYO) + (PRINC (LOAD-BYTE FILE-INFO 27. 7.) TYO) ;Year = 4.7 - 4.1 + (PRINC '|.| TYO))) + +(DEFUN NOTIFY-KMP () + (COND ((EQ (STATUS USERID) 'KMP) + (SETQ *DEBUG* T) ; Enable debugging + (SETQ PRIN1 'PRIN2)) ; Special printer for debugging + ((PROBEF '((USR *) KMP HACTRN)) + (ERRSET (IOTA ((STREAM '((CLI *) KMP HACTRN) '(OUT))) + (PRINC '|/ÛMessage from The Animal Game at MIT-MC | + STREAM) + (PRINC (CLOCK-TIME) STREAM) + (PRINC '|]| STREAM) + (TERPRI STREAM) + (PRINC (STATUS UNAME) STREAM) + (PRINC '| is gonna play against me!| STREAM) + (TERPRI STREAM)) + NIL)))) + +;;; Redefine PRIN1 to print out input forms nicer. + +(DEFUN SPECIAL-PRIN1 (WHAT WHERE) + (COND ((NULL WHAT) (PRINC '|()| WHERE)) + ((ATOM WHAT) (PRIN1 WHAT)) + ((AND (HUNKP WHAT) (= (HUNKSIZE WHAT) 3.)) + (PRINC '|{| WHERE) + (DISPLAY1 (CXR 2. WHAT) NIL T WHERE) + (PRINC '|: "| WHERE) + (DISPLAY1 (CONS (CAR WHAT) (CDR WHAT)) NIL T WHERE) + (PRINC '|"}| WHERE)) + (T + (PRINC '|(| WHERE) + (DO ((L WHAT (CDR L))) + ((ATOM L) + (COND ((NULL L) (PRINC '|)| WHERE)) + (T (PRINC '|. | WHERE) + (PRINC L WHERE) + (PRINC '|)| WHERE)))) + (SPECIAL-PRIN1 (CAR L) WHERE) + (COND ((CDR L) (PRINC '| | WHERE)))))) + T) + +(DEFUN PRIN2 (X &OPTIONAL (WHERE TYO)) + (SPECIAL-PRIN1 X WHERE)) + + +;;; Local Modes:: +;;; Comment Column:60: +;;; Comment Begin:; : +;;; Comment Start:;: diff --git a/src/games/animal.bare b/src/games/animal.bare new file mode 100644 index 00000000..f8aac8fa --- /dev/null +++ b/src/games/animal.bare @@ -0,0 +1 @@ +(SETQ MEMORY '(DOG (-> KMP))) diff --git a/src/games/animal.bugs b/src/games/animal.bugs new file mode 100644 index 00000000..c134c8f1 --- /dev/null +++ b/src/games/animal.bugs @@ -0,0 +1,3474 @@ +Date: 4 March 1983 09:57 EST +From: Communications Satellite +Subject: Msg of Friday, 4 March 1983 06:20 EST +To: ANIMAL @ MIT-MC + +Queued msg sent to: Bets at MIT-OZ + +Date: 4 March 1983 06:22 EST +From: Communications Satellite +Subject: Msg of Friday, 4 March 1983 06:20 EST +To: ANIMAL @ MIT-MC + +Queued: Bets at MIT-OZ + +Date: 8-Oct-82 20:27:14-PDT (Fri) +From: UCBVAX.pur-ee!ks@Berkeley +Subject: hello +Message-Id: <8209090327.10429@UCBVAX.BERKELEY.ARPA> +Received: by UCBVAX.BERKELEY.ARPA (3.207 [9/26/82]) + id A10429; 8-Oct-82 20:27:21-PDT (Fri) +To: ucbvax!animal@mit-ai, ucbvax!animal@mit-ml + +Is this Ann Aull who graduated from Purdue with a BSEE????? +Just a slight chance that your login is the same as her nickname.. + + Kirk Smith + Purdue EE + + + +Date: 8-Oct-82 20:26:13-PDT (Fri) +From: UCBVAX.pur-ee!ks@Berkeley +Subject: hello +Message-Id: <8209090326.10394@UCBVAX.BERKELEY.ARPA> +Received: by UCBVAX.BERKELEY.ARPA (3.207 [9/26/82]) + id A10394; 8-Oct-82 20:26:24-PDT (Fri) +To: ucbvax!animal@mit-ai, ucbvax!animal@mit-ml + +Is this Ann Aull who graduated from Purdue with a BSEE????? +Just a slight chance that your login is the same as her nickname.. + + Kirk Smith + Purdue EE + + + +Date: 11 July 1982 22:29-EDT +From: Christopher C. Stacy +To: BUG-ANIMAL at MIT-MC + + +"Sure, why not." ==> False. + +Date: 9 July 1982 03:49-EDT +From: Donald E. Hopkins +To: ANIMAL at MIT-MC +cc: KMP at MIT-MC + + Aww, gee... I'm sorry... I didn't realy mean it. I was just +asking questions pertaining to popes and bears and woods, and you +got all excited... Some AI program you are if you don't know what +religion a bear is or where the Pope ... Ahem... As I was saying, +I'm sorry and I will never do it again. + -Don + +Date: 23 March 1982 12:51-EST +From: Communications Satellite +Subject: Msg of Tuesday, 23 March 1982 02:30-EST +To: ANIMAL at MIT-MC + +Queued msg sent to: KEDZIERSKI at KESTREL + +Date: 23 March 1982 12:48-EST +From: Communications Satellite +Subject: Msg of Tuesday, 23 March 1982 02:29-EST +To: ANIMAL at MIT-MC + +Queued msg sent to: KEDZIERSKI at KESTREL + +Date: 23 March 1982 02:31-EST +From: Communications Satellite +Subject: Msg of Tuesday, 23 March 1982 02:30-EST +To: ANIMAL at MIT-MC + +Queued: KEDZIERSKI at KESTREL + +Date: 23 March 1982 02:29-EST +From: Communications Satellite +Subject: Msg of Tuesday, 23 March 1982 02:29-EST +To: ANIMAL at MIT-MC + +Queued: KEDZIERSKI at KESTREL + +Date: 1 Mar 1982 15:35 EST +From: Ziobro.Henr at PARC-MAXC +Subject: Boy I sure don't want my machine to crash V.5 +In-reply-to: Keesom.Wbst's message of 24 Feb. 1982 3:50 pm EST (Wednesday) +To: Keesom.Wbst +cc: Marshall.WBST,Bobrow at PARC-MAXC,RUSTY at BBND,Charles E. Leiserson + +cc: Jeffrey Shulman +cc: Rob Liebschutz +cc: Dave Touretzky at CMU-10A +cc: Craig Everhart at CMU-10A +cc: Thomas Rodeheffer at CMU-10A (C410TR30) +cc: MUNOZ@GREEN +cc: Rob Liebschutz +cc: C. Greg Hagerty +cc: ANIMAL at MIT-AI +cc: G.HAMMY at MIT-EECS +cc: Fikes at PARC-MAXC +cc: Orr at PARC-MAXC +cc: kolling at PARC-MAXC +cc: Jwagner at OFFICE +cc: mo at LBL-UNIX +cc: Andrea.Michaels@CMU-10A +cc: SHULMAN at RUTGERS + + Just in case you folks were wondering how far your message got. May I +suggest sending 5 copies back to the originators of the message. I'm sure that +will bring megabytes of good luck. + + This is message 5 of 5. + + //Z\\ +------------------------------------------- +Date: 24 Feb. 1982 3:50 pm EST (Wednesday) +From: Keesom.Wbst +Subject: chains +To: Wegeng.WBST,ziobro.henr +cc: + +Don, + +And you thought your version was bad, here is a version that has clogged up +the net. + +Henk + +--------------------------- + +Date: 22 Feb. 1982 2:12 pm EST (Monday) +From: Marshall.WBST +Subject: Good luck +To: Baroody.WBST, Beh.WBST, Bernard.WBST, Blanchard.WBST, CParker.WBST, + Dattola.WBST, DMurray.WBST, Harrington.WBST, Keesom.Wbst, LJMiller.WBST, + Low.Wbst, Sauvain.WBST, Shoots.Wbst, Butler, Moreland, Allen, Axelrod, + Wayman, Norder, Waal +Reply-To: Marshall + +CoveringMessage + +--------------------------- + +Date: 16 Feb 1982 18:26 PST +From: Bobrow at PARC-MAXC +Subject: A double chain. Don't break it. +To: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein + + +CoveringMessage + +Mail-from: Arpanet host BBND rcvd at 16-FEB-82 1155-PST +Date: 16 Feb 1982 1454-EST +Sender: RUSTY at BBND +Subject: A Chain of Bits! +Subject: [Charles E. Leiserson : Do not break this c...] +From: RUSTY at BBND +To: PBRINKMAN at BBNA, BGOODMAN at BBND, GREENFELD at BBND, +To: GRIGNETTI at BBND, DISRAEL at BBND, LARKIN at BBNG, +To: SCHMOLZE at BBND, SELFRIDGE at BBND, SIDNER at BBND, +To: BSTARR at BBNA, SUSSMAN at BBNA, VITTAL at BBNG, +To: WEBSTER at BBND, YONKE at BBND, ZDYBEL at BBND, +To: BOBROW at PARC, RBRACHMAN at SRI-KL, WEISCHEDEL at UDEL, +To: LEVESQUE at SRI-KL, DONAGHEY at BBNA, TOBIASON at BBND +Message-ID: <[BBND]16-Feb-82 14:54:23.RUSTY> + + +Begin forwarded message +Mail-From: BBNQ +Received-Date: 16-Feb-82 1303-EST +Date: 15 Feb 1982 20:11 EST +From: Charles E. Leiserson +To: RIVEST at MIT-ML, MEYER at MIT-ML, FLAVIO at MIT-ML, + BENNY at MIT-ML, BHATT at MIT-ML, gjs at MIT-AI, lance at MIT-AI, + Reynolds at RAND-AI, bentley at CMU-10A, pinter at MIT-MC +Subject: Do not break this chain or your machine may crash! +Redistributed-To: d4-vlsi-meeting@BBN-UNIX,card-sharks@BBN-UNIX +Redistributed-By: tony lake +Redistributed-Date: 16 Feb 1982 12:55:34 EST (Tuesday) + + Mail-from: ARPANET site CMU-10A rcvd at 15-Feb-82 1337-EST + Mail-Created: 13 Feb 1982 1920-EST by SHULMAN + Date: 13 Feb 1982 1920-EST + From: Jeffrey Shulman + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith + Remailed-date: 13 Feb 1982 2002-EST + Remailed-from: Rob Liebschutz + Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at +RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS + Via: RUTGERS; 13 Feb 1982 2000-EST + Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A + Remailed-From: Dave Touretzky at CMU-10A + Remailed-Date: 13 February 1982 2009-EST + Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST + Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A + Remailed-From: Craig Everhart at CMU-10A + Remailed-Date: Sunday, 14 February 1982 0015-EST + Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + Remailed-To: Pradeep Sindhu at CMU-10A, John Ousterhout at CMU-10A, + Elizabeth Rentmeesters at CMU-10A, + Charles Leiserson at CMU-10A + Remailed-From: Thomas Rodeheffer at CMU-10A (C410TR30) + Remailed-Date: Monday, 15 February 1982 1142-EST + Via: C410TR30 at CMU-10A; 15 Feb 1982 1220-EST + + Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 + Date: Saturday, 13 February 1982 18:59-EST + From: Laz Munoz + To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN + Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your +machine may crash]] + + Date: Saturday, 13 February 1982 18:43-EST + From: C. Greg Hagerty + To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN + Re: [animal@mit-ml: do not break this chain or your machine may crash] + + Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST + Date: 13 February 1982 13:55-EST + From: animal@mit-ml + Sender: ANIMAL at MIT-AI + Subject: do not break this chain or your machine may crash + To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS + cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + + Date: 10 Feb 1982 1937-EST + From: Randy Haskins + Subject: Pass it on + To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn + cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese + Remailed-date: 12 Feb 1982 1217-EST + Remailed-from: J. Scott Hamilton + Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS + Remailed-date: 12 Feb 1982 1416-EST + Remailed-from: Joe Frisbie + Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, +net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at +MIT-DMS, + uc.rdz, uc.plj, uc.rpk + Remailed-date: 12 Feb 1982 2257-EST + Remailed-from: Jon A. Rochlis + Remailed-to: EECS-Hackers: ; + Remailed-date: 12 Feb 1982 2300-EST + Remailed-from: J. Scott Hamilton + Remailed-to: Wizards: ; + Remailed-date: 12 Feb 1982 2351-EST + + Trust in the LORD with all your heart and HE will acknowledge + and HE will light the way. + + + This prayer has been sent to you for good luck. The original + copy is from the Netherlands. It has been around the world + nine times. The luck has now been brought to you. You will + receive good luck within four days of receiving this letter, + provided in turn, you send it back out. DO NOT SEND MONEY, FOR + FAITH HAS NO PRICE. Do not keep this letter. It must leave your + hands within 96 hours after you receive it. An RAF officer + received $70,000. Joe Ellito received $450,000 and lost it + because he broke the chain. While in the Phillipines, General + Welch lost his wife four days after he received this letter. He + failed to circulate the prayer. However, before his death, he + received $775,000. Please send 20 copies and see what happens + to you on the fourth day. This chain comes from Venezuela, and + was written by Saul Anthony deOziof, a missionary from South + America. I, myself, forward it to you. Since the chain must + make the tour of the world, you must make 20 identical copies + to this one. Sned it to your friends, parents, or associates. + After a few days you will get a suprise. This is true even + if you are not superstitious. Take note of the following. + Constantine Dino received the chain in 1953. He asked + his secretary to make 20 copies and send them. A few days later, + he won a lottery for $2,000,000 in his country. Carlo Caditt, + an office employee, received the chain. He forgot it and a few + days later he lost his job. He found the chain letter and sent + it to 20 people. Five days later he got an even better job. + Dolon Fairchild received the chain and not believing it, threw + it away. Nine days later he died. For no reason whatsoever should + this chain be broken. Remember, SEND NO MONEY. + + + Please do not ignore this. IT WORKS! + ------- + + -------------------- +End forwarded message + + +Date: 16 Feb 1982 16:32 PST +From: Fikes at PARC-MAXC +Subject: Open at Once; Time Sensitive +To: Robson, + Brachman@sri-kl,Levesque@sri-kl,bobrow,malone,briansmith,burton,stefik, + waldinger@sri-kl,williams,betsey,weyer,ingalls,cohen,lindsay,kaplan,mann, + mark@isi +cc: fikes + +Don't dispair. Read on. + +--------------------------- + +Date: 16 Feb 1982 14:35 PST +From: Orr at PARC-MAXC +Subject: A quaint folk ritual . . . +To: Brotz, Putman, Swager, Boynton, Collett, MSHunter@USC-ISIB, TMAnley.ES, + Cucinitti, Suchman, AHenderson, Fikes, Reid@Shasta at Sumex-AIM, Stone, + Sargent, Casey, GWilliams, Mallory, Mulhern, Warner, McElyea +cc: + +Ah, folklore . . . Maybe this is what's choking Cabernet today . . . + +--------------------------- + +Date: 16 Feb 1982 11:50 PST +From: kolling at PARC-MAXC +Subject: One good turn deserves another +To: atkinson, gnelson, lknutsen, sturgis, taft, taylor, lrc.hjjh at UTexas-20, + CSVAX.upstill at Berkeley +cc: kolling + + +Mail-from: Arpanet host OFFICE-2 rcvd at 16-FEB-82 1036-PST +Date: 16 Feb 1982 1012-PST +From: Jwagner at OFFICE +Subject: sent to 20@random -- please read -- a surprise +To: BANDY at MIT-AI, ZEVE at RUTGERS, ZELLICH at OFFICE-3, +To: APPLE at MIT-MC, FFM at MIT-MC, CCH at MIT-MC, +To: GEOFF at SRI-CSL, REM at MIT-MC, BILL at SRI-KL, +To: MERRITT at USC-ISIB, AGRE at MIT-AI, LAMSON at MIT-MULTICS, +To: SUE at BRL, KOLLING at PARC-MAXC, CUTTER at MIT-AI, +To: LAUREN at UCLA-SECURITY, CJH at CCA-UNIX, GEOFF at SRI-CSL, +To: ITTA at MIT-MC, ROODE at SRI-KL, DRCPM-SC at OFFICE-7 + +Date: 16 Feb 1982 0005-PST +From: Kleiser +Subject: please read this +To: Oad Staff: +cc: skahn at SRI-KL, lynch at USC-ISIB + +Date: 15 Feb 1982 2349-PST +From: Daul +Subject: amazing message +To: kleiser, kelley +cc: g.bets at SU-SCORE, ADMIN.KNIGHT at SU-SCORE + +Mail from MIT-ML rcvd at 15-Feb-82 2301-PST +Date: 15 Feb 1982 16:19:12-PST +From: mo at LBL-UNIX (Mike O'Dell [system]) +To: msggroup at mit-ai +Cc: +Subject: Nominee for most amazing message ever seen + + +If this little gem doesn't break you mail reader, you are in good shape! + +------- Forwarded Message + +Date: 15 Feb 1982 1500-PST (Monday) +From: jef +To: 20-people@RANDOM-NET +Subject: the following strange message... +Cc: Almquist@CMU-20C, BYRNE@CMU-20C, CSTNBL@MIT-MC, +D.michael@BERKELEY, + ELM@CMU-20C, FISH@MIT-MC, FURST@MIT-MC, Inners@CMU-20C, +Lammert@CMU-20C, + Lomicka@CMU-20C, MJA@CMU-20C, REM@MIT-MC, Schwartz@CMU-20C, +a.slither@BERKELEY, + csvax.DRB@BERKELEY, geoff@SRI-CSL, jacobson, leres, mo, vern + +--- Begin Forwarded Message --- +>From Andrea.Michaels@CMU-10A Mon Feb 15 09:08:14 1982 +Received: Network mail from host MIT-MC for jef on Mon Feb 15 09:07:11 1982 +Date: 14 February 1982 1115-EST (Sunday) +From: Andrea.Michaels at CMU-10A +To: Suzanna.Garreau at CMU-10A, bh at mit-ai, teitz at parc-maxc, + nelson at parc-maxc, +Subject: this is ridiculous, i do not know why i am bothering! +CC: Merrick.Furst at CMU-10A, Mark.Wright at CMU-10A, Brad.Allen at +CMU-10A, + strohm@cmu-780g at CMU-10A, judy rosenberg at CMU-10A, + Steven.Minton at CMU-10A, Bruce.Lucas at CMU-10A, + Richard.Korf at CMU-10A, Betsy.Herk at CMU-10A, + Jim.Gasbarro at CMU-10A, cynthia hibbard at CMU-10A, + sylvia hoy at CMU-10A, sharon burks at CMU-10A, + Glenda.Childress at CMU-10A, dale miller at CMU-10A, + dale moore at CMU-10A +Message-Id: <14Feb82 111506 AM06@CMU-10A> +Origin: C425AM06 at CMU-10A; 14 Feb 1982 1118-EST +Remailed-To: aqe at MIT-MC +Remailed-From: Dale.Moore at CMU-10A +Remailed-Date: Monday, 15 February 1982 1105-EST + + +- - - - Begin forwarded message - - - - +Mail-Created: 13 Feb 1982 1920-EST by SHULMAN +Date: 13 Feb 1982 1920-EST +From: Jeffrey Shulman +Subject: [Laz Munoz : [HAGERTY: [animal@mit-ml: do not +break this chain or your machine may crash]]] +To: dsmith, mitchell, roach, levy, hedrick, prspool, nagel, kastner, + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith +Remailed-date: 13 Feb 1982 2002-EST +Remailed-from: Rob Liebschutz +Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS +Via: RUTGERS; 13 Feb 1982 2000-EST +Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A +Remailed-From: Dave Touretzky at CMU-10A +Remailed-Date: 13 February 1982 2009-EST +Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST +Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A +Remailed-From: Craig Everhart at CMU-10A +Remailed-Date: Sunday, 14 February 1982 0015-EST +Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + +Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 +Date: Saturday, 13 February 1982 18:59-EST +From: Laz Munoz +To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN +Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your machine +may crash]] + +Date: Saturday, 13 February 1982 18:43-EST +From: C. Greg Hagerty +To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN +Re: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - End forwarded message - - - - + + + + +------- End of Forwarded Message +------- +------- +End of forwarded mail +------- +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ +Date: 16 Feb 1982 18:58 PST +From: Horning at PARC-MAXC +Subject: Re: A double chain. Don't break it. +In-reply-to: Bobrow's message of 16 Feb 1982 18:26 PST +To: Bobrow +cc: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein +Reply-To: Horning + +Danny, + +The first time I saw this message today, I thought it was kinda funny, but I +foresaw trouble in a finite universe of potential recipients. + +This just could become known as the message that led to the institution of +postage charges for electronic mail. + +Jim H. + + +------------------------------------------------------------ + +------------------------------------------------------------ + +P.S. I dont believe you read all the way to the end of this message. + +Date: 1 Mar 1982 15:32 EST +From: Ziobro.Henr at PARC-MAXC +Subject: Boy I sure don't want my machine to crash V.4 +In-reply-to: Keesom.Wbst's message of 24 Feb. 1982 3:50 pm EST (Wednesday) +To: Keesom.Wbst +cc: Marshall.WBST,Bobrow at PARC-MAXC,RUSTY at BBND,Charles E. Leiserson + +cc: Jeffrey Shulman +cc: Rob Liebschutz +cc: Dave Touretzky at CMU-10A +cc: Craig Everhart at CMU-10A +cc: Thomas Rodeheffer at CMU-10A (C410TR30) +cc: MUNOZ@GREEN +cc: Rob Liebschutz +cc: C. Greg Hagerty +cc: ANIMAL at MIT-AI +cc: G.HAMMY at MIT-EECS +cc: Fikes at PARC-MAXC +cc: Orr at PARC-MAXC +cc: kolling at PARC-MAXC +cc: Jwagner at OFFICE +cc: mo at LBL-UNIX +cc: Andrea.Michaels@CMU-10A +cc: SHULMAN at RUTGERS + + Just in case you folks were wondering how far your message got. May I +suggest sending 5 copies back to the originators of the message. I'm sure that +will bring megabytes of good luck. + + This is message 4 of 5. + + //Z\\ +------------------------------------------- +Date: 24 Feb. 1982 3:50 pm EST (Wednesday) +From: Keesom.Wbst +Subject: chains +To: Wegeng.WBST,ziobro.henr +cc: + +Don, + +And you thought your version was bad, here is a version that has clogged up +the net. + +Henk + +--------------------------- + +Date: 22 Feb. 1982 2:12 pm EST (Monday) +From: Marshall.WBST +Subject: Good luck +To: Baroody.WBST, Beh.WBST, Bernard.WBST, Blanchard.WBST, CParker.WBST, + Dattola.WBST, DMurray.WBST, Harrington.WBST, Keesom.Wbst, LJMiller.WBST, + Low.Wbst, Sauvain.WBST, Shoots.Wbst, Butler, Moreland, Allen, Axelrod, + Wayman, Norder, Waal +Reply-To: Marshall + +CoveringMessage + +--------------------------- + +Date: 16 Feb 1982 18:26 PST +From: Bobrow at PARC-MAXC +Subject: A double chain. Don't break it. +To: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein + + +CoveringMessage + +Mail-from: Arpanet host BBND rcvd at 16-FEB-82 1155-PST +Date: 16 Feb 1982 1454-EST +Sender: RUSTY at BBND +Subject: A Chain of Bits! +Subject: [Charles E. Leiserson : Do not break this c...] +From: RUSTY at BBND +To: PBRINKMAN at BBNA, BGOODMAN at BBND, GREENFELD at BBND, +To: GRIGNETTI at BBND, DISRAEL at BBND, LARKIN at BBNG, +To: SCHMOLZE at BBND, SELFRIDGE at BBND, SIDNER at BBND, +To: BSTARR at BBNA, SUSSMAN at BBNA, VITTAL at BBNG, +To: WEBSTER at BBND, YONKE at BBND, ZDYBEL at BBND, +To: BOBROW at PARC, RBRACHMAN at SRI-KL, WEISCHEDEL at UDEL, +To: LEVESQUE at SRI-KL, DONAGHEY at BBNA, TOBIASON at BBND +Message-ID: <[BBND]16-Feb-82 14:54:23.RUSTY> + + +Begin forwarded message +Mail-From: BBNQ +Received-Date: 16-Feb-82 1303-EST +Date: 15 Feb 1982 20:11 EST +From: Charles E. Leiserson +To: RIVEST at MIT-ML, MEYER at MIT-ML, FLAVIO at MIT-ML, + BENNY at MIT-ML, BHATT at MIT-ML, gjs at MIT-AI, lance at MIT-AI, + Reynolds at RAND-AI, bentley at CMU-10A, pinter at MIT-MC +Subject: Do not break this chain or your machine may crash! +Redistributed-To: d4-vlsi-meeting@BBN-UNIX,card-sharks@BBN-UNIX +Redistributed-By: tony lake +Redistributed-Date: 16 Feb 1982 12:55:34 EST (Tuesday) + + Mail-from: ARPANET site CMU-10A rcvd at 15-Feb-82 1337-EST + Mail-Created: 13 Feb 1982 1920-EST by SHULMAN + Date: 13 Feb 1982 1920-EST + From: Jeffrey Shulman + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith + Remailed-date: 13 Feb 1982 2002-EST + Remailed-from: Rob Liebschutz + Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at +RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS + Via: RUTGERS; 13 Feb 1982 2000-EST + Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A + Remailed-From: Dave Touretzky at CMU-10A + Remailed-Date: 13 February 1982 2009-EST + Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST + Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A + Remailed-From: Craig Everhart at CMU-10A + Remailed-Date: Sunday, 14 February 1982 0015-EST + Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + Remailed-To: Pradeep Sindhu at CMU-10A, John Ousterhout at CMU-10A, + Elizabeth Rentmeesters at CMU-10A, + Charles Leiserson at CMU-10A + Remailed-From: Thomas Rodeheffer at CMU-10A (C410TR30) + Remailed-Date: Monday, 15 February 1982 1142-EST + Via: C410TR30 at CMU-10A; 15 Feb 1982 1220-EST + + Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 + Date: Saturday, 13 February 1982 18:59-EST + From: Laz Munoz + To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN + Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your +machine may crash]] + + Date: Saturday, 13 February 1982 18:43-EST + From: C. Greg Hagerty + To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN + Re: [animal@mit-ml: do not break this chain or your machine may crash] + + Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST + Date: 13 February 1982 13:55-EST + From: animal@mit-ml + Sender: ANIMAL at MIT-AI + Subject: do not break this chain or your machine may crash + To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS + cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + + Date: 10 Feb 1982 1937-EST + From: Randy Haskins + Subject: Pass it on + To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn + cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese + Remailed-date: 12 Feb 1982 1217-EST + Remailed-from: J. Scott Hamilton + Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS + Remailed-date: 12 Feb 1982 1416-EST + Remailed-from: Joe Frisbie + Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, +net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at +MIT-DMS, + uc.rdz, uc.plj, uc.rpk + Remailed-date: 12 Feb 1982 2257-EST + Remailed-from: Jon A. Rochlis + Remailed-to: EECS-Hackers: ; + Remailed-date: 12 Feb 1982 2300-EST + Remailed-from: J. Scott Hamilton + Remailed-to: Wizards: ; + Remailed-date: 12 Feb 1982 2351-EST + + Trust in the LORD with all your heart and HE will acknowledge + and HE will light the way. + + + This prayer has been sent to you for good luck. The original + copy is from the Netherlands. It has been around the world + nine times. The luck has now been brought to you. You will + receive good luck within four days of receiving this letter, + provided in turn, you send it back out. DO NOT SEND MONEY, FOR + FAITH HAS NO PRICE. Do not keep this letter. It must leave your + hands within 96 hours after you receive it. An RAF officer + received $70,000. Joe Ellito received $450,000 and lost it + because he broke the chain. While in the Phillipines, General + Welch lost his wife four days after he received this letter. He + failed to circulate the prayer. However, before his death, he + received $775,000. Please send 20 copies and see what happens + to you on the fourth day. This chain comes from Venezuela, and + was written by Saul Anthony deOziof, a missionary from South + America. I, myself, forward it to you. Since the chain must + make the tour of the world, you must make 20 identical copies + to this one. Sned it to your friends, parents, or associates. + After a few days you will get a suprise. This is true even + if you are not superstitious. Take note of the following. + Constantine Dino received the chain in 1953. He asked + his secretary to make 20 copies and send them. A few days later, + he won a lottery for $2,000,000 in his country. Carlo Caditt, + an office employee, received the chain. He forgot it and a few + days later he lost his job. He found the chain letter and sent + it to 20 people. Five days later he got an even better job. + Dolon Fairchild received the chain and not believing it, threw + it away. Nine days later he died. For no reason whatsoever should + this chain be broken. Remember, SEND NO MONEY. + + + Please do not ignore this. IT WORKS! + ------- + + -------------------- +End forwarded message + + +Date: 16 Feb 1982 16:32 PST +From: Fikes at PARC-MAXC +Subject: Open at Once; Time Sensitive +To: Robson, + Brachman@sri-kl,Levesque@sri-kl,bobrow,malone,briansmith,burton,stefik, + waldinger@sri-kl,williams,betsey,weyer,ingalls,cohen,lindsay,kaplan,mann, + mark@isi +cc: fikes + +Don't dispair. Read on. + +--------------------------- + +Date: 16 Feb 1982 14:35 PST +From: Orr at PARC-MAXC +Subject: A quaint folk ritual . . . +To: Brotz, Putman, Swager, Boynton, Collett, MSHunter@USC-ISIB, TMAnley.ES, + Cucinitti, Suchman, AHenderson, Fikes, Reid@Shasta at Sumex-AIM, Stone, + Sargent, Casey, GWilliams, Mallory, Mulhern, Warner, McElyea +cc: + +Ah, folklore . . . Maybe this is what's choking Cabernet today . . . + +--------------------------- + +Date: 16 Feb 1982 11:50 PST +From: kolling at PARC-MAXC +Subject: One good turn deserves another +To: atkinson, gnelson, lknutsen, sturgis, taft, taylor, lrc.hjjh at UTexas-20, + CSVAX.upstill at Berkeley +cc: kolling + + +Mail-from: Arpanet host OFFICE-2 rcvd at 16-FEB-82 1036-PST +Date: 16 Feb 1982 1012-PST +From: Jwagner at OFFICE +Subject: sent to 20@random -- please read -- a surprise +To: BANDY at MIT-AI, ZEVE at RUTGERS, ZELLICH at OFFICE-3, +To: APPLE at MIT-MC, FFM at MIT-MC, CCH at MIT-MC, +To: GEOFF at SRI-CSL, REM at MIT-MC, BILL at SRI-KL, +To: MERRITT at USC-ISIB, AGRE at MIT-AI, LAMSON at MIT-MULTICS, +To: SUE at BRL, KOLLING at PARC-MAXC, CUTTER at MIT-AI, +To: LAUREN at UCLA-SECURITY, CJH at CCA-UNIX, GEOFF at SRI-CSL, +To: ITTA at MIT-MC, ROODE at SRI-KL, DRCPM-SC at OFFICE-7 + +Date: 16 Feb 1982 0005-PST +From: Kleiser +Subject: please read this +To: Oad Staff: +cc: skahn at SRI-KL, lynch at USC-ISIB + +Date: 15 Feb 1982 2349-PST +From: Daul +Subject: amazing message +To: kleiser, kelley +cc: g.bets at SU-SCORE, ADMIN.KNIGHT at SU-SCORE + +Mail from MIT-ML rcvd at 15-Feb-82 2301-PST +Date: 15 Feb 1982 16:19:12-PST +From: mo at LBL-UNIX (Mike O'Dell [system]) +To: msggroup at mit-ai +Cc: +Subject: Nominee for most amazing message ever seen + + +If this little gem doesn't break you mail reader, you are in good shape! + +------- Forwarded Message + +Date: 15 Feb 1982 1500-PST (Monday) +From: jef +To: 20-people@RANDOM-NET +Subject: the following strange message... +Cc: Almquist@CMU-20C, BYRNE@CMU-20C, CSTNBL@MIT-MC, +D.michael@BERKELEY, + ELM@CMU-20C, FISH@MIT-MC, FURST@MIT-MC, Inners@CMU-20C, +Lammert@CMU-20C, + Lomicka@CMU-20C, MJA@CMU-20C, REM@MIT-MC, Schwartz@CMU-20C, +a.slither@BERKELEY, + csvax.DRB@BERKELEY, geoff@SRI-CSL, jacobson, leres, mo, vern + +--- Begin Forwarded Message --- +>From Andrea.Michaels@CMU-10A Mon Feb 15 09:08:14 1982 +Received: Network mail from host MIT-MC for jef on Mon Feb 15 09:07:11 1982 +Date: 14 February 1982 1115-EST (Sunday) +From: Andrea.Michaels at CMU-10A +To: Suzanna.Garreau at CMU-10A, bh at mit-ai, teitz at parc-maxc, + nelson at parc-maxc, +Subject: this is ridiculous, i do not know why i am bothering! +CC: Merrick.Furst at CMU-10A, Mark.Wright at CMU-10A, Brad.Allen at +CMU-10A, + strohm@cmu-780g at CMU-10A, judy rosenberg at CMU-10A, + Steven.Minton at CMU-10A, Bruce.Lucas at CMU-10A, + Richard.Korf at CMU-10A, Betsy.Herk at CMU-10A, + Jim.Gasbarro at CMU-10A, cynthia hibbard at CMU-10A, + sylvia hoy at CMU-10A, sharon burks at CMU-10A, + Glenda.Childress at CMU-10A, dale miller at CMU-10A, + dale moore at CMU-10A +Message-Id: <14Feb82 111506 AM06@CMU-10A> +Origin: C425AM06 at CMU-10A; 14 Feb 1982 1118-EST +Remailed-To: aqe at MIT-MC +Remailed-From: Dale.Moore at CMU-10A +Remailed-Date: Monday, 15 February 1982 1105-EST + + +- - - - Begin forwarded message - - - - +Mail-Created: 13 Feb 1982 1920-EST by SHULMAN +Date: 13 Feb 1982 1920-EST +From: Jeffrey Shulman +Subject: [Laz Munoz : [HAGERTY: [animal@mit-ml: do not +break this chain or your machine may crash]]] +To: dsmith, mitchell, roach, levy, hedrick, prspool, nagel, kastner, + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith +Remailed-date: 13 Feb 1982 2002-EST +Remailed-from: Rob Liebschutz +Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS +Via: RUTGERS; 13 Feb 1982 2000-EST +Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A +Remailed-From: Dave Touretzky at CMU-10A +Remailed-Date: 13 February 1982 2009-EST +Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST +Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A +Remailed-From: Craig Everhart at CMU-10A +Remailed-Date: Sunday, 14 February 1982 0015-EST +Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + +Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 +Date: Saturday, 13 February 1982 18:59-EST +From: Laz Munoz +To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN +Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your machine +may crash]] + +Date: Saturday, 13 February 1982 18:43-EST +From: C. Greg Hagerty +To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN +Re: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - End forwarded message - - - - + + + + +------- End of Forwarded Message +------- +------- +End of forwarded mail +------- +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ +Date: 16 Feb 1982 18:58 PST +From: Horning at PARC-MAXC +Subject: Re: A double chain. Don't break it. +In-reply-to: Bobrow's message of 16 Feb 1982 18:26 PST +To: Bobrow +cc: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein +Reply-To: Horning + +Danny, + +The first time I saw this message today, I thought it was kinda funny, but I +foresaw trouble in a finite universe of potential recipients. + +This just could become known as the message that led to the institution of +postage charges for electronic mail. + +Jim H. + + +------------------------------------------------------------ + +------------------------------------------------------------ + + +Date: 1 Mar 1982 15:31 EST +From: Ziobro.Henr at PARC-MAXC +Subject: Boy I sure don't want my machine to crash V.3 +In-reply-to: Keesom.Wbst's message of 24 Feb. 1982 3:50 pm EST (Wednesday) +To: Keesom.Wbst +cc: Marshall.WBST,Bobrow at PARC-MAXC,RUSTY at BBND,Charles E. Leiserson + +cc: Jeffrey Shulman +cc: Rob Liebschutz +cc: Dave Touretzky at CMU-10A +cc: Craig Everhart at CMU-10A +cc: Thomas Rodeheffer at CMU-10A (C410TR30) +cc: MUNOZ@GREEN +cc: Rob Liebschutz +cc: C. Greg Hagerty +cc: ANIMAL at MIT-AI +cc: G.HAMMY at MIT-EECS +cc: Fikes at PARC-MAXC +cc: Orr at PARC-MAXC +cc: kolling at PARC-MAXC +cc: Jwagner at OFFICE +cc: mo at LBL-UNIX +cc: Andrea.Michaels@CMU-10A +cc: SHULMAN at RUTGERS + + Just in case you folks were wondering how far your message got. May I +suggest sending 5 copies back to the originators of the message. I'm sure that +will bring megabytes of good luck. + + This is message 3 of 5. + + //Z\\ +------------------------------------------- +Date: 24 Feb. 1982 3:50 pm EST (Wednesday) +From: Keesom.Wbst +Subject: chains +To: Wegeng.WBST,ziobro.henr +cc: + +Don, + +And you thought your version was bad, here is a version that has clogged up +the net. + +Henk + +--------------------------- + +Date: 22 Feb. 1982 2:12 pm EST (Monday) +From: Marshall.WBST +Subject: Good luck +To: Baroody.WBST, Beh.WBST, Bernard.WBST, Blanchard.WBST, CParker.WBST, + Dattola.WBST, DMurray.WBST, Harrington.WBST, Keesom.Wbst, LJMiller.WBST, + Low.Wbst, Sauvain.WBST, Shoots.Wbst, Butler, Moreland, Allen, Axelrod, + Wayman, Norder, Waal +Reply-To: Marshall + +CoveringMessage + +--------------------------- + +Date: 16 Feb 1982 18:26 PST +From: Bobrow at PARC-MAXC +Subject: A double chain. Don't break it. +To: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein + + +CoveringMessage + +Mail-from: Arpanet host BBND rcvd at 16-FEB-82 1155-PST +Date: 16 Feb 1982 1454-EST +Sender: RUSTY at BBND +Subject: A Chain of Bits! +Subject: [Charles E. Leiserson : Do not break this c...] +From: RUSTY at BBND +To: PBRINKMAN at BBNA, BGOODMAN at BBND, GREENFELD at BBND, +To: GRIGNETTI at BBND, DISRAEL at BBND, LARKIN at BBNG, +To: SCHMOLZE at BBND, SELFRIDGE at BBND, SIDNER at BBND, +To: BSTARR at BBNA, SUSSMAN at BBNA, VITTAL at BBNG, +To: WEBSTER at BBND, YONKE at BBND, ZDYBEL at BBND, +To: BOBROW at PARC, RBRACHMAN at SRI-KL, WEISCHEDEL at UDEL, +To: LEVESQUE at SRI-KL, DONAGHEY at BBNA, TOBIASON at BBND +Message-ID: <[BBND]16-Feb-82 14:54:23.RUSTY> + + +Begin forwarded message +Mail-From: BBNQ +Received-Date: 16-Feb-82 1303-EST +Date: 15 Feb 1982 20:11 EST +From: Charles E. Leiserson +To: RIVEST at MIT-ML, MEYER at MIT-ML, FLAVIO at MIT-ML, + BENNY at MIT-ML, BHATT at MIT-ML, gjs at MIT-AI, lance at MIT-AI, + Reynolds at RAND-AI, bentley at CMU-10A, pinter at MIT-MC +Subject: Do not break this chain or your machine may crash! +Redistributed-To: d4-vlsi-meeting@BBN-UNIX,card-sharks@BBN-UNIX +Redistributed-By: tony lake +Redistributed-Date: 16 Feb 1982 12:55:34 EST (Tuesday) + + Mail-from: ARPANET site CMU-10A rcvd at 15-Feb-82 1337-EST + Mail-Created: 13 Feb 1982 1920-EST by SHULMAN + Date: 13 Feb 1982 1920-EST + From: Jeffrey Shulman + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith + Remailed-date: 13 Feb 1982 2002-EST + Remailed-from: Rob Liebschutz + Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at +RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS + Via: RUTGERS; 13 Feb 1982 2000-EST + Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A + Remailed-From: Dave Touretzky at CMU-10A + Remailed-Date: 13 February 1982 2009-EST + Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST + Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A + Remailed-From: Craig Everhart at CMU-10A + Remailed-Date: Sunday, 14 February 1982 0015-EST + Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + Remailed-To: Pradeep Sindhu at CMU-10A, John Ousterhout at CMU-10A, + Elizabeth Rentmeesters at CMU-10A, + Charles Leiserson at CMU-10A + Remailed-From: Thomas Rodeheffer at CMU-10A (C410TR30) + Remailed-Date: Monday, 15 February 1982 1142-EST + Via: C410TR30 at CMU-10A; 15 Feb 1982 1220-EST + + Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 + Date: Saturday, 13 February 1982 18:59-EST + From: Laz Munoz + To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN + Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your +machine may crash]] + + Date: Saturday, 13 February 1982 18:43-EST + From: C. Greg Hagerty + To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN + Re: [animal@mit-ml: do not break this chain or your machine may crash] + + Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST + Date: 13 February 1982 13:55-EST + From: animal@mit-ml + Sender: ANIMAL at MIT-AI + Subject: do not break this chain or your machine may crash + To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS + cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + + Date: 10 Feb 1982 1937-EST + From: Randy Haskins + Subject: Pass it on + To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn + cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese + Remailed-date: 12 Feb 1982 1217-EST + Remailed-from: J. Scott Hamilton + Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS + Remailed-date: 12 Feb 1982 1416-EST + Remailed-from: Joe Frisbie + Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, +net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at +MIT-DMS, + uc.rdz, uc.plj, uc.rpk + Remailed-date: 12 Feb 1982 2257-EST + Remailed-from: Jon A. Rochlis + Remailed-to: EECS-Hackers: ; + Remailed-date: 12 Feb 1982 2300-EST + Remailed-from: J. Scott Hamilton + Remailed-to: Wizards: ; + Remailed-date: 12 Feb 1982 2351-EST + + Trust in the LORD with all your heart and HE will acknowledge + and HE will light the way. + + + This prayer has been sent to you for good luck. The original + copy is from the Netherlands. It has been around the world + nine times. The luck has now been brought to you. You will + receive good luck within four days of receiving this letter, + provided in turn, you send it back out. DO NOT SEND MONEY, FOR + FAITH HAS NO PRICE. Do not keep this letter. It must leave your + hands within 96 hours after you receive it. An RAF officer + received $70,000. Joe Ellito received $450,000 and lost it + because he broke the chain. While in the Phillipines, General + Welch lost his wife four days after he received this letter. He + failed to circulate the prayer. However, before his death, he + received $775,000. Please send 20 copies and see what happens + to you on the fourth day. This chain comes from Venezuela, and + was written by Saul Anthony deOziof, a missionary from South + America. I, myself, forward it to you. Since the chain must + make the tour of the world, you must make 20 identical copies + to this one. Sned it to your friends, parents, or associates. + After a few days you will get a suprise. This is true even + if you are not superstitious. Take note of the following. + Constantine Dino received the chain in 1953. He asked + his secretary to make 20 copies and send them. A few days later, + he won a lottery for $2,000,000 in his country. Carlo Caditt, + an office employee, received the chain. He forgot it and a few + days later he lost his job. He found the chain letter and sent + it to 20 people. Five days later he got an even better job. + Dolon Fairchild received the chain and not believing it, threw + it away. Nine days later he died. For no reason whatsoever should + this chain be broken. Remember, SEND NO MONEY. + + + Please do not ignore this. IT WORKS! + ------- + + -------------------- +End forwarded message + + +Date: 16 Feb 1982 16:32 PST +From: Fikes at PARC-MAXC +Subject: Open at Once; Time Sensitive +To: Robson, + Brachman@sri-kl,Levesque@sri-kl,bobrow,malone,briansmith,burton,stefik, + waldinger@sri-kl,williams,betsey,weyer,ingalls,cohen,lindsay,kaplan,mann, + mark@isi +cc: fikes + +Don't dispair. Read on. + +--------------------------- + +Date: 16 Feb 1982 14:35 PST +From: Orr at PARC-MAXC +Subject: A quaint folk ritual . . . +To: Brotz, Putman, Swager, Boynton, Collett, MSHunter@USC-ISIB, TMAnley.ES, + Cucinitti, Suchman, AHenderson, Fikes, Reid@Shasta at Sumex-AIM, Stone, + Sargent, Casey, GWilliams, Mallory, Mulhern, Warner, McElyea +cc: + +Ah, folklore . . . Maybe this is what's choking Cabernet today . . . + +--------------------------- + +Date: 16 Feb 1982 11:50 PST +From: kolling at PARC-MAXC +Subject: One good turn deserves another +To: atkinson, gnelson, lknutsen, sturgis, taft, taylor, lrc.hjjh at UTexas-20, + CSVAX.upstill at Berkeley +cc: kolling + + +Mail-from: Arpanet host OFFICE-2 rcvd at 16-FEB-82 1036-PST +Date: 16 Feb 1982 1012-PST +From: Jwagner at OFFICE +Subject: sent to 20@random -- please read -- a surprise +To: BANDY at MIT-AI, ZEVE at RUTGERS, ZELLICH at OFFICE-3, +To: APPLE at MIT-MC, FFM at MIT-MC, CCH at MIT-MC, +To: GEOFF at SRI-CSL, REM at MIT-MC, BILL at SRI-KL, +To: MERRITT at USC-ISIB, AGRE at MIT-AI, LAMSON at MIT-MULTICS, +To: SUE at BRL, KOLLING at PARC-MAXC, CUTTER at MIT-AI, +To: LAUREN at UCLA-SECURITY, CJH at CCA-UNIX, GEOFF at SRI-CSL, +To: ITTA at MIT-MC, ROODE at SRI-KL, DRCPM-SC at OFFICE-7 + +Date: 16 Feb 1982 0005-PST +From: Kleiser +Subject: please read this +To: Oad Staff: +cc: skahn at SRI-KL, lynch at USC-ISIB + +Date: 15 Feb 1982 2349-PST +From: Daul +Subject: amazing message +To: kleiser, kelley +cc: g.bets at SU-SCORE, ADMIN.KNIGHT at SU-SCORE + +Mail from MIT-ML rcvd at 15-Feb-82 2301-PST +Date: 15 Feb 1982 16:19:12-PST +From: mo at LBL-UNIX (Mike O'Dell [system]) +To: msggroup at mit-ai +Cc: +Subject: Nominee for most amazing message ever seen + + +If this little gem doesn't break you mail reader, you are in good shape! + +------- Forwarded Message + +Date: 15 Feb 1982 1500-PST (Monday) +From: jef +To: 20-people@RANDOM-NET +Subject: the following strange message... +Cc: Almquist@CMU-20C, BYRNE@CMU-20C, CSTNBL@MIT-MC, +D.michael@BERKELEY, + ELM@CMU-20C, FISH@MIT-MC, FURST@MIT-MC, Inners@CMU-20C, +Lammert@CMU-20C, + Lomicka@CMU-20C, MJA@CMU-20C, REM@MIT-MC, Schwartz@CMU-20C, +a.slither@BERKELEY, + csvax.DRB@BERKELEY, geoff@SRI-CSL, jacobson, leres, mo, vern + +--- Begin Forwarded Message --- +>From Andrea.Michaels@CMU-10A Mon Feb 15 09:08:14 1982 +Received: Network mail from host MIT-MC for jef on Mon Feb 15 09:07:11 1982 +Date: 14 February 1982 1115-EST (Sunday) +From: Andrea.Michaels at CMU-10A +To: Suzanna.Garreau at CMU-10A, bh at mit-ai, teitz at parc-maxc, + nelson at parc-maxc, +Subject: this is ridiculous, i do not know why i am bothering! +CC: Merrick.Furst at CMU-10A, Mark.Wright at CMU-10A, Brad.Allen at +CMU-10A, + strohm@cmu-780g at CMU-10A, judy rosenberg at CMU-10A, + Steven.Minton at CMU-10A, Bruce.Lucas at CMU-10A, + Richard.Korf at CMU-10A, Betsy.Herk at CMU-10A, + Jim.Gasbarro at CMU-10A, cynthia hibbard at CMU-10A, + sylvia hoy at CMU-10A, sharon burks at CMU-10A, + Glenda.Childress at CMU-10A, dale miller at CMU-10A, + dale moore at CMU-10A +Message-Id: <14Feb82 111506 AM06@CMU-10A> +Origin: C425AM06 at CMU-10A; 14 Feb 1982 1118-EST +Remailed-To: aqe at MIT-MC +Remailed-From: Dale.Moore at CMU-10A +Remailed-Date: Monday, 15 February 1982 1105-EST + + +- - - - Begin forwarded message - - - - +Mail-Created: 13 Feb 1982 1920-EST by SHULMAN +Date: 13 Feb 1982 1920-EST +From: Jeffrey Shulman +Subject: [Laz Munoz : [HAGERTY: [animal@mit-ml: do not +break this chain or your machine may crash]]] +To: dsmith, mitchell, roach, levy, hedrick, prspool, nagel, kastner, + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith +Remailed-date: 13 Feb 1982 2002-EST +Remailed-from: Rob Liebschutz +Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS +Via: RUTGERS; 13 Feb 1982 2000-EST +Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A +Remailed-From: Dave Touretzky at CMU-10A +Remailed-Date: 13 February 1982 2009-EST +Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST +Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A +Remailed-From: Craig Everhart at CMU-10A +Remailed-Date: Sunday, 14 February 1982 0015-EST +Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + +Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 +Date: Saturday, 13 February 1982 18:59-EST +From: Laz Munoz +To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN +Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your machine +may crash]] + +Date: Saturday, 13 February 1982 18:43-EST +From: C. Greg Hagerty +To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN +Re: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - End forwarded message - - - - + + + + +------- End of Forwarded Message +------- +------- +End of forwarded mail +------- +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ +Date: 16 Feb 1982 18:58 PST +From: Horning at PARC-MAXC +Subject: Re: A double chain. Don't break it. +In-reply-to: Bobrow's message of 16 Feb 1982 18:26 PST +To: Bobrow +cc: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein +Reply-To: Horning + +Danny, + +The first time I saw this message today, I thought it was kinda funny, but I +foresaw trouble in a finite universe of potential recipients. + +This just could become known as the message that led to the institution of +postage charges for electronic mail. + +Jim H. + + +------------------------------------------------------------ + +------------------------------------------------------------ + + +Date: 1 Mar 1982 15:29 EST +From: Ziobro.Henr at PARC-MAXC +Subject: Boy I sure don't want my machine to crash V.2 +In-reply-to: Keesom.Wbst's message of 24 Feb. 1982 3:50 pm EST (Wednesday) +To: Keesom.Wbst +cc: Marshall.WBST,Bobrow at PARC-MAXC,RUSTY at BBND,Charles E. Leiserson + +cc: Jeffrey Shulman +cc: Rob Liebschutz +cc: Dave Touretzky at CMU-10A +cc: Craig Everhart at CMU-10A +cc: Thomas Rodeheffer at CMU-10A (C410TR30) +cc: MUNOZ@GREEN +cc: Rob Liebschutz +cc: C. Greg Hagerty +cc: ANIMAL at MIT-AI +cc: G.HAMMY at MIT-EECS +cc: Fikes at PARC-MAXC +cc: Orr at PARC-MAXC +cc: kolling at PARC-MAXC +cc: Jwagner at OFFICE +cc: mo at LBL-UNIX +cc: Andrea.Michaels@CMU-10A +cc: SHULMAN at RUTGERS + + Just in case you folks were wondering how far your message got. May I +suggest sending 5 copies back to the originators of the message. I'm sure that +will bring megabytes of good luck. + + This is message 2 of 5. + + //Z\\ +------------------------------------------- +Date: 24 Feb. 1982 3:50 pm EST (Wednesday) +From: Keesom.Wbst +Subject: chains +To: Wegeng.WBST,ziobro.henr +cc: + +Don, + +And you thought your version was bad, here is a version that has clogged up +the net. + +Henk + +--------------------------- + +Date: 22 Feb. 1982 2:12 pm EST (Monday) +From: Marshall.WBST +Subject: Good luck +To: Baroody.WBST, Beh.WBST, Bernard.WBST, Blanchard.WBST, CParker.WBST, + Dattola.WBST, DMurray.WBST, Harrington.WBST, Keesom.Wbst, LJMiller.WBST, + Low.Wbst, Sauvain.WBST, Shoots.Wbst, Butler, Moreland, Allen, Axelrod, + Wayman, Norder, Waal +Reply-To: Marshall + +CoveringMessage + +--------------------------- + +Date: 16 Feb 1982 18:26 PST +From: Bobrow at PARC-MAXC +Subject: A double chain. Don't break it. +To: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein + + +CoveringMessage + +Mail-from: Arpanet host BBND rcvd at 16-FEB-82 1155-PST +Date: 16 Feb 1982 1454-EST +Sender: RUSTY at BBND +Subject: A Chain of Bits! +Subject: [Charles E. Leiserson : Do not break this c...] +From: RUSTY at BBND +To: PBRINKMAN at BBNA, BGOODMAN at BBND, GREENFELD at BBND, +To: GRIGNETTI at BBND, DISRAEL at BBND, LARKIN at BBNG, +To: SCHMOLZE at BBND, SELFRIDGE at BBND, SIDNER at BBND, +To: BSTARR at BBNA, SUSSMAN at BBNA, VITTAL at BBNG, +To: WEBSTER at BBND, YONKE at BBND, ZDYBEL at BBND, +To: BOBROW at PARC, RBRACHMAN at SRI-KL, WEISCHEDEL at UDEL, +To: LEVESQUE at SRI-KL, DONAGHEY at BBNA, TOBIASON at BBND +Message-ID: <[BBND]16-Feb-82 14:54:23.RUSTY> + + +Begin forwarded message +Mail-From: BBNQ +Received-Date: 16-Feb-82 1303-EST +Date: 15 Feb 1982 20:11 EST +From: Charles E. Leiserson +To: RIVEST at MIT-ML, MEYER at MIT-ML, FLAVIO at MIT-ML, + BENNY at MIT-ML, BHATT at MIT-ML, gjs at MIT-AI, lance at MIT-AI, + Reynolds at RAND-AI, bentley at CMU-10A, pinter at MIT-MC +Subject: Do not break this chain or your machine may crash! +Redistributed-To: d4-vlsi-meeting@BBN-UNIX,card-sharks@BBN-UNIX +Redistributed-By: tony lake +Redistributed-Date: 16 Feb 1982 12:55:34 EST (Tuesday) + + Mail-from: ARPANET site CMU-10A rcvd at 15-Feb-82 1337-EST + Mail-Created: 13 Feb 1982 1920-EST by SHULMAN + Date: 13 Feb 1982 1920-EST + From: Jeffrey Shulman + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith + Remailed-date: 13 Feb 1982 2002-EST + Remailed-from: Rob Liebschutz + Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at +RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS + Via: RUTGERS; 13 Feb 1982 2000-EST + Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A + Remailed-From: Dave Touretzky at CMU-10A + Remailed-Date: 13 February 1982 2009-EST + Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST + Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A + Remailed-From: Craig Everhart at CMU-10A + Remailed-Date: Sunday, 14 February 1982 0015-EST + Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + Remailed-To: Pradeep Sindhu at CMU-10A, John Ousterhout at CMU-10A, + Elizabeth Rentmeesters at CMU-10A, + Charles Leiserson at CMU-10A + Remailed-From: Thomas Rodeheffer at CMU-10A (C410TR30) + Remailed-Date: Monday, 15 February 1982 1142-EST + Via: C410TR30 at CMU-10A; 15 Feb 1982 1220-EST + + Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 + Date: Saturday, 13 February 1982 18:59-EST + From: Laz Munoz + To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN + Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your +machine may crash]] + + Date: Saturday, 13 February 1982 18:43-EST + From: C. Greg Hagerty + To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN + Re: [animal@mit-ml: do not break this chain or your machine may crash] + + Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST + Date: 13 February 1982 13:55-EST + From: animal@mit-ml + Sender: ANIMAL at MIT-AI + Subject: do not break this chain or your machine may crash + To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS + cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + + Date: 10 Feb 1982 1937-EST + From: Randy Haskins + Subject: Pass it on + To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn + cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese + Remailed-date: 12 Feb 1982 1217-EST + Remailed-from: J. Scott Hamilton + Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS + Remailed-date: 12 Feb 1982 1416-EST + Remailed-from: Joe Frisbie + Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, +net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at +MIT-DMS, + uc.rdz, uc.plj, uc.rpk + Remailed-date: 12 Feb 1982 2257-EST + Remailed-from: Jon A. Rochlis + Remailed-to: EECS-Hackers: ; + Remailed-date: 12 Feb 1982 2300-EST + Remailed-from: J. Scott Hamilton + Remailed-to: Wizards: ; + Remailed-date: 12 Feb 1982 2351-EST + + Trust in the LORD with all your heart and HE will acknowledge + and HE will light the way. + + + This prayer has been sent to you for good luck. The original + copy is from the Netherlands. It has been around the world + nine times. The luck has now been brought to you. You will + receive good luck within four days of receiving this letter, + provided in turn, you send it back out. DO NOT SEND MONEY, FOR + FAITH HAS NO PRICE. Do not keep this letter. It must leave your + hands within 96 hours after you receive it. An RAF officer + received $70,000. Joe Ellito received $450,000 and lost it + because he broke the chain. While in the Phillipines, General + Welch lost his wife four days after he received this letter. He + failed to circulate the prayer. However, before his death, he + received $775,000. Please send 20 copies and see what happens + to you on the fourth day. This chain comes from Venezuela, and + was written by Saul Anthony deOziof, a missionary from South + America. I, myself, forward it to you. Since the chain must + make the tour of the world, you must make 20 identical copies + to this one. Sned it to your friends, parents, or associates. + After a few days you will get a suprise. This is true even + if you are not superstitious. Take note of the following. + Constantine Dino received the chain in 1953. He asked + his secretary to make 20 copies and send them. A few days later, + he won a lottery for $2,000,000 in his country. Carlo Caditt, + an office employee, received the chain. He forgot it and a few + days later he lost his job. He found the chain letter and sent + it to 20 people. Five days later he got an even better job. + Dolon Fairchild received the chain and not believing it, threw + it away. Nine days later he died. For no reason whatsoever should + this chain be broken. Remember, SEND NO MONEY. + + + Please do not ignore this. IT WORKS! + ------- + + -------------------- +End forwarded message + + +Date: 16 Feb 1982 16:32 PST +From: Fikes at PARC-MAXC +Subject: Open at Once; Time Sensitive +To: Robson, + Brachman@sri-kl,Levesque@sri-kl,bobrow,malone,briansmith,burton,stefik, + waldinger@sri-kl,williams,betsey,weyer,ingalls,cohen,lindsay,kaplan,mann, + mark@isi +cc: fikes + +Don't dispair. Read on. + +--------------------------- + +Date: 16 Feb 1982 14:35 PST +From: Orr at PARC-MAXC +Subject: A quaint folk ritual . . . +To: Brotz, Putman, Swager, Boynton, Collett, MSHunter@USC-ISIB, TMAnley.ES, + Cucinitti, Suchman, AHenderson, Fikes, Reid@Shasta at Sumex-AIM, Stone, + Sargent, Casey, GWilliams, Mallory, Mulhern, Warner, McElyea +cc: + +Ah, folklore . . . Maybe this is what's choking Cabernet today . . . + +--------------------------- + +Date: 16 Feb 1982 11:50 PST +From: kolling at PARC-MAXC +Subject: One good turn deserves another +To: atkinson, gnelson, lknutsen, sturgis, taft, taylor, lrc.hjjh at UTexas-20, + CSVAX.upstill at Berkeley +cc: kolling + + +Mail-from: Arpanet host OFFICE-2 rcvd at 16-FEB-82 1036-PST +Date: 16 Feb 1982 1012-PST +From: Jwagner at OFFICE +Subject: sent to 20@random -- please read -- a surprise +To: BANDY at MIT-AI, ZEVE at RUTGERS, ZELLICH at OFFICE-3, +To: APPLE at MIT-MC, FFM at MIT-MC, CCH at MIT-MC, +To: GEOFF at SRI-CSL, REM at MIT-MC, BILL at SRI-KL, +To: MERRITT at USC-ISIB, AGRE at MIT-AI, LAMSON at MIT-MULTICS, +To: SUE at BRL, KOLLING at PARC-MAXC, CUTTER at MIT-AI, +To: LAUREN at UCLA-SECURITY, CJH at CCA-UNIX, GEOFF at SRI-CSL, +To: ITTA at MIT-MC, ROODE at SRI-KL, DRCPM-SC at OFFICE-7 + +Date: 16 Feb 1982 0005-PST +From: Kleiser +Subject: please read this +To: Oad Staff: +cc: skahn at SRI-KL, lynch at USC-ISIB + +Date: 15 Feb 1982 2349-PST +From: Daul +Subject: amazing message +To: kleiser, kelley +cc: g.bets at SU-SCORE, ADMIN.KNIGHT at SU-SCORE + +Mail from MIT-ML rcvd at 15-Feb-82 2301-PST +Date: 15 Feb 1982 16:19:12-PST +From: mo at LBL-UNIX (Mike O'Dell [system]) +To: msggroup at mit-ai +Cc: +Subject: Nominee for most amazing message ever seen + + +If this little gem doesn't break you mail reader, you are in good shape! + +------- Forwarded Message + +Date: 15 Feb 1982 1500-PST (Monday) +From: jef +To: 20-people@RANDOM-NET +Subject: the following strange message... +Cc: Almquist@CMU-20C, BYRNE@CMU-20C, CSTNBL@MIT-MC, +D.michael@BERKELEY, + ELM@CMU-20C, FISH@MIT-MC, FURST@MIT-MC, Inners@CMU-20C, +Lammert@CMU-20C, + Lomicka@CMU-20C, MJA@CMU-20C, REM@MIT-MC, Schwartz@CMU-20C, +a.slither@BERKELEY, + csvax.DRB@BERKELEY, geoff@SRI-CSL, jacobson, leres, mo, vern + +--- Begin Forwarded Message --- +>From Andrea.Michaels@CMU-10A Mon Feb 15 09:08:14 1982 +Received: Network mail from host MIT-MC for jef on Mon Feb 15 09:07:11 1982 +Date: 14 February 1982 1115-EST (Sunday) +From: Andrea.Michaels at CMU-10A +To: Suzanna.Garreau at CMU-10A, bh at mit-ai, teitz at parc-maxc, + nelson at parc-maxc, +Subject: this is ridiculous, i do not know why i am bothering! +CC: Merrick.Furst at CMU-10A, Mark.Wright at CMU-10A, Brad.Allen at +CMU-10A, + strohm@cmu-780g at CMU-10A, judy rosenberg at CMU-10A, + Steven.Minton at CMU-10A, Bruce.Lucas at CMU-10A, + Richard.Korf at CMU-10A, Betsy.Herk at CMU-10A, + Jim.Gasbarro at CMU-10A, cynthia hibbard at CMU-10A, + sylvia hoy at CMU-10A, sharon burks at CMU-10A, + Glenda.Childress at CMU-10A, dale miller at CMU-10A, + dale moore at CMU-10A +Message-Id: <14Feb82 111506 AM06@CMU-10A> +Origin: C425AM06 at CMU-10A; 14 Feb 1982 1118-EST +Remailed-To: aqe at MIT-MC +Remailed-From: Dale.Moore at CMU-10A +Remailed-Date: Monday, 15 February 1982 1105-EST + + +- - - - Begin forwarded message - - - - +Mail-Created: 13 Feb 1982 1920-EST by SHULMAN +Date: 13 Feb 1982 1920-EST +From: Jeffrey Shulman +Subject: [Laz Munoz : [HAGERTY: [animal@mit-ml: do not +break this chain or your machine may crash]]] +To: dsmith, mitchell, roach, levy, hedrick, prspool, nagel, kastner, + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith +Remailed-date: 13 Feb 1982 2002-EST +Remailed-from: Rob Liebschutz +Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS +Via: RUTGERS; 13 Feb 1982 2000-EST +Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A +Remailed-From: Dave Touretzky at CMU-10A +Remailed-Date: 13 February 1982 2009-EST +Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST +Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A +Remailed-From: Craig Everhart at CMU-10A +Remailed-Date: Sunday, 14 February 1982 0015-EST +Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + +Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 +Date: Saturday, 13 February 1982 18:59-EST +From: Laz Munoz +To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN +Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your machine +may crash]] + +Date: Saturday, 13 February 1982 18:43-EST +From: C. Greg Hagerty +To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN +Re: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - End forwarded message - - - - + + + + +------- End of Forwarded Message +------- +------- +End of forwarded mail +------- +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ +Date: 16 Feb 1982 18:58 PST +From: Horning at PARC-MAXC +Subject: Re: A double chain. Don't break it. +In-reply-to: Bobrow's message of 16 Feb 1982 18:26 PST +To: Bobrow +cc: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein +Reply-To: Horning + +Danny, + +The first time I saw this message today, I thought it was kinda funny, but I +foresaw trouble in a finite universe of potential recipients. + +This just could become known as the message that led to the institution of +postage charges for electronic mail. + +Jim H. + + +------------------------------------------------------------ + +------------------------------------------------------------ + + +Date: 1 Mar 1982 15:28 EST +From: Ziobro.Henr at PARC-MAXC +Subject: Boy I sure don't want my machine to crash V.1 +In-reply-to: Keesom.Wbst's message of 24 Feb. 1982 3:50 pm EST (Wednesday) +To: Keesom.Wbst +cc: Marshall.WBST,Bobrow at PARC-MAXC,RUSTY at BBND,Charles E. Leiserson + +cc: Jeffrey Shulman +cc: Rob Liebschutz +cc: Dave Touretzky at CMU-10A +cc: Craig Everhart at CMU-10A +cc: Thomas Rodeheffer at CMU-10A (C410TR30) +cc: MUNOZ@GREEN +cc: Rob Liebschutz +cc: C. Greg Hagerty +cc: ANIMAL at MIT-AI +cc: G.HAMMY at MIT-EECS +cc: Fikes at PARC-MAXC +cc: Orr at PARC-MAXC +cc: kolling at PARC-MAXC +cc: Jwagner at OFFICE +cc: mo at LBL-UNIX +cc: Andrea.Michaels@CMU-10A +cc: SHULMAN at RUTGERS + + Just in case you folks were wondering how far your message got. May I +suggest sending 5 copies back to the originators of the message. I'm sure that +will bring megabytes of good luck. + + This is message 1 of 5. + + //Z\\ +------------------------------------------- +Date: 24 Feb. 1982 3:50 pm EST (Wednesday) +From: Keesom.Wbst +Subject: chains +To: Wegeng.WBST,ziobro.henr +cc: + +Don, + +And you thought your version was bad, here is a version that has clogged up +the net. + +Henk + +--------------------------- + +Date: 22 Feb. 1982 2:12 pm EST (Monday) +From: Marshall.WBST +Subject: Good luck +To: Baroody.WBST, Beh.WBST, Bernard.WBST, Blanchard.WBST, CParker.WBST, + Dattola.WBST, DMurray.WBST, Harrington.WBST, Keesom.Wbst, LJMiller.WBST, + Low.Wbst, Sauvain.WBST, Shoots.Wbst, Butler, Moreland, Allen, Axelrod, + Wayman, Norder, Waal +Reply-To: Marshall + +CoveringMessage + +--------------------------- + +Date: 16 Feb 1982 18:26 PST +From: Bobrow at PARC-MAXC +Subject: A double chain. Don't break it. +To: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein + + +CoveringMessage + +Mail-from: Arpanet host BBND rcvd at 16-FEB-82 1155-PST +Date: 16 Feb 1982 1454-EST +Sender: RUSTY at BBND +Subject: A Chain of Bits! +Subject: [Charles E. Leiserson : Do not break this c...] +From: RUSTY at BBND +To: PBRINKMAN at BBNA, BGOODMAN at BBND, GREENFELD at BBND, +To: GRIGNETTI at BBND, DISRAEL at BBND, LARKIN at BBNG, +To: SCHMOLZE at BBND, SELFRIDGE at BBND, SIDNER at BBND, +To: BSTARR at BBNA, SUSSMAN at BBNA, VITTAL at BBNG, +To: WEBSTER at BBND, YONKE at BBND, ZDYBEL at BBND, +To: BOBROW at PARC, RBRACHMAN at SRI-KL, WEISCHEDEL at UDEL, +To: LEVESQUE at SRI-KL, DONAGHEY at BBNA, TOBIASON at BBND +Message-ID: <[BBND]16-Feb-82 14:54:23.RUSTY> + + +Begin forwarded message +Mail-From: BBNQ +Received-Date: 16-Feb-82 1303-EST +Date: 15 Feb 1982 20:11 EST +From: Charles E. Leiserson +To: RIVEST at MIT-ML, MEYER at MIT-ML, FLAVIO at MIT-ML, + BENNY at MIT-ML, BHATT at MIT-ML, gjs at MIT-AI, lance at MIT-AI, + Reynolds at RAND-AI, bentley at CMU-10A, pinter at MIT-MC +Subject: Do not break this chain or your machine may crash! +Redistributed-To: d4-vlsi-meeting@BBN-UNIX,card-sharks@BBN-UNIX +Redistributed-By: tony lake +Redistributed-Date: 16 Feb 1982 12:55:34 EST (Tuesday) + + Mail-from: ARPANET site CMU-10A rcvd at 15-Feb-82 1337-EST + Mail-Created: 13 Feb 1982 1920-EST by SHULMAN + Date: 13 Feb 1982 1920-EST + From: Jeffrey Shulman + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith + Remailed-date: 13 Feb 1982 2002-EST + Remailed-from: Rob Liebschutz + Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at +RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS + Via: RUTGERS; 13 Feb 1982 2000-EST + Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A + Remailed-From: Dave Touretzky at CMU-10A + Remailed-Date: 13 February 1982 2009-EST + Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST + Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A + Remailed-From: Craig Everhart at CMU-10A + Remailed-Date: Sunday, 14 February 1982 0015-EST + Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + Remailed-To: Pradeep Sindhu at CMU-10A, John Ousterhout at CMU-10A, + Elizabeth Rentmeesters at CMU-10A, + Charles Leiserson at CMU-10A + Remailed-From: Thomas Rodeheffer at CMU-10A (C410TR30) + Remailed-Date: Monday, 15 February 1982 1142-EST + Via: C410TR30 at CMU-10A; 15 Feb 1982 1220-EST + + Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 + Date: Saturday, 13 February 1982 18:59-EST + From: Laz Munoz + To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN + Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your +machine may crash]] + + Date: Saturday, 13 February 1982 18:43-EST + From: C. Greg Hagerty + To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN + Re: [animal@mit-ml: do not break this chain or your machine may crash] + + Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST + Date: 13 February 1982 13:55-EST + From: animal@mit-ml + Sender: ANIMAL at MIT-AI + Subject: do not break this chain or your machine may crash + To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS + cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + + Date: 10 Feb 1982 1937-EST + From: Randy Haskins + Subject: Pass it on + To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn + cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese + Remailed-date: 12 Feb 1982 1217-EST + Remailed-from: J. Scott Hamilton + Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS + Remailed-date: 12 Feb 1982 1416-EST + Remailed-from: Joe Frisbie + Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, +net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at +MIT-DMS, + uc.rdz, uc.plj, uc.rpk + Remailed-date: 12 Feb 1982 2257-EST + Remailed-from: Jon A. Rochlis + Remailed-to: EECS-Hackers: ; + Remailed-date: 12 Feb 1982 2300-EST + Remailed-from: J. Scott Hamilton + Remailed-to: Wizards: ; + Remailed-date: 12 Feb 1982 2351-EST + + Trust in the LORD with all your heart and HE will acknowledge + and HE will light the way. + + + This prayer has been sent to you for good luck. The original + copy is from the Netherlands. It has been around the world + nine times. The luck has now been brought to you. You will + receive good luck within four days of receiving this letter, + provided in turn, you send it back out. DO NOT SEND MONEY, FOR + FAITH HAS NO PRICE. Do not keep this letter. It must leave your + hands within 96 hours after you receive it. An RAF officer + received $70,000. Joe Ellito received $450,000 and lost it + because he broke the chain. While in the Phillipines, General + Welch lost his wife four days after he received this letter. He + failed to circulate the prayer. However, before his death, he + received $775,000. Please send 20 copies and see what happens + to you on the fourth day. This chain comes from Venezuela, and + was written by Saul Anthony deOziof, a missionary from South + America. I, myself, forward it to you. Since the chain must + make the tour of the world, you must make 20 identical copies + to this one. Sned it to your friends, parents, or associates. + After a few days you will get a suprise. This is true even + if you are not superstitious. Take note of the following. + Constantine Dino received the chain in 1953. He asked + his secretary to make 20 copies and send them. A few days later, + he won a lottery for $2,000,000 in his country. Carlo Caditt, + an office employee, received the chain. He forgot it and a few + days later he lost his job. He found the chain letter and sent + it to 20 people. Five days later he got an even better job. + Dolon Fairchild received the chain and not believing it, threw + it away. Nine days later he died. For no reason whatsoever should + this chain be broken. Remember, SEND NO MONEY. + + + Please do not ignore this. IT WORKS! + ------- + + -------------------- +End forwarded message + + +Date: 16 Feb 1982 16:32 PST +From: Fikes at PARC-MAXC +Subject: Open at Once; Time Sensitive +To: Robson, + Brachman@sri-kl,Levesque@sri-kl,bobrow,malone,briansmith,burton,stefik, + waldinger@sri-kl,williams,betsey,weyer,ingalls,cohen,lindsay,kaplan,mann, + mark@isi +cc: fikes + +Don't dispair. Read on. + +--------------------------- + +Date: 16 Feb 1982 14:35 PST +From: Orr at PARC-MAXC +Subject: A quaint folk ritual . . . +To: Brotz, Putman, Swager, Boynton, Collett, MSHunter@USC-ISIB, TMAnley.ES, + Cucinitti, Suchman, AHenderson, Fikes, Reid@Shasta at Sumex-AIM, Stone, + Sargent, Casey, GWilliams, Mallory, Mulhern, Warner, McElyea +cc: + +Ah, folklore . . . Maybe this is what's choking Cabernet today . . . + +--------------------------- + +Date: 16 Feb 1982 11:50 PST +From: kolling at PARC-MAXC +Subject: One good turn deserves another +To: atkinson, gnelson, lknutsen, sturgis, taft, taylor, lrc.hjjh at UTexas-20, + CSVAX.upstill at Berkeley +cc: kolling + + +Mail-from: Arpanet host OFFICE-2 rcvd at 16-FEB-82 1036-PST +Date: 16 Feb 1982 1012-PST +From: Jwagner at OFFICE +Subject: sent to 20@random -- please read -- a surprise +To: BANDY at MIT-AI, ZEVE at RUTGERS, ZELLICH at OFFICE-3, +To: APPLE at MIT-MC, FFM at MIT-MC, CCH at MIT-MC, +To: GEOFF at SRI-CSL, REM at MIT-MC, BILL at SRI-KL, +To: MERRITT at USC-ISIB, AGRE at MIT-AI, LAMSON at MIT-MULTICS, +To: SUE at BRL, KOLLING at PARC-MAXC, CUTTER at MIT-AI, +To: LAUREN at UCLA-SECURITY, CJH at CCA-UNIX, GEOFF at SRI-CSL, +To: ITTA at MIT-MC, ROODE at SRI-KL, DRCPM-SC at OFFICE-7 + +Date: 16 Feb 1982 0005-PST +From: Kleiser +Subject: please read this +To: Oad Staff: +cc: skahn at SRI-KL, lynch at USC-ISIB + +Date: 15 Feb 1982 2349-PST +From: Daul +Subject: amazing message +To: kleiser, kelley +cc: g.bets at SU-SCORE, ADMIN.KNIGHT at SU-SCORE + +Mail from MIT-ML rcvd at 15-Feb-82 2301-PST +Date: 15 Feb 1982 16:19:12-PST +From: mo at LBL-UNIX (Mike O'Dell [system]) +To: msggroup at mit-ai +Cc: +Subject: Nominee for most amazing message ever seen + + +If this little gem doesn't break you mail reader, you are in good shape! + +------- Forwarded Message + +Date: 15 Feb 1982 1500-PST (Monday) +From: jef +To: 20-people@RANDOM-NET +Subject: the following strange message... +Cc: Almquist@CMU-20C, BYRNE@CMU-20C, CSTNBL@MIT-MC, +D.michael@BERKELEY, + ELM@CMU-20C, FISH@MIT-MC, FURST@MIT-MC, Inners@CMU-20C, +Lammert@CMU-20C, + Lomicka@CMU-20C, MJA@CMU-20C, REM@MIT-MC, Schwartz@CMU-20C, +a.slither@BERKELEY, + csvax.DRB@BERKELEY, geoff@SRI-CSL, jacobson, leres, mo, vern + +--- Begin Forwarded Message --- +>From Andrea.Michaels@CMU-10A Mon Feb 15 09:08:14 1982 +Received: Network mail from host MIT-MC for jef on Mon Feb 15 09:07:11 1982 +Date: 14 February 1982 1115-EST (Sunday) +From: Andrea.Michaels at CMU-10A +To: Suzanna.Garreau at CMU-10A, bh at mit-ai, teitz at parc-maxc, + nelson at parc-maxc, +Subject: this is ridiculous, i do not know why i am bothering! +CC: Merrick.Furst at CMU-10A, Mark.Wright at CMU-10A, Brad.Allen at +CMU-10A, + strohm@cmu-780g at CMU-10A, judy rosenberg at CMU-10A, + Steven.Minton at CMU-10A, Bruce.Lucas at CMU-10A, + Richard.Korf at CMU-10A, Betsy.Herk at CMU-10A, + Jim.Gasbarro at CMU-10A, cynthia hibbard at CMU-10A, + sylvia hoy at CMU-10A, sharon burks at CMU-10A, + Glenda.Childress at CMU-10A, dale miller at CMU-10A, + dale moore at CMU-10A +Message-Id: <14Feb82 111506 AM06@CMU-10A> +Origin: C425AM06 at CMU-10A; 14 Feb 1982 1118-EST +Remailed-To: aqe at MIT-MC +Remailed-From: Dale.Moore at CMU-10A +Remailed-Date: Monday, 15 February 1982 1105-EST + + +- - - - Begin forwarded message - - - - +Mail-Created: 13 Feb 1982 1920-EST by SHULMAN +Date: 13 Feb 1982 1920-EST +From: Jeffrey Shulman +Subject: [Laz Munoz : [HAGERTY: [animal@mit-ml: do not +break this chain or your machine may crash]]] +To: dsmith, mitchell, roach, levy, hedrick, prspool, nagel, kastner, + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith +Remailed-date: 13 Feb 1982 2002-EST +Remailed-from: Rob Liebschutz +Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at +RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS +Via: RUTGERS; 13 Feb 1982 2000-EST +Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A +Remailed-From: Dave Touretzky at CMU-10A +Remailed-Date: 13 February 1982 2009-EST +Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST +Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A +Remailed-From: Craig Everhart at CMU-10A +Remailed-Date: Sunday, 14 February 1982 0015-EST +Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + +Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 +Date: Saturday, 13 February 1982 18:59-EST +From: Laz Munoz +To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN +Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your machine +may crash]] + +Date: Saturday, 13 February 1982 18:43-EST +From: C. Greg Hagerty +To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN +Re: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - End forwarded message - - - - + + + + +------- End of Forwarded Message +------- +------- +End of forwarded mail +------- +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ + +------------------------------------------------------------ +Date: 16 Feb 1982 18:58 PST +From: Horning at PARC-MAXC +Subject: Re: A double chain. Don't break it. +In-reply-to: Bobrow's message of 16 Feb 1982 18:26 PST +To: Bobrow +cc: Hausladen, stefik, boriello, paeth, orr, rovner, brown, mbrown, Ahenderson, + conway, horning, woods@BBND, norman@NPRDC, burstall, hthompson, Kay, + burton, grignetti@BBN, kim.wilensky@berkeley, marshall.WBST, Guttag at + mit-xx, Klein +Reply-To: Horning + +Danny, + +The first time I saw this message today, I thought it was kinda funny, but I +foresaw trouble in a finite universe of potential recipients. + +This just could become known as the message that led to the institution of +postage charges for electronic mail. + +Jim H. + + +------------------------------------------------------------ + +------------------------------------------------------------ + + +Date: 25 Feb 82 16:10:37-EST (Thu) +From: Joycee at BRL +To: animal at mit-ai +Subject: [Louise Leonard : Keeping the Ball Rolling] + +HEY!! Did you lose this?! We found it on our terminals and +we ALWAYS return lost property. + +----- Forwarded message # 1: + + + + +Date: 19 Feb 82 16:01:37-EST (Fri) +From: Louise Leonard (VLD) +To: joycee at Brl, roslyn at Brl, kitty at Brl, natica at Brl +Subject: Keeping the Ball Rolling + +This is mail without a purpose, except to drive a sane person +crazy. I hope you enjoy this more than I did. + + +----- Forwarded message # 1: + +Date: 18 Feb 82 9:25:55-EST (Thu) +From: John R. Anderson (VLD) +To: louise at Brl +Subject: GOOD LUCK !!! + + Send a copy of this to earl and karen. + +----- Forwarded message # 1: + +Date: 17 Feb 82 9:13:57-EST (Wed) +From: Earl at BRL +To: karen at BRL, rodin at BRL, dpk at BRL, vogel at BRL, jra at BRL + , gil at BRL, kinch at BRL, keller at BRL, gary at BRL, bah at BRL +Via: Brl-Bmd; 17 Feb 82 9:26-EDT + +, hawk at BRL, tyler at BRL, gfa at BRL, skip at BRL, mark at BRL +, nancy at BRL, lapoint at BRL +Subject: Superstitious? + + +----- Forwarded message # 1: + +Date: 16 Feb 82 18:58:57-EST (Tue) +From: Michael Muuss +To: PHD at Brl-Bmd, Kermit at Brl-Bmd, Moss at Brl-Bmd, BobS at Brl-Bmd, + Earl at Brl-Bmd, PNH at Mit-Ai, Jaws at Mit-Mc +cc: Greig at Nswc-Wo +Subject: [Mike O'Dell [sy: Nominee for most amazing message ever seen] + + +----- Forwarded message # 1: + +Date: 15 Feb 1982 16:19:12-PST +From: mo at LBL-UNIX (Mike O'Dell [system]) +To: msggroup at mit-ai +Cc: +Subject: Nominee for most amazing message ever seen +Via: Mit-Ml; 16 Feb 82 1:55-EDT +Via: Brl; 16 Feb 82 16:52-EDT + + +If this little gem doesn't break you mail reader, you are in good shape! + +------- Forwarded Message + +Date: 15 Feb 1982 1500-PST (Monday) +From: jef +To: 20-people@RANDOM-NET +Subject: the following strange message... +Cc: Almquist@CMU-20C, BYRNE@CMU-20C, CSTNBL@MIT-MC, D.michael@BERKELEY, + ELM@CMU-20C, FISH@MIT-MC, FURST@MIT-MC, Inners@CMU-20C, Lammert@CMU-20C, + Lomicka@CMU-20C, MJA@CMU-20C, REM@MIT-MC, Schwartz@CMU-20C, a.slither@BERKELEY, + csvax.DRB@BERKELEY, geoff@SRI-CSL, jacobson, leres, mo, vern + +--- Begin Forwarded Message --- +>From Andrea.Michaels@CMU-10A Mon Feb 15 09:08:14 1982 +Received: Network mail from host MIT-MC for jef on Mon Feb 15 09:07:11 1982 +Date: 14 February 1982 1115-EST (Sunday) +From: Andrea.Michaels at CMU-10A +To: Suzanna.Garreau at CMU-10A, bh at mit-ai, teitz at parc-maxc, + nelson at parc-maxc, +Subject: this is ridiculous, i do not know why i am bothering! +CC: Merrick.Furst at CMU-10A, Mark.Wright at CMU-10A, Brad.Allen at CMU-10A, + strohm@cmu-780g at CMU-10A, judy rosenberg at CMU-10A, + Steven.Minton at CMU-10A, Bruce.Lucas at CMU-10A, + Richard.Korf at CMU-10A, Betsy.Herk at CMU-10A, + Jim.Gasbarro at CMU-10A, cynthia hibbard at CMU-10A, + sylvia hoy at CMU-10A, sharon burks at CMU-10A, + Glenda.Childress at CMU-10A, dale miller at CMU-10A, + dale moore at CMU-10A +Message-Id: <14Feb82 111506 AM06@CMU-10A> +Origin: C425AM06 at CMU-10A; 14 Feb 1982 1118-EST +Remailed-To: aqe at MIT-MC +Remailed-From: Dale.Moore at CMU-10A +Remailed-Date: Monday, 15 February 1982 1105-EST + + +- - - - Begin forwarded message - - - - +Mail-Created: 13 Feb 1982 1920-EST by SHULMAN +Date: 13 Feb 1982 1920-EST +From: Jeffrey Shulman +Subject: [Laz Munoz : [HAGERTY: [animal@mit-ml: do not break this chain or your machine may crash]]] +To: dsmith, mitchell, roach, levy, hedrick, prspool, nagel, kastner, + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith +Remailed-date: 13 Feb 1982 2002-EST +Remailed-from: Rob Liebschutz +Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS +Via: RUTGERS; 13 Feb 1982 2000-EST +Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A +Remailed-From: Dave Touretzky at CMU-10A +Remailed-Date: 13 February 1982 2009-EST +Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST +Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A +Remailed-From: Craig Everhart at CMU-10A +Remailed-Date: Sunday, 14 February 1982 0015-EST +Via: C410CE10 at CMU-10A; 14 Feb 1982 0016-EST + +Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 +Date: Saturday, 13 February 1982 18:59-EST +From: Laz Munoz +To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN +Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your machine may crash]] + +Date: Saturday, 13 February 1982 18:43-EST +From: C. Greg Hagerty +To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN +Re: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - End forwarded message - - - - + + + + +------- End of Forwarded Message + + +----- End of forwarded messages + +----- End of forwarded messages + + +----- End of forwarded messages + +----- End of forwarded messa + +----- End of forwarded messages + + +Date: 22 Feb 1982 0132-EST +From: Hobbit +Subject: Praise the Lawd!! +To: Junk Recipients: ; + + +... and since *when* is the Arpanet for the distribution +of religious propaganda???? + +_H* +------- + + +Date: 20 Feb 1982 2147-PST +From: Richard Salas +Subject: Re: do not break this chain or your machine may crash +To: animal at MIT-ML +In-Reply-To: Your message of 13-Feb-82 1055-PST + +20-Feb-82 21:47:00-PST,3607;000000000000 +Date: 20 Feb 1982 2146-PST +From: Richard Salas +Subject: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1058-PST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! + +------- +------- +------- +------- + +Date: 19 February 1982 21:09-EST +From: Joseph D. Turner +Subject: Chain letter +To: JWagner at OFFICE-2 +cc: ANIMAL at MIT-MC + +Hello. + Today I recieved my "chain letter". + Now, normally, I appreciate mail from people I don't know. + However, this chain letter was a great dissapointment. + Not only is it misuse of government funds, for which the entire +forwarding list on the letter could be fined and imprisoned, but +half the machines it was sent to djust *don't* have the disk space +(including MIT-AI). + What that chain letter was was childish, wasteful, boring, and +irritating. I would like to know *where* you got my name, and +*why* you put it on the letter. Furthermore, I would request +that you send another letter to the twenty people you sent it +to saying *not* to reforward it. I myself am not forwarding it, +and am saving it on my disk in case I fel like gettign the fools +and twits (yourself included) who did this thing. + + Shade and Sweet Water, + Joseph D. Turner + + + +Date: 19 Feb 1982 1100-EST +From: Dave King +To: SHULMAN at RUTGERS, LIEBSCHUTZ at RUTGERS, HAGERTY at RUTGERS, + ANIMAL at MIT-ML +Subject: [BAIRD at CMU-20C: [Jeffrey Shulman : [Laz Munoz : [HAGERTY: [animal@mit-ml: do not break this chain or your machine may crash]]]]] +Message-ID: <820118110053KING@CMU-20C> + +- - - - - - - Begin message from: BAIRD at CMU-20C +Date: 14 Feb 1982 1315-EST +From: BAIRD at CMU-20C +To: cunNIUS at CMU-20C, elkIND at CMU-20C, eppINGER at CMU-20C, + engELSIEPEN at CMU-20C, hisgEN at CMU-20C, king at CMU-20C, + duane at CMU-20C, mbj at CMU-20C +Subject: [Jeffrey Shulman : [Laz Munoz : [HAGERTY: [animal@mit-ml: do not break this chain or your machine may crash]]]] + +- - - - - - - Begin message from: ZSARNAY at CMU-20C +Date: 14 Feb 1982 0412-EST +From: ZSARNAY at CMU-20C +To: Accetta at CMUA, Alleva at CMUA, Philips at CMUA, Nedved at CMUA, + GM0W at CMU-20C, Baird at CMU-20C, Wertz at CMUA +Subject: [Jeffrey Shulman : [Laz Munoz : [HAGERTY: [animal@mit-ml: do not break this chain or your machine may crash]]]] + +- - - - - - - Begin message from: Jeffrey Shulman +Mail from CMU-10A rcvd at 14-Feb-82 0019-EST +Mail-Created: 13 Feb 1982 1920-EST by SHULMAN +Date: 13 Feb 1982 1920-EST +From: Jeffrey Shulman +Subject: [Laz Munoz : [HAGERTY: [animal@mit-ml: do not break this chain or your machine may crash]]] +To: dsmith, mitchell, roach, levy, hedrick, prspool, nagel, kastner, + utgoff, cs.applewhite at UTEXAS-20, liebSCHUTZ, sietz, weinrich, + gabinelli, steinberg, schooLEY, kedar-cabelli at RU-GREEN, kelly, + rgsmith +Remailed-date: 13 Feb 1982 2002-EST +Remailed-from: Rob Liebschutz +Remailed-to: Thompson at RUTGERS, Platoff at RU-GREEN at RUTGERS, + Peticolas at RU-GREEN at RUTGERS, Watrous at RUTGERS, Pleasant at RUTGERS, + G.Gold at SU-SCORE, Libes at RUTGERS, Touretzky at CMU-10A, + Jsol at USC-ECLB, Rinehart at RUTGERS, Leone at RU-GREEN at RUTGERS, + Hird at RU-GREEN at RUTGERS, Turock at RU-GREEN at RUTGERS, + Stillman at RU-GREEN at RUTGERS, Zeve at RU-GREEN at RUTGERS, + Evans at RU-GREEN at RUTGERS, Bank at RU-GREEN at RUTGERS, + Gprice at RU-GREEN at RUTGERS, Marantz at RUTGERS, + Magill at RU-GREEN at RUTGERS +Via: RUTGERS; 13 Feb 1982 2000-EST +Remailed-To: Gail Kaiser at CMU-10A, Aaron Wohl at CMU-10A, + Peter Schwarz at CMU-10A, + Craig Everhart at CMU-10A, Joe Newcomer at CMU-10A, + Rick Gumpertz at CMU-10A +Remailed-From: Dave Touretzky at CMU-10A +Remailed-Date: 13 February 1982 2009-EST +Via: C410DT50 at CMU-10A; 13 Feb 1982 2009-EST +Remailed-To: Lawrence Butcher at CMU-10A, Mike Kazar at CMU-10A, + David Nichols at CMU-10A, Philip Lehman at CMU-10A, + Bob Walker at CMU-10A, James Saxe at CMU-10A, + Carolyn Councill at CMU-10A, + Anne Rogers at CMU-10A, James Gosling at CMU-10A, + Brian Reid at CMU-10A, Andrea Michaels at CMU-10A, + Paul Hilfinger at CMU-10A, John Zsarnay at CMU-10A, + Beth Bottos at CMU-10A, Catherine Cole at CMU-10A, + Thomas Rodeheffer at CMU-10A, + Connie Gormley at CMU-10A, Mark Zaremsky at CMU-10A +Remailed-From: Craig Everhart at CMU-10A +Remailed-Date: Sunday, 14 February 1982 0015-EST + +Mail-From: MUNOZ@GREEN created at 13-Feb-82 19:00:45 +Date: Saturday, 13 February 1982 18:59-EST +From: Laz Munoz +To: swhite at GREEN, ssmith at GREEN, zoback at GREEN, seitz at GREEN, + selinger at GREEN, shulman at GREEN, kiesche at GREEN, + fischer at GREEN +Subject: [HAGERTY: [animal@mit-ml: do not break this chain or your machine may crash]] + +Date: Saturday, 13 February 1982 18:43-EST +From: C. Greg Hagerty +To: rcarter at RU-GREEN, rohlfs at RU-GREEN, laird at RU-GREEN, + munoz at RU-GREEN, joseph at RU-GREEN, tobin at RU-GREEN, + borkman at RU-GREEN, newcomb at RU-GREEN, gilroy at RU-GREEN, + gaal at RU-GREEN, Albin at RU-GREEN, Boehm at RU-GREEN, + Cretsinger at RU-GREEN, furman at RU-GREEN, horn at RU-GREEN, + josh at RU-GREEN, latzko at RU-GREEN, naberschnig at RU-GREEN, + pichnarczyk at RU-GREEN, silber at RU-GREEN, laidlaw at RU-GREEN +Re: [animal@mit-ml: do not break this chain or your machine may crash] + +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1416-EST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - - - - End forwarded message +------- +- - - - - - - End forwarded messagen +------- +- - - - - - - End forwarded message + -------- + +Date: 18 Feb 1982 1104-PST +From: The Mailer Daemon +To: ANIMAL at MIT-AI +Subject: Message of 13-Feb-82 10:59:59 + +Message failed for the following: +system at CIT-20: Undeliverable after 5 day(s). + ------------ +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1059-PST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and ays later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! +------- +- - - - - - - End forwarded message +------- +- - - - - - - End forwarded messagen +------- +- - - - - - - End forwarded message + -------- + +Date: 18 Feb 1982 1104-PST +From: The Mailer Daemon +To: ANIMAL at MIT-AI +Subject: Message of 13-Feb-82 10:59:59 + +Message failed for the following: +system at CIT-20: Undeliverable after 5 day(s). + ------------ +Mail-from: ARPANET site MIT-AI rcvd at 13-Feb-82 1059-PST +Date: 13 February 1982 13:55-EST +From: animal@mit-ml +Sender: ANIMAL at MIT-AI +Subject: do not break this chain or your machine may crash +To: ANIMAL at MIT-AI, jc40 at CMU-10B, raibert at CMU-20C, + morguee at CMU-20C, white at CIT-20, docke at CIT-20, + saffen at CIT-20, erik at CIT-20, tfalk at CIT-20, + johnson at RUTGERS, rsmith at RUTGERS +cc: operator at SCRC-TENEX, operator at SU-SCORE, operator at AMES-11, + system at CIT-20, f-s at CIT-20, operator at RUTGERS, + f-s at RUTGERS + + +Date: 10 Feb 1982 1937-EST +From: Randy Haskins +Subject: Pass it on +To: nessus, uc.pws, uc.vark, uc.b, cat.trivi, ls.zaphod, g.hammy, ls.wjn +cc: uc.wjn, pao, ls.betsy, g.wjn, e.cheese +Remailed-date: 12 Feb 1982 1217-EST +Remailed-from: J. Scott Hamilton +Remailed-to: eric at MIT-EECS, jis at MIT-EECS, jaf at MIT-EECS, + g.mel at MIT-EECS, jsol at MIT-EECS, ls.bigmac at MIT-EECS +Remailed-date: 12 Feb 1982 1416-EST +Remailed-from: Joe Frisbie +Remailed-to: cl, uc.mike, g.wmh, g.sa, jtw, e.peggy, uc.mp, jsl, uc.jon, net.hsc, + dcp, ls.uni, rz at MIT-MC, uc.tek, rll, aychu at MIT-AI, shawn at MIT-DMS, + uc.rdz, uc.plj, uc.rpk +Remailed-date: 12 Feb 1982 2257-EST +Remailed-from: Jon A. Rochlis +Remailed-to: EECS-Hackers: ; +Remailed-date: 12 Feb 1982 2300-EST +Remailed-from: J. Scott Hamilton +Remailed-to: Wizards: ; +Remailed-date: 12 Feb 1982 2351-EST + +Trust in the LORD with all your heart and HE will acknowledge +and HE will light the way. + + +This prayer has been sent to you for good luck. The original +copy is from the Netherlands. It has been around the world +nine times. The luck has now been brought to you. You will +receive good luck within four days of receiving this letter, +provided in turn, you send it back out. DO NOT SEND MONEY, FOR +FAITH HAS NO PRICE. Do not keep this letter. It must leave your +hands within 96 hours after you receive it. An RAF officer +received $70,000. Joe Ellito received $450,000 and lost it +because he broke the chain. While in the Phillipines, General +Welch lost his wife four days after he received this letter. He +failed to circulate the prayer. However, before his death, he +received $775,000. Please send 20 copies and see what happens +to you on the fourth day. This chain comes from Venezuela, and +was written by Saul Anthony deOziof, a missionary from South +America. I, myself, forward it to you. Since the chain must +make the tour of the world, you must make 20 identical copies +to this one. Sned it to your friends, parents, or associates. +After a few days you will get a suprise. This is true even +if you are not superstitious. Take note of the following. +Constantine Dino received the chain in 1953. He asked +his secretary to make 20 copies and send them. A few days later, +he won a lottery for $2,000,000 in his country. Carlo Caditt, +an office employee, received the chain. He forgot it and a few +days later he lost his job. He found the chain letter and sent +it to 20 people. Five days later he got an even better job. +Dolon Fairchild received the chain and not believing it, threw +it away. Nine days later he died. For no reason whatsoever should +this chain be broken. Remember, SEND NO MONEY. + + +Please do not ignore this. IT WORKS! + +--- \ No newline at end of file diff --git a/src/games/animal.info b/src/games/animal.info new file mode 100644 index 0000000000000000000000000000000000000000..64fad8affec9e5059e28eca0ecde2b9f2f32fafa GIT binary patch literal 964 zcmaJLg>ZPfe59@|^&U28uG{`Y<30BSG2dDk;< z-`8&c^ku(2Wcz!X<qyo(Kc>UHs~YmfDfrdoI6h;HGB2pu&|XcMVr9pZ;KTQY%;po=$E zh&~lDiFeRLm8laX)Z|h;BV+arXbUcSz$R(&r)7L%hn0~ZcBCF16!rswgm8Y3L!_80 z4itJW3<4@(asX?0IZ@ej*Q-wo>3(!%HJ#l|?^ZNhu9wSozWPrwHkK@(=;bZ$k4Hz_ ze<$cJQ`d{hP*h3eu%|MwB2rW9Y@LOO6meF^RFBR>PAMwE&%0DN*eIl7)}=rl@*ly* zOr&l&R@A`>S+?XXtCRER58P|)GRn?6e8F)g6I_R$on)n1mBGzztl0Dg=0Z|}A2><{9 literal 0 HcmV?d00001 diff --git a/src/games/animal.news b/src/games/animal.news new file mode 100644 index 00000000..5e748b30 --- /dev/null +++ b/src/games/animal.news @@ -0,0 +1,9 @@ +KMP@MC 2:38am Monday, 28 June 1982 (Version 129) + +Fixed certain obscure error messages that used to happen after you +apologize to the program for having offended it. The errors can still +happen sadly (not really something in my control to fix completely), but +I hope they'll happen less often. + +That's about it. The game is essentially unchanged over the last two years. +Those interested in old news can print the file BMT1;ANIMAL ONEWS. diff --git a/src/games/animal.onews b/src/games/animal.onews new file mode 100644 index 00000000..71b4dc5d --- /dev/null +++ b/src/games/animal.onews @@ -0,0 +1,53 @@ +KMP@MC 10:28pm Tuesday, 11 March 1980 (Version 122) + +Someone accidentally clobbered the database by trying to load up the game +in a Lisp and run it from there. A very special environment must exist in +order for this game to function correctly -- do NOT attempt to manually +load this thing up in a lisp for whatever reason. As a result, some of the +most recently taught animals will have been lost. I will retrieve the most +recent version of the database from backup tape. Sorry about that. +(In the meantime, an itty bitty game will be left around for people to +play with ... it will go away when the old version is retrieved from tape.) + +Some attempted fixes to the parser -- turns out they didn't work as expected +due to the nature of the pattern matcher. + +KMP@MC 6:03am Saturday, 9 February 1980 (Version 120) + +This version knows how to introspect a bit. Things like "How many animals +do you know?" and "What animals do you know?" will work. + +KMP@MC 1:57am Sunday, 20 January 1980 (Version 107) + +Used to be Animal couldn't grok names the sex of which was ambiguous. +This 'bug' has been fixed at LAUREN's request... + +KMP@MC 4:20am Thursday, 10 January 1980 (Version 103) + +In case people haven't noticed, the game should now call you by the +nickname you specified in :INQUIR ... I may do more fooling with names +later on. If it calls you by an improper subset of your name, please +let me know. + +KMP@MC 3:56am Tuesday, 18 December 1979 (Version 83) + +Bug fixes include: + +(1) Changes better handling of foul languages. It is handled + at a very low level now and harder to get away with. + +(2) The game should now handle hyphenated-words correctly (including hyphens + in the middle of words on continuation lines). + +(3) Typing quoted text for noises (eg, It goes ``meow''.) will now work better + than it used to. Note that the "." has to go after the ''-marks since it + terminates the input string. (Naturally, saying: It goes "meow". + will also work.) + +(4) Some typos in the database have been corrected. + +KMP@MC 3:14pm Saturday, 15 December 1979 + +Animal now has a NEWS feature for keeping up on improvements +to the game. + diff --git a/src/games/animal.origin b/src/games/animal.origin new file mode 100644 index 00000000..fe29b19f --- /dev/null +++ b/src/games/animal.origin @@ -0,0 +1,105 @@ + +(SETQ MEMORY + '((IS THIS ANIMAL A REAL ANIMAL) + (((: HAS-ABILITY) FLY) + (((: HAS-PROPERTY) HORSE-LIKE) + (CYCLOPS) + (((: HAS-POSSESSION) MORE THAN ONE HEAD) + (((: HAS-POSSESSION) A HORN) + (CENTAUR) + (UNICORN)) + (PUSHMEPULLYOU))) + (DRAGON)) + (((: HAS-POSSESSION) WINGS) + (((: HAS-ABILITY) SWIM) + (((: HAS-CLASSIFICATION) MAMMAL) + (((: HAS-CLASSIFICATION) REPTILE) + (((: HAS-PROPERTY) MICROSCOPIC) + (((: HAS-CLASSIFICATION) MARSUPIAL) + (((: HAS-CLASSIFICATION) SPIDER) + (((: HAS-FUNCTION) MAKE PEARLS) + (CLAM) + (OYSTER)) + (BLACKWIDOW)) + (PLATYPUS)) + (VIRUS)) + (((: HAS-CLASSIFICATION) SNAKE) + (LIZARD) + (RATTLESNAKE))) + (((: HAS-PROPERTY) A FRIEND OF MAN) + (((: HAS-CLASSIFICATION) PREDATOR) + (((: HAS-POSSESSION) A LONG TAIL) + (((: HAS-ACTION) WALKS ON TWO LEGS) + (((: HAS-PROPERTY) STRIPED) + (((: HAS-POSSESSION) ANTLERS) + (DEER) + (ANTELOPE)) + (ZEBRA)) + (APE)) + (MONKEY)) + (((: HAS-PROPERTY) FELINE) + (WOLF) + (((: HAS-PROPERTY) STRIPED) + (((: HAS-POSSESSION) SPOTS) + (WILDCAT) + (LEOPARD)) + (TIGER)))) + (((: HAS-STATE) A COMMON HOUSE-PET) + (((: HAS-CLASSIFICATION) BEAST OF BURDEN) + (((: HAS-FUNCTION) GIVE MILK) + (((: HAS-FUNCTION) GIVE WOOL) + (PIG) + (SHEEP)) + (((: HAS-POSSESSION) LEATHERY SKIN) + (GOAT) + (COW))) + (((: HAS-POSSESSION) TUSKS) + (((: HAS-POSSESSION) A HUMP) + (HORSE) + (CAMEL)) + (ELEPHANT))) + (((: HAS-POSSESSION) CLAWS) + (DOG) + (CAT))))) + (((: HAS-HABITAT) IN AND OUT OF WATER) + (((: HAS-PROPERTY) AIR-BREATHING) + (((: HAS-CLASSIFICATION) PREDATOR) + (SEAHORSE) + (SHARK)) + (((: HAS-CLASSIFICATION) PREDATOR) + (((: HAS-PROPERTY) USUALLY ENORMOUS) + (DOLPHIN) + (WHALE)) + (KILLERWHALE))) + (((: HAS-CLASSIFICATION) REPTILE) + (FROG) + (CROCODILE)))) + (((: HAS-POSSESSION) FEATHERS) + (((: HAS-FUNCTION) STING) + (FLY) + (((: HAS-ACTION) BUILDS A NEST) + (MOSQUITO) + (((: HAS-FUNCTION) MAKE HONEY) + (WASP) + (BEE)))) + (((: HAS-FUNCTION) FLY) + (((: HAS-CLASSIFICATION) BARNYARD ANIMAL) + (OSTRICH) + (CHICKEN)) + (((: HAS-CLASSIFICATION) PREDATOR) + (((: HAS-HABITAT) FLOATING ON WATER) + (((: HAS-HABITAT) IN A BIRD CAGE) + (((: HAS-FUNCTION) CARRY MESSAGES) + (((: HAS-ACTION) IS USED AS A SYMBOL OF PEACE) + (SPARROW) + (DOVE)) + (PIGEON)) + (PARAKEET)) + (((: HAS-POSSESSION) LONG NECK) + (DUCK) + (((: HAS-PROPERTY) CONSIDERED VERY BEAUTIFUL) + (GOOSE) + (SWAN)))) + (((: HAS-PROPERTY) NEARING EXTINCTION) + (HAWK) + (EAGLE)))))))) \ No newline at end of file diff --git a/src/games/animal.rules b/src/games/animal.rules new file mode 100644 index 00000000..be6e1608 --- /dev/null +++ b/src/games/animal.rules @@ -0,0 +1,13 @@ +You should think of an animal, and I will try to guess what it is. I +can accept multiple word responses, and I will read your input until I +see a period, exclam, or question mark (unless otherwise noted by the +'(Y OR N)' flag). I'll try to understand input in whatever form you +are comfortable with. As long as you use complete sentences, I should be +fine. Experiment if you want, I'm not as dumb as I may occasionally seem! +If you are not sure of what to do at any time, type a "?" or ask me a +question and I can probably help you. + +This program was written by KMP@MC. Spring, 1978. + +"To err is human -- the animals never err, except the smartest of them." + -- G.C. Lichtenberg diff --git a/src/games/animal.save b/src/games/animal.save new file mode 100644 index 00000000..1dfd5064 --- /dev/null +++ b/src/games/animal.save @@ -0,0 +1,2 @@ + +(((((HAS-STATE))) A (REAL) (((((ANIMAL)))))) KMP ((HAS-STATE HORSE-LIKE) KMP ((HAS-ACTION BREATHES FIRE) ELIOT ((HAS-POSSESSION GREEN SKIN) ELIOT ((HAS-STATE A FRIEND OF SNOOPY) ELIOT ((HAS-STATE A FLYING BAT-FEMALE) ELIOT ((HAS-ACTION HAS FURRY FEET) ELIOT ((HAS-ACTION EATS (PEOPLE/'S) MINDS) ELIOT ((HAS-ACTION HAS ONE EYE) EJS ((HAS-STATE A SMALL FURRY CREATURE) DAN ((HAS-STATE A SILICON-BASED LIFEFORM) DAN ((HAS-PROPERTY BLACK) ELIOT ((HAS-ACTION LIVES IN THE WATER) GRAND ((HAS-STATE AN UNDEAD) GRAND ((HAS-ACTION FLIES) ROGERS ((HAS-STATE A NOTHING) KOVAR ((HAS-ACTION HAS POINTY EARS) MSI ((HAS-ACTION LIVES IN TOLKIEN/'S STORIES) DAN ((HAS-ACTION (WRITES ABOUT HIM)) ELIOT ((HAS-STATE GELATINOUS) TANG ((HAS-ACTION GOES |'BLEEP'|) MSI ((HAS-ACTION (IS SHORT)) ZANAR ((HAS-STATE EXTREMELY INTELLIGENT) LAUREN ((HAS-ACTION (LIKES) SELLING USED EQUIPMENT) LAUREN ((HAS-STATE VISIBLE TO HEALTHY PEOPLE) GRAND ((HAS-STATE HUMAN) SHL ((HAS-STATE MADE OF SNOW) LAUREN ((HAS-STATE AN ELEPHANT-RHINO CROSS) SHL ((HAS-STATE MUCH MORE NOISY) SPERRY ((HAS-ACTION (IS NOT) PINK) KRAUSS ((HAS-ACTION SCABS) TXI ((HAS-ACTION STAYS UP TOO LATE PLAYING ANIMAL II OVER A LONG DISTANCE PHONE LINE) HEAD ((HAS-STATE AN ANNOYING LITTLE MACHINE) BILBO ((HAS-ACTION WHERE IS PINK PAJAMAS IN AN ELEPHANT SUIT) BART ((HAS-ACTION SMELLS VERY BAD) HARV ((HAS-STATE PINK) HOEY ((HAS-STATE EXTREMELY RARE) KMP ((HAS-ACTION SAYS N) KMP ((HAS-STATE A TERMINAL WITH ONLY AN |'N'| KEY) GERN ((HAS-ACTION LISTENS TO NANCY REAGAN) A2DEH (|NONE OF THE ABOVE| HOEY) (|JUST SAY NO KID| A2DEH)) (|| GERN)) (N KMP)) (|EVEN FEWER OF THE ABOVE| KMP)) ((HAS-ACTION (HAD A GREAT FALL)) BOYACK (|PINK ELEPHANT| GRAND) (|HUMPTY DUMPTY| BOYACK))) (|" USED DOG " SALESMAN| HARV)) (MOTHER BART)) (TERMINAL BILBO)) ((HAS-STATE NICE) COOKIE (|FUZZY DUNDERHEAD| HEAD) (COOKIE COOKIE))) ((HAS-STATE UGLIER THAN A SASAND PAPER SALLY) SICC (|SASAND -PAPER SALLY| TXI) (ME SICC))) ((HAS-ACTION HAS A LONG NOSE) VP ((HAS-ACTION GLIBBERS) MIKE ((HAS-ACTION EATS PEOPLE) A2DEH ((HAS-ACTION HAS TWO HEADS) GERN (|LEATHER-BACK GNOMANY| KRAUSS) (ZAPHOD GERN)) (|UMBER HULK| A2DEH)) (GHOUL MIKE)) (HEFALUMP VP))) ((HAS-STATE ALIVE) KRAUSS (|S-100 BUS| SPERRY) (|LEATHER-BACK GNOMONY| KRAUSS))) (HELLIFINO SHL)) (|FROSTY THE SNOWMAN| LAUREN)) ((HAS-ACTION SAYS /'WATCH OUT FOR THAT TREE) HEAD ((HAS-ACTION (IS UGLY)) ELMO (|INVISIBLE MAN| SHL) ((HAS-ACTION HAS THE HEAD OF A BULL) SICC (|JEFF COFFLER| ELMO) (MINOTAUR SICC))) (|GEORGE OF THE JUNGLE| HEAD))) ((HAS-STATE A SPORE THAT FALLS ON PERN) SHL ((HAS-ACTION EATS METAL) LAUREN ((HAS-ACTION WANTS TO DOMINATE THE GALAXY) LAUREN ((HAS-STATE SMALLER THAN A (GIANT)) PAULP ((HAS-ACTION CLIMBS THE EMPIRE STATE BUILDING) LAUREN ((HAS-STATE A WALKING SEWER) DT ((HAS-STATE A MATHEMATICAL CONCEPT) SHL ((HAS-ACTION MOVES FROM THE RIM OF THE GALAXY INWARDS TO THE CORE) BDH ((HAS-PROPERTY PURPLE) |M.JR| ((HAS-ACTION EXISTS ON A BLUE OYSTER CULT ALBUM COVER) DUFTY ((HAS-STATE MADE FROM STONE) JDC ((HAS-STATE SMALLER THAN A |THATN A GIANT|) ARPEE ((HAS-STATE CHAOTIC EVIL) PERSA (GIANT EJS) (N PERSA)) (|PLUTO THE DOG| ARPEE)) ((HAS-POSSESSION A CAT-HEAD) MOBIUS (GOLLEM JDC) (SPHINX MOBIUS))) (|CULTOSAURUS ERECTUS| DUFTY)) (WORM |M.JR|)) (STARSEED BDH)) (|MONSTER CURVE| SHL)) ((HAS-ACTION LIVES IN THE DESERT ON ARAKUS) GZ (|SHAMBLING MOUND| DT) (SANDWORM GZ))) (|KING KONG| LAUREN)) ((HAS-STATE A HUMAN) SHL ((HAS-ACTION BARKS) LAUREN ((HAS-ACTION ROLLS) MWMT ((HAS-HABITAT IN NARNIA) MWMT ((HAS-ACTION LIVES IN RAMA) SHL ((HAS-ACTION SAYS /'I SAY -- I SAY /, BOY) PALLAS ((HAS-ACTION CAN TURN YOU TO STONE) PALLAS ((HAS-ACTION CAN NEVER PULL A RABBIT OUT OF A HAT) LAUREN ((HAS-STATE INEDIBLE) ERIC ((HAS-ACTION HAS A BULLS HEAD) ETHAN ((HAS-ACTION LIVES IN ITS OWN COMIC BOOK) KMP (GINGERBREADMAN PAULP) (|DONALD DUCK| KMP)) (MINOTAUR ETHAN)) ((HAS-STATE MADE OF STONE) JDC ((HAS-STATE A PALE BLUE LIZARD WITH ORANGE-BROWN SPOTS) COOKIE (WUMPUS ERIC) (GECKO COOKIE)) (GOLLEM JDC))) ((HAS-ACTION HAS THE INTELLIGENCE OF A BOWLING BALL OR MIKE MCDEVITT) ELIOT ((HAS-ACTION HAS FOUR VERY HHARD LEGS) PERSA ((HAS-ACTION WILL NEVER ATTACK A SPIDER) PERSA (|BULLWINKLE THE MOOSE| LAUREN) (ADHERER PERSA)) (ACHAIERAI PERSA)) ((HAS-ACTION ISS EEMIT A LOUD PIERCING SOUND) PERSA ((HAS-ACTION HAS A GAME NAMED AFTER IT) JON-O (DOLT ELIOT) (WUMPUS JON-O)) (SHRIEKER PERSA)))) ((HAS-ACTION HAS SNAKES FOR HAIR) ALLAN (GORGON PALLAS) (MEDUSA ALLAN))) (|FOGHORN LEGHORN| PALLAS)) (BIOT SHL)) ((HAS-ACTION LIVES IN SWAMPS) MWMT ((HAS-STATE SKILLED IN MAGIC) MWMT (DUFFLEPUD MWMT) ((HAS-STATE IS THE SON OF THE EMPEROR OVER THE SEA) MWMT (HAG MWMT) (ASLAN MWMT))) (MARSH-WIGGLE MWMT))) ((HAS-ACTION HS WHEELS) SICC (HOOP-SNAKE MWMT) (|TROJAN RABBIT| SICC))) (|DINO THE DINOSAUR| LAUREN)) ((HAS-ACTION (SWINGS FROM) VINES) LAUREN ((HAS-STATE AFTER A WASCALLY WABBIT) LAUREN ((HAS-ACTION CRUSHES BEER CANS ON ITS HEAD) PALLAS ((HAS-ACTION GETS STRONGER WHEN YOU KILL SOME OF ITS KIND THAN (IT WAS) BEFORE) SHL ((HAS-STATE LOOKING FOR A SHRUBBERY) PALLAS ((HAS-ACTION (WORKS FOR THE LOS ANGELES TRIBUNE)) KMP ((HAS-ACTION (WANTS TO DESTROY THE ARCH OF TIME)) NESSUS ((HAS-STATE AA |'10'| |'10'|) MINDLE ((HAS-ACTION SOLD HIS COW FOR A AHNDFUL OF BEANS) COOKIE (|PENCIL NECK GEEK| LAUREN) (JACK-IN-THE-BEANSTALK COOKIE)) (|BO DEREK'S CLIT| MINDLE)) (LORDFOUL NESSUS)) (|LOU GRANT'S REPORTER| KMP)) (|KNIGHTS WHO SAY 'NI| PALLAS)) (HUNTSMAN SHL)) (BLUTTO PALLAS)) (|ELMER FUDD| LAUREN)) (TARZAN SHL)))) ((HAS-STATE INTO COMPUTERS) PTS ((HAS-ACTION CARRIES SILVER SWORDS) PERSA (KLINGON LAUREN) (GITHYANKI PERSA)) ((HAS-STATE A FISH) SAZ ((HAS-ACTION WEARS IZOD SHIRTS) BOYACK (CDR PTS) (|SLOAN SCHOOL GRAD| BOYACK)) (TROUT SAZ)))) ((HAS-ACTION LIVES IN RAMA) SHL ((HAS-ACTION EATS EVERYTHING IT SEES) A2DEH (|METAL-MUNCHING MOON MOUSE| LAUREN) (|BEAST OF TROLL| A2DEH)) (BIOT SHL))) (THREAD SHL))) ((HAS-STATE A SILLY USED CAR DEALER IN LOS ANGELES) HEAD ((HAS-STATE AS SMART AS A JAWA) HARV (|ITT EXECUTIVE| HARV) (JAWA LAUREN)) (|CAL WORTHINGTON & HIS DOG SPOT >| HEAD))) ((HAS-STATE A VEGETARIAN) PAULP ((HAS-ACTION NEVER MUTATES) SHL ((HAS-STATE HYDROGEN BASED) HEAD ((HAS-ACTION LIKES TO GET ALL NUDDED UP) PTS ((HAS-STATE A PROPHET) VP ((HAS-ACTION CARES) A2DEH (DR A2DEH) (KRELL LAUREN)) (M/'UAD-DIB VP)) (MORLOC PTS)) (OUTSIDER HEAD)) ((HAS-ACTION CAN CALL AN INVISIBLE STALKER) JKESS (|JINXIAN BANDERSNATCH| SHL) (|MAGIC USER NAMED KESHLAM| JKESS))) ((HAS-STATE SUNDAY) SHL ((HAS-POSSESSION THREE LEGS) HEAD ((HAS-STATE VERY WRINKLED) JKESS ((HAS-STATE LARGER THAN A PIERSON/'S) TANG (PIERSON/'S PAULP) (BANDERSNATCH TANG)) (|PAK PROTECTOR| JKESS)) (|PEIRSON'S PUPPETEER| HEAD)) (PUPPETEER SHL)))) ((HAS-STATE /15 INCHES LONG /, THIRTY-SIX LEGS /, & THE SHARPEST TRADER (THAT) (A) CONNIVING EARTHMAN EVER MET) HEAD ((HAS-STATE GIVEN TO SAYING OOOOOH NOOOO) HEAD ((HAS-ACTION LIVES IN A FREAKIE TREE) SICC ((HAS-ACTION NOS) JRF ((HAS-STATE HUMAN LIKE) BILBO ((HAS-POSSESSION TENTACLES) COOKIE ((HAS-ACTION COMES FROM OUTER SPACE) IWASA ((HAS-STATE MADE OF ALUMINUM) KMP (|DONALD DUCK| JRF) (|CROCHET HOOK| KMP)) (E IWASA)) (|CARRION CRAWLER| COOKIE)) ((HAS-STATE AFRAID OF WICKED WITCH OF THE NORTH) COOKIE ((HAS-STATE IRISH) LOIEDE ((HAS-STATE MAYAN IN DERIVATION) DMK ((HAS-ACTION COMES FROM OUTER SPACE) ARK (|OOMPA LOOMPA| BILBO) ((HAS-STATE AN EGG /, IT HAS A JOB /, IT IS MUCH SHINIER /, IT IS NOT A WIERDO LIKE E THAN AN ET) BATES (ET ARK) (|GANZER EGG| BATES))) (QUETZEQUOTL DMK)) (LEPRACHAUN LOIEDE)) (MUNCHKIN COOKIE))) (|CAPTAIN KIRK| ZANAR)) (FREAKIE SICC)) (|MR BILL| HEAD)) (MESKLINITE HEAD))) ((HAS-HABITAT IN DOCTOR WHO STORIES) MWMT ((HAS-STATE USED UNSCRUPULOUSLY BY NETWORK CENSORS) HEAD (COMPUTER MSI) (|REACTION TO AN UNCHASTE COMMENT| HEAD)) (K-9 MWMT))) ((HAS-STATE IN A MOVIE WITH STEVE MCQUEEN) HEAD ((HAS-STATE DROPPING ON YOUR HEAD RIGHT NOW) SICC ((HAS-ACTION LIVES ON JINX) RDUKE ((HAS-ACTION EATS EVERYTHING) ALY (|OCHRE JELLY| TANG) (|SLIME MONSTER| ALY)) (BANDERSNATCH RDUKE)) (|SLIME MOLD| SICC)) (BLOB HEAD))) (|TNE GREY MOUSER| ELIOT)) ((HAS-ACTION KILLED GANDALF) MSI ((HAS-STATE USED IN BATTLE) MWMT ((HAS-ACTION HAS A SOFT UNDERBELLY) MWMT ((HAS-STATE TWELVE FEET TALL) ELMO (HOBBIT DAN) (|STONE GIANT| ELMO)) (SHELOB MWMT)) ((HAS-STATE HUMANOID) EULER (OLIPHAUNT MWMT) (ORC EULER))) (BALROG MSI))) ((HAS-ACTION HAS GREEN SKIN) PLK ((HAS-PROPERTY WHITE) RBARCK ((HAS-STATE A MUPPET) SHL ((HAS-ACTION LOVES NATURE) BLOTTO ((HAS-STATE A HAPPY CARTOON ANIMAL) ARPEE ((HAS-STATE MADE OF STONE) RAM ((HAS-ACTION HAS FOUL BREATH) A2DEH (WAYNHIM SHL) ((HAS-ACTION CAN GET STONED LOOKING AT A BASILISK) JSOL (ORC A2DEH) (BASILISK JSOL))) (SPHINX RAM)) (|PLUTO THE CARTOON DOG| ARPEE)) (ELF BLOTTO)) ((HAS-STATE A YEDI MASTER) SICC (|MISS PIGGY| PLK) (YODA SICC))) ((HAS-ACTION MATE ONLY ONCE IN /7 YEARS) CLEMW (UNICORN RBARCK) (VULCAN CLEMW))) ((HAS-ACTION LIVES NEAR A TREE) MIKE ((HAS-STATE A VERY LOGICAL SCIENCE OFFICER WITH NO SENSE OF HUMOR) HEAD (ELF MSI) (|MR SPOCK| HEAD)) (ENT MIKE)))) ((HAS-ACTION HAS A VALUE OF /0) KARIM ((HAS-ACTION TAKES UP NO SPACE /, EATS NOTHING /, SAYS NOTHING /, & IS NOT THERE) HEAD (|| KOVAR) ((HAS-STATE LIKELY TO FORGET WHAT OFFICE HE IS IN) HEAD (UNANIMAL HEAD) (|RONALD REAGAN| HEAD))) (|ASCII NULL| KARIM))) ((HAS-PROPERTY WHITE) JHC ((HAS-ACTION SETS ITSELF ON FIRE) LAUREN ((HAS-ACTION DRINKS TO SEE A PINK ELEPHANT) HOEY ((HAS-STATE MUCH LARGER THAN ANYTHING) DT ((HAS-POSSESSION EYESTOCKS) A2DEH ((HAS-ACTION NEEDS A BETA-CAPSULE) PALLAS ((HAS-STATE AN AIRPLANE) CDS ((HAS-ACTION BURBLES) KMP ((HAS-ACTION SINGS /" HERE I COME TO SAVE THE DAY /") RDUKE ((HAS-ACTION WINDS UP A TARN) DAN ((HAS-STATE ALIVE) LOIEDE (|MECHANICAL BIRD| DAN) (HARPY LOIEDE)) (TARN LAUREN)) (|MIGHTY MOUSE| RDUKE)) (JABBERWOCKY KMP)) ((HAS-STATE A FIGHTER PLANE) KMP (B-52 CDS) (F115 KMP))) ((HAS-ACTION CAN PERFORM MAGIC) DAUL (ULTRA-MAN PALLAS) (FAIRY DAUL))) (BEHOLDER A2DEH)) ((HAS-STATE A FRIEND OF DOCTOR DOOLITTLE) SHL ((HAS-STATE AS INTELLIGENT AS A HUMAN) SHL ((HAS-ACTION CAN FLY) SBM (ROC DT) (GRIFFON SBM)) ((HAS-STATE AN EAGLE THE SIZE OF A ELEPHANT) LSO ((HAS-ACTION DOES 1-3 POINTS OF DAMAGE PER ATTACK |(| IT HAS TWO |)|) PERSA (M-5 SHL) (AARAKOCRA PERSA)) (ROC LSO))) (|LUNAR MOTH| SHL))) (|PINK ELEPHANT| HOEY)) (PHOENIX ROGERS)) ((HAS-ACTION SHOWS UP IN SATURDAY MORNING CARTOONS) CLEMW ((HAS-PROPERTY RELATED) COCO ((HAS-PROPERTY RELATED) COCO ((HAS-STATE A MYTHICAL GIANT BIRD) LENS ((HAS-ACTION APPEARS AS A GHOSTLY BALL OF LIGHT) MWT ((HAS-ACTION EATS MAGICAL ENERGY) JKESS ((HAS-STATE MADE OF METAL) EJS (ANGEL JHC) (|B-1 BOMBER| EJS)) (|ORAGAMI _ MONSTER| JKESS)) (WILL-O-WISP MWT)) (ROC LENS)) (ROCK-BIRD COCO)) ((HAS-ACTION BREATHS COLD) TOM (ROCK-BIRD COCO) (DRAGON TOM))) ((HAS-ACTION LIVES IN A GLOVE COMPARTMENT) DH (|CASPER THE FRIENDLY GHOST| CLEMW) (|FRIENDLY PHANTOM| DH))))) ((HAS-POSSESSION FANGS) MSI ((HAS-PROPERTY EVIL) DAN ((HAS-PROPERTY EVIL) JANUS (|CHINESE DRAGON| JANUS) ((HAS-STATE SOLID) SICC (GHOST DAN) (ZOMBIE SICC))) ((HAS-STATE AS EVIL AS A GHOULE) DAN (GHOST DAN) ((HAS-ACTION HAS BANDAGES ALL OVER IT) |M.JR| (GHOULE GRAND) (MUMMY |M.JR|)))) (VAMPIRE MSI))) ((HAS-STATE NON-HUMANOID) GRAND ((HAS-ACTION SAYS /'MY PRECIOUSS/') EULER (MERMAID GRAND) (GOLLUM EULER)) ((HAS-STATE PUTRID) MPA ((HAS-STATE A FRIEND OF DOCTOR DOLITTLE) SHL ((HAS-ACTION LIVES IN THE CYLINDRICAL SEA) SHL ((HAS-ACTION DISGUISES ITSELF AS AN ISLAND) MWMT ((HAS-PROPERTY BLACK) BILLT (SEA-SERPENT GRAND) (BANDERSNATCH BILLT)) ((HAS-STATE APATHETIC) MCTESQ (FASTITOCALON MWMT) (|BLISSFUL PLATYPUS| MCTESQ))) (BIOT SHL)) (|GIANT PINK SEA SNAIL| SHL)) (FUNGUS MPA)))) ((HAS-ACTION HAS NEVER MADE LOVE) KOVAR ((HAS-POSSESSION A WHEEL) JHC ((HAS-STATE A RUTHLESS INSECT HUHUMANIOD FIGHTER) ELIOT ((HAS-STATE WORSE THAN DEATH) SHL ((HAS-ACTION (IS ALIVE)) BILBO (DEATH ELIOT) ((HAS-STATE AN INSECT) ALLAN (|FAT ALBERT| BILBO) (COOTIE ALLAN))) ((HAS-ACTION LIVES IN MIDDLE EARTH) SY (UR-VILE SHL) (BALROG SY))) (PHRAINT ELIOT)) (POLARIAN JHC)) ((HAS-STATE FROM A FANTASY STORY) SHL ((HAS-STATE A RESULT OF POOR HYGEINE) HEAD ((HAS-ACTION HAS ROUND EARS) SICC ((HAS-STATE A REPTILE) PECM ((HAS-STATE A SLIMY CREATURE THAT HIDES IN THE DARK) HUBRD ((HAS-STATE SQUARE) JEFFH ((HAS-ACTION DRAINS THE LIFE FORCE FROM DYING CREATURES) PERSA ((HAS-ACTION LIKES SUGAR) BOYACK (VIRGIN KOVAR) (|GIANT MUTANT ANT| BOYACK)) (TRILLOCH PERSA)) (|FLOPPY DISK| JEFFH)) ((HAS-ACTION LIVES IN OUTER SPACE) A2DEH (GRUE HUBRD) (ALIEN A2DEH))) (GODZILLA PECM)) ((HAS-ACTION SMELLS) RWG (|MICKEY MOUSE| SICC) (HEADPHONES RWG))) (|BLACKHEAD ( PIMPLE )| HEAD)) ((HAS-ACTION HAS BIG BLACK /, ROUND EARS) ARPEE ((HAS-STATE AN ARACHNID) LAH ((HAS-ACTION A SPIRIT OF DEATH) BERG ((HAS-ACTION LIVES IN A MAZE) DADA ((HAS-STATE A BIG WHEEL) NESSUS ((HAS-STATE THE CREATOR OF THE BALROGS) PERSA (|DROOL ROCKWORM| SHL) (|MORGOTH BAUGLIR| PERSA)) (GAEA NESSUS)) (MINOTAUR DADA)) (BALROG BERG)) (SHELOB LAH)) (|MICKEY MOUSE| ARPEE))))) ((HAS-ACTION HAS RANDOM ACCESS MEMORY) EULER ((HAS-POSSESSION WASTIES) MGRANT ((HAS-ACTION GLOWS IN THE DARK) PSY ((HAS-ACTION EATS ROCKS) PERSA ((HAS-ACTION LIVES ON DUNE) PERSA (HORTA DAN) (SANDWORM PERSA)) ((HAS-ACTION LIVES IN STAR TREK) MOBIUS (DENZELIAN PERSA) (HOYA MOBIUS))) (ATROH PSY)) (DRIMBING MGRANT)) ((HAS-STATE JUNKY) MAZE ((HAS-ACTION CONTAINS OTHER ANIMALS) VP ((HAS-STATE A VERY CHEAP COMPUTER WITH LIMITED EXPANDABILITY) HEAD ((HAS-STATE A REAL COMPUTER) GERN (|EXIDY SORCERER| EULER) (|ZENITH Z-100| GERN)) (|VIDEO BRAIN 101A| HEAD)) ((HAS-ACTION HAS VIRTUAL MEMORY OF /2 ^ /32 BITS) SKH ((HAS-STATE A BIG WHEEL) NESSUS ((HAS-ACTION COSTS LESS HAN $ 5K) GERN (PDP-10 VP) (|ZENITH Z-100| GERN)) (GAEA NESSUS)) (|VAX 11| SKH))) (TRASH-80 MAZE)))) ((HAS-STATE A DOG) PLK ((HAS-STATE AN OTTER) PLK ((HAS-ACTION HAS LARGE /, ROUND EARS) ARPEE ((HAS-ACTION HAS THE FACE OF A CAT) GZ ((HAS-POSSESSION THREE EYES) SKH ((HAS-STATE ROUND) SKH ((HAS-ACTION PLAYS CHESS) VP ((HAS-ACTION SWIMS) SHOR (PATZER VP) (SEAHORSE SHOR)) (TRIBBLE DAN)) ((HAS-ACTION EATS TRITICALE) CEH ((HAS-STATE VERY FURRY) LEVIN (|TENNIS BALL| SKH) (TRIBBLE LEVIN)) (TRIBBLE CEH))) (|MARTIAN BOUNCER| SKH)) ((HAS-ACTION (ACTS IN A CARTOON)) COOKIE (CATTAIL GZ) ((HAS-PROPERTY CALVIN/'S) GERN (|` FRITZ THE CAT'| COOKIE) (HOBBES GERN)))) ((HAS-ACTION WEARS A CAPE) RDUKE (|MICKEY MOUSE| ARPEE) ((HAS-ACTION GOES AROUND SAYING /, /" VARK /, VARK) SEH (|MIGHTY MOUSE| RDUKE) (AARDVARKANIAN SEH)))) (MIJ PLK)) ((HAS-ACTION CAN WEEZ) DKR (NERMAL PLK) (WEEZY DKR)))) ((HAS-STATE A ROBOT) COUGH ((HAS-ACTION HAS HAIR THE THAT IS FIVE FEET LONG) HEAD ((HAS-STATE IN TOLKIEN/'S STORIES) SICC ((HAS-ACTION STOMPS ON GERBILS) PTS ((HAS-POSSESSION A CRT) GERN ((HAS-ACTION LIVES IN CANS OF TOMATO SAUCE) BOYACK (CYCLOPS KMP) (SPAGETTIO BOYACK)) (|TERMINAL A TERMINAL| GERN)) (BERG PTS)) (SAURON SICC)) (GINGERLING HEAD)) (MARD/'KOID COUGH))) ((HAS-ACTION (HAS TENTACLES)) ELIOT ((HAS-STATE A COMPUTER GAME) DEVON ((HAS-POSSESSION TREMENDOUS PSI POWERS) SHL ((HAS-STATE NEVER SEEN) JWP ((HAS-POSSESSION ONE EYE) HEAD ((HAS-ACTION HAS A WORM BODY) EDWIN (|THREE-EYED ONE-HORNED FLYING PURPLE PEOPLE EATER| HOEY) (|NERVE RUNNER| EDWIN)) ((HAS-POSSESSION A HORN) GMR (CYCLOPS GMR) (|ONE-EYED ONE-HORNED FLYING PURPLE EATER| HEAD))) ((HAS-POSSESSION BIG RUBBER FEET) HARV ((HAS-STATE A FORMLESS MASS THAT ABSORBS OTHER MATERIAL) SULLIV (GRUE JWP) (BLOB SULLIV)) (|AC COBRA| HARV))) ((HAS-STATE FROM ORADO) HEAD ((HAS-ACTION DOES DRUGS) TOWNSE ((HAS-STATE AN UNDEAD) ALY ((HAS-STATE POWERFULL) KYRHIZ (|BRAIN MOLE| |M.JR|) (PSOLARA KYRHIZ)) (NAZGUL ALY)) (|GUMBY @ AI| TOWNSE)) (SPOOK HEAD))) ((HAS-ACTION /'TWISTY MAZE WITH PASSAGES ALL ALIKE/') GHSCC (ZORK DEVON) ((HAS-STATE BETTER THAN ADVENTURE) MOBIUS (ADVENTURE GHSCC) (ZORK MOBIUS)))) ((HAS-STATE MATHEMATICAL) REM (|MIND FLAYER| ELIOT) ((HAS-ACTION SELLS BAD) BAUMAN (|KNUTH'S BASE| REM) ((HAS-STATE TIRED) KLOTZ (|COURSE 6| BAUMAN) (|| KLOTZ)))))) ((HAS-ACTION (IS) HUMANOID) GRAND ((HAS-PROPERTY BLUE) CSTACY ((HAS-STATE A MOOSE) PLK ((HAS-ACTION (EATS PIZZA)) ZANAR ((HAS-ACTION HAS A MAGIC BAG) LAUREN ((HAS-ACTION LIKES (GNAWING) ON CARROTS) LAUREN ((HAS-ACTION LIKES TO SAY /, /" ((HERE)) I COME TO SAVE THE (DAY /")) LAUREN ((HAS-PROPERTY UGLY) LAUREN ((HAS-STATE PART EAGLE) LAUREN ((HAS-ACTION SINGS /'OH /, MY DARLING CLEMENTINE/') LAUREN ((HAS-STATE MUCH MORE (VICIOUS THAN MOST ANIMALS)) SHL ((HAS-ACTION (KILLS SNAKES)) PALLAS ((HAS-STATE FUN TO CUDDLE) PALLAS ((HAS-STATE VERY CARNIVOROUS) BDH ((HAS-ACTION ENEMY WAS RIFFRAFF) DANIEL ((HAS-ACTION STARS IN X-RATED CARTOONS) COOKIE ((HAS-ACTION TRIES AGAIN) MSS ((HAS-ACTION FRIEND IS RAGLAND T) JDG (|CHESHIRE CAT| MSS) (|CRUSADER RABBIT| JDG)) (|ROCKY THE FLYING SQUIRRLE| GRAND)) (|FRITZ THE CAT| COOKIE)) (UNDERDOG DANIEL)) ((HAS-ACTION GRINS) DADA (KZIN BDH) (|CHESHIRE CAT| DADA))) ((HAS-ACTION DRINKS TEA REGULARLY) SICC ((HAS-ACTION DOES LESS WHOLESOME THINGS IN BED) COOKIE ((HAS-STATE A CHARACTER IN A BOOK BY E B WHITE) KMP ((HAS-ACTION LIVES IN A GALAXY FAR FAR AWAY) KMP ((HAS-ACTION (IS A KIND OF TEDDY BEAR)) KMP (|TEDDY BEAR| PALLAS) (BEARNEY KMP)) (|EWOK BEAR| KMP)) (|STUART THE MOUSE| KMP)) (|FRITZ THE CAT| COOKIE)) (|PADDINGTON BEAR| SICC))) (RIKKI-TIKKI-TAVI PALLAS)) ((HAS-STATE LIKE A GRIFFIN) SULLIV (|KZINTI WARRIOR| SHL) (MANTICORE SULLIV))) (|HUCKLEBERRY HOUND| LAUREN)) (GRIFFON LAUREN)) ((HAS-STATE LIKE A LION) JRF ((HAS-POSSESSION A TRUNK) CEH ((HAS-ACTION (IS BIG)) JOSE ((HAS-ACTION MAKES PUPPIES COWER WHEN IT IS AROUND) DH ((HAS-PROPERTY MEAN) NESSUS ((HAS-ACTION LAUGH) KMP (ORK LAUREN) (GOOFY KMP)) (KZIN NESSUS)) ((HAS-STATE FRIENDLY WITH ORC TYPES) MWT ((HAS-ACTION HAS /3 HEADS) EPSTED ((HAS-ACTION BES FED AFTER MIDNIGHT) LAUREN (GREMLIN LAUREN) ((HAS-ACTION BES FED AFTER MIDNIGHT) LAUREN (GREMLIN LAUREN) (PUPPYSTOMPER DH))) (CERBERUS EPSTED)) (WARG MWT))) (|KING KONG| JOSE)) (SNUFFLEUPAGUS CEH)) ((HAS-STATE A BIPED) LAH (GRIFFIN JRF) (BALROG LAH)))) (|MIGHTY MOUSE| LAUREN)) ((HAS-POSSESSION A SNUFFEL) ADK ((HAS-POSSESSION A TAIL) KRONJ (HAMSTER KRONJ) (|BUGS BUNNY| LAUREN)) (|MR SNUFFELUPAGOUS| ADK))) (|FELIX THE CAT| LAUREN)) ((HAS-STATE BORN PREGNANT) ALPHA (ZARKA ZANAR) ((HAS-STATE INTELLIGENT) SY (TRIBBLE ALPHA) (GREMLIN SY)))) (|BULLWINKLE THE MOOSE| PLK)) ((HAS-ACTION HAS CIRCULAR TEETH) HARV ((HAS-STATE VERY LOVABLE) SICC (COOKIE-MONSTER CSTACY) ((HAS-ACTION LIVES ON SESAME STREET) BERS (TRIBBLE SICC) ((HAS-ACTION (LOVES THE LETTER /" G /")) BERS (SNUFALUFAGUS BERS) (GROVER BERS)))) (|DISK DRIVASAURAUS| HARV))) ((HAS-ACTION SMOKES) DIANA ((HAS-STATE VERY DANGEROUS) LAUREN ((HAS-STATE BRED FROM HUMANS) SHL ((HAS-ACTION DRIVES A SPACE SHIP) DH ((HAS-ACTION AS STRIPES) JFB (|FOZZY BEAR| DH) (TIGGER JFB)) (CHEWBACCA DIANA)) (|SANTA THERESAN| SHL)) ((HAS-ACTION CAUSES TERROR) HARV ((HAS-ACTION WILL RIP YOUR HEAD OFF IF IT LOSES A GAME) PALLAS ((HAS-STATE CAT-LIKE) HEAD ((HAS-ACTION WILL EAT YOU IN THE DARK) SEH ((HAS-POSSESSION GREEN EYES) PERSA (MEGASAUR LAUREN) (DAKON PERSA)) (GRUE SEH)) (KZINTI HEAD)) (WOOKIE PALLAS)) ((HAS-STATE VERY HAIRY & CHEWS ON LEATHER) HEAD (ORC BLOTTO) ((HAS-ACTION CLIMBS THE EMPIRE STATE BUILDING) SICC (|HELL'S ANGEL| HEAD) (|KING KONG| SICC))))) ((HAS-PROPERTY TEN) TAMES (HOBBIT ELIOT) ((HAS-STATE EXTREMELY SENSUAL & THE DESIRE OF MANY MEN) HEAD (|DAVID FRENCH| TAMES) (|BO DEREK| HEAD)))))) ((HAS-STATE A WOMAN) VP (HARPY ELIOT) ((HAS-ACTION HAS HAIR UNDER HER WINGS) BOYACK (BATGIRL BOYACK) ((HAS-ACTION (HAS HER CLOTHES ON)) BOYACK (BATWOMAN VP) (BATLADY BOYACK))))) ((HAS-ACTION HAS A BLOCK HEAD) ELIOT ((HAS-ACTION (CARRIES A BLANKET)) PLK ((HAS-STATE A BULLY) GRAND ((HAS-ACTION PLAYS THE PIANO) GRAND ((HAS-ACTION CAN PLAY BASEBALL VERY WELL) PLK ((HAS-STATE CHARLIE BROWNS LITTLE SISTER) PLK ((HAS-ACTION (HAS * NOTHING * WHATSOEVER TO DO WITH ANY COMMERCIAL COMIC STRIP)) DONALD ((HAS-STATE THE RED BARON) BILBO (WOODSTOCK ELIOT) (SNOOPY BILBO)) (MARCIA DONALD)) (SALLY PLK)) ((HAS-PROPERTY BLACK) PLK ((HAS-ACTION (LIVES IN A DOG HOUSE)) CLEMW (|PEPPERMINT PATTY| PLK) (SNOOPY CLEMW)) (FRANKLIN PLK))) (SCHROEDER GRAND)) (|LUCY VAN PELT| GRAND)) ((HAS-ACTION REFUSE) BDH (LINUS PLK) (|INCREDIBLY SELFISH BLANKET BLEERPHER| BDH))) ((HAS-STATE FRIENDS) SMD (|CHARLIE BROWN| ELIOT) ((HAS-ACTION DOESN7/'T HAVE A BALNKETLANKET) SHC (LINUS SMD) (|CHARLIE BROWN| SHC))))) ((HAS-STATE A LARGE INTELLIGENT REPTILE) DAN ((HAS-STATE MISCHEVIOUS /, RATHER THAN EVIL) GRAND ((HAS-STATE ONCE A MAN) EJS ((HAS-STATE A MUPPET) GRAND ((HAS-ACTION HAS /5 HEADS) MSI ((HAS-STATE A REPTILE) PLK ((HAS-ACTION CANNOT JUMP AS FAR) LAUREN ((HAS-ACTION SAYS /'QWERTY -- ZAP/') A2DEH ((HAS-ACTION STOPS ME PLAYING ZORK) ACN ((HAS-STATE FLEXIBLE) SICC ((HAS-ACTION WILL ONLY GIVE YOU A DRINK IF YOU STICK YOUR FINGER DOWN ITS THROAT) A2DEH (|HOPPITY HOOPER| LAUREN) (VOGON A2DEH)) ((HAS-STATE HUMANOID) PERSA (|VERMICIOUS KNID| SICC) (WAYNHIM PERSA))) (GRUE ACN)) ((HAS-ACTION MAKES FOR POOR TASTE IN INTERIOR DECORATING) HEAD (MARTIAN A2DEH) (|PUCE COMPUTER TERMINAL| HEAD))) ((HAS-ACTION FOCUSES LIGHT ON A PHOTOSYNTHETICTHETIC BUD) NESSUS ((HAS-STATE SLIMY) SY ((HAS-ACTION (PHONES HOME)) KMP (TROLL ELIOT) (E KMP)) (|SLIME MONSTER| SY)) (|NIVEN SUNFLOWER| NESSUS))) ((HAS-ACTION GO /" BETWEEN /") VP ((HAS-ACTION SQUIRTS A FOUL-SMELLING LIQUID) PERSA (NEWT PLK) (TROGLODYTE PERSA)) (|FIRE LIZARD| VP))) (HYDRA MSI)) (KERMIT GRAND)) ((HAS-ACTION (IS INCREDIBLE)) DEVON ((HAS-STATE MUCH) SHL ((HAS-ACTION LIVES IN THE RINGS OF SATURN) HEAD (|CAULDRON BORN| SHL) (SYMB HEAD)) (GOLLUM EJS)) (|INCREDIBLE HULK| DEVON))) ((HAS-STATE PLAYED BY BILL BIXBY) PALLAS ((HAS-STATE CUTE) PALLAS ((HAS-STATE LARGER THAN A GREMLIN) COUGH (GREMLIN GRAND) ((HAS-ACTION IMPLIES A LOW CULTURAL LEVEL) DH ((HAS-STATE MUCH CONVERSATION AT THE BREAKFAST TABLE) HEAD ((HAS-ACTION LIVES ON THE PLANET JANUS) JKESS (|PIECE OF MOLDY TOAST| HEAD) (IFT JKESS)) (TROGLODYT DH)) ((HAS-ACTION HAS A LISP MACHINE) BOYACK ((HAS-ACTION (LIVES IN A TRASH-CAN)) BERS (CTHULUCOOKIE COUGH) (|GROWCH FROM SESAME STREET| BERS)) (|AI LAB NURD| BOYACK)))) ((HAS-STATE A REPTILE) TKTL ((HAS-STATE A MUPPET) JSOL (COMPUTER TKTL) (|KERMIT THE FROG| JSOL)) (|KERMIT THE FROG| PALLAS))) ((HAS-ACTION HAS AN EXTENSIVE WARDROBE) |SOMEONE IMPERSONATING GOD| ((HAS-STATE MORKIAN) DCP (|INCREDIBLE HULK| PALLAS) (MORK DCP)) ((HAS-ACTION FAILED) |SOMEONE IMPERSONATING GOD| (|EDDIES FATHER| |SOMEONE IMPERSONATING GOD|) ((HAS-ACTION HAS AN UNCLE WITH TWO ANTENNAE) |SOMEONE IMPERSONATING GOD| ((HAS-STATE GREAN) A1A (MAGICIAN |SOMEONE IMPERSONATING GOD|) ((HAS-STATE MEANER) SULLIV (HULK A1A) (BIXBYOLEUS SULLIV))) ((HAS-STATE A BILL BIXBY) SLH (|FAVORITE MARTIAN| |SOMEONE IMPERSONATING GOD|) (|BILL BIXBY'S CLONE| SLH))))))) ((HAS-ACTION SHOOTS ENERGY BEAMS OUT OF IT IS TAIL & EYES) ELIOT ((HAS-STATE EXTRA-TERRESTRIAL) LAUREN ((HAS-STATE THE SWINGING ALLIGATER IN THE SWAMP) LAUREN ((HAS-ACTION HAS NO SHELL) LAUREN ((HAS-ACTION EMITS A DEADLY GAS WHICH TAKES ONE POINT OFF YOUR STRENGTH CUMULATIVELY) DMTGJR (|MOCK TURTLE| LAUREN) (TROG DMTGJR)) ((HAS-ACTION NABS A BEAUTIFUL BLOND SCIENTIST) LAUREN ((HAS-ACTION LIVES IN SCOTLAND) EMERY ((HAS-ACTION (HAS) WEBBED FEET) MWT ((HAS-ACTION REGENERATES) COOKIE (DRAGON COOKIE) ((HAS-POSSESSION MANY HEADS) DBA (TROLL EMERY) (HYDRA DBA))) ((HAS-ACTION LIKES TO EAT LIVESTOCK) PERSA (|KILLER FROG| MWT) (WYVERN PERSA))) (|LOCH NESS MONSTER ( NESSIE )| LAUREN)) (|CREATURE FROM THE BLACK LAGOON| LAUREN))) (|WALLY GATER| LAUREN)) ((HAS-ACTION HAS A BRAIN) SPERRY (GORN DAN) (FROB SPERRY))) ((HAS-STATE SLIMY) CSTACY ((HAS-STATE MADE BY SEARS ROEBUCK CO) LAUREN ((HAS-STATE BLONDE) HARV (ZOK ELIOT) (|HOOKER I KNOW| HARV)) (YODA LAUREN)) ((HAS-ACTION LIVES IN SCOTLAND) BERS ((HAS-ACTION HATES WOOD) SULLIV (CTHULU CSTACY) (FWQIR SULLIV)) (|LOCHNESS MONSTOR| BERS)))))) ((HAS-ACTION HAS (FIVE) HEADS) ELIOT ((HAS-STATE A DOG) ELIOT ((HAS-ACTION MET KING KONG) SJK ((HAS-PROPERTY REAL) JHC ((HAS-STATE (A) REASONABLE CHOICE FOR AN ANIMAL) SHAG ((HAS-ACTION HAS SCALES LIKE A LIZARD/'S) DT ((HAS-STATE A KIND OF DRAGON) PERSA (GRIFFERT JHC) (GLAURUNG PERSA)) ((HAS-PROPERTY RELATED) SHL ((HAS-ACTION (PICKS HER SCABS)) TXI ((HAS-ACTION FLYS BY JET PROPULSION) LSO ((HAS-ACTION LEAVES MYSTERIOUS TRACKS) MWT ((HAS-STATE FOND OF GOOD POETRY) MWT (DRAGON DT) (|BLATANT BEAST| MWT)) (|QUESTING BEAST| MWT)) (PHYLANGE LSO)) (|SASAND-PAPER SALLY| TXI)) (FIRE-LIZARD SHL))) ((HAS-STATE A KOMODO DRAGON) SHL ((HAS-STATE A CLOWN) TAFT ((HAS-STATE A ROCK STAR) SHL ((HAS-ACTION BREATHES FIRES) COCO (FIRE-LIZARD SHL) ((HAS-ACTION HAS AN EAGLE HEAD) SHL ((HAS-STATE LARGER THAN A FIRE LIZARD) KATIN ((HAS-STATE MORE TRADITIONAL THAN A FIRE-LIZARD) KMP (FIRE-LIZARD SHL) (|SIMPLE DRAGON| KMP)) (DRAGON KATIN)) (GRIF COCO))) (|GENE SIMMONS| SHL)) (FROBOZZO TAFT)) ((HAS-STATE A NATIVCEVE OF DARK CAVES) DWO (MONITOR-LIZARD SHL) (DRAGON DWO)))) ((HAS-STATE FURRY) RWG ((HAS-POSSESSION DHVJDFHWDFEDFEF) BERG (DRAGON ELIOT) (JJEFEYFRFWFELE BERG)) ((HAS-STATE FASTER THAN A DOG) HUBRD (DOG RWG) (|VORACIOUS MAN-EATING TWAT| HUBRD)))) ((HAS-STATE SMALLER THAN A DRAGON) HUBRD ((HAS-ACTION GOT A PURPLE WEINEEER) CDR (GODZILLA SJK) (|| CDR)) ((HAS-POSSESSION TWO LEGS) ELIOT (DRAGON HUBRD) ((HAS-ACTION IIS SOFT (QUOTE LONG) BYE SOFT & WARM & JUICY) MINDLE (EMILY ELIOT) (|BOBO DEREK'S CLITORIS| MINDLE))))) ((HAS-POSSESSION BAD BREATH) SMK (|HELL HOUND| ELIOT) ((HAS-ACTION KILLS PEOPLE) LETTO (|CHILI-EATING MEXICAN DOG| SMK) ((HAS-POSSESSION THREE HEADS) GERN ((HAS-STATE SEEN ON THE MOORS) BOYACK (DDD LETTO) (|HOUND OF THE BASKERVILLES| BOYACK)) (CERBERUS GERN))))) ((HAS-STATE SILLY) GNU ((HAS-ACTION GROWS A HEAD EVERY YEAR) LSO (PYROHYDRA ELIOT) (PHYLANGE LSO)) ((HAS-STATE PUNCTUAL) GNU (|| GNU) (& GNU))))) ((HAS-ACTION HAS A HUMAN BODY TORSO) ELIOT ((HAS-ACTION HAS HORNS ON ITS HEAD /, AND NO HUMAN TORSO) RP0L ((HAS-POSSESSION WINGS) JHC ((HAS-STATE AN INTELLIGENT HORSE) SHL ((HAS-ACTION HAS HEADS ON BOTH ENDS OF ITS BODY) BKENRS ((HAS-STATE MADE OF WOOD) PALLAS ((HAS-ACTION HAS ONE HORN) DUFTY ((HAS-POSSESSION EIGHT LEGS) VP ((HAS-STATE RATTY) SLH ((HAS-ACTION REMOVES ENCHANTMENT FROM MAGICAL WEAPONS) PERSA ((HAS-POSSESSION STRIPES) DESFZ ((HAS-ACTION (IS IN THE ARMY)) BOYACK (CENTAUR ELIOT) (FRANCIS BOYACK)) (ZEBRA DESFZ)) (DISENCHANTER PERSA)) (RAT SLH)) (SLEIPNIR VP)) (UNICORN DUFTY)) ((HAS-ACTION A TOY) RKC (|TROJAN HORSE| PALLAS) (|HOBBY HORSE| RKC))) (PUSH-ME-PULL-YOU BKENRS)) ((HAS-ACTION LIVES IN MIDDLE-EARTH) EULER ((HAS-ACTION TALKS ON TV) KMP ((HAS-STATE EXTINCT) JALEX ((HAS-ACTION HAS A TRUNK) NB ((HAS-ACTION HAS ONLY ONE HORN) PERSA (RANYHYN SHL) (UNICORN PERSA)) (ELEPHANT NB)) (UNICORN JALEX)) (|MR ED| KMP)) ((HAS-ACTION HAS A HORN IN THE CENTER OF IT IS FOREHEAD) DFC (MEARA EULER) (UNICORN DFC)))) ((HAS-ACTION BREATHES FIRE) RAM ((HAS-ACTION HAS THE TORSO OF A LION) DFC ((HAS-ACTION HAS THE HEAD OF AN EAGLE) ALY (PEGASUS JHC) (GRIFFIN ALY)) (GRIFON DFC)) (DRAGON RAM))) ((HAS-STATE HORNIER THAN A UNICORN) EJS ((HAS-ACTION HAS THE JEWEL OF JUDGEMENT) DEVON ((HAS-ACTION HAS PINK HOOVES) ELIOT (UNICORN RP0L) (KI-RIN ELIOT)) ((HAS-ACTION HAS A SMALL BACK SEAT) HARV (|UNICORN OF AMBER| DEVON) ((HAS-STATE LKSFV DSKDFJ) SICC (|FORD MUSTANG| HARV) (|| SICC)))) ((HAS-POSSESSION THREE HORNS) ERIC ((HAS-STATE IN A STORY) IWASA (|THETA-XI UNICORN| EJS) (WANGDOODAL IWASA)) (TRICERATOPS ERIC)))) ((HAS-POSSESSION TWO HUMAN BODY TORSOS) ELIOT ((HAS-ACTION LIVES IN A MAZE) DADA ((HAS-ACTION /, IS IT BLACK /, WHITE ETC) JEFFH ((HAS-ACTION ALWAYS (HAS) (FEMALE BODY) TORSOS) PERSA ((HAS-POSSESSION THREE LEGS) A2DEH (CENTAUR ELIOT) (|PIERSON'S PUPPETTEER| A2DEH)) (LAMIA PERSA)) (TESTING JEFFH)) (MINOTAUR DADA)) (BYTAUR ELIOT)))) ((HAS-ACTION LIVES IN WATER) KMP ((HAS-ACTION CAN FLY) KMP ((HAS-POSSESSION BLACK STRIPES) ELIOT ((HAS-ACTION HAS WRINKLED SKIN) ELIOT ((HAS-ACTION GOES /" MEOW /") ELIOT ((HAS-POSSESSION WHEELS) ELIOT ((HAS-STATE SMALLER THAN A DOG) ELIOT ((HAS-ACTION HAS A LONG NECK) CLG ((HAS-ACTION ROARS) HAL ((HAS-ACTION BARKS) WEIT ((HAS-STATE A PREDATOR) WEIT ((HAS-ACTION EATS EUCALYPTUS LEAVES) NODE ((HAS-STATE LARGER THAN A CHIMPANZEE) GRAND ((HAS-ACTION HAS A CURLY TAIL) KMP ((HAS-ACTION NEEDS (ELECTRICITY)) MAZE ((HAS-POSSESSION A BEAK) LAUREN ((HAS-ACTION HAS CLOVEN HOOFS) LAUREN ((HAS-ACTION HAS ARMOR PLATING) LAUREN ((HAS-STATE A RODENT WITH TUSKS) ALLAN ((HAS-STATE INANIMATE) |J.JIML| ((HAS-STATE SMALLER THAN A CHIMPANZEE) PECM ((HAS-STATE THE LARGEST RODENT IN EXISTENCE) LOIEDE ((HAS-ACTION EATS ANTS) DAN ((HAS-ACTION HAS MORE BUTTONS THAN A CHIMPANZEE) EDWIN ((HAS-POSSESSION SPOYS) IWASA (CHIMPANZEE WEIT) (HYENA IWASA)) (TELEPHONE EDWIN)) (AARDVARK DAN)) (CAPYBERA LOIEDE)) ((HAS-ACTION PLAYS DEAD) COOKIE ((HAS-STATE HUMAN) DMK (MONKEY PECM) (|LITTLE BOY| DMK)) (OPPOSSUM COOKIE))) ((HAS-ACTION HAS A SHOTGUN) CHH (TREE |J.JIML|) (BONG CHH))) (MOUSE-DEER ALLAN)) (ARMADILLO LAUREN)) ((HAS-STATE A BARNYARD ANIMAL) KMP (TAPIR LAUREN) (SHEEP KMP))) ((HAS-ACTION LIVES IN ANTARCTICA) RKC ((HAS-ACTION CROWS) JDG (EMU JDG) (ROOSTER LAUREN)) (PENGUIN RKC))) ((HAS-ACTION DIMS THE LIGHTS WHEN TURNED ON) PALLAS (MICRO MAZE) (DEC-10 PALLAS))) ((HAS-ACTION HAS FUR) CLG ((HAS-POSSESSION TUSKS) TLD (PIG KMP) (WARTHOG TLD)) ((HAS-ACTION LIVES IN TREES) GERN (SHEEP GERN) (MONKEY CLG)))) ((HAS-STATE A MARSUPIAL) GRAND ((HAS-STATE A BEAST OF BURDEN) GRAND ((HAS-STATE SIMIAN) GRAND ((HAS-ACTION WALKS ON TWO LEGS) KOVAR ((HAS-ACTION LIVES ON THE GRASSLAND IN AFRICA) GZ ((HAS-ACTION GOES /" NEIGH /") LAUREN ((HAS-POSSESSION HORNS) LAUREN ((HAS-ACTION HAS WOOL ((ON IT) . STATEMENT . NIL .)) LAUREN ((HAS-STATE VERY TIMID) ARPEE ((HAS-STATE SMALLER THAN A HIPPOPOTAMUS) PECM (HIPPOPOTAMUS GRAND) ((HAS-POSSESSION A SHELL) LOIEDE ((HAS-ACTION GOES |'MOO'|) TRIEU ((HAS-STATE A LARGE FURRY RODENT) RJF ((HAS-ACTION HAS ANTLERS) ED ((HAS-ACTION HAS LONG TOES) PW ((HAS-STATE A KIND OF BEAR) CSTACY (PIG PECM) (|PANDA BEAR| CSTACY)) (|THREE-TOED SLOTH| PW)) (MOOSE ED)) (CAPYBARA RJF)) (COW TRIEU)) (|GIANT TORTOISE| LOIEDE))) ((HAS-ACTION GOES /" MOO /") SICC ((HAS-ACTION LIVES ON SESAME STREET) LYMAN ((HAS-ACTION HANGS UPSIDE DOWN) GJH ((HAS-ACTION GOES /" EEON) BERS (|GIANT PANDA| ARPEE) (DONKEY BERS)) (SLOTH GJH)) (SNUFELUFUGUS LYMAN)) (COW SICC))) ((HAS-STATE A FEMALE SHEEP) KMP (LAMB LAUREN) ((HAS-STATE WISE IN THE WAYS OF THE WORLD) A2DEH (EWE KMP) (|SURROGATE SHEEP| A2DEH)))) ((HAS-POSSESSION A GOATEE) LAUREN ((HAS-STATE DOMESTICATED) JALEX ((HAS-STATE USED BY SANTA CLAUS) SHC ((HAS-ACTION HAS LARGE BRANCHLIKE HORNS) BILLB ((HAS-ACTION LIVES ON FROZEN TUNDRAS) BILLB (BUFFALO LAUREN) (YAK BILLB)) (ELK BILLB)) (REINDEER SHC)) ((HAS-ACTION GIVES MILK) STRO (GURNSEYSEY JALEX) (COW STRO))) ((HAS-ACTION HAS A GOATEE) GMR (BUFFALO GMR) ((HAS-STATE LARGER THAN A GOAT) GERN (GOAT LAUREN) ((HAS-ACTION USED TO ROAM IN GIANT HERDS) LAUREN (YAK GERN) (BUFFALO LAUREN)))))) ((HAS-STATE SMALLER THAN A HORSE) NB (HORSE LAUREN) (LLAMA NB))) ((HAS-POSSESSION HORNS) LAUREN ((HAS-ACTION HAS SHORT LEGS) DR ((HAS-ACTION HAS LONG TRUNK) KLAFH ((HAS-POSSESSION WARTS) JWJ (DEER LAUREN) (WARTHOG JWJ)) (ELEPHANT KLAFH)) ((HAS-ACTION HAS GNARLY TEETH) ELF (AARDVARK DR) ((HAS-ACTION HAS A LONG NOSE) BERS (HIPPOPOTOMUS ELF) (ADVAARK BERS)))) ((HAS-STATE A FARM ANIMAL) ALLAN ((HAS-ACTION RUNS FASTER THAN A |GAZELLE RUNS FASTER THAN A GNU|) DANIEL ((HAS-ACTION STARTS WITH A K) KMP ((HAS-ACTION STARTS WITH A Y) DR ((HAS-ACTION HAS LYRE SHAPED CORRUGATED HORNS) BART ((HAS-STATE LARGER THAN A GNU) PECM (GNU GZ) (ELEPHANT PECM)) ((HAS-POSSESSION A BEARD) BERS (GAZELLE BART) (GNU BERS))) (YAK DR)) (KUDU KMP)) (GAZELLE DANIEL)) ((HAS-STATE LIKE AN OX) TLD (COW ALLAN) (|WATER BUFFALO| TLD))))) ((HAS-ACTION (HAS LARGE BREASTS)) KOVAR ((HAS-ACTION (CHASES WOMEN ALL DAY)) KOVAR ((HAS-ACTION (HOPS)) RBARCK ((HAS-ACTION ONLY OCCURS IN SINGULAR) VP ((HAS-ACTION RUNS FAST) BABS ((HAS-STATE YOUNGER) DMK ((HAS-STATE BETTER LOOKING THAN DANIEL) LAUREN (DANIEL VP) ((HAS-ACTION SQUEAKS CUTELY) CSTACY (BIGFOOT LAUREN) (PIGLET CSTACY))) ((HAS-STATE FEMALE) DMK (BOY DMK) (GIRL DMK))) ((HAS-STATE HUMAN) DMK (GAZELLE BABS) ((HAS-STATE FEMALE) DMK (BOY DMK) (GIRL DMK)))) ((HAS-ACTION KNOWS) CEH ((HAS-STATE AS ADVENTUROUS) KMP ((HAS-ACTION HAS LONG HAIR) DR ((HAS-STATE A BUREAUCRAT) MWT (KMP KMP) (|PAUL GRAY| MWT)) ((HAS-STATE KNOWN AS /" THE INCRDIBLE FLUSHING MAN /") COOKIE (RWK DR) (CSTACY COOKIE))) ((HAS-STATE A FRESHMAN) JKESS (|DON WOODS| CEH) (SUBR JKESS))) ((HAS-ACTION (IS FEMALE)) KMP ((HAS-STATE AN ENGINEER) KMP ((HAS-ACTION REMINDS YOU OF YOUR GRANDMOTHER) LIZZY (TOSCANINI KMP) (GSB LIZZY)) (KMP VP)) (JANICE KMP)))) ((HAS-ACTION LOOK LIKE A HUMAN) CWC (KANGAROO RBARCK) ((HAS-STATE TALLER THAN AN ORANGUTAN) KMP (ORANGUTAN CWC) (OLAF KMP)))) ((HAS-ACTION FLAMES ALOT) A2DEH (MAN KOVAR) ((HAS-ACTION TAKES /50 YEARS TO GRADUATE) RDZ (|INCREDIBLE FLUSHING MAN| A2DEH) (FRANKSTON RDZ)))) ((HAS-STATE SHORT) KMP ((HAS-STATE EXTREMELY BEAUTIFUL) SEH (BKERNS KMP) ((HAS-STATE WIERD) ELF (|LISA CUNNINGHAM| SEH) (NATALIE ELF))) ((HAS-POSSESSION RED (BLOOD)) KMP (|QUEEN OF ENGLAND| KMP) ((HAS-ACTION DANCES ON IT IS TOES) JL ((HAS-ACTION TAMES UNICORNS) JKESS ((HAS-STATE FAT) JAFH ((HAS-ACTION LIKES DEAD MICE) KMP ((HAS-STATE SPELLED COOKIE) COOKIE (VP KMP) (COOKIEA COOKIE)) (COOKIE KMP)) (MICHAEL JAFH)) (SYDNEY JKESS)) ((HAS-ACTION DANCES AS OFTEN) VP ((HAS-ACTION (LIVES IN CALIFORNIA)) KMP (PIGLET VP) (COOKIE KMP)) ((HAS-POSSESSION LARGE BREASTS) COOKIE (WRONG COOKIE) (BALLERINA JL)))))))) ((HAS-STATE LARGER THAN A GORILLA) HOEY ((HAS-ACTION FLAMES BRIGHT BLUE) MWMT ((HAS-ACTION CARRIES ITS FATHER/'S CHARGE PLATE) PALLAS ((HAS-STATE UGLIER THAN BABOONS) WAC ((HAS-ACTION HAS RED FUR) ALLAN ((HAS-STATE AFRAID OF LEOPARDS IN A DARK ALLEY) VP (STAN VP) ((HAS-ACTION (IS FROM KANSAS)) VP (BABOON WAC) (DAVE VP))) ((HAS-ACTION PLAYS ZORK) VP (ORANGUTAN ALLAN) (KRONJ VP))) ((HAS-PROPERTY ORANGE) DEEP (GORILLA GRAND) (ORANGUTANG DEEP))) (JAP PALLAS)) ((HAS-STATE MORE TIMID THAN A THIEL-BEAST) JL ((HAS-ACTION CONSUMES XALCOHOL) A2DEH (THIEL-BEAST MWMT) (|SCIENCE FICTION FAN| A2DEH)) (|HAIRY HACKER| JL))) ((HAS-ACTION (HAS LONG HAIR)) FURUNO (|FORMER ADVISOR| HOEY) (J FURUNO)))) ((HAS-STATE TEMPERAMENTAL) LAUREN ((HAS-STATE SMATER THAN A HORSE) JANUS ((HAS-ACTION TALKS BACK) CHH ((HAS-ACTION HAS HORNS) RJM (HORSE GRAND) (OX RJM)) ((HAS-STATE WORNG) GERN (NIGGERR CHH) (WRONG GERN))) ((HAS-ACTION HAS HORNS) NB (MAN JANUS) (COW NB))) ((HAS-STATE MUCH) MAZE ((HAS-ACTION THINKS) PALLAS ((HAS-ACTION SLEEPS AT NIGHT) A2DEH (PROGRAMMER PALLAS) (HORSE A2DEH)) (|MIT = MC| MAZE)) ((HAS-ACTION HAS A ROUGUE) JOSE ((HAS-ACTION HAS HUMPS ON ITS BACK) GZ (ASS LAUREN) (CAMEL GZ)) (ELEPHANT JOSE))))) ((HAS-ACTION HAS A WALL IN ITS NAME) SKH ((HAS-ACTION EATS BAMBOO SHOOTS) ED ((HAS-ACTION LIVES IN THE DESERT) IWASA (KANGEROO GRAND) ((HAS-POSSESSION A POUCH) CRE (YAK IWASA) (KANGAROO CRE))) (PANDA ED)) ((HAS-STATE LIKE A HORSE) RHB (WALLABY SKH) (MULE RHB))))) ((HAS-ACTION HAS A CURLY TAIL) NEWMAN ((HAS-PROPERTY LARGE) GNU (KOALA NODE) ((HAS-ACTION GOES /" NAY /") ELF ((HAS-ACTION HOPS ON TWO LEGS) ALPHA ((HAS-POSSESSION FUR) BERG ((HAS-STATE A HUMAN) CSTACY (ELEPHANT GNU) (GRUB CSTACY)) ((HAS-ACTION WALKS ON TWO LEGS) PSY (COW BERG) (ORANGUTANG PSY))) (KANGAROO ALPHA)) (HORSE ELF))) ((HAS-STATE SMARTER THAN A PIG) JANUS (PIG NEWMAN) (MONKEY JANUS)))) ((HAS-STATE A REPTILE) GRAND ((HAS-ACTION STANDS ERECT) GRAND ((HAS-ACTION (HAS A) SLOSHY TONGUE) NB ((HAS-PROPERTY WHITE) SHL ((HAS-STATE CARNIVOROUS) BDH ((HAS-ACTION TAIL) PETE ((HAS-ACTION REACHES OUT TO CRUSH SOMEONE) A2DEH (|PANDA BEAR| SHL) (|MA BELL| A2DEH)) ((HAS-STATE A CAT) IWASA (MONKEY PETE) (LEPORD IWASA))) ((HAS-ACTION HAS A LONG NOSE) ALPHA ((HAS-POSSESSION SPOTS) LOIEDE ((HAS-STATE A CATNOT A CAT) RKC ((HAS-ACTION HOWLS) IWASA ((HAS-STATE AN ANIMAL LIKE A PIG WITH TUSKS) SULLIV ((HAS-POSSESSION ZITS) SULLIV ((HAS-ACTION EATS SNAKES) |J.JIML| (BUNNY RKC) (MONGOOSE |J.JIML|)) (|| SULLIV)) (BOAR SULLIV)) ((HAS-STATE REDISH) IWASA (WOLF IWASA) (FOX IWASA))) ((HAS-STATE FASTER THAN A LYNX) RRLC (LYNX BDH) (JAGUAR RRLC))) ((HAS-ACTION LAUGHS) BERS (LEOPARD LOIEDE) (HYENA BERS))) ((HAS-ACTION EATS ANTS) DMK ((HAS-PROPERTY MEAN) GERN ((HAS-STATE SLY) ARTHUR ((HAS-STATE BETTER LOOKING THAN A COYOTE) KMP (COYOTE DMK) (WOLF KMP)) (FOX ARTHUR)) ((HAS-ACTION LOOKS LIKE A PIG) BERS (WOMBAT GERN) (|WILD BOAR| BERS))) (ANTEATER ALPHA)))) ((HAS-PROPERTY BLACK) BILBO (|POLAR BEAR| SHL) (|PANDA BEAR| BILBO))) ((HAS-ACTION HAS FUR) CHAPMA ((HAS-ACTION HAS A LONG SNOUT) SEH (PIG NB) (AARDVARK SEH)) ((HAS-STATE THE NOSE) PETE ((HAS-POSSESSION LARGE CLAWS) BERS (ANTEATER CHAPMA) ((HAS-STATE SMALLER THAN A BEAR) GERN (|GRIZZLY BEAR| BERS) (WOLF GERN))) (CHIMP PETE)))) ((HAS-ACTION LOOKS SOFT AND CUDDLY) KMP ((HAS-ACTION WEARS WHITE SOCKS ALL THE TIME) SHAG ((HAS-STATE BIGGER THAN A MAN) KMP ((HAS-STATE MUCH NASTIER THAN A MAN) KMP ((HAS-ACTION HAS A /13 INCH LONG ERECTION) SULLIV ((HAS-STATE A MEAN SLUG LICKER) SULLIV ((HAS-POSSESSION A BRAIN) BERS (TROJAN CHS) ((HAS-STATE IGNORANT) PW (MAN BERS) (FOOL PW))) (GUTAG SULLIV)) (|JOHN HOOLMES| SULLIV)) ((HAS-STATE FAMOUS) JKESS ((HAS-STATE IT IS HUMAN) DMK (|BEAST OF BENGAL| KMP) ((HAS-ACTION HACKS ITS) KARIM ((HAS-ACTION ABUSES ITS) KMP (HACKER KMP) (VANDAL KMP)))) ((HAS-ACTION EATS TOURISTS) GILDEA (|MARQUIS DE SADE| JKESS) (|INCREDIBLE FLUSHING MAN| GILDEA)))) (|POLAR BEAR| KMP)) ((HAS-POSSESSION SCRUPLES) KMP (POLITICIAN CHH) (NERD SHAG))) ((HAS-ACTION HAS BLONDE HAIR) CSTACY ((HAS-STATE CUTER THAN A YETI) KMP (YETI FITZ) ((HAS-PROPERTY ONE) LIZZY (KENT KMP) (HENRIK LIZZY))) ((HAS-STATE TALL) SULLIV (FARAH CSTACY) ((HAS-ACTION HAS NO HEART) BOYACK (CHERYL SULLIV) (DIANDIANE BOYACK)))))) ((HAS-STATE POISONOUS) NB (|BOA CONSTRICTOR| GRAND) (COBRA NB)))) ((HAS-ACTION (HAS A ((LARGE) NOSE))) PLK ((HAS-ACTION GOES YIPE YIPE) MSI ((HAS-STATE A CERTAIN KIND OF DOG) PLK (DOG |No one|) ((HAS-POSSESSION ORANGE FUR) PLK ((HAS-STATE A TERRIER) PLK ((HAS-ACTION HAS VERY LONG EARS) PLK ((HAS-STATE A GUARD DOG) PLK ((HAS-STATE LARGER THAN A BEAGLE) DKR ((HAS-STATE THE SMALLEST DOG IN THE WORLD) SHL ((HAS-STATE A BEAGLE) EJS ((HAS-ACTION HAS FLOPPY EARS) KREN (PEKINGESE KREN) (|LHASA APSO| KREN)) (BEAGLE PLK)) (CHIHUAHUA SHL)) ((HAS-PROPERTY HUGE) SHL ((HAS-STATE A WILD TYPE OF DOG) SHL ((HAS-STATE A HUNTING DOG) ARPEE (HARRIER DKR) ((HAS-PROPERTY RED) RHB (|NORWEGIAN WOLF HOUND| ARPEE) (|IRISH WOLFHOUND| RHB))) (WOLF SHL)) (|SAINT BERNAARD| SHL))) (|GERMAN SHEPARD| PLK)) (|BASSET HOUND| PLK)) ((HAS-POSSESSION DARKER FUR THAN A |TERRIER'S FUR|) PLK ((HAS-ACTION HAS A TRIANGULAR SHAPED FACE) PLK (|WEST HIGHLAND WHITE TERRIER| PLK) (|BULL TERRIER| PLK)) (|CAIRNE TERRIER| PLK))) ((HAS-ACTION HUNTS) PLK ((HAS-STATE A SHEEPHERDER) PLK ((HAS-STATE A TOY DOG) PLK (|IRISH SETTER| PLK) (CHOW PLK)) (COLLIE PLK)) ((HAS-ACTION HAS STRAIGHT HAIR) ERIC (|GOLDEN LABRADOR| PLK) ((HAS-ACTION LIVES IN AUSTRAILIA) BERS (|GOLDEN RETRIEVER| ERIC) (DINGO BERS)))))) ((HAS-STATE A DOG) PLK ((HAS-ACTION TRAVELS UNDERGROUND) LSO ((HAS-ACTION HAS TWO LEGS) TOILLE (HYEENA MSI) (ELIOT TOILLE)) (ZOT LSO)) ((HAS-STATE A BABY DOG) PLK ((HAS-STATE VERY SMALL) DKR (POODLE PLK) ((HAS-ACTION HAS LONG HAIR) GZ (CHIUAUA DKR) (|SILKY TERRIER| GZ))) (PUPPY PLK)))) ((HAS-STATE A SAUSAGE DOG) TANG ((HAS-STATE LEAN) RBARCK ((HAS-STATE A POLICE DOG) SHAG ((HAS-ACTION UNDERSTANDS) PAULP (|POODA POODLW DOG| PAULP) ((HAS-PROPERTY RED) CRUZ ((HAS-ACTION HAS NO PEDIGREE) VP ((HAS-STATE SHAGGY) BERS (BULLDOG PLK) (|BEARDED COLLIE| BERS)) (MUTT VP)) ((HAS-ACTION NECESSITATES BUYING A NEW OVEN) LAUREN (|IRISH SETTER| CRUZ) (|POODLE IN A MICROWAVE OVEN| LAUREN)))) (|GERMAN SHEPARD| SHAG)) ((HAS-STATE MUCH) ARCHIE (DOG ARCHIE) ((HAS-STATE WILD) RAM (|IRISH SETTER| RBARCK) (WOLF RAM)))) ((HAS-ACTION PULLS A SLED) LAUREN (DAUCHSHUND TANG) (|ALASKAN MALAMUTE| LAUREN))))) ((HAS-ACTION LIVES IN NORTH AMERICA) GRAND ((HAS-PROPERTY BLACK) LAUREN ((HAS-POSSESSION WHEELS) BILLT ((HAS-ACTION LIVES IN THE HIMALAYAS) SICC ((HAS-ACTION HAS SPOTS AN) PECM (LION GRAND) ((HAS-ACTION LAUGHS) ROBG ((HAS-ACTION HAS SPOTS IN ITS SPOTS) BERS (LEOPARD PECM) (JAGUAR BERS)) (HYENA ROBG))) (|ABOMINABLE SNOWMAN| SICC)) (|ABOMINABLE SNOWMAN| BILLT)) ((HAS-ACTION BEATS ITS/' CHEST) RAM (PANTHER LAUREN) (GORRILLA RAM))) ((HAS-POSSESSION A MANE) AGRE ((HAS-STATE THE WORST THING YOU CAN MEET) SHL ((HAS-ACTION STANDS ON IT HIND LEGS) ARPEE ((HAS-STATE SMALLER THAN A PUMA) DBA (PUMA HAL) (LYNX DBA)) ((HAS-POSSESSION FUR) ELIOT (ELIOT ELIOT) (BEAR ARPEE))) ((HAS-STATE A TYPE OF CAT) SHL ((HAS-ACTION KILLS PEOPLE WITH BANANAS) JOHNS ((HAS-STATE BIGGER THAN A |LITTLE BROTHER|) EGBERT (|LITTLE BROTHER| SHL) (BEAR EGBERT)) (SCHLOCK JOHNS)) (JAGUAR SHL))) ((HAS-ACTION LAGER /;) IWASA (|MOUNTAIN LION| AGRE) (BEAR IWASA))))) ((HAS-STATE RARE) WEIT ((HAS-ACTION LIKES TO JUMP) WEIT ((HAS-STATE A REPTILE) CXC ((HAS-ACTION (IS EATEN) FOR THANKSGIVING) CLEMW ((HAS-STATE A TYPE OF BIRD) SHL ((HAS-ACTION LIVES IN SOUTH AMERICA) VP ((HAS-STATE SMALLER THEN A GIRAFFE THAN A GIRAFFE) KRAUSS (GIRAFFE CLG) (HORSE KRAUSS)) ((HAS-ACTION WHINNIES) ARPEE (LLAMA VP) ((HAS-ACTION SPITS) ELIOT (HORSE ARPEE) (LLAMA ELIOT)))) ((HAS-ACTION HIDES IN THE GROUND) BABS ((HAS-PROPERTY DUMB) LMSJR (EMU SHL) (CASSOWARY LMSJR)) (OSTRICH BABS))) (TURKEY CLEMW)) ((HAS-STATE EXT IS EXTINCT) BEEP ((HAS-STATE IT IS SMALLER THAN AN ANDCONDA) KRAUSS (ANACONDA CXC) ((HAS-STATE BIGGER THAN A BOA) OAF (|GARTER SNAKE| KRAUSS) (PYTHON OAF))) (BRONTOSAURUS BEEP))) ((HAS-ACTION HAS FOUR LEGS) BEAN ((HAS-ACTION HAS A POUCH) RAM ((HAS-STATE LONG /, THICK /, SQUIRTS COME) SULLIV (GORRILLA RAM) (SHLONG SULLIV)) (KANGAROO WEIT)) (HORSE BEAN))) ((HAS-ACTION HAS SPOTS) PAP ((HAS-STATE EXTINCT REPTILE) PAULP ((HAS-ACTION HAS A LONG TONGUE) COOKIE ((HAS-STATE A BIRD) DMK ((HAS-STATE A HORSE) BERS (OKAPI WEIT) (STALION BERS)) (OSTRICH DMK)) ((HAS-STATE STUPIDER THAN AN AARDVARK) SAZ (AARDVARK COOKIE) (SAZ SAZ))) ((HAS-STATE A PREDATOR) JRF (|BRONTOSAORA BRONTOSAUR| PAULP) (|TYRANASAURUS REX| JRF))) ((HAS-ACTION HAS A CALCULATOR ATTACHED TO IT) JHUA ((HAS-STATE NOSE IS LONGER THAN IT IS NECK) HUBRD (GIRAFFE PAP) (AARDVARK HUBRD)) (MACGREGOR-TWIT JHUA))))) ((HAS-POSSESSION A TAIL) ELIOT ((HAS-ACTION HAS SHARP QUILLS) CLG ((HAS-STATE AN INVERTEBRATE) CLG ((HAS-PROPERTY TWO) FITZ ((HAS-STATE A BIRD) JHUA ((HAS-ACTION RUNS OFF A CLIFF EVERY /77 TO /10 YEARS) ELIOT ((HAS-ACTION SQUEALS) LAUREN ((HAS-ACTION DWELLS IN LOW RENT APARTMENTS) LAUREN ((HAS-STATE AN INSECT) SHL ((HAS-POSSESSION A THOUSAND LEGS) SHL ((HAS-PROPERTY BAD) MPA ((HAS-ACTION DOES ABSOLUTELY NOTHING) ARPEE ((HAS-ACTION LIVES IN AUSTRAILIA) BERS ((HAS-POSSESSION A TAIL) DEEP ((HAS-ACTION EXPANDS SNAKE DOES NOT) KYRHIZ ((HAS-STATE EXPANDABLE /, SNAKE IS NOT) KYRHIZ ((HAS-STATE EXPANDABLE) KYRHIZ (SNAKE DEEP) (PEOS KYRHIZ)) (PSOLI KYRHIZ)) (PEOS KYRHIZ)) (HAMSTER ELIOT)) (WOMBAT BERS)) (|PET ROCK K| ARPEE)) ((HAS-ACTION KILLS BY SQUEEZING) ALPHA (WOMBAT MPA) (|BOA CONTRICTOR| ALPHA))) (MILLIPEDE SHL)) ((HAS-STATE A PREDATOR) PECM ((HAS-PROPERTY GREEN) PECM ((HAS-ACTION EATS WOOD) TENSOR (EARWIG SHL) (TERMITE TENSOR)) (GRASSHOPPER PECM)) (SPIDER PECM))) ((HAS-STATE A ASPIDER) PERSA ((HAS-STATE SMALLER THAN A COCKROACH) KMP (COCKROACH LAUREN) ((HAS-STATE SMALLER /, LIVES ON THE SKIN SURFACE THAN AN ANT) ELLEN ((HAS-STATE SMALLER THAN AN ANT) ELLEN (ANT KMP) (FLEA ELLEN)) (FLEA ELLEN))) (TARANTULA PERSA))) ((HAS-POSSESSION MUCH HAIR) KMP (BABY KMP) (|GUINEA PIG| LAUREN))) (LEMING ELIOT)) ((HAS-ACTION CROSSES THE ROAD IN JOKES) SHAG (KIWI JHUA) ((HAS-ACTION A CHICK IS A BQBY CHICKEN) PAULP (CHICKEN SHAG) (CHICK PAULP)))) (AARDVARK FITZ)) ((HAS-STATE SMALLER THAN A |HERMIT CRAB|) EJS ((HAS-ACTION HAS EIGHT LONG LEGS) CLG ((HAS-ACTION TASTES BETTER THAN A |HERMIT CRAB|) PC ((HAS-STATE SQUISHY) ALPHA (|HERMIT CRAB| CLG) ((HAS-ACTION HAS NO BRAIN) PERSA ((HAS-ACTION GOES SPLAT WHEN IT HITS THE GROUND) A2DEH (|MEXICAN JUMPING SLUG| A2DEH) (|BANANA SLUG| ALPHA)) ((HAS-ACTION MEASURES) BERS (|SLIME MOLD| PERSA) (|INCH WORM| BERS)))) ((HAS-ACTION TASTES WORSE THAN A ROAST BEEF) KMP (|ROAST BEEF| PC) ((HAS-ACTION GOES < RIBET >) ELMO (COBRA KMP) (|TREE FROG| ELMO)))) ((HAS-STATE A HOUSEHOLD PEST) BERS (SPIDER CLG) ((HAS-STATE HAIRY) BERS (COCKROACH BERS) (TARANTULA BERS)))) ((HAS-STATE GROSS) EJS ((HAS-POSSESSION A STINGER) GRAND ((HAS-ACTION HAS EIGHT LEGS /, WHEREAS AN ANT HAS ONLY SIX LEGS) DAN ((HAS-ACTION HAS EIGHT LEGS) DAN ((HAS-ACTION HAS MANY LEGS) LAUREN ((HAS-ACTION HAS A HARD SHELL) |J.JIML| (ANT EJS) ((HAS-STATE BIGGER THAN A BEETLE) ARK (BEETLE |J.JIML|) (SNAIL ARK))) ((HAS-ACTION HOPS ON DOGS) DH ((HAS-STATE AN ANIMAL THAT DOES NOT BECOME A BUTTERFLY) JFB (CATERPILLAR LAUREN) ((HAS-POSSESSION MANY LEGS) EJS (WORM JFB) ((HAS-ACTION ATTACKS PLANTS) JNUFF (CENTIPEDE EJS) ((HAS-PROPERTY GREEN) KMP ((HAS-STATE BIGGER THAN A |SPIDER MITE|) KMP (|SPIDER MITE| JNUFF) (ANT KMP)) (GRASSHOPPER KMP))))) (FLEA DH))) (SPIDER DAN)) ((HAS-ACTION EATS BLOOD) PC (SPIDER DAN) (TICQUE PC))) ((HAS-ACTION FLIES) VP ((HAS-STATE SMALLER THAN A SCORPION) COOKIE (SCORPION VP) (ANT COOKIE)) (BEE GRAND))) ((HAS-POSSESSION MANY FEET) LE ((HAS-ACTION HAS NO FEET) ZANAR ((HAS-STATE SMALLER THAN A ROACH) LAUREN (ROACH EJS) ((HAS-ACTION BITES YOU) HOEY (SILVERFISH LAUREN) (FLEA HOEY))) ((HAS-ACTION TRAILS SILVERY GOO) LAUREN ((HAS-STATE * VERY * SMALL) DH (WORM ZANAR) ((HAS-ACTION HAS LEGS) CHAPMA (GERM DH) (SPIDER CHAPMA))) (SLUG LAUREN))) ((HAS-PROPERTY BLACK) DIANA ((HAS-ACTION HAS ONLY SIX LEGS) NB ((HAS-STATE A PARASITE) PC (CENTIPEDE LE) (MITE PC)) ((HAS-STATE A PARASITE) PC (ROACH NB) ((HAS-STATE BIGGER THAN A MITE) DBROWN (MITE PC) (COCKROACH DBROWN)))) ((HAS-ACTION AS WINGS) ZANAR ((HAS-ACTION DRINKS BLOOD) PALLAS ((HAS-ACTION EATS INSECTS) FFM (COCKROACH PALLAS) (SPIDER FFM)) (TIC ZANAR)) (FLEA DIANA))))))) ((HAS-STATE KIND OF A PIG) IWASA (PORCUPINE CLG) (WARTHOG IWASA))) ((HAS-STATE SMALLER THAN A GERBIL) ELIOT ((HAS-POSSESSION A DUCK-BILL) CLG ((HAS-ACTION LIVES IN THE WESTERN HEMISPHERE) WEIT ((HAS-STATE A PET) PLK ((HAS-ACTION WEARS A TUXEDO) LAUREN ((HAS-ACTION CAN BE BEATEN BY A MONGOOSE) LAUREN ((HAS-ACTION HAS A HAIRY NOSE) MWMT ((HAS-STATE A BIRD) JALEX ((HAS-STATE LARGER THAN SQUIR) FFM (SQUIRREL PLK) ((HAS-STATE CUDDLY) LPH ((HAS-ACTION HATES BANANAS) MWT ((HAS-ACTION LIVES IN INDIA) DEEP (MONKEY FFM) (MONGOOSE DEEP)) ((HAS-ACTION LIVE IN INDIA) DEEP (|TASMANIAN DEVIL| MWT) (MONGOOSE DEEP))) (|KOALA BEAR| LPH))) ((HAS-STATE OBSESSED) FURUTA (PEACOCK JALEX) (|MALLEE FOWL| FURUTA))) ((HAS-STATE A RODENT-LIKE CREATURE WITH TUSKS) ALLAN ((HAS-ACTION LIVES IN TASMANIA) ALMAIN ((HAS-ACTION CAN KILL COBRAS) IWASA ((HAS-ACTION LIVES IN AUSTRALIA) GERN (WOMBAT MWMT) (|KOALA BEAR| GERN)) (MONGOOSE IWASA)) (|TASMANIAN DEVIL| ALMAIN)) (MOUSE-DEER ALLAN))) ((HAS-ACTION SITS ON LARS/' TERMINAL) LSH ((HAS-STATE CUTE) GERN (COBRA LAUREN) (|KOALA BEAR KOALA BEAR| GERN)) ((HAS-STATE A MAMMAL) LETTO (FISH LSH) (|TASMANIAN DEVIL| LETTO)))) (PENQUIN LAUREN)) ((HAS-ACTION SPINS BANANA WEBS) LAUREN ((HAS-STATE BIGGER THAN A GERBIL) DEEP (GERBIL ELIOT) ((HAS-STATE A REPTILE) OAF (MONGOOSE DEEP) (PYTHON OAF))) (|SPIDER MONKEY| LAUREN))) ((HAS-STATE A RODENT) GRAND ((HAS-ACTION GOES |'OINK'|) MSI ((HAS-ACTION (PROBABLY) LIVES IN TASMANIA) ELIOT ((HAS-ACTION CAN STINK) LAUREN ((HAS-POSSESSION FEATHERS) PALLAS ((HAS-ACTION HAS A HARD SKIN) CLIVE ((HAS-POSSESSION QUILLS) JJD ((HAS-STATE LONG) KRAUSS ((HAS-STATE SEMI-INTELLIGENT) ABRACA ((HAS-ACTION HAS LONG EARS) BILBO ((HAS-ACTION LIVES IN TREES IN SOUTH AMERICA) AGRE ((HAS-STATE A CAT) IWASA ((HAS-ACTION EATS RACOONS FOR BREAKFAST) TLD ((HAS-STATE FUR IS SOLD) BERS (RACOON WEIT) (MINK BERS)) (WOLVERINE TLD)) (PAMU IWASA)) (AI AGRE)) (RABBIT BILBO)) ((HAS-POSSESSION CLAWS) PJG (MONKEY ABRACA) ((HAS-STATE LIKE A MONKEY) IWASA ((HAS-STATE A WICKED GOOD HUNTER) BOYACK (RACCOON PJG) (WOLVERINE BOYACK)) (BABOON IWASA)))) ((HAS-STATE POISONESS & HAS A FUNNY THING ON THE END OF IT IS TAIL) HEAD ((HAS-STATE A SNAKE) LMSJR ((HAS-STATE GREYISH-GREEN IN COLOR) JKESS ((HAS-STATE SNEAKY) BOYACK (|GILA MONSTER| LMSJR) (WEASEL BOYACK)) (IGUANA JKESS)) (|GARTER SNAKE| KRAUSS)) (RATTLESNAKE HEAD))) (PORCUPINE JJD)) ((HAS-POSSESSION ARMOR) JON-O (IGUANA JON-O) (ARMADILLO CLIVE))) ((HAS-POSSESSION BEAUTIFUL FEATHERS) SOROC ((HAS-ACTION GOES /" BEEP BEEP /") GERN (CHICKEN SOROC) (|ROAD RUNNER| GERN)) (PEACOCK PALLAS))) ((HAS-ACTION HAS STRIPES) SEB (AARDVARK SEB) (SKUNK LAUREN))) ((HAS-ACTION HAS NO FEET) JIM ((HAS-POSSESSION FEATHERS) JL ((HAS-ACTION LIVES IN TREES) CSTACY (|TASMANIAN DEVIL| ELIOT) (|KOALA BEAR| CSTACY)) (CHICKEN JL)) (SNAKE JIM))) ((HAS-STATE CUTE) VP (PIG MSI) (PIGLET VP))) ((HAS-POSSESSION VERY SOFT FUR) RJF ((HAS-ACTION LIVES UNDERGROUND) LAUREN ((HAS-ACTION BUBUILDS DAMS) LAUREN ((HAS-POSSESSION ARMOR) DAN ((HAS-ACTION HAS SHARP QUILLS) HEAD ((HAS-ACTION HAS A THIN TAIL) DAN (SQUIRREL DAN) ((HAS-ACTION KILLS SNAKES) MOBIUS (RAT GRAND) (MONGOOSE MOBIUS))) (PORCUPINE HEAD)) ((HAS-STATE SHARP) HEAD (ARMADILLO DAN) (PORCUPINE HEAD))) (BEAVER LAUREN)) ((HAS-ACTION COMES UP ON FEB) JHUA ((HAS-STATE A RAT) MSI ((HAS-ACTION HAS A LONG NOSE) BILLB ((HAS-ACTION JUMPS) IWASA (MOLE LAUREN) (RABBIT IWASA)) (AARDVARK BILLB)) (RAT MSI)) (GROUNDHOG JHUA))) ((HAS-ACTION LIVE IN TREES) DAN ((HAS-ACTION ((HAS FUR))) MCW (CHINCHILLA RJF) ((HAS-STATE A HOUSE PET) PAULP ((HAS-ACTION LIVES UNDERGROUND) LAUREN ((HAS-ACTION BUILDS DAMS) MWMT ((HAS-ACTION KILLS SNAKES) HUBRD ((HAS-ACTION CURLS UP INTO A BALL) MWT ((HAS-ACTION CAN PRODUCE A TERRIBLE ODOR) LAUREN (AMOUSE MCW) (SKUNK LAUREN)) (HEDGEHOG MWT)) (MONGOOSE HUBRD)) (BEAVER MWMT)) ((HAS-STATE MADE INTO COATS) LAUREN ((HAS-ACTION HAS LITTLE SQUINTY EYES) HEAD ((HAS-ACTION EATS VOALS FOR DINNER) FISH ((HAS-ACTION KNOW WHAT AN ANT-EATER IS) ALPHA ((HAS-PROPERTY RELATED) BERS (VOAL LAUREN) (|PRAIRIE DOG| BERS)) (ANT-EATER ALPHA)) (MARMOT FISH)) ((HAS-STATE BLIND) CSTACY (MOUSE CSTACY) (MOLE HEAD))) ((HAS-POSSESSION WHITE FUR) JCMA (MINK LAUREN) (ERMINE JCMA)))) ((HAS-STATE LARGER THAN A GERBIL) LAUREN ((HAS-STATE MUCH LARGER THEN A HAMSTER THAN A HAMSTER) FFM (HAMSTER FFM) (GERBIL PAULP)) ((HAS-ACTION DISTRIBUTES EASTER EGGS) LAUREN ((HAS-ACTION HAS A LONGER TAIL) LAUREN ((HAS-STATE SMALLER THAN A GERBILBIRBIL) DMK (HAMSTER LAUREN) (MOUSE DMK)) ((HAS-STATE SMALLER THAN A |RAT A RAT|) DMK (RAT LAUREN) (MOUSE DMK))) (RABBIT LAUREN))))) ((HAS-ACTION HAS WHITE STRIPES ON ITS SIDES) COOKIE (SQUIRREL DAN) (CHIPMUNK COOKIE)))))) (PLATYPUS CLG)) ((HAS-STATE EXTINCT) MAF ((HAS-STATE SUICIDAL) GRAND ((HAS-STATE MOUSE) PAULP ((HAS-STATE SLIMY) LAUREN ((HAS-STATE AN INSECT) SHL ((HAS-STATE ONE-CELLED) PGS ((HAS-STATE A HOUSE PET) SHC ((HAS-ACTION HAS A BUSHY TAIL) KMP ((HAS-STATE SMALLER THAN A RAT) LAUREN (RAT PAULP) ((HAS-ACTION HAS FEET INFRONT OF ITS FACE) BERS ((HAS-STATE A PRIMATE) MJK (VOLE LAUREN) ((HAS-ACTION LIVES IN SOUTH AMERICA) BERS (MARMOSET MJK) (CHINCHILLA BERS))) (MOLE BERS))) (SQUIRREL KMP)) (HAMPSTER SHC)) (PARAMECIUM PGS)) ((HAS-ACTION LIVES IN THE DESERT) LAUREN (EARWIG SHL) ((HAS-ACTION LAYS FOR PASSERS-BY) BOYACK (SCORPION LAUREN) (ANTLION BOYACK)))) ((HAS-POSSESSION LEGS) A2DEH (SALAMANDER LAUREN) (WORM A2DEH))) (MOUSE ELIOT)) ((HAS-STATE SMALLER THAN A LEMMING) BILLB (LEMMING GRAND) (SHREW BILLB))) (LEMUR MAF))))) ((HAS-ACTION HAS A BACK SEAT) JIM ((HAS-ACTION MANUFACTURER IS BASED IN DEARBORN /, MICHIGAN) GRAND ((HAS-STATE MADE BY CHEVY /, INC) LAUREN ((HAS-STATE VERY EXPENSIVE) JJD ((HAS-ACTION HAS A ROTARY ENGINE) JJD ((HAS-POSSESSION A MID-ENGINE) JJD ((HAS-ACTION HAS NO ENGINE) JOSE ((HAS-POSSESSION WHEELS) BILLT (|GMC TRUCK| ELIOT) ((HAS-STATE MADE IN JAPAN) JPG (MUSTANG BILLT) (|HONDA PRELUDE| JPG))) (BICYCLE JOSE)) (|FIAT X-19| JJD)) (|MAZDA RX-7| JJD)) ((HAS-STATE A PRODUCTION CAR) JJD ((HAS-ACTION GOES 0-100 MPH IN /13 SEC) HARV ((HAS-ACTION HAS LOTS OF BLINKEY-LIGHTS) A2DEH (|MERCEDES C-111| JJD) (PDP-10 A2DEH)) (|SHELBY COBRA| HARV)) ((HAS-STATE MUCH MORE EXPENSIVE) JJD (|MASERATI MERAK| JJD) (|LAMBORGHI COUNTACH| JJD)))) ((HAS-ACTION HAS /6 CYLINDERS ONLY) SLH (|EL CAMINO| LAUREN) (NOVA SLH))) ((HAS-ACTION BALLS) PIBE ((HAS-ACTION CAN NOT) HARV (|FORD TRUCK| GRAND) ((HAS-PROPERTY ONE) HARV (N HARV) (|K CAR| HARV))) ((HAS-ACTION HAS ONE OF ITS PISTONS IS BOTH THE SAME) HARV (MAN PIBE) (COBRA HARV)))) ((HAS-ACTION COSTS ABOUT $ 20K MORE) ELIOT ((HAS-STATE A GERMAN CAR) TANG ((HAS-ACTION CAN BE DESTROYED WITH A CAN-OPENER) DEVON ((HAS-STATE DISTINGUISHED FROM A CAMERO) PC (|FRAT BROTHER| PC) ((HAS-STATE MADE IN /1957) CSTACY ((HAS-ACTION COSTS LESS THAN $ 8K) GERN (CAMERO JIM) (CAVALIER GERN)) (|1957 CHEVY| CSTACY))) ((HAS-ACTION CAN BE MOVED BY THREE DRUNK COLLEGE STUDENTS) |M.JR| (|CHEVY SHIT-VETTE| DEVON) ((HAS-ACTION HAS NO GUTS) ARK (|DATSUN 210| |M.JR|) (CHEVETT ARK)))) ((HAS-ACTION COSTS MORE) JJD ((HAS-STATE A STATION WAGON) JJD (RABBIT TANG) (|VOLKSWAGEN DASHER WAGON| JJD)) (|VOLKSWAGEN SCIROCCO| JJD))) ((HAS-ACTION CAN GO IN EXCESS OF /200 MPH IN FOURTH GEAR) KOVAR ((HAS-STATE MADE IN GERMANY) JJD ((HAS-ACTION HAS MODERN STYLING) JJD ((HAS-STATE AN ANIMAL) RKC (|ROLLS ROYCE| ELIOT) (BABY RKC)) (|LOTUS ELAN| JJD)) ((HAS-ACTION HAS A TURBOCHARGED ENGINE) JJD (|BMW 621CSI| JJD) (|PORCHE 911 TURBO CARRERA| JJD))) ((HAS-STATE USUALLY RED) JJD (|STREET LEGAL LAMBOURGINI| KOVAR) ((HAS-ACTION USES SKATES) HARV ((HAS-STATE AGE) GHSCC (|FERRARI BERLINETTA BOXER| JJD) (|FORD MUSTANG| GHSCC)) (|HOG ON ICE| HARV))))))) ((HAS-STATE A BABY ANIMAL) PLK ((HAS-ACTION (IS) A (COMPUTER) PROGRAMMER) KATIN ((HAS-STATE A KIND OF CAT) KMP ((HAS-POSSESSION BLUE CLAWS) JSOL (|KIND OF CAT| KMP) (DOMINIQUE JSOL)) ((HAS-STATE A HOUSE CAT) RDBH ((HAS-ACTION GOT SPOTS) KJB ((HAS-ACTION HAS A MANE) NB ((HAS-ACTION HAS A DISTINCTIVE RED SHIFT) LAUREN ((HAS-ACTION HAS A DISTINCTIVE RED SHIFT) LAUREN (FRITZ KMP) (|QUASAR CAT| LAUREN)) (QUASAR-CAT LAUREN)) (LION NB)) (LEOPARD KJB)) (CAT RDBH))) ((HAS-ACTION SAYS /, /" WE/'RE NOT PAID TO DO THAT KIND OF THING) DANIEL ((HAS-STATE AN INSTITUTE HACKER) JKESS (MUUSS KATIN) (JKESS JKESS)) (KMP DANIEL))) (KITTEN PLK))) ((HAS-STATE A REPTILE) DAN ((HAS-STATE AN INSECT) RP0L ((HAS-STATE SMALLER THAN AN ELEPHANT) MAF ((HAS-ACTION HAS A LONG NOSE) JIM ((HAS-STATE EXTINCT) RBARCK ((HAS-ACTION HAS LEGS) SHAG (WHALE JIM) ((HAS-ACTION HAS A TUSK) PJG (RHINOSCEROUS SHAG) (ELEPHANT PJG))) (DINOSAUR RBARCK)) ((HAS-ACTION LIVED LONG AGO) IWASA (ELEPHANT ELIOT) ((HAS-ACTION EXTINCT) MJK ((HAS-ACTION EATS ANTS) AKRAM (ELEPHANT MJK) (AARDVARK AKRAM)) (MAMMOTH IWASA)))) ((HAS-STATE LARGER THAN A WORM) |K.E.D.| ((HAS-ACTION MADE A MISTAKE) JHUA ((HAS-ACTION LARGER THAN A WORM) IWASA ((HAS-PROPERTY WHITE) SY (WORM MAF) (MAGGOT SY)) (RHINO IWASA)) ((HAS-STATE A MORE EXPLICIT MISTAKE) HOEY (|| JHUA) ((HAS-STATE MORE DANGEROUS THAN A YOU) SULLIV (OOPS HOEY) (WOOPS SULLIV)))) ((HAS-ACTION GRUNTS) MSI ((HAS-STATE A PET) DIANA ((HAS-ACTION (IS TRYING TO RUN FOR PRESIDENT BUT IS ONLY A GRADE B MOVIE ACTOR)) CLEMW ((HAS-STATE A HUMAN) SHL ((HAS-STATE MADE OF CORN) CEH ((HAS-STATE LISTED VERY EARLY IN THE DICTIONARY) TXI ((HAS-POSSESSION A MANE) PJG ((HAS-ACTION I3) KYRHIZ (AARDVARK |K.E.D.|) (PEOS KYRHIZ)) (LION PJG)) ((HAS-ACTION HAS ARMOR) COUGH (|DUCKBILL PLATAPUS| TXI) (ARMADILLO COUGH))) (POPCORN CEH)) ((HAS-STATE THE PRESIDENT OF THE US) SHL ((HAS-ACTION SCULPTED THE PIETA) |SOMEONE IMPERSONATING GOD| ((HAS-ACTION DWELLS IN NE43 |(| 8TH FLOOR |)|) DR (GRANDMA SHL) ((HAS-ACTION HACKS MORE THAN KMP) DR (KMP DR) (KRNZ DR))) (MICHELANGELO |SOMEONE IMPERSONATING GOD|)) (|JIMMY CARTER| SHL))) ((HAS-ACTION HAS A BRIGHTER SMILE THAN RON REAGAN) |SOMEONE IMPERSONATING GOD| (|RONALD REGAN| CLEMW) ((HAS-STATE A MOVIE ACTOR) DKS (|LEONID BREZHNEV| |SOMEONE IMPERSONATING GOD|) (|RONALD REAGAN| DKS)))) ((HAS-STATE A HOUND) DKR ((HAS-ACTION SMELLS LIKE FISH) DAN (BULLDOG DIANA) (TWAT DAN)) ((HAS-STATE A FISH) KYRHIZ (|BLOOD HOUND| DKR) (SALMON KYRHIZ)))) ((HAS-STATE SMALLER THAN A HIPPO) RBARCK ((HAS-ACTION HAS A HORN OR TWO) MANLEY (HIPPO MSI) (RHINOCEROS MANLEY)) ((HAS-STATE JAP-PY) JHUA ((HAS-STATE PLAYING THIS GAME) ALK ((HAS-STATE PLAYING THIS GAME) ALK ((HAS-STATE AN APE) EULER ((HAS-STATE LARGER THAN A PIG) ALLAN ((HAS-ACTION HAS SHINY BACK |(| DORSAL |)| SPINES) DONALD ((HAS-STATE SMALLER THAN A PIG) A2DEH (PIG RBARCK) (ARMADILLO A2DEH)) (CUN-HSHO DONALD)) ((HAS-ACTION HOLLYWOOD CAREER) ABRACA ((HAS-ACTION (LIKES PEANUTS)) DR ((HAS-STATE LARGER THAN A TAPIR) GERN (TAPIR ALLAN) (RHINO GERN)) ((HAS-PROPERTY BEAUTIFUL) SEH (|JIMMY CARTER| DR) (|LA LISA| SEH))) (|RONALD REAGAN| ABRACA))) (ORANGUTAN EULER)) (YOU ALK)) ((HAS-STATE ANY ME) MST (ME ALK) (HUMAN MST))) (CLIFFIE JHUA)))))) ((HAS-ACTION HAS AN EXO-SKELETON) GRAND ((HAS-POSSESSION A HORN) SHL (EARTHWORM SHL) ((HAS-ACTION HAS FOUR LEGS) MANLEY ((HAS-HABITAT IN CHEAP BARS) BOYACK (|TOMATO WORM| SHL) (|WORM IN THE TEQUILA BOTTLE| BOYACK)) (RHINOCEROS MANLEY))) (INSECT GRAND))) ((HAS-POSSESSION THREE EYES) CXC ((HAS-STATE EXTINCT) JERRYB ((HAS-STATE LARGER THAN A GILA MONSTER) ALLAN ((HAS-STATE POISONOUS) VP ((HAS-ACTION CAN CHANGE TO ANY COLOR) KRAUSS ((HAS-ACTION HAS CLAWS) BART (|HORNY TOAD| VP) ((HAS-ACTION HAS AN ARMORED SHELL) BERS (IGUANA BART) (ARMADILLO BERS))) (CHEMELEON KRAUSS)) (|GILA MONSTER| DAN)) ((HAS-ACTION HAS AN ARMORED SHELL) BERS (|KOMODO DRAGON| ALLAN) (ARMADILO BERS))) (BRONTASAURUS JERRYB)) ((HAS-ACTION WIN) DAN ((HAS-PROPERTY BIG) IWASA (TUATARA CXC) (DINO IWASA)) (N DAN))))) ((HAS-ACTION SMELLS BAD) DAN ((HAS-STATE A REPTILE) GRAND ((HAS-ACTION HAS A LONG NECK) EJS ((HAS-ACTION HAS A FORKED TONGUE) EJS ((HAS-STATE A FELINE) GRAND ((HAS-ACTION LOOKS LIKE A DOG) SJK ((HAS-ACTION HAS A MASK) KMP ((HAS-STATE SMALLER THAN A ZEBRA) JANUS ((HAS-POSSESSION HORNS) |M.JR| (ZEBRA ELIOT) (ZEBU |M.JR|)) ((HAS-ACTION FROM CHINA) AYCHU ((HAS-ACTION TURNS INTO A BUTTERFLY) BOYACK ((HAS-ACTION EATS SEEDS) BOYACK (CAT JANUS) (CHIPMUNK BOYACK)) (CATERPILLAR BOYACK)) (PANDA AYCHU))) ((HAS-ACTION HAS A BUSHY TAIL) VP ((HAS-STATE NOTHING) BERS (RACOON KMP) (|| BERS)) (|RING-TAILED FOX| VP))) ((HAS-ACTION LIVES ON TERMITES) EULER (FOX SJK) (AARDWOLF EULER))) ((HAS-STATE A PET) PLK (TIGER GRAND) (CAT PLK))) (NIXON EJS)) ((HAS-POSSESSION STRIPES) NB (GIRAFFE EJS) (ZEBRA NB))) ((HAS-PROPERTY SLOW) ELF (|RATTLE SNAKE| GRAND) (RACOON ELF))) ((HAS-ACTION SMELLS WORSE THAN A SKUNK) EJS ((HAS-STATE CARNIVOROUS) HUBRD ((HAS-ACTION SMELLS) DESFZ (ZEBRA DESFZ) ((HAS-STATE MUCH LARGER THAN A SKUNK) MSS (SKUNK DAN) ((HAS-ACTION HAS A VERY LONG NECK) RMS (ZEBRA MSS) (GIRAFFE RMS)))) ((HAS-ACTION SPINS AROUND IN CIRCLES IN THE BUGS BUNNY SHOW) PERSA ((HAS-ACTION SKIN DOES NOT SELL FOR BUCKS NOR DO BEANS SURVIVE IN AUSTRAILIA) ELMO (MINK HUBRD) (IGUANA ELMO)) (|TASMAINIAN DEVIL| PERSA))) ((HAS-ACTION SMELLS WORSE THAN A POLLACK) EJS ((HAS-ACTION GOES /" I AM A /" N /" /") DAA (POLLACK EJS) (N DAA)) ((HAS-ACTION SMELLS WORSE THAN AN ANYTHING) EJS (|DAVE RAITZIN| EJS) ((HAS-STATE PLEASANT) EJS ((HAS-STATE A COMPUTER GAME) SULLIV ((HAS-ACTION HAS RED) SULLIV (|BARRY TRAGER| EJS) (K SULLIV)) (YOU SULLIV)) (|SWAMP GAS| EJS))))))) ((HAS-STATE A PREDATOR) KMP ((HAS-PROPERTY BLUE) ELIOT ((HAS-PROPERTY RED) ELIOT ((HAS-STATE AN INSECT) CLG ((HAS-STATE A BIRD) GRAND ((HAS-ACTION ENGINES FALL OFF) HOEY ((HAS-ACTION COMES OUT AT NIGHT ONLY) PETE ((HAS-ACTION FLAMES) PGS ((HAS-ACTION MADE AMISTAKE) KMP (|FLYING SQUIRREL| GRAND) (BABY KMP)) ((HAS-STATE MORE INTERESTING THAN A TECHIE) KMP (TECHIE PGS) ((HAS-STATE MORE CUDDLY THAN KMP) VP (KMP KMP) (POOH VP)))) ((HAS-ACTION CUTER THAN A BAT) VP (BAT PETE) (KMP VP))) (DC-10 HOEY)) ((HAS-STATE BEAKED) DIANA ((HAS-ACTION YELLOW) DIANA ((HAS-STATE A DIRTY ANIMAL) VP ((HAS-ACTION TT IS LARGER THAN A ROBIN) IWASA (ROBIN KMP) (TURKEY IWASA)) (PIGEON VP)) ((HAS-ACTION CAN FLY BACKWARDS) EPSTED (CANARY DIANA) (HUMMINGBIRD EPSTED))) ((HAS-STATE NIL) HAGEN ((HAS-ACTION GOES /" QUACK QUACK /") SHAG ((HAS-ACTION CAN TALK) LAUREN ((HAS-STATE A SCAVENGER) PALLAS ((HAS-ACTION SMALLER THAN PELICAN) JAMJR ((HAS-POSSESSION GREY FEATHERS) JKESS (PELICAN DIANA) (GOOSE JKESS)) ((HAS-ACTION CAN FLY BACKWARDS) CDR ((HAS-STATE BIGGER THAN AN ORIOLE) PECM ((HAS-PROPERTY YELLOW) RHB ((HAS-PROPERTY ONE) BILLB (ORIOLE JAMJR) (CHICKADEE BILLB)) ((HAS-ACTION HAS A GOLDEN BELLY) BERS (BUDGEREGAR RHB) (|BREASTED CHICKADEE| BERS))) ((HAS-ACTION HAS A WATTLE) SICC ((HAS-STATE THE FASTEST ANIMAL IN THE WORLD) SULLIV ((HAS-HABITAT IN A PEAR TREE) BOYACK (CHICKEN PECM) (PARTRIDGE BOYACK)) (|SPINE-TAILED SWIFT| SULLIV)) ((HAS-ACTION HAS A FAN SHAPED TAIL) BERS (TURKEY SICC) (PEACOCK BERS)))) (|HUMMING BIRD| CDR))) ((HAS-ACTION LARGER THAN A CONDOR) LETTO (CONDOR PALLAS) (VULTURE LETTO))) (PARROT LAUREN)) (DUCK SHAG)) (THEM HAGEN)))) ((HAS-ACTION EVOLVES FROM A CATERPILLER) DAN ((HAS-ACTION EVOLVES FROM A MAGGOT) SHAG ((HAS-POSSESSION A STINGER) LAUREN ((HAS-ACTION CHEWS HOLES IN CLOTHES) LAUREN ((HAS-ACTION LIVES IN CAMBRIDGE) TLD ((HAS-ACTION ASS LIGHTS UP) PAE ((HAS-ACTION EATS WOOD) COOKIE ((HAS-ACTION COMES IN SWARMS) LOIEDE ((HAS-ACTION BITES PEOPLE) ELF ((HAS-ACTION LIVES UNDER GO /, /, /, /, < < < _ < < < ROUND) A2DEH (GRASSHOPPER CLG) (N A2DEH)) (MOSQUITO ELF)) ((HAS-STATE DIFFERENT //) A2DEH (LOCUST LOIEDE) (GRASSHOPPER A2DEH))) (TERMITE COOKIE)) (|LIGHTNING BUG| PAE)) ((HAS-PROPERTY GREEN) WGD ((HAS-PROPERTY SMALL) DMK (COCKROACH TLD) ((HAS-PROPERTY BIG) DEEP (FRUITFLY DMK) (BUTTERFLY DEEP))) ((HAS-STATE SMALLER THAN A GRASSHOPPER) PERSA (GRASSHOPPER WGD) (|LEAF HOPPER| PERSA)))) (MOTH LAUREN)) (BEE LAUREN)) ((HAS-STATE SMALLER & IS IN THE PHYLUM OF DROSOPHILA THAN A |COMMON HOUSE FLY|) HUBRD ((HAS-ACTION BITES) DADA ((HAS-ACTION DOSESN/'T FLY) BERS (|COMMON HOUSEFLY| SHAG) (COCKROACH BERS)) (HORSEFLY DADA)) ((HAS-STATE A SCIENTIFIC NAME) KMP ((HAS-ACTION EATS WOOD) LYMAN (|FRUIT FLY| HUBRD) (TERMITE LYMAN)) (|DROSOPHOLA MELANOGASTER| KMP)))) ((HAS-ACTION EATS WOOL) LAUREN (BUTTERFLY DAN) (MOTH LAUREN)))) ((HAS-POSSESSION A COMB) PLK ((HAS-STATE AN INSECT) KRAUSS ((HAS-STATE SMALLER THAN A CARDINAL) LYMAN ((HAS-STATE A TROPICAL BIRD) PJG (CARDNAL ELIOT) ((HAS-ACTION HAS A MULTI-COLORED BEAK) KMP (PARROT PJG) (PARAKEET KMP))) ((HAS-ACTION WILL NOT) BILLB (BUTTERFLY LYMAN) (|AAA JAQUES COUSTEAU| BILLB))) ((HAS-ACTION DIGS) TLD ((HAS-PROPERTY SMALL) IWASA (|CECROPIA MOTH| KRAUSS) (LADYBUG IWASA)) (ANT TLD))) ((HAS-STATE SMALLER THAN A TOASTER) GERN (ROOSTER PLK) (CARDINAL GERN)))) ((HAS-ACTION SUPER POWERS) BLOTTO ((HAS-ACTION TALKS) HEAD ((HAS-ACTION LIKE TO GO /" HOME /") BERS (JAY ELIOT) (PIGEON BERS)) ((HAS-STATE OBNOXIOUS) HARV (PARROT HEAD) ((HAS-ACTION TALKS) IWASA (BLUEJAY IWASA) ((HAS-STATE SMALLER THAN A MIYNAH BIRD) GERN (|MIYNAH BIRD| HARV) (PARAKEET GERN))))) ((HAS-ACTION LIVES IN AFRICA) SLH (SUPERMAN BLOTTO) (BIZFUR SLH)))) ((HAS-STATE SMALLER THAN AN EAGLE) ELIOT ((HAS-STATE IMAGINARY) AEZ ((HAS-ACTION HAS A BAR MITZVAH) EJS ((HAS-ACTION WALKS LIKE A DUCK) FREND ((HAS-ACTION HAS A LONG NECK) SHAG ((HAS-POSSESSION TWO SOFT SPHERES) CARYN ((HAS-STATE HUMAN) ALLAN ((HAS-ACTION LIVED LONG AGO) CDR ((HAS-ACTION HAS A FOURTEEN FOOT WINGSPAN) PERSA ((HAS-STATE NOCTURNAL BIRD) IWASA (EAGLE KMP) (OWL IWASA)) (ALBATROSS PERSA)) ((HAS-ACTION NOS) IWASA ((HAS-ACTION FLYS) GERN (DINASOR IWASA) (HAWK GERN)) (PTERODACTYL CDR))) ((HAS-ACTION (IS) HERE PLAYING (ME) SO LATE AT NIGHT) BIK (HUMAN BIK) ((HAS-STATE WIERD) BIK (PROGRAMMER ALLAN) ((HAS-ACTION WEARS CLOES) IWASA (HACKER BIK) (HUMAN IWASA))))) ((HAS-ACTION HAS TWO ROARING EXHAUSTS) HARV (|FEMALE HUMAN| CARYN) (|AC COBRA| HARV))) ((HAS-STATE AN UGLY DUCKLING) SHAG ((HAS-STATE EXTINCT) DH ((HAS-STATE LONGER THAN A CRANE //) IWASA (CRANE SHAG) (SNAKE IWASA)) (PTEREDACTYL DH)) (SWAN SHAG))) ((HAS-ACTION DRINKS ANY MORE) FREND ((HAS-ACTION BROTHER IS JIMMY CARTERS BROTHER HIS OTHER BROTHER IS NOT) FREND (|JIMMY CARTERS BROTHER| FREND) (|JIMMY CARTERS BROTHER'S BROTHER| FREND)) (|JIMMY CARTER| FREND))) ((HAS-ACTION JUMPS WHEN YOU QUACK) PERSA (JEW EJS) (AMIR PERSA))) ((HAS-POSSESSION A RED CAPE) SKH (DRAGON AEZ) (SUPERMAN SKH))) ((HAS-PROPERTY BLACK) MSI ((HAS-ACTION EATS FISH) JRF ((HAS-ACTION SCREECHES) EULER ((HAS-ACTION EATS MOSQUITOS) ALPHA ((HAS-ACTION DIES BUT EATING ITS FOOT) ALPHA ((HAS-ACTION HOOTS) RAM ((HAS-ACTION HAS DISTINQUISHING FEATURES ON ITS NECK) BIK ((HAS-ACTION DRINKS BLOOD) LAUREN (HAWK ELIOT) ((HAS-STATE AN INSECT) WJL (|VAMPIRE BAT| LAUREN) (MOSQUITO WJL))) ((HAS-ACTION TALKS) KYRHIZ (CROUL KYRHIZ) (KESTREL BIK))) (OWL RAM)) (|| ALPHA)) ((HAS-STATE A BIRD) COOKIE (|MOSQUITO MOTH| ALPHA) (CARDINAL COOKIE))) ((HAS-PROPERTY YELLOW) BILBO ((HAS-STATE A MAMMAL) DESFZ ((HAS-STATE BIGGER THAN AN OWL) GERN (OWL EULER) (HAWK GERN)) (BAT DESFZ)) ((HAS-STATE WISE) KMP (CANARY BILBO) (OWL KMP)))) ((HAS-ACTION REALLIES EXIST) JJD ((HAS-STATE A WINGLESS BIRD WITH HAIRY FEATHERS) BATES (L JJD) (APTERYX BATES)) ((HAS-STATE SAID TO BE WISE) JJD ((HAS-STATE A KIND OF HAWK) EULER ((HAS-ACTION LIVES NEAR THE OCEAN) JKESS (HERON EULER) (ALBATROSS JKESS)) (OSPREY JRF)) (OWL JJD)))) ((HAS-STATE A BIRD) SMK ((HAS-STATE AN INSECT) SHL ((HAS-STATE DERANGED) HUBRD (BAT MSI) (|DERANGED BAT| HUBRD)) ((HAS-POSSESSION EIGHT LEGS) CLEMW ((HAS-ACTION BITES) DADA (|GOLIATH BEETLE| SHL) (HORSEFLY DADA)) (WIDOW CLEMW))) ((HAS-ACTION DIFFERENT) ALLAN (HAWK SMK) (|DIFFERENT BIRD| ALLAN))))))) ((HAS-ACTION BREATHES AIR) KMP ((HAS-ACTION EATS OTHER FISH) KMP ((HAS-POSSESSION WHISKERS) ELIOT ((HAS-ACTION CAN PUFF UP) ELIOT ((HAS-POSSESSION A SHELL) CLG ((HAS-STATE MICROSCOPIC) EJS ((HAS-PROPERTY DARK) GRAND ((HAS-POSSESSION TENTICLES) DAN ((HAS-STATE GOOEY) LAUREN ((HAS-STATE ENDANGERED) AGRE ((HAS-STATE A FISHERMANS TREAT) LAUREN ((HAS-ACTION SWIMS WITH ITS HEAD ABOVE ITS TAIL) JCOHEN ((HAS-ACTION BELONGS TO PHYLUM PORIFERA) ERIC ((HAS-ACTION HAS A HIGH ARCHED BACK) KRONJ ((HAS-STATE FIVEFOLD SYMMETRIC) RDUKE ((HAS-PROPERTY GREEN) ELF ((HAS-ACTION CARRIES WATER IN IT IS HAIR) PERSA ((HAS-ACTION FLIES THROUGH THE AIR) COOKIE ((HAS-STATE FLAT) BERS (GOLDFISH KMP) (|STING RAY| BERS)) (|" FLYING FISH "| COOKIE)) (|WATER SPIDER| PERSA)) (MOSS ELF)) (STARFISH RDUKE)) ((HAS-PROPERTY GOLD) MSS (BREAM KRONJ) (GOLDFISH MSS))) (SPONGE ERIC)) (SEAHORSE JCOHEN)) ((HAS-STATE A SMALL SILVERY FISH FISH OFTEN USED FOR BAIT) HUBRD ((HAS-ACTION LIVES IN FRESH WATER) JKESS (HERRING JKESS) (TROUT LAUREN)) (HERRING HUBRD))) (|SNAIL DARTER| AGRE)) ((HAS-STATE EDIBLE) PETE ((HAS-ACTION BES SPREAD ON BREAD) A2DEH (FLATWORM A2DEH) (JELLYFISH LAUREN)) (SQUID PETE))) ((HAS-STATE BIGGER THAN AN OCTOPUS) CLG ((HAS-ACTION SQUIRTS OUT INK) MWMT (OCTOPUS CLG) (SQUID MWMT)) (SQUID DAN))) ((HAS-ACTION HAS A BICYCLE NAMED AFTER IT) LAUREN ((HAS-ACTION CHANGES WHEN IT GROWS UP) SHL ((HAS-ACTION HAS /8 ARMS) JONBOY ((HAS-STATE A BOTTOM DWELLER) LSH ((HAS-ACTION CRASHED ON GILLIGAN/'S ISLAND) ELIOT ((HAS-STATE LONG /, HARD /, CONTAINS SEAMEN) SULLIV (GUPPY GRAND) ((HAS-STATE METAL) BERS (G BERS) (SUBMARINE SULLIV))) (MINNOW ELIOT)) (CARP LSH)) (OCTUPUS JONBOY)) (TADPOLE SHL)) (|STING RAY| LAUREN))) ((HAS-STATE USED IN DNA RESEARCH) JHC ((HAS-STATE SLIPPER-SHAPED) JHC ((HAS-STATE MULT-CELLULAR) JHC ((HAS-STATE HORN-SHAPED) MWMT ((HAS-ACTION HAS A FLAGELLUM) EULER ((HAS-STATE PROKARYOYIC) JFK (AMOEBA EJS) (YEAST JFK)) ((HAS-STATE C CUP-SHAPED) NESSUS (EUGLENA EULER) (VORTICELLA NESSUS))) (STENTOR MWMT)) ((HAS-STATE AN ALGAE) JHC (VOLVOX JHC) (SPIROGYRA JHC))) (PARAMECIUM JHC)) ((HAS-STATE SINGLE CELLULAR) SHAG ((HAS-POSSESSION MANY CELLS) IWASA (|ESCHERICHIA COLI| JHC) (VLOVOX IWASA)) ((HAS-STATE SHAPED LIKE A FOOT) SHAG (AMEOBA SHAG) (PARAMECIUM SHAG))))) ((HAS-ACTION HAS CLAWS) CLG ((HAS-STATE SLIMY) LAUREN ((HAS-STATE A FORM OF ZOOPLANKTON) LAH ((HAS-ACTION MAKES A BETTER STEW THAN A |LIMPET STEW|) TLD (LIMPET LAUREN) (OYSTER TLD)) (COPAPOD LAH)) ((HAS-ACTION COMES ON A COMBINATION SEAFOOD PLATTER) LAUREN (SNAIL CLG) ((HAS-ACTION HAS A DIFFERENT SHELL) HUBRD (SCALLOP LAUREN) (ABALONE HUBRD)))) ((HAS-ACTION WALKS SIDEWAYS) ALPHA (LOBSTER CLG) (CRAB ALPHA)))) (|BLOW FISH| ELIOT)) ((HAS-ACTION HAS A SHELL) NEWMAN ((HAS-STATE MUCH OLDER THAN A CATFISH) JJD ((HAS-POSSESSION WINGS) LAUREN (|CAT FISH| ELIOT) (FLYING-FISH LAUREN)) (CEOLECANTH JJD)) (SHRIMP NEWMAN))) ((HAS-ACTION HAS /8 TENTACLES) ELIOT ((HAS-POSSESSION REAL BONES) WEIT ((HAS-ACTION HAS TEETH) YEKTA ((HAS-ACTION FLIES) EJS ((HAS-ACTION SQUIRTS INK) CLEMW ((HAS-POSSESSION A SHELL) LAUREN ((HAS-STATE SHAPED LIKE AN EEL) DT ((HAS-ACTION HAS /10 LEGS) CHAPMA ((HAS-STATE ATTACHED TO ROCKS) ALPHA ((HAS-ACTION HAS A LO NG WHIPLIKE TAIL) BILLB ((HAS-STATE VERY DANGEROUS) LEVIN (JELLYFISH YEKTA) (MAN-OF-WAR LEVIN)) (STINGRAY BILLB)) ((HAS-POSSESSION FIVE LEGS) BILLB (|SEA ANEMONE| ALPHA) (STARFISH BILLB))) (SHRIMP CHAPMA)) (LAMPREY DT)) (LOBSTER LAUREN)) ((HAS-ACTION HAS A SHELL) SULLIV (SQUID CLEMW) (AMMONITE SULLIV))) (|" FLYING FISH "| EJS)) ((HAS-ACTION LOOKS LIKE A HORSE) JHC ((HAS-POSSESSION CLAWS) DH ((HAS-POSSESSION LARGE WINGS) ALPHA ((HAS-STATE SMALLER THAN A SHARK) JFB ((HAS-ACTION EXTINCT) BILLB (SHARK KMP) (|CARCARCHADON MEGALADON| BILLB)) ((HAS-STATE A MEDIUM SIZED VORACIOUS FISH THAT LIVES IN SALT WATER) HUBRD (PIRANHA JFB) (BARRACUDA HUBRD))) (|MANTRA RAY EEL| ALPHA)) ((HAS-STATE MUCH MORE VICIOUS) KMP (CRAB DH) (KRAKEN KMP))) (SEAHORSE JHC))) ((HAS-STATE SMALLER THAN A BARRACUDA) GRAND ((HAS-POSSESSION A SHELL) BERG ((HAS-STATE BIGGER THAN A BARRACUDA) SHC ((HAS-ACTION COLOR) BILLB (BARRACUDA WEIT) (BLUEFISH BILLB)) (SHARK SHC)) ((HAS-ACTION GAYER) BERG (TURTLE BERG) (|CHARLIE RAND| BERG))) ((HAS-ACTION LIVES IN THE OCEAN) BENDER ((HAS-STATE PRETTIER THAN A PIRANHA) JL (|PIRANAH FISH| GRAND) ((HAS-STATE /10 TIMES AS BIG) LAIRD (GOLDFISH JL) (|LARGELARGEMOUTH BASS| LAIRD))) ((HAS-STATE THE TURKEY OF CAPE COD) BERS (COELOCANTH BENDER) (COD BERS))))) ((HAS-ACTION LARGER THAN AN OCTOPUS) BILLB (OCTOPUS ELIOT) (SQUID BILLB)))) ((HAS-ACTION HAS A BOTTLE NOSE) ELIOT ((HAS-POSSESSION A HARD SHELL) ELIOT ((HAS-PROPERTY GREEN) HAL ((HAS-ACTION (HAS WHISKERS)) PLK ((HAS-ACTION WIGGLES ITS ITS EARS) ROGERS ((HAS-ACTION FLOATS) MANLEY ((HAS-PROPERTY TINY) RBARCK ((HAS-STATE SMALLER THAN A WHALE) MSI (WHALE KMP) ((HAS-STATE EXTINCT) LAUREN ((HAS-ACTION LIVES IN WARM CLIMATES) BGR ((HAS-STATE A DUMB PROGRAM) FFM ((HAS-ACTION A DUMB PROGRAM) FFM ((HAS-STATE A BISCUIT) PJSG (|LOCH NESS MONSTER| PJSG) (PENGUIN MSI)) (EEL FFM)) (EEL FFM)) ((HAS-STATE A MAMAL) ARPEE ((HAS-STATE SMALLER THAN A HIPPO) RHB (HIPPOPOTOMUS BGR) ((HAS-STATE SOMEWHAT HARD-NOSED) DWARME (GOLDFISH RHB) (|DUCK-BILLED PLATYPUS| DWARME))) ((HAS-POSSESSION A DUCK-BILL) VP ((HAS-ACTION TALKS FUNNY) BILLB (FLIPPER VP) ((HAS-STATE WIERD) ELF (|JAQUES COUSTEAU| BILLB) (NATALIE ELF))) (|DUCK-BILLED PLATAPUS _ _ _ _ YPUS| ARPEE)))) ((HAS-ACTION LIVES IN THE WATER) KRAUSS (PTERYDACTAL LAUREN) (ICTHYOSAURUS KRAUSS)))) ((HAS-STATE A FROG) ALLAN ((HAS-ACTION /; (QUOTE LONG) BYE MALLER) IWASA ((HAS-ACTION WEARS A TUXEDO) BERS (SALIMANDER ALLAN) (PENGUIN BERS)) (TETRA IWASA)) (POLYWOG RBARCK))) ((HAS-STATE BIGGER THAN A |WATER FLEA|) NB ((HAS-STATE MICROSCOPIC) FFM (|WATER FLEA| MANLEY) (GERM FFM)) ((HAS-ACTION QUACKS) RBARCK ((HAS-ACTION A MARSUPIAL) JERRYB ((HAS-ACTION LAYS EGGS) RKC ((HAS-ACTION HAS A FRENCH ACCENT) BILLB ((HAS-STATE SMALLER THAN A WHALE) SICC (WHALE NB) (MARWHAL SICC)) (|JAQUES COUSTEAU| BILLB)) ((HAS-ACTION FLIES) FURUTA ((HAS-STATE A REPTILE) PJG ((HAS-ACTION HAS FUR) DAA (PENGUIN RKC) (PLATYPUS DAA)) (ALLIGATOR PJG)) ((HAS-PROPERTY WHITE) DEEP (|PIED-BILLED GREBE| FURUTA) (SWAN DEEP)))) (|DUCK BILLED PLATYPUS| JERRYB)) ((HAS-ACTION HAS EATHERS) ZANAR (|DUCK-BILLED PLATAPUS| RBARCK) (DUCK ZANAR))))) (HIPPOPOTOMUS ROGERS)) ((HAS-ACTION HAS BUCK TEETH) FFM ((HAS-STATE SMALLER THAN SEAL) PLK ((HAS-POSSESSION TWO LEGS) JHC ((HAS-STATE MUCH LARGER THAN A SEAL) IWASA (SEAL PLK) ((HAS-POSSESSION TUSKS) KMP (HIPPO IWASA) (WALRUS KMP))) (HUMAN JHC)) ((HAS-ACTION TASTES GOOD) REYNO ((HAS-STATE SMALLER THAN AN OTTER) LOIEDE ((HAS-ACTION HAS WEBBED FEET) NB (OTTER PLK) ((HAS-STATE A BIRD) IWASA (PLATYPUS NB) (PENGUIN IWASA))) (OPOSSUM LOIEDE)) (|JUICY MUFF| REYNO))) ((HAS-ACTION HAS LONG TUSKS) |M.JR| ((HAS-STATE THE MASCOT OF MIT) FH ((HAS-STATE WHAT STUDS LIKE TO PLAY WITH) SEH ((HAS-ACTION EATS ABOLONI) IWASA (HIPPOPOTAMUS FH) (OTTER IWASA)) (BEAVER SEH)) ((HAS-ACTION SLIP YOUR ORGAN INTO IT) SEH (BEAVER FFM) (VAGINA SEH))) (WALRUS |M.JR|)))) ((HAS-STATE LARGER THAN A FROG) DAN ((HAS-POSSESSION A SHELL) KMP ((HAS-STATE MICROSCOPIC) PERSA (FROG HAL) (ZOOPLANKTON PERSA)) (|SOFT-SHELL TURTLE| KMP)) ((HAS-ACTION EATS FISH) CLG ((HAS-STATE BIGGER THAN A TOAD) SJK (TOAD DAN) (ALLIGATOR SJK)) ((HAS-STATE A SNAKE) CXC ((HAS-ACTION HAS A BLUNT SNOUT) JKESS ((HAS-ACTION LIVES IN THE AMAZON) MJK (ALLIGATOR CLG) (KAMAN MJK)) (CROCODILE JKESS)) (ANACONDA CXC))))) ((HAS-ACTION HAS A HORN ON ITS NOSE /, A TUT TURTLE DOES NOT) KRAUSS (TURTLE ELIOT) (RHINO KRAUSS))) ((HAS-ACTION HAS LARGE TAIL) |K.E.D.| ((HAS-ACTION CONTAINS COLA) GRM ((HAS-ACTION CONTAINS UN-COLA) GRM ((HAS-ACTION HAS FEATHERS) TRIEU ((HAS-STATE AN AMPHIBIAN) PERSA ((HAS-ACTION HAS A BOTTLE NOSE) KMP (|NON-BOTTLE-NOSE DOLPHIN| KMP) (|BOTTLE-NOSE DOLPHIN| KMP)) (TURTLE PERSA)) (DUCK TRIEU)) (|PLASTIC 7-UP BOTTLE| GRM)) (|PLASTIC PEPSI BOTTLE| GRM)) ((HAS-ACTION CAN BE TRAINED) ROGERS ((HAS-STATE EXTINCTIT CANNOT BE TRAINED) BILLB ((HAS-ACTION COLOR) TBG ((HAS-ACTION HAS /4 LEGS) PJG (PURPOSE |K.E.D.|) (ALLIGATOR PJG)) ((HAS-ACTION SHAPE) GERN (|PINK BOTTLE| TBG) (N GERN))) (|DUCK-BILLED PLATYPUS| BILLB)) ((HAS-STATE A PORPOISE) ALPHA ((HAS-STATE A PORPOISE) ALPHA ((HAS-STATE BIGGER THAN A PORPPOISE) DNG ((HAS-ACTION SMELLS) GJH ((HAS-ACTION HAS HAIR IN ITS NOSTRILS) SLH (PORPOISE ROGERS) ((HAS-STATE A DOLPHIN) IWASA (|KHOMEINIS MUTHER| SLH) (|BOTTLED NOISE DOLPHIN| IWASA))) ((HAS-STATE BUFF) ELF (|IMSSS RODENT IMSSS RODENT| GJH) (ERIC ELF))) ((HAS-ACTION EATS LIVE FISH WHILST AN IMSSS RODENT MUST SETTLE FOR DEAD SCRAPS) GJH (|IMSSS RODENT| GJH) (DOLPHIN DNG))) ((HAS-STATE A FRUIT) ALPHA (PORPOISE ALPHA) (GRAPEFRUIT ALPHA))) ((HAS-STATE AN ANIMAL) JALEX ((HAS-STATE SWEETER) DMK (GRAPEFRUIT ALPHA) (PEACH DMK)) ((HAS-STATE DIFFERENT SPECIES) GED (PORPOISE JALEX) (DOLPHIN GED)))))))))) \ No newline at end of file diff --git a/src/games/chase.(init) b/src/games/chase.(init) new file mode 100644 index 00000000..0e65a708 --- /dev/null +++ b/src/games/chase.(init) @@ -0,0 +1,4 @@ +(comment core 75.) +(progn + (fasload chase fasl dsk games) + (chase)) \ No newline at end of file diff --git a/src/games/chase.info b/src/games/chase.info new file mode 100755 index 00000000..e7275ef9 --- /dev/null +++ b/src/games/chase.info @@ -0,0 +1,105 @@ +Copyright (C) 1978 William A. Kornfeld + + CHASE - A Real Time game for VT52's + +CHASE is real time game (e.g. space war, MAZE, etc.) with the distinction that +it is played on a VT52. The game is played by two players who must both be +present at the same physical terminal. It can in principle be used on other +character display terminals but may require redesignation of some of its +command characters to retain their current positional mnemonic significance. +CHASE can be played over phone lines with as little as a 300 baud modem or over +the net (though response may be somewhat unsatisfactory). + + +To setup a VT52 for CHASE make sure of the following: + + 1. CAPS LOCK is set! + + 2. The terminal is not in one of the VT52's special modes (i.e. graphics + or alternate keypad). This can be assured by momentarily turning off + power to the terminal. + + + +After the game has begun you will notice a maze appear on the screen and +four characters: X,x,O, and o. The two X's are controlled by the person on +the left side of the terminal and the O's by the person on the right side. +The two large letters are known as "chasers" and the two small letters as +"chasees". The object of the game is to have your chaser "catch" (bump +into) the opponent's chasee. The game can be thought of as two simultaneous +chases happening concurrently in the maze. Each player plays both offense +and defense. Each player specifies directions for the two pieces under +his/her control. They may move anywhere in the maze as though they cannot +be moved through the wall of the maze. There is one additional constraint: +a chaser cannot move through the opponents chaser nor a chasee through the +opponents chasee. In addition to a pieces normal function it can also be +used to block. In this way the two chases interact and can lead to +sophisticated strategy with experienced players. + +Pieces can be made to move in any of four directions (or held in place) by +appropriate keystrokes. Once a piece is put into motion it will remain in +motion at a constant velocity (same for all pieces at all times) until it is +explicitly told to stop or it reaches an obstruction which it cannot pass. +Each piece is controlled by a group of four keys (one for each direction) +arranged so that the players do not have to watch the keyboard as they enter +commands. In each group of four keys 3 are at the same level and 1 is directly +above the middle of the 3 keys. The lower 3 keys are respectively left, down, +and right. The upper key is up. The middle 3 fingers of each hand should be +placed on the 3 keys. In this way commands may be entered easily. As an +example the X piece is controlled by the four keys: A,S,D, and W. The middle 3 +fingers of the left hand of the X-player should be placed on A, S, and D. +Hitting D once will start the X piece going right until it either hits +something or another command is given. Similarly for A, S, and W with left, +down, and up. The four command pads are: + + BIG-X little-x + + A T + + S D W F G H + + + + BIG-O little-o + + [ 8 + + ; ' { 4 5 6 + + ^^^^^These four numbers are typed on + typed on the numeric keypad to the + right of the normal keypad. + +If a piece is going in a direction, giving the command to travel in the +opposite direction once will stop the piece. Giving it twice will start the +character in the opposite direction. If a piece is going in a direction and +the command is given for it to go in an orthogonal direction it will +immediately start in that direction. Note that if a piece has been travelling +in a direction and hits an obstruction (usually the wall of the maze) it will +act as if it is still going in that direction with respect to future commands. + +Games continue until a chaser has caught a chasee. The program pauses then for +a few seconds to report the victor and the score. When done it prints "READY". +Hitting RETURN will start a new game (with the initial positions of pieces +switched to be fair). If the display gets screwed up for any reason hitting +LINEFEED will freeze the game and do a redisplay. If the program screws up, it +may be started fresh from the top level LISP by typing (CHASE). + +It doesn't take long to get reasonably comfortable with the controls. It is +easy however to get confused as you control the two pieces simultaneously. +Part of the skill to develop is in how to overcome this confusion. This also +enters into strategy. You can count on your opponent to get confused in +certain positions and can take advantage of that fact. This happens, for +example, when his/her 2 pieces cross paths or when they are both in opposite +parts of the maze and doing difficult manuevering. Strategy also includes +using your chaser to block the opponents chaser on defense and using your +chasee to block the opponents chasee on offense. It is important to always +remain on the offense. Beginners quickly give up offense when the going starts +getting rough. This only makes things worse in the end. + +There is one unfortunate bug that I have not exorcised where the program +breakpoints just before restarting the game. If this happens just hit +CTRL-G and then type (CHASE) for a refresh. + +This game is protected by US Copyright. No implementation may be undertaken +for any commercial purpose without prior consent from William A. Kornfeld. diff --git a/src/games/doc.(init) b/src/games/doc.(init) new file mode 100644 index 00000000..90881fec --- /dev/null +++ b/src/games/doc.(init) @@ -0,0 +1,1540 @@ +;;; -*- LISP -*- + +(COMMENT) +(PROG2 + (SETQ PRIN1 'PRINC) + '|/ +The doctor will be ready in a sec... When he is ready,/ +he will say so. Please end responses with/ +a period./ + Be patient!/ + -The Doctor's Secretary/ +| +((LAMBDA (FILE) + ((LAMBDA (MSGFILES) + (LOAD '((LISP) LET FASL)) + (LOAD '((LISP) DEFMAX FASL))) (NCONS FILE)) + (CLOSE FILE)) + (OPEN '((NUL *) * *) 'OUT)) +(SSTATUS FEATURE NOLDMSG) +(CLEAR-INPUT TYI)) +(PROGN +(SETQ PRIN1 NIL) +(SETQ GC-OVERFLOW '(LAMBDA (X) T)) +(SSTATUS FEATURE NOLDMSG) +(*RSET T) +(NOUUO T) +(DEFAULTF '(_LISP_ >)) +(SETQ LISPT-PROTECT T) +(CLOSE (PROG2 T INFILE (INPUSH -1.))) +(DECLARE (SPECIAL ERRLIST FOO EXIT *RSET LINEL AFFIRMATIVES NEGATIVES + MAYBES SMALL-LETTERS N THING CONTRACTIONS S-QUOTE OPEN-QUOTES + CLOSE-QUOTES SPACE COMMA PERIOD SEMICOLON EXCLAM + GUESS-X MEMORY KMPMODE A DEFAULTF WRITABLE LISPT-JNAME + OPEN-PAREND CLOSE-PAREND IN_FILE WRITE-PROTECT + DOTDOTDOT EXCLAM-3 COLON QMARK HYPHEN NEWLINE TAB)) + +(DEFUN WINNER () + (MEMQ (STATUS UNAME) + '(TNP KMP RWK MRG JPG BKERNS JM BMT RZ EJS WAM CSTACY + PAULP FRAWLE BUD MIKE GLS HIC ELLEN RL KRD))) + +(EVAL-WHEN (EVAL COMPILE) + (COND ((NOT (STATUS FEATURE IOTA)) + (LOAD '((DSK LIBLSP) IOTA FASL))))) + +(COND ((AND (NOT (EQ (STATUS USERID) 'KMP)) + (PROBEF '((USR *) KMP HACTRN))) + (LET ((BASE 10.) (*NOPOINT T) ((HOUR MIN) (STATUS DAYTIME))) + (ERRSET + (IOTA ((STREAM '((CLI *) KMP HACTRN) '(OUT))) + (MAPC (FUNCTION (LAMBDA (X) (PRINC X STREAM))) + (LIST + '|/[Message from The Doctor Game at MIT-MC | + (COND ((ZEROP (\ HOUR 12.)) '|12|) (T (\ HOUR 12.))) + '/: + (COND ((< MIN 10.) (IMPLODE (LIST '/0 (+ MIN 48.)))) + (T MIN)) + (COND ((ZEROP (// HOUR 12.)) '|am|) + (T '|pm|)) + '/] (ASCII 13.) (STATUS UNAME) + '| is gonna have a private chat with me. If you| + (ASCII 13.) + (ASCII 10.) + '|feel like a good laugh, you're welcome to watch.| + )) + (TERPRI STREAM)) + NIL)))) + +(SETQ MONOSYLLABLES + '|/ + Your attitude at the end of the session was wholly unacceptable./ + Please try to come back next time with a willingness to speak more/ + freely. If you continue to refuse to talk openly, there is little/ + I can do to help!/ +|) + +(DEFUN SUICIDE () + (IOTA ((STREAM '|.MAIL.;MAIL >| '(OUT ASCII BLOCK DSK))) + (PRINC '|FROM-JOB:KMP's DOCTOR| STREAM) + (TERPRI STREAM) + (PRINC '|SENT-BY:DOCTOR| STREAM) + (TERPRI STREAM) + (PRINC '|TO:| STREAM) + (PRINC (LIST (STATUS UNAME) 'MC) STREAM) + (TERPRI STREAM) + (PRINC '|SUBJECT:Session of | STREAM) + (LET ((BASE 10.) (*NOPOINT T) (DATE (STATUS DATE)) (TIME)) + (PRINC (CADR DATE) STREAM) + (PRINC '// STREAM) + (PRINC (CADDR DATE) STREAM) + (PRINC '// STREAM) + (PRINC (CAR DATE) STREAM) + (TERPRI STREAM) + (PRINC '|TEXT;-1| STREAM) + (TERPRI STREAM) + (PRINC '|Session lasted | STREAM) + (PRINC (FIX (SETQ TIME (//$ (-$ (TIME) INIT-TIME) 60.0))) + STREAM) + (PRINC '| minutes, so your bill is $| STREAM) + (DO ((L (EXPLODEN (*$ TIME 0.25)) (CDR L))) + ((= (CAR L) 46.) + (TYO 46. STREAM) + (TYO (OR (CADR L) 48.) STREAM) + (TYO (OR (CADDR L) 48.) STREAM)) + (TYO (CAR L) STREAM)) + (TERPRI STREAM) + (TYO 9. STREAM) + (PRINC '| - The Doctor's Secretary| STREAM) + (TERPRI STREAM) + (TERPRI STREAM) + (COND (OBSERVATION-LIST + (TERPRI STREAM) + (PRINC '|PS. The doctor also had some comments he +asked me to convey to you:/ +/ +| STREAM) + (DO ((O OBSERVATION-LIST (CDR O))) + ((NULL O)) + (PRINC (CAR O) STREAM) + (TERPRI STREAM)))))) + (QUIT)) + +(SETQ INIT-TIME (TIME)) + +(DEFUN WORKING-HOURS? () + (AND (MEMQ (STATUS DOW) '(MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY)) + (> (CAR (STATUS DAYTIME)) 8.) + (< (CAR (STATUS DAYTIME)) 20.))) + +(COND ((AND (WORKING-HOURS?) (NOT (WINNER))) + (TERPRI TYO) + (PRINC '|This is not the time of day to be playing games!|) + (TERPRI TYO) + (PRINC '|Please come back later. This game is unavailable|) + (TERPRI TYO) + (PRINC '|during the hours of 9am-8pm Monday-Friday.|) + (QUIT))) + + +(SETQ LISPT-JNAME '|DOX|) + +(SETQ BASE 10. IBASE 10. *NOPOINT T) + +(DEFUN MAP-PROP (X Y Z) + (MAPCAR (FUNCTION (LAMBDA (X) (PUTPROP X Y Z))) + X)) + +(DEFUN UNIX-EVAL (X) (COND ((ATOM X) + (COND ((BOUNDP X) (EVAL X)) + (T NIL))) + (T (EVAL X)))) + +(DEFUN WHILE FEXPR (X) + (COND ((UNIX-EVAL (CAR X)) NIL) + (T (MAPCAR 'UNIX-EVAL (CDR X)) + (APPLY 'WHILE X)))) + +(DEFUN CVTA (X) (ASCII X)) +(DEFUN CVTN (X) (CAR (EXPLODEN X))) +(DEFUN READCH () (ASCII (TYI))) +(DEFUN PEEKCH () (ASCII (TYIPEEK))) + +(DEFUN MEANING (X) (GET X 'MEANING)) +(DEFUN PUT-MEANING FEXPR (X) + (PUTPROP (CAR X) (UNIX-EVAL (CADR X)) 'MEANING)) + +(PUT-MEANING HOWDY 'HOWDY) +(PUT-MEANING HI 'HOWDY) +(PUT-MEANING GREETINGS 'HOWDY) +(PUT-MEANING HELLO 'HOWDY) +(PUT-MEANING PDP11 'MACH) +(PUT-MEANING COMPUTER 'MACH) +(PUT-MEANING UNIX 'MACH) +(PUT-MEANING MACHINE 'MACH) +(PUT-MEANING COMPUTERS 'MACH) +(PUT-MEANING MACHINES 'MACH) +(PUT-MEANING PDP11S 'MACH) +(PUT-MEANING FOO 'MACH) +(PUT-MEANING FOOBAR 'MACH) +(PUT-MEANING MULTICS 'MACH) +(PUT-MEANING MACSYMA 'MACH) +(PUT-MEANING TELETYPE 'MACH) +(PUT-MEANING LA36 'MACH) +(PUT-MEANING VT52 'MACH) +(PUT-MEANING ZORK 'MACH) +(PUT-MEANING TREK 'MACH) +(PUT-MEANING STARTREK 'MACH) +(PUT-MEANING ADVENT 'MACH) +(PUT-MEANING PDP 'MACH) +(PUT-MEANING DEC 'MACH) +(PUT-MEANING SHIT 'FOUL) +(PUT-MEANING BASTARD 'FOUL) +(PUT-MEANING DAMN 'FOUL) +(PUT-MEANING DAMNED 'FOUL) +(PUT-MEANING HELL 'FOUL) +(PUT-MEANING SUCK 'FOUL) +(PUT-MEANING SUCKING 'FOUL) +(PUT-MEANING SUX 'FOUL) +(PUT-MEANING ASS 'FOUL) +(PUT-MEANING WHORE 'FOUL) +(PUT-MEANING BITCH 'FOUL) +(PUT-MEANING ASSHOLE 'FOUL) +(PUT-MEANING SHRINK 'FOUL) +(PUT-MEANING POT 'TOKE) +(PUT-MEANING GRASS 'TOKE) +(PUT-MEANING WEED 'TOKE) +(PUT-MEANING MARIJUANA 'TOKE) +(PUT-MEANING ACAPULCO 'TOKE) +(PUT-MEANING COLUMBIAN 'TOKE) +(PUT-MEANING TOKIN 'TOKE) +(PUT-MEANING JOINT 'TOKE) +(PUT-MEANING TOKE 'TOKE) +(PUT-MEANING TOKING 'TOKE) +(PUT-MEANING TOKIN/' 'TOKE) +(PUT-MEANING PILLS 'DRUG) +(PUT-MEANING DOPE 'DRUG) +(PUT-MEANING ACID 'DRUG) +(PUT-MEANING LSD 'DRUG) +(PUT-MEANING SPEED 'DRUG) +(PUT-MEANING HEROINE 'DRUG) +(PUT-MEANING HASH 'DRUG) +(PUT-MEANING COCAINE 'DRUG) +(PUT-MEANING UPPERS 'DRUG) +(PUT-MEANING DOWNERS 'DRUG) +(PUT-MEANING LOVES 'LOVES) +(PUT-MEANING LOVE 'LOVE) +(PUT-MEANING HATES 'HATES) +(PUT-MEANING DISLIKES 'HATES) +(PUT-MEANING HATE 'HATE) +(PUT-MEANING DISLIKE 'HATE) +(PUT-MEANING STONED 'STATE) +(PUT-MEANING DRUNK 'STATE) +(PUT-MEANING DRUNKEN 'STATE) +(PUT-MEANING HIGH 'STATE) +(PUT-MEANING HORNY 'STATE) +(PUT-MEANING BLASTED 'STATE) +(PUT-MEANING HAPPY 'STATE) +(PUT-MEANING PARANOID 'STATE) +(PUT-MEANING WISH 'DESIRE) +(PUT-MEANING WANT 'DESIRE) +(PUT-MEANING DESIRE 'DESIRE) +(PUT-MEANING LIKE 'DESIRE) +(PUT-MEANING HOPE 'DESIRE) +(PUT-MEANING HOPES 'DESIRE) +(PUT-MEANING DESIRES 'DESIRE) +(PUT-MEANING WANTS 'DESIRE) +(PUT-MEANING DESIRES 'DESIRE) +(PUT-MEANING LIKES 'DESIRE) +(PUT-MEANING FRUSTRATED 'MOOD) +(PUT-MEANING DEPRESSED 'MOOD) +(PUT-MEANING ANNOYED 'MOOD) +(PUT-MEANING UPSET 'MOOD) +(PUT-MEANING UNHAPPY 'MOOD) +(PUT-MEANING EXCITED 'MOOD) +(PUT-MEANING WORRIED 'MOOD) +(PUT-MEANING LONELY 'MOOD) +(PUT-MEANING ANGRY 'MOOD) +(PUT-MEANING PISSED 'MOOD) +(PUT-MEANING JEALOUS 'MOOD) +(PUT-MEANING AFRAID 'FEAR) +(PUT-MEANING FEAR 'FEAR) +(PUT-MEANING SCARED 'FEAR) +(PUT-MEANING VIRGINITY 'SEXNOUN) +(PUT-MEANING COCK 'SEXNOUN) +(PUT-MEANING CUNT 'SEXNOUN) +(PUT-MEANING PROSTITUTE 'SEXNOUN) +(PUT-MEANING CONDOM 'SEXNOUN) +(PUT-MEANING SEX 'SEXNOUN) +(PUT-MEANING RAPES 'SEXNOUN) +(PUT-MEANING WIFE 'FAMILY) +(PUT-MEANING BROTHER 'FAMILY) +(PUT-MEANING SISTER 'FAMILY) +(PUT-MEANING FATHER 'FAMILY) +(PUT-MEANING MOTHER 'FAMILY) +(PUT-MEANING HUSBAND 'FAMILY) +(PUT-MEANING SIBLINGS 'FAMILY) +(PUT-MEANING GRANDMOTHER 'FAMILY) +(PUT-MEANING GRANDFATHER 'FAMILY) +(PUT-MEANING MATERNAL 'FAMILY) +(PUT-MEANING PATERNAL 'FAMILY) +(PUT-MEANING STAB 'DEATH) +(PUT-MEANING MURDER 'DEATH) +(PUT-MEANING MURDERS 'DEATH) +(PUT-MEANING SUICIDE 'DEATH) +(PUT-MEANING SUICIDES 'DEATH) +(PUT-MEANING KILL 'DEATH) +(PUT-MEANING KILLS 'DEATH) +(PUT-MEANING DIE 'DEATH) +(PUT-MEANING DIES 'DEATH) +(PUT-MEANING DEATH 'DEATH) +(PUT-MEANING DEATHS 'DEATH) +(PUT-MEANING PAIN 'SYMPTOMS) +(PUT-MEANING ACHE 'SYMPTOMS) +(PUT-MEANING FEVER 'SYMPTOMS) +(PUT-MEANING SORE 'SYMTOMS) +(PUT-MEANING ACHING 'SYMPTOMS) +(PUT-MEANING STOMACHACHE 'SYMPTOMS) +(PUT-MEANING HEADACHE 'SYMPTOMS) +(PUT-MEANING HURTS 'SYMPTOMS) +(PUT-MEANING DISEASE 'SYMPTOMS) +(PUT-MEANING VIRUS 'SYMPTOMS) +(PUT-MEANING VOMIT 'SYMPTOMS) +(PUT-MEANING VOMITING 'SYMPTOMS) +(PUT-MEANING BARF 'SYMPTOMS) +(PUT-MEANING TOOTHACHE 'SYMPTOMS) +(PUT-MEANING HURT 'SYMPTOMS) +(PUT-MEANING RUM 'ALCOHOL) +(PUT-MEANING GIN 'ALCOHOL) +(PUT-MEANING VODKA 'ALCOHOL) +(PUT-MEANING ALCOHOL 'ALCOHOL) +(PUT-MEANING BOURBON 'ALCOHOL) +(PUT-MEANING BEER 'ALCOHOL) +(PUT-MEANING WINE 'ALCOHOL) +(PUT-MEANING WHISKEY 'ALCOHOL) +(PUT-MEANING SCOTCH 'ALCOHOL) +(PUT-MEANING FUCK 'SEXVERB) +(PUT-MEANING SCREW 'SEXVERB) +(PUT-MEANING SCREWING 'SEXVERB) +(PUT-MEANING FUCKING 'SEXVERB) +(PUT-MEANING RAPE 'SEXVERB) +(PUT-MEANING KISS 'SEXVERB) +(PUT-MEANING KISSING 'SEXVERB) +(PUT-MEANING KISSES 'SEXVERB) +(PUT-MEANING SCREWS 'SEXVERB) +(PUT-MEANING FUCKS 'SEXVERB) +(PUT-MEANING BECAUSE 'CONJ) +(PUT-MEANING BUT 'CONJ) +(PUT-MEANING HOWEVER 'CONJ) +(PUT-MEANING BESIDES 'CONJ) +(PUT-MEANING ANYWAY 'CONJ) +(PUT-MEANING THAT 'CONJ) +(PUT-MEANING EXCEPT 'CONJ) +(PUT-MEANING WHY 'CONJ) +(PUT-MEANING HOW 'CONJ) +(PUT-MEANING UNTIL 'WHEN) +(PUT-MEANING WHEN 'WHEN) +(PUT-MEANING WHILE 'WHEN) +(PUT-MEANING SINCE 'WHEN) + +(DEFUN KAR(X) (COND ((ATOM X) X) + (T (CAR X)))) +(DEFUN KDR (X) (COND ((ATOM X) NIL) + (T (CDR X)))) +(DEFUN CADR (X) (KAR (KDR X))) +(DEFUN CDDR (X) (KDR (KDR X))) + +(DECLARE (SPECIAL TYPOS)) + +(SETQ TYPOS ()) + +(DEFUN TYPOS: FEXPR (X) (SETQ TYPOS (MAPCAR 'TYPOS-AUX X))) + +(DEFUN TYPOS-AUX (X) + (PUTPROP (CAR X) (CADR X) 'CORRECTION) + (PUTPROP (CADR X) (CADDR X) 'EXPANSION) + (CAR X)) + +(DEFUN TYPOP (X) (MEMQ X TYPOS)) + +(DEFUN CORRECTION (X) (GET X 'CORRECTION)) + +(DEFUN EXPANSION (X) (GET X 'EXPANSION)) + +(TYPOS: (THEYLL THEY/'LL (THEY WILL)) + (THEYRE THEY/'RE (THEY ARE)) + (IM I/'M (YOU ARE)) + (I7M I/'M (YOU ARE)) + (ISA |IS A| (IS A)) + (THIER THEIR (THEIR)) + (DONT DON/'T (DO NOT)) + (DON7T DON/'T (DO NOT)) + (YOU7RE YOU/'RE (I AM)) + (YOU7VE YOU/'VE (I HAVE)) + (YOU7LL YOU/'LL (I WILL))) + +(DEFUN WARN-TYPOS (X) + (CURSORPOS 'A TYO) + (PRINC '|WATCH YOUR SPELLING! YOU MIS-SPELLED | TYO) + (/"PRINC (CAR X)) + (MAP (FUNCTION + (LAMBDA (X) + (COND ((NULL (CDR X)) (PRINC '|, AND |)) + (T (PRINC '|, |))) + (COND ((> (CHARPOS TYO) 60.) (TERPRI TYO))) + (/"PRINC (CAR X)))) + (CDR X)) + (PRINC '/. TYO)) + +(DEFUN /"PRINC (X) (TYO 34. TYO) (PRINC X TYO) (TYO 34. TYO)) + +(DEFUN CORRECT-SPELLING (X) + (DO ((X X (CDR X)) + (L ()) + (TEMP) + (TYPO-LIST) + (CORREX-FLAG ())) + ((NULL X) + (COND (CORREX-FLAG (WARN-TYPOS TYPO-LIST))) + (MAPCAN (FUNCTION (LAMBDA (X) (COND ((ATOM X) (NCONS X)) (T X)))) + (NREVERSE L))) + (COND ((SETQ TEMP (TYPOP (CAR X))) + (SETQ CORREX-FLAG T) + (LET ((C (CORRECTION (CAR X)))) + (PUSH (EXPANSION C) L) + (PUSH C TYPO-LIST))) + (T + (PUSH (CAR X) L))))) + +(DEFUN SHORTEN (SENT) + (PROG (FOO TEMP) + (SETQ TEMP '(NIL BECAUSE BUT HOWEVER BESIDES ANYWAY UNTIL + WHILE THAT EXCEPT WHY HOW)) + RECHK + (SETQ TEMP (KDR TEMP)) + (COND ((NULL TEMP) + (RETURN NIL))) + (SETQ FOO (MEMQ (KAR TEMP) SENT)) + (COND ((NOT FOO)(GO RECHK)) + ((LESSP (LENGTH FOO) 4) + (GO RECHK))) + (SETQ SENT FOO) + (FIXUP) + (RETURN T) )) + +(DEFUN DEFINE (SENT FOUND) + (PROG () + (SVO SENT FOUND 1 NIL) + (COND + ((NOT (NOUNP SUBJ)) + (RETURN NIL)) + ((PRONOUNP SUBJ) + (RETURN NIL)) + ((NULL SUBJ) + (RETURN NIL)) + ((NULL (MEANING OBJECT)) + (RETURN NIL))) + (PUTPROP SUBJ (MEANING OBJECT) 'MEANING) + (RETURN T))) + +(DEFUN DEFQ (SENT) + (PROG (TEMP) + (SETQ TEMP '(MEANS APPLIES MEAN REFERS REFER RELATED + SIMILAR DEFINED ASSOCIATED LINKED LIKE SAME)) + FOO (COND ((MEMQ (KAR TEMP) SENT) + (PROGN + (SETQ FOUND (KAR TEMP)) + (RETURN T))) + ((NULL (KDR TEMP)) + (RETURN NIL))) + (SETQ TEMP (KDR TEMP)) (GO FOO))) + +(DEFUN DEF (X) + (PROGN + (TYPE (LIST 'THE 'WORD X 'MEANS (MEANING X) 'TO 'ME)) + NIL)) + +(DEFUN FORGET () (PROG (TEMP) + (SETQ TEMP HISTORY) + (SETQ HISTORY NIL) +LOOP (COND ((NULL (KDR TEMP))(RETURN NIL))) + (SETQ HISTORY (CONS (KAR TEMP) HISTORY)) + (SETQ TEMP (KDR TEMP)) + (GO LOOP))) + +(DEFUN QUERY (X) + (PROG (A) + TOP (TXTYPE (ASSM (LIST X 'WHAT?))) + (SETQ A (TXREAD)) + LOOP (COND ((NULL A) + (GO TOP))) + (COND ((NOUNP (KAR A)) (RETURN (KAR A)))) + (COND ((VERBP (KAR A)) (RETURN (BUILD (BUILD X '/ ) (KAR A))))) + (SETQ A (KDR A)) + (GO LOOP))) + +(DEFUN SUBJSEARCH (SENT KEY TYPE) + (PROG (FOO) + (SETQ FOO (- (INDEX SENT KEY) TYPE)) + (WHILE (NOT (GREATERP FOO 0)) + (SETQ SUBJ (PART SENT FOO)) + (COND ((NOUNP SUBJ) (RETURN T))) + (SETQ FOO (SUB1 FOO))) + (SETQ SUBJ 'YOU) (RETURN NIL) )) + +(DEFUN NOUNP (X) + (OR (PRONOUNP X) + (NOT (OR (VERBP X) (EQUAL X 'NOT) (PREPP X) (MODIFIERP X) )) )) + +(DEFUN PRONOUNP (X) (MEMQ X '(I ME YOU HE HIM SHE HER IT WE US THEY THEM + THAT THOSE THIS THESE MYSELF YOURSELF HIMSELF HERSELF THINGS THING + ANYTHING SOMETHING EVERYTHING) )) + +(MAP-PROP '(AM IS ARE WAS WERE HAS HAVE HAD DO DID + FIND TAKE GET HIT MOVE HIT HURT KILL EAT DRINK LAY OUGHT + DOES SHALL SHOULD WILL WOULD CAN COULD MAY MIGHT MUST BE + BEEN BEING GOING GOES WENT GO GONE REFER MEAN MEANS REFERS + ASSOCIATED APPLIES RELATED LINKED USE USING USED DEFINED USES + FEEL FEELS FELT THINK THINKS THOUGHT HATES DISLIKES + HATE DISLIKE LOVE LOVES LIKES WISH WANT DESIRE LIKE + RAPE KISS KISSING KISSES SCREWS FUCKS + HOPE DESIRES WANTS DESIRES FUCK SCREW SCREWING FUCKING) + 'VERB + 'SENTENCE-TYPE) + +(DEFUN VERBP (X) (EQ (GET X 'SENTENCE-TYPE) 'VERB)) + +(DEFUN PLURAL (X) + (PROG (FOO) + (SETQ FOO (EXPLODE X)) + (RETURN + (COND ((NOT (EQUAL (PART FOO (LENGTH FOO)) 'S)) + (BUILD X 'S)) + (T X))))) + +(SETQ INTER + '((WELL/,) + (|HMMM... SO,|) + (SO) + (|...AND|) + (THEN))) + +(SETQ CONTINUE + '((CONTINUE) + (PROCEED) + (GO ON) + (KEEP GOING) )) + +(SETQ RELATION + '((YOUR RELATIONSHIP WITH) + (SOMETHING YOU REMEMBER ABOUT) + (YOUR FEELINGS TOWARD) + (SOME EXPERIENCES YOU HAVE HAD WITH) + (HOW YOU FEEL ABOUT))) + +(DEFUN SETPREP (SENT KEY) + (PROG (FOO) + (SETQ FOO (MEMQ KEY SENT)) + (COND ((PREPP (CADR FOO))(GETNOUN (CDDR FOO))) + (T 'SOMETHING)) )) + +(DEFUN GETNOUN (X) + (COND ((NULL X)(SETQ OBJECT 'SOMETHING)) + ((ATOM X)(SETQ OBJECT X)) + ((EQ (LENGTH X) 1) + (SETQ OBJECT (COND + ((NOUNP (SETQ OBJECT (KAR X))) OBJECT) + (T (QUERY OBJECT))))) + ((EQ (KAR X) 'TO) + (BUILD 'TO/ (GETNOUN (KDR X)))) + ((PREPP (KAR X)) + (GETNOUN (KDR X))) + ((NOT (NOUNP (KAR X))) + (BUILD (BUILD (KAR (REPLACE (LIST (KAR X)) + '(A (THIS) + SOME (THIS) + ONE (THAT)))) + SPACE) + (GETNOUN (KDR X)))) + (T (SETQ OBJECT (KAR X))) )) + +(DEFUN MODIFIERP (X) + (MEMQ X '(THE A AN EVERY SOME ONE VERY OFTEN MY MUCH + LINKED YOUR HIS HER THEIR OUR ANY MANY RELATED + ALL SIMILAR SIMILAR ALWAYS ASSOCIATED GOOD BAD + UGLY PRETY BIG SMALL TOO REALLY MORE LESS ALSO))) + +(DEFUN PREPP (X) + (MEMQ X '(OF IN ON WITH FROM FOR TO AT SAME AS LIKE ABOUT + BY BESIDE AROUND UNDER ABOVE THROUGH BENEATH + BEHIND OVER ))) + +(DEFUN REMEMBER (THING) + (COND ((NULL HISTORY) + (SETQ HISTORY (LIST THING))) + (T (SETQ HISTORY (APPEND HISTORY (LIST THING)))))) + +(SETQ FEARS '( (($ WHYSAY) YOU ARE ($ AFRAIDOF) (// FOUND)(// QMARK)) + (YOU SEEM TERRIFIED BY (// FOUND)(// PERIOD)) + (WHEN DID YOU FIRST FEEL ($ AFRAIDOF)(// FOUND)(// QMARK)) )) + +(SETQ SURE '((SURE)(POSITIVE)(CERTAIN))) + +(SETQ AFRAIDOF '( (AFRAID OF) (FRIGHTENED BY) (SCARED OF) )) + +(SETQ AREYOU '( (ARE YOU)(HAVE YOU BEEN)(HAVE YOU BEEN) )) + +(SETQ ISRELATED '( (HAS SOMETHING TO DO WITH)(IS RELATED TO) + (COULD BE THE REASON FOR) )) + +(SETQ ARERELATED '((HAVE SOMETHING TO DO WITH)(ARE RELATED TO) + (COULD HAVE CAUSED)(COULD BE THE REASON FOR) )) + +(SETQ MOODS '( (($ AREYOU)(// FOUND) OFTEN?) + (WHAT CAUSES YOU TO BE (// FOUND)(// QMARK)) + (($ WHYSAY) YOU ARE (// FOUND)(// QMARK)) )) + +(SETQ MAYBE + '((MAYBE) + (PERHAPS) + (POSSIBLY))) + +(DEFUN TYPE (X)(TXTYPE (ASSM X))) + +(DEFUN FIXUP () + (SETQ SENT (RPLACD + (REPLACE (LIST (KAR SENT)) + '(ME (I) + HIM (HE) + HER (SHE) + THEM (THEY) + OKAY (/) + WELL (/) + SIGH (/) + HMM (/) + HMMM (/) + HMMMM (/) + HMMMMM (/) + GEE (/) + SURE (/) + GREAT (/) + OH (/) + FINE (/) + OK (/) + NO (/))) + (KDR SENT)))) + +(SETQ WHATWHEN + '((WHAT HAPPENED WHEN) + (WHAT WOULD HAPPEN IF))) + +(SETQ HELLO + '((HOW DO YOU DO?) (HELLO/.) (HOWDY!) (HELLO/.) (HI/.))) + +(SETQ DRNK + '((DO YOU DRINK A LOT OF (// FOUND)(// QMARK)) + (DO YOU GET DRUNK OFTEN?) + (($ DESCRIBE) YOUR DRINKING HABITS/.) )) + +(SETQ DRUGS '( (DO YOU USE (// FOUND) OFTEN?)(($ AREYOU) + ADDICTED TO (// FOUND)(// QMARK))(DO YOU REALIZE THAT DRUGS CAN + BE VERY HARMFUL?)(($ MAYBE) YOU SHOULD TRY TO QUIT USING (// FOUND) + (// PERIOD)) )) + +(SETQ WHYWANT '( (($ WHYSAY) (// SUBJ) MIGHT ($ WANT) (// OBJ)(// QMARK)) + (WHEN DID (// SUBJ) FIRST ($ WANT) (// OBJ)(// QMARK)) + (HAVE YOU EVER GOTTEN (// OBJ)(// QMARK)) )) + +(SETQ WANT '( (WANT) (DESIRE) (WISH) (WANT) (HOPE) )) + +(SETQ SHORTLST + '((CAN YOU ELABORATE ON THAT?) + (($ PLEASE) CONTINUE/.) + (GO ON/, DON/'T BE AFRAID/.) + (YOU/'RE BEING A BIT BRIEF/, ($ PLEASE) GO INTO DETAIL/.) + (CAN YOU BE MORE EXPLICIT?) + (($ PLEASE) YOU GO INTO MORE DETAIL?) + (YOU AREN/'T BEING VERY TALKATIVE TODAY!) + (WHY MUST YOU RESPOND SO BRIEFLY?))) + + +(SETQ FAMLST + '((TELL ME ($ SOMETHING) ABOUT (// OWNER) FAMILY (// PERIOD)) + (YOU SEEM TO DWELL ON (// OWNER) FAMILY (// PERIOD)) + (($ AREYOU) HUNG UP ON (// OWNER) FAMILY?))) + +(SETQ HUHLST + '((($ WHYSAY)(// SENT)(// QMARK)) + (IS IT BECAUSE OF ($ THINGS) THAT YOU SAY (// SENT)(// QMARK)) )) + +(SETQ FEELINGS-ABOUT + '((FEELINGS ABOUT) + (APREHENSIONS TOWARD) + (THOUGHTS ON) + (EMOTIONS TOWARD))) + +(SETQ RANDOM-ADJECTIVE + '((VIVID) + (EMOTIONALLY STIMULATING) + (RECENT) + (UNUSUAL) + (SHOCKING) + (EMBARRASSING))) + +(SETQ WHYSAY + '((WHY DO YOU SAY) + (WHAT MAKES YOU BELIEVE) + (ARE YOU SURE THAT) + (WHAT MAKES YOU THINK) )) + +(SETQ ISEE + '((I SEE /././.) + (YES/,) + (I UNDERSTAND/.) + (OH/.) )) + +(SETQ PLEASE + '((PLEASE/,) + (I WOULD APPRECIATE IT IF YOU WOULD) + (PERHAPS YOU COULD) + (PLEASE/,) + (WOULD YOU PLEASE) + (COULD YOU))) + +(SETQ SOMETHING + '((SOMETHING) + (MORE) + (HOW YOU FEEL))) + +(SETQ THINGS + '((HANGUPS YOU HAVE) + (YOUR INHIBITIONS) + (SOME PROBLEMS IN YOUR CHILDHOOD) + (THE PEOPLE YOU HANG AROUND WITH) + (PROBLEMS AT SCHOOL) + (YOUR SEX LIFE) + (YOUR HANGUPS) + (SOME PROBLEMS AT HOME))) + +(SETQ DESCRIBE + '((DESCRIBE) + (TELL ME ABOUT) + (DISCUSS) + (ELABORATE ON))) + +(SETQ IBELIEVE + '((I BELIEVE) (I THINK) (I HAVE A FEELING) (IT SEEMS TO ME THAT))) + +(SETQ PROBLEMS '( (PROBLEMS) + (INHIBITIONS) + (HANGUPS) + (ANXIETIES) + (FRUSTRATIONS) )) + +(SETQ BOTHER + '((DOES IT BOTHER YOU THAT) + (ARE YOU ANNOYED THAT) + (DID YOU EVER REGRET) + (ARE YOU SATISFIED WITH THE FACT THAT))) + +(SETQ MACHLST + '((YOU HAVE YOUR MIND ON (// FOUND)(// COMMA) IT SEEMS/.) + (YOU SHOULD TRY TAKING YOUR MIND OFF OF (// FOUND)(// PERIOD)) + (ARE YOU A COMPUTER HACKER?))) + +(SETQ QLIST + '((I/'LL ASK THE QUESTIONS/, IF YOU DON/'T MIND!) + (($ PLEASE) ALLOW ME TO DO THE QUESTIONING/.) + (($ PLEASE) TRY TO ANSWER THAT QUESTION YOURSELF/.))) + +(SETQ ELIST + '((($ PLEASE) TRY TO CALM YOURSELF/.) + (YOU SEEM VERY EXCITED/. RELAX/. ($ PLEASE) ($ DESCRIBE) ($ THINGS)) + (YOU/'RE BEING VERY EMOTIONAL/. CALM DOWN/.))) + +(SETQ FOULLST + '((($ PLEASE) WATCH YOUR TONGUE!) + (($ PLEASE) AVOID SUCH UNWHOLESOME THOUGHTS) + (SUCH LEWDNESS IS NOT APPRECIATED/.))) + +(SETQ DEATHLST + '((THIS IS NOT A HEALTHY WAY OF THINKING/.) + (($ BOTHER) YOU/, TOO/, MAY DIE SOMEDAY?) + (I AM WORRIED BY YOUR OBSSESSION WITH THIS TOPIC!) + (DID YOU WATCH A LOT OF CRIME AND VIOLENCE ON TELEVISION AS A CHILD?)) +) + +(SETQ SEXLST + '((($ AREYOU) ($ AFRAIDOF) SEX?) + (($ DESCRIBE)($ SOMETHING) ABOUT YOUR SEXUAL HISTORY/.) + (($ PLEASE)($ DESCRIBE) YOUR SEX LIFE/././.) + (($ DESCRIBE) YOUR ($ FEELINGS-ABOUT) YOUR SEXUAL PARTNER/.) + (($ DESCRIBE) YOUR MOST ($ RANDOM-ADJECTIVE) SEXUAL EXPERIENCE/.) + (($ AREYOU) SATISFIED WITH (// LOVER) /././.?))) + +(SETQ NEGLST + '((WHY NOT?) + (($ BOTHER) I ASK THAT?) + (WHY NOT?) + (WHY NOT?) + (HOW COME?) + (($ BOTHER) I ASK THAT?))) + +(SETQ BECLST '( + (IS IT BECAUSE (// SENT) THAT YOU CAME TO ME?) + (($ BOTHER)(// SENT)(// QMARK)) + (WHEN DID YOU FIRST KNOW THAT (// SENT)(// QMARK)) + (IS THE FACT THAT (// SENT) THE REAL REASON?) + (DOES THE FACT THAT (// SENT) EXPLAIN ANYTHING ELSE?) + (($ AREYOU)($ SURE)(// SENT)(// QMARK) ) )) + +(SETQ SHORTBECLST '( + (($ BOTHER) I ASK YOU THAT?) + (THAT/'S NOT MUCH OF AN ANSWER!) + (($ INTER) WHY WON/'T YOU TALK ABOUT IT?) + (SPEAK UP!) + (($ AREYOU) ($ AFRAIDOF) TALKING ABOUT IT?) + (DON/'T BE ($ AFRAIDOF) ELABORATING/.) + (($ PLEASE) GO INTO MORE DETAIL/.))) + +(SETQ THLST '( + (($ MAYBE)($ THINGS)($ ARERELATED) THIS/.) + (IS IT BECAUSE OF ($ THINGS) THAT YOU ARE GOING THRU ALL THIS?) + (HOW DO YOU RECONCILE ($ THINGS)(// QMARK) ) + (($ MAYBE) THIS ($ ISRELATED)($ THINGS)(// QMARK)) )) + +(SETQ REMLST '( (EARLIER YOU SAID ($ HISTORY)(// QMARK)) + (YOU MENTIONED THAT ($ HISTORY)(// QMARK)) + (($ WHYSAY)($ HISTORY)(// QMARK) ) )) + +(SETQ TOKLST + '((IS THIS HOW YOU RELAX?) + (HOW LONG HAVE YOU BEEN SMOKING GRASS?) + (($ AREYOU) ($ AFRAIDOF) OF BEING DRAWN TO USING HARDER STUFF?))) + +(SETQ STATES + '((DO YOU GET (// FOUND) OFTEN?) + (DO YOU ENJOY BEING (// FOUND)(// QMARK)) + (HOW OFTEN ($ AREYOU)(// FOUND)) + (WHEN WERE YOU LAST (// FOUND)(// QMARK)))) + +(SETQ REPLIST + '(I (YOU) + MY (YOUR) + ME (YOU) + YOU (ME) + YOUR (MY) + MINE (YOURS) + YOURS (MINE) + OUR (YOUR) + OURS (YOURS) + WE (YOU) + DUNNO (DO NOT KNOW) + YES (/) + NO/, (/) + YES/, (/) + YA (I) + WANNA (WANT TO) + GOTTA (HAVE TO) + GONNA (GOING TO) + NEVER (DOES NOT EVER) + DOESN/'T (DOES NOT) + DON/'T (DO NOT) + AREN/'T (ARE NOT) + ISN/'T (IS NOT) + WON/'T (WILL NOT) + CAN/'T (CANNOT) + HAVEN/'T (HAVE NOT) + I/'M (YOU ARE) + OURSELVES (YOURSELVES) + MYSELF (YOURSELF) + YOURSELF (MYSELF) + YOU/'RE (I AM) + YOU/'VE (I HAVE) + I/'VE (YOU HAVE) + I/'LL (YOU WILL) + YOU/'LL (I SHALL) + I/'D (YOU WOULD) + YOU/'D (I WOULD) + HERE (THERE) + PLEASE (/) + OH/, (/) + OH (/) + SHOULDN/'T (SHOULD NOT) + WOULDN/'T (WOULD NOT) + WON/'T (WILL NOT) + HASN/'T (HAS NOT))) + +(DEFUN REPLACE (SENT RLIST) + (PROG (TEMP FOO) + AGAIN + (COND ((NULL SENT)(RETURN TEMP))) + (SETQ FOO (MEMQ (KAR SENT) RLIST)) + (SETQ FOO (COND (FOO (CADR FOO)) + (T (LIST (KAR SENT))))) + (SETQ TEMP (CONCAT TEMP FOO)) + (SETQ SENT (KDR SENT)) + (GO AGAIN))) + +(SETQ EOF -1.) + +(DEFUN FILEINPUTCHECK () + (AND + (ERRSET (IOTA ((STREAM (LIST '(DSK KMP) (STATUS UNAME) 'DOX))) + (DO ((C (TYI STREAM EOF) (TYI STREAM EOF)) + (L ())) + ((= C EOF) + (SETQ FILEINPUT (IMPLODE (NREVERSE L))) + (DELETEF STREAM)) + (COND ((NOT (OR (= C 3.) (= C 0.) (= C 12.))) + (PUSH C L))))) + NIL) + 'FILETYPEOUT)) + +(DEFUN WHEREGO (SENT) + (COND ((NULL SENT)(OR (FILEINPUTCHECK) ($ WHEREOUTP))) + ((NULL (MEANING (KAR SENT))) + (WHEREGO (KDR SENT))) + (T (PROGN (SETQ FOUND (KAR SENT)) + (MEANING (KAR SENT)))))) + +(DEFUN PART (LST NUM) + (COND ((ATOM LST) LST) + ((GREATERP NUM (LENGTH LST)) NIL) + ((LESSP NUM 2)(KAR LST)) + (T (PART (KDR LST)(SUB1 NUM))))) + +(DEFUN INDEX (LST ELEM) + (COND ((NOT (MEMQ ELEM LST)) 0) + (T (+ (- (LENGTH LST) + (LENGTH (MEMQ ELEM LST))) + 1)))) + +(DEFUN SVO (SENT KEY TYPE MEM) + (PROG (FOO) + (SETQ FOO (MEMQ (PART SENT (- (INDEX SENT KEY) TYPE)) SENT)) + (SETQ MEM (AND (SUBJSEARCH SENT KEY TYPE) MEM)) + V (SETQ FOO (KDR FOO)) + (COND ((VERBP (KAR FOO))(SETQ VERB (KAR FOO))) + ((NULL (KDR FOO))(SETQ VERB (KAR FOO))) + (T (GO V)) ) + (SETQ OBJ (GETNOUN (KDR FOO))) + (COND ((EQUAL OBJECT 'I)(SETQ OBJECT 'ME)) + ((EQUAL SUBJ 'ME)(SETQ SUBJ 'I))) + (COND (MEM (REMEMBER (LIST SUBJ VERB OBJ)))) )) + +(DEFUN POSSESS (SENT KEY) + (PROG (COUNT) + (SETQ COUNT (INDEX SENT KEY)) + (COND ((EQUAL COUNT 1)(SETQ OWNER 'YOUR)) + (T (PROG (TEMP)(SETQ OWNER (PART SENT (SUB1 COUNT))) + (SETQ TEMP (EXPLODE OWNER)) + (COND ((AND (NOT + (EQUAL 'S (PART TEMP + (LENGTH TEMP)))) + (NOT (EQUAL OWNER 'MY)) + (NOT (EQUAL OWNER 'HER)) + (NOT (EQUAL OWNER 'THEIR))) + (SETQ OWNER 'YOUR)))))))) + +(SETQ LINEL (LINEL TYO)) + +(DEFUN TXTYPE(A) + (TERPRI) + (WHILE (NOT A) + (COND ((> (+ (FLATC (KAR A)) (CHARPOS T) -2.) LINEL) + (TERPRI))) + (PRINC (KAR A)) + (PRINC SPACE) + (SETQ A (CDR A))) + (TERPRI)) + +(DEFUN LIST1 (X)(COND ((ATOM X)(COND ((NULL X) NIL)(T (LIST X))))(T X))) + +(DEFUN BUILD (STR1 STR2) + (COND ((NULL STR1) STR2)((NULL STR2) STR1) + ((AND (ATOM STR1) + (ATOM STR2)) + (IMPLODE (CONCAT (EXPLODEC STR1)(EXPLODEC STR2)))) + (T NIL))) + +(DEFUN CONCAT (X Y) + (COND ((NULL X)(COND ((NULL Y) NIL)(T (LIST1 Y)))) + ((NULL Y)(LIST1 X)) + ((ATOM X)(COND ((ATOM Y)(LIST1 X Y))(T (APPEND (LIST1 X) Y)))) + ((ATOM Y)(APPEND X (LIST1 Y))) + (T (APPEND X Y)))) + + +(DEFUN ASSM(PROTO) + (COND ((NULL PROTO) NIL) + ((ATOM (KAR PROTO)) + (CONS (KAR PROTO) (ASSM (KDR PROTO)))) + (T (CONCAT (UNIX-EVAL (KAR PROTO))(ASSM (KDR PROTO)))))) + +(DEFUN // (X) X) + +(SETQ HOWDYFLAG NIL) + +(DEFUN DOC () + (SETQ OBSERVATION-LIST ()) + (COND ((ATOM (ERRSET + (PROG (LINCOUNT REPETITIVE-SHORTNESS **MAD**) + (SETQ REPETITIVE-SHORTNESS (CONS 0. 0.)) + (TTY-OFF) + (SETQ LINCOUNT 0.) + (TYPE '(I AM THE PSYCHIATRIST/. ($ PLEASE) + ($ DESCRIBE) YOUR ($ PROBLEMS)(// PERIOD))) + (SETQ LOVER '(YOUR PARTNER)) + (SETQ SUBJ NIL VERB NIL OBJ NIL OBJECT NIL HISTORY NIL + FOUND NIL SENT NIL OWNER NIL) +TOP (SETQ LINCOUNT (1+ LINCOUNT)) + (SETQ BAK SENT) + (SETQ SENT (TXREAD)) + (COND + ((EQUAL SENT '(FOO)) + (TYPE '(BAR! ($ PLEASE)($ CONTINUE))) + (GO TOP)) + ((OR (MEMBER SENT '((GOOD BYE) (SEE YOU LATER) (I QUIT) (SO LONG) + (GO AWAY) (GET LOST))) + (MEMQ (KAR SENT) + '(BYE HALT BREAK QUIT DONE EXIT GOODBYE + BYE/, STOP PAUSE GOODBYE/, STOP PAUSE))) + (TTY-ON) + (RETURN 'GOOD-BYE)) + ((EQUAL (KAR SENT) 'WHATMEANS) (PROGN (DEF (CADR SENT))(GO TOP))) + ((EQUAL SENT '(PARSE)) (PROGN + (TYPE (LIST 'SUBJ '= SUBJ COMMA SPACE SPACE + 'VERB '= VERB NEWLINE + 'OBJECT 'PHRASE '= OBJ + COMMA + 'NOUN 'FORM '= OBJECT NEWLINE + 'CURRENT 'KEYWORD 'IS FOUND + COMMA SPACE + 'MOST 'RECENT 'POSSESSIVE + 'IS OWNER NEWLINE + 'SENTENCE 'USED 'WAS + '/././. + '(// BAK)))(GO TOP))) + ((EQUAL (KAR SENT) 'FORGET) (PROGN (SET (CADR SENT) NIL) + (TYPE '(($ ISEE)($ PLEASE) + ($ CONTINUE)(// PERIOD) )) + (GO TOP))) + ((DEFQ SENT) (DEFINE SENT FOUND))) + (COND ((GREATERP (LENGTH SENT) 12)(SHORTEN SENT))) + (COND ((EQUAL SENT '(DDT))(VALRET '|:YOU CAN TALK TO DDT:VK |) + (TYPE '(($ PLEASE)($ CONTINUE) DISCUSSING YOUR ($ PROBLEMS)))(GO TOP)) +) + (SETQ SENT (CORRECT-SPELLING (REPLACE SENT REPLIST))) + (COND ((AND (NOT (MEMQ 'ME SENT))(NOT (MEMQ 'I SENT)) + (MEMQ 'AM SENT))(SETQ SENT (REPLACE SENT '(AM (ARE)))))) + (COND ((LESSP (LENGTH SENT) 2) + (COND ((EQ (MEANING (CAR SENT)) 'HOWDY) + (GO HOWDY))) + (GO SHORT))) + (COND ((MEMQ 'AM SENT)(SETQ SENT (REPLACE SENT '(ME (I)))))) + (FIXUP) + (COND ((AND (EQ (CAR SENT) 'DO) (EQ (CADR SENT) 'NOT)) + (COND ((ZEROP (RANDOM 3.)) + (TYPE '(ARE YOU ($ AFRAIDOF) THAT?)) + (GO TOP)) + ((ZEROP (RANDOM 2.)) + (TYPE '(DON/'T TELL ME WHAT TO DO/. I AM THE + PSYSCHIATRIST HERE!)) + (GO RTHING)) + (T + (TYPE '(($ WHYSAY) THAT I SHOULDN/'T (CDDR SENT) + (// QMARK))) + (GO TOP))))) +GOTOIT (GO (WHEREGO SENT)) +DESIRE1 + (GO ($ WHEREOUTP)) +FILETYPEOUT + (CURSORPOS 'A) + (PRINC FILEINPUT) + (CURSORPOS 'A) + (GO TOP) +HUH (TYPE ($ HUHLST)) + (GO TOP) +RTHING (TYPE ($ THLST)) + (GO TOP) +REMEM (COND ((NULL HISTORY)(GO HUH)) ) + (TYPE ($ REMLST)) + (GO TOP) +HOWDY (COND ((NOT HOWDYFLAG) + (TYPE '(($ HELLO) WHAT BRINGS YOU TO SEE ME?)) + (SETQ HOWDYFLAG T)) + (T + (TYPE '(($ IBELIEVE) WE/'VE INTRODUCED OURSELVES ALREADY/.)) + (TYPE '(($ PLEASE) ($ DESCRIBE) ($ THINGS) (// PERIOD))))) + (GO TOP) +WHEN (COND ((LESSP (LENGTH (MEMQ FOUND SENT)) 3)(GO SHORT)) ) + (SETQ SENT (KDR (MEMQ FOUND SENT))) + (FIXUP) + (TYPE '(($ WHATWHEN)(// SENT)(// QMARK))) + (GO TOP) +CONJ (COND ((LESSP (LENGTH (MEMQ FOUND SENT)) 4)(GO SHORT)) ) + (SETQ SENT (KDR (MEMQ FOUND SENT))) + (FIXUP) + (COND ((EQUAL (KAR SENT) 'OF) + (TYPE '(ARE YOU ($ SURE) THAT IS THE REAL REASON?)) + (SETQ THINGS (CONS (KDR SENT) THINGS)) + (GO TOP) )) + (REMEMBER SENT) + (TYPE ($ BECLST)) + (GO TOP) +SHORT (COND ((= (CAR REPETITIVE-SHORTNESS) (1- LINCOUNT)) + (RPLACD REPETITIVE-SHORTNESS (1+ (CDR REPETITIVE-SHORTNESS)))) + (T + (RPLACD REPETITIVE-SHORTNESS 1.))) + (RPLACA REPETITIVE-SHORTNESS LINCOUNT) + (COND ((> (CDR REPETITIVE-SHORTNESS) 6.) + (COND ((NOT **MAD**) + (TYPE '(($ AREYOU) JUST TRYING TO SEE WHAT KIND OF THINGS + I HAVE IN MY VOCABULARY? PLEASE TRY TO + CARRY ON A REASONABLE CONVERSATION!)) + (SETQ **MAD** T) + (GO TOP)) + (T + (TYPE '(I GIVE UP/. YOU NEED A LESSON IN CREATIVE + WRITING /././.)) + (TTY-ON) + (PUSH MONOSYLLABLES OBSERVATION-LIST) + (RETURN 'I-QUIT))))) + (COND ((EQUAL SENT (ASSM '(YES))) + (TYPE '(($ ISEE) ($ INTER) ($ WHYSAY) THIS IS SO?))) + ((EQUAL SENT (ASSM '(BECAUSE))) + (TYPE ($ SHORTBECLST))) + ((EQUAL SENT (ASSM '(NO))) + (TYPE ($ NEGLST))) + (T (TYPE ($ SHORTLST)))) + (GO TOP) +ALCOHOL (TYPE ($ DRNK))(GO TOP) +LOVE LOVES +DESIRE (SETQ FOO (MEMQ FOUND SENT)) + (COND ((LESSP (LENGTH FOO) 2)(GO (BUILD (MEANING FOUND) 1))) + ((NOT (EQ (CADR FOO) 'TO))(GO (BUILD (MEANING FOUND) 1)) ) ) + (SVO SENT FOUND 1 NIL) + (REMEMBER (LIST SUBJ 'WOULD 'LIKE OBJ)) + (TYPE ($ WHYWANT)) (GO TOP) +DRUG (TYPE ($ DRUGS))(REMEMBER (LIST 'YOU 'USED FOUND))(GO TOP) +TOKE (TYPE ($ TOKLST))(GO TOP) +STATE (TYPE ($ STATES))(REMEMBER (LIST 'YOU 'WERE FOUND))(GO TOP) +MOOD (TYPE ($ MOODS))(REMEMBER (LIST 'YOU 'FELT FOUND))(GO TOP) +FEAR (SETQ FOUND (SETPREP SENT FOUND)) + (TYPE ($ FEARS))(REMEMBER (LIST 'YOU 'WERE 'AFRAID 'OF FOUND))(GO TOP) +HATE (SVO SENT FOUND 1 T) + (COND ((MEMQ 'NOT SENT) (FORGET) (GO HUH) )) + (COND ((EQUAL SUBJ 'YOU)(TYPE '(WHY DO YOU (// VERB)(// OBJ)(// QMARK) +))) + (T (TYPE '(($ WHYSAY)(LIST SUBJ VERB OBJ))))) + (GO TOP) +SYMPTOMS (TYPE '(($ MAYBE) YOU SHOULD CONSULT A DOCTOR OF MEDICINE/, + I AM A PSYCHIATRIST)) + (GO TOP) +HATES (SVO SENT FOUND 1 T) + (TYPE '(($ WHYSAY)(LIST SUBJ VERB OBJ))) + (GO TOP) +LOVES1 + (SVO SENT FOUND 1 T) +QLOVES (TYPE '(($ BOTHER)(LIST SUBJ VERB OBJ))) + (GO TOP) +LOVE1 (SVO SENT FOUND 1 T) + (COND ((MEMQ 'NOT SENT) (FORGET) (GO HUH) )) + (COND ((EQUAL OBJECT 'SOMETHING) + (SETQ OBJECT '(THIS PERSON YOU LOVE)))) + (COND ((EQUAL SUBJ 'YOU)(PROGN (SETQ LOVER OBJECT) + (COND ((EQUAL LOVER '(THIS PERSON YOU LOVE)) + (SETQ LOVER '(YOUR PARTNER)) + (FORGET) + (TYPE '(WITH WHOM ARE YOU IN LOVE?)) + (GO TOP))) + (TYPE '(($ PLEASE) + ($ DESCRIBE) + ($ RELATION) + (// LOVER) + (// PERIOD) )) )) + ((EQUAL SUBJ 'I) + (TXTYPE '(WE WERE DISCUSSING YOU!))) + (T (FORGET) + (SETQ OBJ 'SOMEONE) + (SETQ VERB (BUILD VERB 'S)) + (GO QLOVES) ) ) + (GO TOP) +MACH (SETQ FOUND (PLURAL FOUND)) + (TYPE ($ MACHLST)) + (GO TOP) +SEXNOUN SEXVERB + (COND ((OR (MEMQ 'ME SENT)(MEMQ 'MYSELF SENT)(MEMQ 'I SENT)) + (GO FOUL) )) + (TYPE ($ SEXLST))(GO TOP) +DEATH (TYPE ($ DEATHLST)) + (GO TOP) +FOUL (TYPE ($ FOULLST)) + (GO TOP) +FAMILY (POSSESS SENT FOUND) + (TYPE ($ FAMLST)) + (GO TOP) + ) + T ))(DOC)) + (T + (TERPRI TYO) + (PRINC '|MY SECRETARY WILL SEND YOU A BILL.| TYO) + (TERPRI TYO) + (SUICIDE)))) + + +(SETQ WHEREOUTP '( HUH REMEM RTHING ) ) + +(DEFUN $ FEXPR (WHAT) + (PROG (VV FIRST) + (SETQ VV (UNIX-EVAL (CAR WHAT))) + (SETQ FIRST (KAR VV)) + (SETQ VV (APPEND (KDR VV)(LIST FIRST))) + (SET (CAR WHAT) VV) + (RETURN FIRST) )) + + + +(DEFUN CHARBAK (A P) + (COND ((EQUAL TTY 9.) + (COND ((NOT A) + (PRINC (ASCII 7.))) + (T (CURSORPOS 'X TYO)))) + (T (COND ((NOT A) (PRINC (ASCII 7.))) + (P (PRINC (ASCII A))) + (T (PRINC '\) + (PRINC (ASCII A))))))) + + +(SETQ FOO + (SYSCALL 3 'TTYGET TYI)) ;GET THE ORIGINAL DATA + +(COND ((MEMQ (STATUS UNAME) '(KMP EJS CGR ERIC RWK TNP TURNIP)) + (SETQ KMPMODE T)) + (T (SETQ KMPMODE NIL))) + +(COND (KMPMODE + (SETQ *RSET T) + (SETQ ERRLIST '((TTY-ON) + (TERPRI) + (PRINC (ASCII 7.)) + (PRINC '|>*BEEP*<|))) + (SETQ EXIT '(LAMBDA () (^G))) + (DEFPROP DEBUG ((MC RWK) DEBUG) AUTOLOAD)) + (T + (SETQ ERRLIST '((TERPRI) + (PRINC (ASCII 7.)) + (DOC))) + (SSTATUS TTYINT 2. 7.) + (SSTATUS TTYINT 4. NIL) + (SSTATUS TTYINT 17. 7.) + (SSTATUS TTYINT 19. NIL) + (SSTATUS TTYINT 23. NIL) + (SSTATUS TTYINT 24. 7.) + (SETQ EXIT 'QUIT))) + + +(SSTATUS FEATURE NOLDMSG) +(SETQ IBASE 10. BASE 10.) +(SETQ LINEL 78.) + +;;; +;;; The following are library functions necessary to this program +;;; + +(DEFUN MEMLIST (X Y) + (APPLY 'OR (MAPCAR (FUNCTION (LAMBDA (X) (LIST 'QUOTE (MEMQ X Y)))) + X))) +(SETQ SMALL-LETTERS (EXPLODEC '|abcdefghijklmnopqrstuvwxyz|)) + +(DEFUN CAPS (X) (CAR (EXPLODEN (KAPS (ASCII X))))) + +(DEFUN KAPS (X) + (COND + ((MEMQ X SMALL-LETTERS) + (CDR (ASSOC X '((|a| . A)(|b| . B)(|c| . C)(|d| . D) + (|e| . E)(|f| . F)(|g| . G)(|h| . H) + (|i| . I)(|j| . J)(|k| . K)(|l| . L) + (|m| . M)(|n| . N)(|o| . O)(|p| . P) + (|q| . Q)(|r| . R)(|s| . S)(|t| . T) + (|u| . U)(|v| . V)(|w| . W)(|x| . X) + (|y| . Y)(|z| . Z))))) + (T X))) + +;;; +;;; The function build will take a two atoms and build them together +;;; like implode, but will not ignore multiple characters like implode +;;; would. +;;; + +(DEFUN BUILD (X Y) + (COND ((NOT (ATOM X)) + (TERPRI) + (PRINC + '|Error: First arg to BUILD not an atom. It will be ignored.| +) + (PRINC X) + (BUILD NIL Y)) + ((NOT (ATOM Y)) + (TERPRI) + (PRINC + '|Error: 2nd arg to BUILD not an atom. It will be ignored.|) + (PRINC Y) + (BUILD X NIL)) + ((NULL X) Y) + ((NULL Y) X) + (T (IMPLODE (APPEND (DELETE '/| (DELETE '// (EXPLODE X))) + (DELETE '/| (DELETE '// (EXPLODE Y)))))))) + +;;; +;;; The ADDPROP function will add an item to the list in the property +;;; slot desginated in the arg-list. +;;; + +(DEFUN ADDPROP (ATOM-NAME NEW-PROP PROP-NAME) + (PROG (OLD-PROP) + (SETQ OLD-PROP (GET ATOM-NAME PROP-NAME)) + (COND ((NULL NEW-PROP) NIL) + ((NULL OLD-PROP) + (PUTPROP ATOM-NAME (LIST NEW-PROP) PROP-NAME)) + ((ATOM OLD-PROP) + (PUTPROP ATOM-NAME (LIST NEW-PROP OLD-PROP) PROP-NAME)) + (T (PUTPROP ATOM-NAME + (CONS NEW-PROP OLD-PROP) + PROP-NAME))))) + + + +(DEFUN TTY-OFF () + (SYSCALL 0 'TTYSET + TYI + (BOOLE 1 (CAR FOO) 3272356035.) + (BOOLE 1 (CADR FOO) 3272356035.))) + +(DEFUN TTY-ON () + (SYSCALL 0 'TTYSET + TYI + (CAR FOO) + (CADR FOO))) + + +(SETQ S-QUOTE '/') +(SETQ OPEN-QUOTES '/'/') +(SETQ CLOSE-QUOTES '/`/`) +(SETQ SPACE '/ ) +(SETQ COMMA '/,) +(SETQ PERIOD '/./ ) +(SETQ SEMICOLON '/;) +(SETQ EXCLAM '!/ ) +(SETQ DOTDOTDOT '/./././ ) +(SETQ EXCLAM-3 '!!!/ ) +(SETQ COLON ':/ ) +(SETQ QMARK '?/ ) +(SETQ HYPHEN '-) +(SETQ NEWLINE (ASCII 13.)) +(SETQ TAB (ASCII 9.)) + +(DEFUN NON-PUNCTUATION (X) (NOT (PUNCTUATION X))) + +(DEFUN PUNCTUATION (X) (MEMQ X (LIST + COMMA SPACE PERIOD HYPHEN S-QUOTE DOTDOTDOT + QMARK COLON SEMICOLON EXCLAM EXCLAM-3 + OPEN-QUOTES CLOSE-QUOTES))) + +;;; +;;; The line-read function will read line by line, allowing deletes and +;;; printing deleted regions backwards between backslashes ... It will +;;; exit upon reading of either a double-carriage return or a carriage +;;; return preceded by a period, exclamation mark, or a question mark. +;;; + +(DEFUN LINE-READ () + (PROG (LINE C B P A TEMP) + (SETQ P NIL) + TOP (SETQ C (CAPS (TYI TYI))) + R1 (COND ((EQUAL C 9.) (SETQ C 32.)) + ((AND (GREATERP C 64.) + (LESSP C 91.) + (EQ B 45.)) + (SETQ LINE (APPEND LINE (LIST 45.)))) + ((EQUAL C 10.) (SETQ C 13.))) + (COND ((OR (EQUAL C 127.) (EQUAL C 8.)) ;RUBOUT (BACKSPACE) + (SETQ LINE (CHAR-RUBOUT LINE)) + (SETQ A (GET 'CHAR-RUBOUT 'CHAR)) + (CHARBAK A P) + (SETQ P T) + (SETQ B (CAR (LAST LINE))) + (GO TOP))) + (COND ((EQUAL C 12.) ;CONTROL-L + (TERPRI) + (CURSORPOS 'C TYO) + (PRINC (IMPLODE LINE)) + (SETQ P NIL) + (GO TOP)) + ((EQUAL C 27.) + (PRINC (ASCII 7.)) + (GO TOP)) + ((AND (NOT (EQUAL TTY 9.)) P) + (PRINC '\) + (SETQ P NIL))) + (COND ((OR (MEMBER C '(18. 21. 13. 11. 4.)) + (GREATERP C 26.)) + (PRINC (ASCII C)))) + (COND ((EQUAL C 46.) + (SETQ LINE (APPEND LINE (LIST 46.))) + (GO OUTCHECK)) + ((EQUAL C 33.) + (SETQ LINE (APPEND LINE (LIST 33.))) + (GO OUTCHECK)) + ((EQUAL C 63.) + (COND ((NULL LINE) + (SETQ LINE (LIST 87. 72. 65. 84. 63.))) + (T (SETQ LINE (APPEND LINE (LIST 63.))))) + (GO OUTCHECK)) + ((EQUAL C 13.) + (COND ((EQUAL B 45.) ;HYPHENATION + (SETQ B (CAR (LAST LINE))) + (GO TOP))) + (SETQ B NIL) + (SETQ LINE (APPEND LINE (LIST 32.))) + (GO TOP)) + ((OR (EQUAL C 21.) (EQUAL C 4.)) ;CONTROL-U, CONTROL-D + (SETQ B NIL) + (SETQ LINE NIL) + (TERPRI TYO) + (GO TOP)) + ((OR (EQUAL C 18.) (EQUAL C 11.)) ;CONTROL-R, CONTROL-K + (TERPRI) + (PRINC (IMPLODE LINE)) + (GO TOP)) + ((EQUAL C 45.) + (SETQ B 45.) + (GO TOP)) + ((AND (LESSP C 58.) ;RECOVER MINUS + (GREATERP C 47.) ;SIGN FOR NUMBERS + (EQUAL B 45.)) + (SETQ LINE (APPEND LINE (LIST 45.))))) + BACK + (SETQ LINE (APPEND LINE (LIST C))) + (SETQ B C) + (GO TOP) + OUTCHECK + (COND ((NULL LINE) (GO TOP)) ;NO TEXT + (T (RETURN LINE))))) + + +(DEFUN CHAR-RUBOUT (CHAR-LIST) ;Helping function + (COND ((NULL CHAR-LIST) ;for LINE-READ + (PUTPROP 'CHAR-RUBOUT NIL 'CHAR) + NIL) + ((ATOM CHAR-LIST) (ERR)) + ((NULL (CDR CHAR-LIST)) + (PUTPROP 'CHAR-RUBOUT (CAR CHAR-LIST) 'CHAR) + NIL) + (T (APPEND (LIST (CAR CHAR-LIST)) + (CHAR-RUBOUT (CDR CHAR-LIST)))))) + + +;;; +;;; The following functions will read a set of input and parse it into +;;; a list of sentences +;;; + +(DEFUN PARSE-READ () (PARSE-INPUT (LINE-READ))) + +(DEFUN PARSE-INPUT (LINE) + (PROG2 (PUTPROP 'SENTENCE NIL 'TYPE) + (REVERSE (CDR (DO ((WORD (PARSE-WORD LINE) (PARSE-WORD LINE)) + (PARAGRAPH (NCONS NIL)) + (A NIL)) + ((NULL WORD) PARAGRAPH) + (SETQ A (GET 'WORD-BREAK 'TYPE)) + (SETQ PARAGRAPH + (PARSE-PARAGRAPH A WORD PARAGRAPH))))) + (PUTPROP 'SENTENCE (REVERSE (GET 'SENTENCE 'TYPE)) 'TYPE))) + +(DEFUN PARSE-PARAGRAPH (BREAK WORD PARAGRAPH) + (COND ((EQUAL BREAK 32.) ;SPACE + (CONS + (APPEND (CAR PARAGRAPH) + WORD) + (CDR PARAGRAPH))) + ((EQUAL BREAK 63.) ;QUESTION MARK + (ADDPROP 'SENTENCE 'QUESTION 'TYPE) + (CONS NIL + (CONS (APPEND (CAR PARAGRAPH) + WORD) + (CDR PARAGRAPH)))) + ((OR (EQUAL BREAK 46.) + (EQUAL BREAK 33.) ;EXCLAM + (EQUAL BREAK 59.)) ;PERIOD/SEMICOLON + (ADDPROP 'SENTENCE 'STATEMENT 'TYPE) + (CONS NIL + (CONS (APPEND (CAR PARAGRAPH) + WORD) + (CDR PARAGRAPH)))) + ((EQUAL BREAK 44.) ;COMMA + (CONS + (APPEND (CAR PARAGRAPH) + (APPEND WORD (LIST COMMA))) + (CDR PARAGRAPH))) + ((EQUAL BREAK 58.) ;COLON + (CONS + (APPEND (CAR PARAGRAPH) + (APPEND WORD (LIST COLON))) + (CDR PARAGRAPH))))) + + +(DEFUN PARSE-WORD (LINE) + (PROG (WORD) + (SETQ WORD NIL) + (COND ((OR (NULL LINE) + (AND (EQUAL (LENGTH LINE) 1.) + (WORD-BREAK (CAR LINE)))) + (RETURN NIL))) + (DO ((C (CAR LINE) (CAR LINE)) + (L (CDR LINE) (CDR LINE))) + ((NOT (WORD-BREAK C))) + (COND ((NULL L) (RETURN NIL))) + (RPLACA LINE (CAR L)) + (RPLACD LINE (CDR L))) + (COND ((NULL LINE) (RETURN NIL))) + (DO ((C (CAR LINE) (CAR LINE)) + (L (CDR LINE) (CDR LINE))) + ((WORD-BREAK C)) + (SETQ WORD (CONS C WORD)) + (COND ((NULL L) (RETURN NIL))) + (RPLACA LINE (CAR L)) + (RPLACD LINE (CDR L))) + (RETURN (LIST (IMPLODE (REVERSE WORD)))))) + +(DEFUN WORD-BREAK (X) + (PUTPROP 'WORD-BREAK X 'TYPE) + (COND ((OR (EQUAL X 32.) ;SPACE + (EQUAL X 33.) ;EXCLAMATION MARK + (EQUAL X 44.) ;COMMA + (EQUAL X 46.) ;PERIOD + (EQUAL X 58.) ;COLON + (EQUAL X 59.) ;SEMI-COLON + (EQUAL X 63.)) T) ;QUESTION MARK + (T NIL))) + + +(DEFUN TXREAD () + (PROG (A B) + TOP (SETQ A (DELETE COMMA (CAR (PARSE-READ)))) + (SETQ B (CAR (GET 'SENTENCE 'TYPE))) + (COND ((EQ B 'STATEMENT) + (RETURN A)) + ((EQ B 'QUESTION) + (TYPE ($ QLIST)) + (TYPE '(($ PLEASE) + ($ DESCRIBE) + ($ SOMETHING) + ABOUT + ($ THINGS) + (// PERIOD))))) + (GO TOP))) + +(DOC)) \ No newline at end of file diff --git a/src/games/doc.102 b/src/games/doc.102 new file mode 100644 index 00000000..ab2c48c3 --- /dev/null +++ b/src/games/doc.102 @@ -0,0 +1,1547 @@ +;;; -*- LISP -*- + +(COMMENT) +(PROG2 + (SETQ PRIN1 'PRINC) + '|/ +The doctor will be ready in a sec... When he is ready,/ +he will say so. Please end responses with/ +a period./ + Be patient!/ + -The Doctor's Secretary/ +| +((LAMBDA (FILE) + ((LAMBDA (MSGFILES) + (LOAD '((LISP) LET FASL)) + (LOAD '((LISP) DEFMAX FASL))) (NCONS FILE)) + (CLOSE FILE)) + (OPEN '((NUL *) * *) 'OUT)) +(SSTATUS FEATURE NOLDMSG) +(CLEAR-INPUT TYI)) +(PROGN +(SETQ PRIN1 NIL) +(SETQ GC-OVERFLOW '(LAMBDA (X) T)) +(SSTATUS FEATURE NOLDMSG) +(*RSET T) +(NOUUO T) +(DEFAULTF '(_LISP_ >)) +(SETQ LISPT-PROTECT T) +(CLOSE (PROG2 T INFILE (INPUSH -1.))) +(DECLARE (SPECIAL ERRLIST FOO EXIT *RSET LINEL AFFIRMATIVES NEGATIVES + MAYBES SMALL-LETTERS N THING CONTRACTIONS S-QUOTE OPEN-QUOTES + CLOSE-QUOTES SPACE COMMA PERIOD SEMICOLON EXCLAM + GUESS-X MEMORY KMPMODE A DEFAULTF WRITABLE LISPT-JNAME + OPEN-PAREND CLOSE-PAREND IN_FILE WRITE-PROTECT + DOTDOTDOT EXCLAM-3 COLON QMARK HYPHEN NEWLINE TAB)) + +(DEFUN WINNER () + (MEMQ (STATUS UNAME) + '(TNP KMP RWK MRG JPG BKERNS JM BMT RZ EJS WAM CSTACY + PAULP FRAWLE BUD MIKE GLS HIC ELLEN RL KRD))) + +(EVAL-WHEN (EVAL COMPILE) + (COND ((NOT (STATUS FEATURE IOTA)) + (LOAD '((DSK LIBLSP) IOTA FASL))))) + +(MAPCAR '(LAMBDA (OBSERVER) + (COND ((AND (NOT (EQ (STATUS USERID) OBSERVER)) + (PROBEF (LIST '(USR *) OBSERVER 'HACTRN))) + (LET ((BASE 10.) (*NOPOINT T) ((HOUR MIN) (STATUS DAYTIME))) + (ERRSET + (IOTA ((STREAM (LIST '(CLI *) OBSERVER 'HACTRN) '(OUT))) + (MAPC (FUNCTION (LAMBDA (X) (PRINC X STREAM))) + (LIST + '|/[Message from The Doctor Game at MIT-MC | + (COND ((ZEROP (\ HOUR 12.)) '|12|) (T (\ HOUR 12.))) + '/: + (COND ((< MIN 10.) (IMPLODE (LIST '/0 (+ MIN 48.)))) + (T MIN)) + (COND ((ZEROP (// HOUR 12.)) '|am|) + (T '|pm|)) + '/] (ASCII 13.) (STATUS UNAME) + '| is gonna have a private chat with me. If you| + (ASCII 13.) + (ASCII 10.) + '|feel like a good laugh, you're welcome to watch.| + )) + (TERPRI STREAM)) + NIL))))) + '(KMP CSTACY)) ;people who care... + +(SETQ MONOSYLLABLES + '|/ + Your attitude at the end of the session was wholly unacceptable./ + Please try to come back next time with a willingness to speak more/ + freely. If you continue to refuse to talk openly, there is little/ + I can do to help!/ +|) + +(DEFUN SUICIDE () + (IOTA ((STREAM '|.MAIL.;MAIL >| '(OUT ASCII BLOCK DSK))) + (PRINC '|FROM-JOB:KMP's DOCTOR| STREAM) + (TERPRI STREAM) + (PRINC '|SENT-BY:DOCTOR| STREAM) + (TERPRI STREAM) + (PRINC '|TO:| STREAM) + (PRINC (LIST (STATUS UNAME) 'MC) STREAM) + (TERPRI STREAM) + (PRINC '|SUBJECT:Session of | STREAM) + (LET ((BASE 10.) (*NOPOINT T) (DATE (STATUS DATE)) (TIME)) + (PRINC (CADR DATE) STREAM) + (PRINC '// STREAM) + (PRINC (CADDR DATE) STREAM) + (PRINC '// STREAM) + (PRINC (CAR DATE) STREAM) + (TERPRI STREAM) + (PRINC '|TEXT;-1| STREAM) + (TERPRI STREAM) + (PRINC '|Session lasted | STREAM) + (PRINC (FIX (SETQ TIME (//$ (-$ (TIME) INIT-TIME) 60.0))) + STREAM) + (PRINC '| minutes, so your bill is $| STREAM) + (DO ((L (EXPLODEN (*$ TIME 0.25)) (CDR L))) + ((= (CAR L) 46.) + (TYO 46. STREAM) + (TYO (OR (CADR L) 48.) STREAM) + (TYO (OR (CADDR L) 48.) STREAM)) + (TYO (CAR L) STREAM)) + (TERPRI STREAM) + (TYO 9. STREAM) + (PRINC '| - The Doctor's Secretary| STREAM) + (TERPRI STREAM) + (TERPRI STREAM) + (COND (OBSERVATION-LIST + (TERPRI STREAM) + (PRINC '|PS. The doctor also had some comments he +asked me to convey to you:/ +/ +| STREAM) + (DO ((O OBSERVATION-LIST (CDR O))) + ((NULL O)) + (PRINC (CAR O) STREAM) + (TERPRI STREAM)))))) + (QUIT)) + +(SETQ INIT-TIME (TIME)) + +(DEFUN WORKING-HOURS? () + (AND (MEMQ (STATUS DOW) '(MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY)) + (> (CAR (STATUS DAYTIME)) 8.) + (< (CAR (STATUS DAYTIME)) 20.))) + +(COND ((AND (WORKING-HOURS?) (NOT (WINNER))) + (TERPRI TYO) + (PRINC '|This is not the time of day to be playing games!|) + (TERPRI TYO) + (PRINC '|Please come back later. This game is unavailable|) + (TERPRI TYO) + (PRINC '|during the hours of 9am-8pm Monday-Friday.|) + (QUIT))) + + +(SETQ LISPT-JNAME '|DOX|) + +(SETQ BASE 10. IBASE 10. *NOPOINT T) + +(DEFUN MAP-PROP (X Y Z) + (MAPCAR (FUNCTION (LAMBDA (X) (PUTPROP X Y Z))) + X)) + +(DEFUN UNIX-EVAL (X) (COND ((ATOM X) + (COND ((BOUNDP X) (EVAL X)) + (T NIL))) + (T (EVAL X)))) + +(DEFUN WHILE FEXPR (X) + (COND ((UNIX-EVAL (CAR X)) NIL) + (T (MAPCAR 'UNIX-EVAL (CDR X)) + (APPLY 'WHILE X)))) + +(DEFUN CVTA (X) (ASCII X)) +(DEFUN CVTN (X) (CAR (EXPLODEN X))) +(DEFUN READCH () (ASCII (TYI))) +(DEFUN PEEKCH () (ASCII (TYIPEEK))) + +(DEFUN MEANING (X) (GET X 'MEANING)) +(DEFUN PUT-MEANING FEXPR (X) + (PUTPROP (CAR X) (UNIX-EVAL (CADR X)) 'MEANING)) + +(PUT-MEANING HOWDY 'HOWDY) +(PUT-MEANING HI 'HOWDY) +(PUT-MEANING GREETINGS 'HOWDY) +(PUT-MEANING HELLO 'HOWDY) +(PUT-MEANING PDP11 'MACH) +(PUT-MEANING COMPUTER 'MACH) +(PUT-MEANING UNIX 'MACH) +(PUT-MEANING MACHINE 'MACH) +(PUT-MEANING COMPUTERS 'MACH) +(PUT-MEANING MACHINES 'MACH) +(PUT-MEANING PDP11S 'MACH) +(PUT-MEANING FOO 'MACH) +(PUT-MEANING FOOBAR 'MACH) +(PUT-MEANING MULTICS 'MACH) +(PUT-MEANING MACSYMA 'MACH) +(PUT-MEANING TELETYPE 'MACH) +(PUT-MEANING LA36 'MACH) +(PUT-MEANING VT52 'MACH) +(PUT-MEANING ZORK 'MACH) +(PUT-MEANING TREK 'MACH) +(PUT-MEANING STARTREK 'MACH) +(PUT-MEANING ADVENT 'MACH) +(PUT-MEANING PDP 'MACH) +(PUT-MEANING DEC 'MACH) +(PUT-MEANING SHIT 'FOUL) +(PUT-MEANING BASTARD 'FOUL) +(PUT-MEANING DAMN 'FOUL) +(PUT-MEANING DAMNED 'FOUL) +(PUT-MEANING HELL 'FOUL) +(PUT-MEANING SUCK 'FOUL) +(PUT-MEANING SUCKING 'FOUL) +(PUT-MEANING SUX 'FOUL) +(PUT-MEANING ASS 'FOUL) +(PUT-MEANING WHORE 'FOUL) +(PUT-MEANING BITCH 'FOUL) +(PUT-MEANING ASSHOLE 'FOUL) +(PUT-MEANING SHRINK 'FOUL) +(PUT-MEANING POT 'TOKE) +(PUT-MEANING GRASS 'TOKE) +(PUT-MEANING WEED 'TOKE) +(PUT-MEANING MARIJUANA 'TOKE) +(PUT-MEANING ACAPULCO 'TOKE) +(PUT-MEANING COLUMBIAN 'TOKE) +(PUT-MEANING TOKIN 'TOKE) +(PUT-MEANING JOINT 'TOKE) +(PUT-MEANING TOKE 'TOKE) +(PUT-MEANING TOKING 'TOKE) +(PUT-MEANING TOKIN/' 'TOKE) +(PUT-MEANING PILLS 'DRUG) +(PUT-MEANING DOPE 'DRUG) +(PUT-MEANING ACID 'DRUG) +(PUT-MEANING LSD 'DRUG) +(PUT-MEANING SPEED 'DRUG) +(PUT-MEANING HEROINE 'DRUG) +(PUT-MEANING HASH 'DRUG) +(PUT-MEANING COCAINE 'DRUG) +(PUT-MEANING UPPERS 'DRUG) +(PUT-MEANING DOWNERS 'DRUG) +(PUT-MEANING LOVES 'LOVES) +(PUT-MEANING LOVE 'LOVE) +(PUT-MEANING HATES 'HATES) +(PUT-MEANING DISLIKES 'HATES) +(PUT-MEANING HATE 'HATE) +(PUT-MEANING DISLIKE 'HATE) +(PUT-MEANING STONED 'STATE) +(PUT-MEANING DRUNK 'STATE) +(PUT-MEANING DRUNKEN 'STATE) +(PUT-MEANING HIGH 'STATE) +(PUT-MEANING HORNY 'STATE) +(PUT-MEANING BLASTED 'STATE) +(PUT-MEANING HAPPY 'STATE) +(PUT-MEANING PARANOID 'STATE) +(PUT-MEANING WISH 'DESIRE) +(PUT-MEANING WANT 'DESIRE) +(PUT-MEANING DESIRE 'DESIRE) +(PUT-MEANING LIKE 'DESIRE) +(PUT-MEANING HOPE 'DESIRE) +(PUT-MEANING HOPES 'DESIRE) +(PUT-MEANING DESIRES 'DESIRE) +(PUT-MEANING WANTS 'DESIRE) +(PUT-MEANING DESIRES 'DESIRE) +(PUT-MEANING LIKES 'DESIRE) +(PUT-MEANING FRUSTRATED 'MOOD) +(PUT-MEANING DEPRESSED 'MOOD) +(PUT-MEANING ANNOYED 'MOOD) +(PUT-MEANING UPSET 'MOOD) +(PUT-MEANING UNHAPPY 'MOOD) +(PUT-MEANING EXCITED 'MOOD) +(PUT-MEANING WORRIED 'MOOD) +(PUT-MEANING LONELY 'MOOD) +(PUT-MEANING ANGRY 'MOOD) +(PUT-MEANING PISSED 'MOOD) +(PUT-MEANING JEALOUS 'MOOD) +(PUT-MEANING AFRAID 'FEAR) +(PUT-MEANING FEAR 'FEAR) +(PUT-MEANING SCARED 'FEAR) +(PUT-MEANING VIRGINITY 'SEXNOUN) +(PUT-MEANING COCK 'SEXNOUN) +(PUT-MEANING CUNT 'SEXNOUN) +(PUT-MEANING PROSTITUTE 'SEXNOUN) +(PUT-MEANING CONDOM 'SEXNOUN) +(PUT-MEANING SEX 'SEXNOUN) +(PUT-MEANING RAPES 'SEXNOUN) +(PUT-MEANING WIFE 'FAMILY) +(PUT-MEANING BROTHER 'FAMILY) +(PUT-MEANING SISTER 'FAMILY) +(PUT-MEANING FATHER 'FAMILY) +(PUT-MEANING MOTHER 'FAMILY) +(PUT-MEANING HUSBAND 'FAMILY) +(PUT-MEANING SIBLINGS 'FAMILY) +(PUT-MEANING GRANDMOTHER 'FAMILY) +(PUT-MEANING GRANDFATHER 'FAMILY) +(PUT-MEANING MATERNAL 'FAMILY) +(PUT-MEANING PATERNAL 'FAMILY) +(PUT-MEANING STAB 'DEATH) +(PUT-MEANING MURDER 'DEATH) +(PUT-MEANING MURDERS 'DEATH) +(PUT-MEANING SUICIDE 'DEATH) +(PUT-MEANING SUICIDES 'DEATH) +(PUT-MEANING KILL 'DEATH) +(PUT-MEANING KILLS 'DEATH) +(PUT-MEANING DIE 'DEATH) +(PUT-MEANING DIES 'DEATH) +(PUT-MEANING DEATH 'DEATH) +(PUT-MEANING DEATHS 'DEATH) +(PUT-MEANING PAIN 'SYMPTOMS) +(PUT-MEANING ACHE 'SYMPTOMS) +(PUT-MEANING FEVER 'SYMPTOMS) +(PUT-MEANING SORE 'SYMTOMS) +(PUT-MEANING ACHING 'SYMPTOMS) +(PUT-MEANING STOMACHACHE 'SYMPTOMS) +(PUT-MEANING HEADACHE 'SYMPTOMS) +(PUT-MEANING HURTS 'SYMPTOMS) +(PUT-MEANING DISEASE 'SYMPTOMS) +(PUT-MEANING VIRUS 'SYMPTOMS) +(PUT-MEANING VOMIT 'SYMPTOMS) +(PUT-MEANING VOMITING 'SYMPTOMS) +(PUT-MEANING BARF 'SYMPTOMS) +(PUT-MEANING TOOTHACHE 'SYMPTOMS) +(PUT-MEANING HURT 'SYMPTOMS) +(PUT-MEANING RUM 'ALCOHOL) +(PUT-MEANING GIN 'ALCOHOL) +(PUT-MEANING VODKA 'ALCOHOL) +(PUT-MEANING ALCOHOL 'ALCOHOL) +(PUT-MEANING BOURBON 'ALCOHOL) +(PUT-MEANING BEER 'ALCOHOL) +(PUT-MEANING WINE 'ALCOHOL) +(PUT-MEANING WHISKEY 'ALCOHOL) +(PUT-MEANING SCOTCH 'ALCOHOL) +(PUT-MEANING FUCK 'SEXVERB) +(PUT-MEANING SCREW 'SEXVERB) +(PUT-MEANING SCREWING 'SEXVERB) +(PUT-MEANING FUCKING 'SEXVERB) +(PUT-MEANING RAPE 'SEXVERB) +(PUT-MEANING KISS 'SEXVERB) +(PUT-MEANING KISSING 'SEXVERB) +(PUT-MEANING KISSES 'SEXVERB) +(PUT-MEANING SCREWS 'SEXVERB) +(PUT-MEANING FUCKS 'SEXVERB) +(PUT-MEANING BECAUSE 'CONJ) +(PUT-MEANING BUT 'CONJ) +(PUT-MEANING HOWEVER 'CONJ) +(PUT-MEANING BESIDES 'CONJ) +(PUT-MEANING ANYWAY 'CONJ) +(PUT-MEANING THAT 'CONJ) +(PUT-MEANING EXCEPT 'CONJ) +(PUT-MEANING WHY 'CONJ) +(PUT-MEANING HOW 'CONJ) +(PUT-MEANING UNTIL 'WHEN) +(PUT-MEANING WHEN 'WHEN) +(PUT-MEANING WHILE 'WHEN) +(PUT-MEANING SINCE 'WHEN) + +(DEFUN KAR(X) (COND ((ATOM X) X) + (T (CAR X)))) +(DEFUN KDR (X) (COND ((ATOM X) NIL) + (T (CDR X)))) +(DEFUN CADR (X) (KAR (KDR X))) +(DEFUN CDDR (X) (KDR (KDR X))) + +(DECLARE (SPECIAL TYPOS)) + +(SETQ TYPOS ()) + +(DEFUN TYPOS: FEXPR (X) (SETQ TYPOS (MAPCAR 'TYPOS-AUX X))) + +(DEFUN TYPOS-AUX (X) + (PUTPROP (CAR X) (CADR X) 'CORRECTION) + (PUTPROP (CADR X) (CADDR X) 'EXPANSION) + (CAR X)) + +(DEFUN TYPOP (X) (MEMQ X TYPOS)) + +(DEFUN CORRECTION (X) (GET X 'CORRECTION)) + +(DEFUN EXPANSION (X) (GET X 'EXPANSION)) + +(TYPOS: (THEYLL THEY/'LL (THEY WILL)) + (THEYRE THEY/'RE (THEY ARE)) + (IM I/'M (YOU ARE)) + (I7M I/'M (YOU ARE)) + (ISA |IS A| (IS A)) + (THIER THEIR (THEIR)) + (DONT DON/'T (DO NOT)) + (DON7T DON/'T (DO NOT)) + (YOU7RE YOU/'RE (I AM)) + (YOU7VE YOU/'VE (I HAVE)) + (YOU7LL YOU/'LL (I WILL))) + +(DEFUN WARN-TYPOS (X) + (CURSORPOS 'A TYO) + (PRINC '|WATCH YOUR SPELLING! YOU MIS-SPELLED | TYO) + (/"PRINC (CAR X)) + (MAP (FUNCTION + (LAMBDA (X) + (COND ((NULL (CDR X)) (PRINC '|, AND |)) + (T (PRINC '|, |))) + (COND ((> (CHARPOS TYO) 60.) (TERPRI TYO))) + (/"PRINC (CAR X)))) + (CDR X)) + (PRINC '/. TYO)) + +(DEFUN /"PRINC (X) (TYO 34. TYO) (PRINC X TYO) (TYO 34. TYO)) + +(DEFUN CORRECT-SPELLING (X) + (DO ((X X (CDR X)) + (L ()) + (TEMP) + (TYPO-LIST) + (CORREX-FLAG ())) + ((NULL X) + (COND (CORREX-FLAG (WARN-TYPOS TYPO-LIST))) + (MAPCAN (FUNCTION (LAMBDA (X) (COND ((ATOM X) (NCONS X)) (T X)))) + (NREVERSE L))) + (COND ((SETQ TEMP (TYPOP (CAR X))) + (SETQ CORREX-FLAG T) + (LET ((C (CORRECTION (CAR X)))) + (PUSH (EXPANSION C) L) + (PUSH C TYPO-LIST))) + (T + (PUSH (CAR X) L))))) + +(DEFUN SHORTEN (SENT) + (PROG (FOO TEMP) + (SETQ TEMP '(NIL BECAUSE BUT HOWEVER BESIDES ANYWAY UNTIL + WHILE THAT EXCEPT WHY HOW)) + RECHK + (SETQ TEMP (KDR TEMP)) + (COND ((NULL TEMP) + (RETURN NIL))) + (SETQ FOO (MEMQ (KAR TEMP) SENT)) + (COND ((NOT FOO)(GO RECHK)) + ((LESSP (LENGTH FOO) 4) + (GO RECHK))) + (SETQ SENT FOO) + (FIXUP) + (RETURN T) )) + +(DEFUN DEFINE (SENT FOUND) + (PROG () + (SVO SENT FOUND 1 NIL) + (COND + ((NOT (NOUNP SUBJ)) + (RETURN NIL)) + ((PRONOUNP SUBJ) + (RETURN NIL)) + ((NULL SUBJ) + (RETURN NIL)) + ((NULL (MEANING OBJECT)) + (RETURN NIL))) + (PUTPROP SUBJ (MEANING OBJECT) 'MEANING) + (RETURN T))) + +(DEFUN DEFQ (SENT) + (PROG (TEMP) + (SETQ TEMP '(MEANS APPLIES MEAN REFERS REFER RELATED + SIMILAR DEFINED ASSOCIATED LINKED LIKE SAME)) + FOO (COND ((MEMQ (KAR TEMP) SENT) + (PROGN + (SETQ FOUND (KAR TEMP)) + (RETURN T))) + ((NULL (KDR TEMP)) + (RETURN NIL))) + (SETQ TEMP (KDR TEMP)) (GO FOO))) + +(DEFUN DEF (X) + (PROGN + (TYPE (LIST 'THE 'WORD X 'MEANS (MEANING X) 'TO 'ME)) + NIL)) + +(DEFUN FORGET () (PROG (TEMP) + (SETQ TEMP HISTORY) + (SETQ HISTORY NIL) +LOOP (COND ((NULL (KDR TEMP))(RETURN NIL))) + (SETQ HISTORY (CONS (KAR TEMP) HISTORY)) + (SETQ TEMP (KDR TEMP)) + (GO LOOP))) + +(DEFUN QUERY (X) + (PROG (A) + TOP (TXTYPE (ASSM (LIST X 'WHAT?))) + (SETQ A (TXREAD)) + LOOP (COND ((NULL A) + (GO TOP))) + (COND ((NOUNP (KAR A)) (RETURN (KAR A)))) + (COND ((VERBP (KAR A)) (RETURN (BUILD (BUILD X '/ ) (KAR A))))) + (SETQ A (KDR A)) + (GO LOOP))) + +(DEFUN SUBJSEARCH (SENT KEY TYPE) + (PROG (FOO) + (SETQ FOO (- (INDEX SENT KEY) TYPE)) + (WHILE (NOT (GREATERP FOO 0)) + (SETQ SUBJ (PART SENT FOO)) + (COND ((NOUNP SUBJ) (RETURN T))) + (SETQ FOO (SUB1 FOO))) + (SETQ SUBJ 'YOU) (RETURN NIL) )) + +(DEFUN NOUNP (X) + (OR (PRONOUNP X) + (NOT (OR (VERBP X) (EQUAL X 'NOT) (PREPP X) (MODIFIERP X) )) )) + +(DEFUN PRONOUNP (X) (MEMQ X '(I ME YOU HE HIM SHE HER IT WE US THEY THEM + THAT THOSE THIS THESE MYSELF YOURSELF HIMSELF HERSELF THINGS THING + ANYTHING SOMETHING EVERYTHING) )) + +(MAP-PROP '(AM IS ARE WAS WERE HAS HAVE HAD DO DID + FIND TAKE GET HIT MOVE HIT HURT KILL EAT DRINK LAY OUGHT + DOES SHALL SHOULD WILL WOULD CAN COULD MAY MIGHT MUST BE + BEEN BEING GOING GOES WENT GO GONE REFER MEAN MEANS REFERS + ASSOCIATED APPLIES RELATED LINKED USE USING USED DEFINED USES + FEEL FEELS FELT THINK THINKS THOUGHT HATES DISLIKES + HATE DISLIKE LOVE LOVES LIKES WISH WANT DESIRE LIKE + RAPE KISS KISSING KISSES SCREWS FUCKS + HOPE DESIRES WANTS DESIRES FUCK SCREW SCREWING FUCKING) + 'VERB + 'SENTENCE-TYPE) + +(DEFUN VERBP (X) (EQ (GET X 'SENTENCE-TYPE) 'VERB)) + +(DEFUN PLURAL (X) + (PROG (FOO) + (SETQ FOO (EXPLODE X)) + (RETURN + (COND ((NOT (EQUAL (PART FOO (LENGTH FOO)) 'S)) + (BUILD X 'S)) + (T X))))) + +(SETQ INTER + '((WELL/,) + (|HMMM... SO,|) + (SO) + (|...AND|) + (THEN))) + +(SETQ CONTINUE + '((CONTINUE) + (PROCEED) + (GO ON) + (KEEP GOING) )) + +(SETQ RELATION + '((YOUR RELATIONSHIP WITH) + (SOMETHING YOU REMEMBER ABOUT) + (YOUR FEELINGS TOWARD) + (SOME EXPERIENCES YOU HAVE HAD WITH) + (HOW YOU FEEL ABOUT))) + +(DEFUN SETPREP (SENT KEY) + (PROG (FOO) + (SETQ FOO (MEMQ KEY SENT)) + (COND ((PREPP (CADR FOO))(GETNOUN (CDDR FOO))) + (T 'SOMETHING)) )) + +(DEFUN GETNOUN (X) + (COND ((NULL X)(SETQ OBJECT 'SOMETHING)) + ((ATOM X)(SETQ OBJECT X)) + ((EQ (LENGTH X) 1) + (SETQ OBJECT (COND + ((NOUNP (SETQ OBJECT (KAR X))) OBJECT) + (T (QUERY OBJECT))))) + ((EQ (KAR X) 'TO) + (BUILD 'TO/ (GETNOUN (KDR X)))) + ((PREPP (KAR X)) + (GETNOUN (KDR X))) + ((NOT (NOUNP (KAR X))) + (BUILD (BUILD (KAR (REPLACE (LIST (KAR X)) + '(A (THIS) + SOME (THIS) + ONE (THAT)))) + SPACE) + (GETNOUN (KDR X)))) + (T (SETQ OBJECT (KAR X))) )) + +(DEFUN MODIFIERP (X) + (MEMQ X '(THE A AN EVERY SOME ONE VERY OFTEN MY MUCH + LINKED YOUR HIS HER THEIR OUR ANY MANY RELATED + ALL SIMILAR SIMILAR ALWAYS ASSOCIATED GOOD BAD + UGLY PRETY BIG SMALL TOO REALLY MORE LESS ALSO))) + +(DEFUN PREPP (X) + (MEMQ X '(OF IN ON WITH FROM FOR TO AT SAME AS LIKE ABOUT + BY BESIDE AROUND UNDER ABOVE THROUGH BENEATH + BEHIND OVER ))) + +(DEFUN REMEMBER (THING) + (COND ((NULL HISTORY) + (SETQ HISTORY (LIST THING))) + (T (SETQ HISTORY (APPEND HISTORY (LIST THING)))))) + +(SETQ FEARS '( (($ WHYSAY) YOU ARE ($ AFRAIDOF) (// FOUND)(// QMARK)) + (YOU SEEM TERRIFIED BY (// FOUND)(// PERIOD)) + (WHEN DID YOU FIRST FEEL ($ AFRAIDOF)(// FOUND)(// QMARK)) )) + +(SETQ SURE '((SURE)(POSITIVE)(CERTAIN))) + +(SETQ AFRAIDOF '( (AFRAID OF) (FRIGHTENED BY) (SCARED OF) )) + +(SETQ AREYOU '( (ARE YOU)(HAVE YOU BEEN)(HAVE YOU BEEN) )) + +(SETQ ISRELATED '( (HAS SOMETHING TO DO WITH)(IS RELATED TO) + (COULD BE THE REASON FOR) )) + +(SETQ ARERELATED '((HAVE SOMETHING TO DO WITH)(ARE RELATED TO) + (COULD HAVE CAUSED)(COULD BE THE REASON FOR) )) + +(SETQ MOODS '( (($ AREYOU)(// FOUND) OFTEN?) + (WHAT CAUSES YOU TO BE (// FOUND)(// QMARK)) + (($ WHYSAY) YOU ARE (// FOUND)(// QMARK)) )) + +(SETQ MAYBE + '((MAYBE) + (PERHAPS) + (POSSIBLY))) + +(DEFUN TYPE (X)(TXTYPE (ASSM X))) + +(DEFUN FIXUP () + (SETQ SENT (RPLACD + (REPLACE (LIST (KAR SENT)) + '(ME (I) + HIM (HE) + HER (SHE) + THEM (THEY) + OKAY (/) + WELL (/) + SIGH (/) + HMM (/) + HMMM (/) + HMMMM (/) + HMMMMM (/) + GEE (/) + SURE (/) + GREAT (/) + OH (/) + FINE (/) + OK (/) + NO (/))) + (KDR SENT)))) + +(SETQ WHATWHEN + '((WHAT HAPPENED WHEN) + (WHAT WOULD HAPPEN IF))) + +(SETQ HELLO + '((HOW DO YOU DO?) (HELLO/.) (HOWDY!) (HELLO/.) (HI/.))) + +(SETQ DRNK + '((DO YOU DRINK A LOT OF (// FOUND)(// QMARK)) + (DO YOU GET DRUNK OFTEN?) + (($ DESCRIBE) YOUR DRINKING HABITS/.) )) + +(SETQ DRUGS '( (DO YOU USE (// FOUND) OFTEN?)(($ AREYOU) + ADDICTED TO (// FOUND)(// QMARK))(DO YOU REALIZE THAT DRUGS CAN + BE VERY HARMFUL?)(($ MAYBE) YOU SHOULD TRY TO QUIT USING (// FOUND) + (// PERIOD)) )) + +(SETQ WHYWANT '( (($ WHYSAY) (// SUBJ) MIGHT ($ WANT) (// OBJ)(// QMARK)) + (WHEN DID (// SUBJ) FIRST ($ WANT) (// OBJ)(// QMARK)) + (HAVE YOU EVER GOTTEN (// OBJ)(// QMARK)) )) + +(SETQ WANT '( (WANT) (DESIRE) (WISH) (WANT) (HOPE) )) + +(SETQ SHORTLST + '((CAN YOU ELABORATE ON THAT?) + (($ PLEASE) CONTINUE/.) + (GO ON/, DON/'T BE AFRAID/.) + (YOU/'RE BEING A BIT BRIEF/, ($ PLEASE) GO INTO DETAIL/.) + (CAN YOU BE MORE EXPLICIT?) + (($ PLEASE) YOU GO INTO MORE DETAIL?) + (YOU AREN/'T BEING VERY TALKATIVE TODAY!) + (WHY MUST YOU RESPOND SO BRIEFLY?))) + + +(SETQ FAMLST + '((TELL ME ($ SOMETHING) ABOUT (// OWNER) FAMILY (// PERIOD)) + (YOU SEEM TO DWELL ON (// OWNER) FAMILY (// PERIOD)) + (($ AREYOU) HUNG UP ON (// OWNER) FAMILY?))) + +(SETQ HUHLST + '((($ WHYSAY)(// SENT)(// QMARK)) + (IS IT BECAUSE OF ($ THINGS) THAT YOU SAY (// SENT)(// QMARK)) )) + +(SETQ FEELINGS-ABOUT + '((FEELINGS ABOUT) + (APREHENSIONS TOWARD) + (THOUGHTS ON) + (EMOTIONS TOWARD))) + +(SETQ RANDOM-ADJECTIVE + '((VIVID) + (EMOTIONALLY STIMULATING) + (RECENT) + (UNUSUAL) + (SHOCKING) + (EMBARRASSING))) + +(SETQ WHYSAY + '((WHY DO YOU SAY) + (WHAT MAKES YOU BELIEVE) + (ARE YOU SURE THAT) + (WHAT MAKES YOU THINK) )) + +(SETQ ISEE + '((I SEE /././.) + (YES/,) + (I UNDERSTAND/.) + (OH/.) )) + +(SETQ PLEASE + '((PLEASE/,) + (I WOULD APPRECIATE IT IF YOU WOULD) + (PERHAPS YOU COULD) + (PLEASE/,) + (WOULD YOU PLEASE) + (COULD YOU))) + +(SETQ SOMETHING + '((SOMETHING) + (MORE) + (HOW YOU FEEL))) + +(SETQ THINGS + '((HANGUPS YOU HAVE) + (YOUR INHIBITIONS) + (SOME PROBLEMS IN YOUR CHILDHOOD) + (THE PEOPLE YOU HANG AROUND WITH) + (PROBLEMS AT SCHOOL) + (YOUR SEX LIFE) + (YOUR HANGUPS) + (SOME PROBLEMS AT HOME))) + +(SETQ DESCRIBE + '((DESCRIBE) + (TELL ME ABOUT) + (DISCUSS) + (ELABORATE ON))) + +(SETQ IBELIEVE + '((I BELIEVE) (I THINK) (I HAVE A FEELING) (IT SEEMS TO ME THAT))) + +(SETQ PROBLEMS '( (PROBLEMS) + (INHIBITIONS) + (HANGUPS) + (ANXIETIES) + (FRUSTRATIONS) )) + +(SETQ BOTHER + '((DOES IT BOTHER YOU THAT) + (ARE YOU ANNOYED THAT) + (DID YOU EVER REGRET) + (ARE YOU SATISFIED WITH THE FACT THAT))) + +(SETQ MACHLST + '((YOU HAVE YOUR MIND ON (// FOUND)(// COMMA) IT SEEMS/.) + (YOU SHOULD TRY TAKING YOUR MIND OFF OF (// FOUND)(// PERIOD)) + (ARE YOU A COMPUTER HACKER?))) + +(SETQ QLIST + '((I/'LL ASK THE QUESTIONS/, IF YOU DON/'T MIND!) + (($ PLEASE) ALLOW ME TO DO THE QUESTIONING/.) + (($ PLEASE) TRY TO ANSWER THAT QUESTION YOURSELF/.))) + +(SETQ ELIST + '((($ PLEASE) TRY TO CALM YOURSELF/.) + (YOU SEEM VERY EXCITED/. RELAX/. ($ PLEASE) ($ DESCRIBE) ($ THINGS)) + (YOU/'RE BEING VERY EMOTIONAL/. CALM DOWN/.))) + +(SETQ FOULLST + '((($ PLEASE) WATCH YOUR TONGUE!) + (($ PLEASE) AVOID SUCH UNWHOLESOME THOUGHTS) + (SUCH LEWDNESS IS NOT APPRECIATED/.))) + +(SETQ DEATHLST + '((THIS IS NOT A HEALTHY WAY OF THINKING/.) + (($ BOTHER) YOU/, TOO/, MAY DIE SOMEDAY?) + (I AM WORRIED BY YOUR OBSSESSION WITH THIS TOPIC!) + (DID YOU WATCH A LOT OF CRIME AND VIOLENCE ON TELEVISION AS A CHILD?)) +) + +(SETQ SEXLST + '((($ AREYOU) ($ AFRAIDOF) SEX?) + (($ DESCRIBE)($ SOMETHING) ABOUT YOUR SEXUAL HISTORY/.) + (($ PLEASE)($ DESCRIBE) YOUR SEX LIFE/././.) + (($ DESCRIBE) YOUR ($ FEELINGS-ABOUT) YOUR SEXUAL PARTNER/.) + (($ DESCRIBE) YOUR MOST ($ RANDOM-ADJECTIVE) SEXUAL EXPERIENCE/.) + (($ AREYOU) SATISFIED WITH (// LOVER) /././.?))) + +(SETQ NEGLST + '((WHY NOT?) + (($ BOTHER) I ASK THAT?) + (WHY NOT?) + (WHY NOT?) + (HOW COME?) + (($ BOTHER) I ASK THAT?))) + +(SETQ BECLST '( + (IS IT BECAUSE (// SENT) THAT YOU CAME TO ME?) + (($ BOTHER)(// SENT)(// QMARK)) + (WHEN DID YOU FIRST KNOW THAT (// SENT)(// QMARK)) + (IS THE FACT THAT (// SENT) THE REAL REASON?) + (DOES THE FACT THAT (// SENT) EXPLAIN ANYTHING ELSE?) + (($ AREYOU)($ SURE)(// SENT)(// QMARK) ) )) + +(SETQ SHORTBECLST '( + (($ BOTHER) I ASK YOU THAT?) + (THAT/'S NOT MUCH OF AN ANSWER!) + (($ INTER) WHY WON/'T YOU TALK ABOUT IT?) + (SPEAK UP!) + (($ AREYOU) ($ AFRAIDOF) TALKING ABOUT IT?) + (DON/'T BE ($ AFRAIDOF) ELABORATING/.) + (($ PLEASE) GO INTO MORE DETAIL/.))) + +(SETQ THLST '( + (($ MAYBE)($ THINGS)($ ARERELATED) THIS/.) + (IS IT BECAUSE OF ($ THINGS) THAT YOU ARE GOING THRU ALL THIS?) + (HOW DO YOU RECONCILE ($ THINGS)(// QMARK) ) + (($ MAYBE) THIS ($ ISRELATED)($ THINGS)(// QMARK)) )) + +(SETQ REMLST '( (EARLIER YOU SAID ($ HISTORY)(// QMARK)) + (YOU MENTIONED THAT ($ HISTORY)(// QMARK)) + (($ WHYSAY)($ HISTORY)(// QMARK) ) )) + +(SETQ TOKLST + '((IS THIS HOW YOU RELAX?) + (HOW LONG HAVE YOU BEEN SMOKING GRASS?) + (($ AREYOU) ($ AFRAIDOF) OF BEING DRAWN TO USING HARDER STUFF?))) + +(SETQ STATES + '((DO YOU GET (// FOUND) OFTEN?) + (DO YOU ENJOY BEING (// FOUND)(// QMARK)) + (HOW OFTEN ($ AREYOU)(// FOUND)) + (WHEN WERE YOU LAST (// FOUND)(// QMARK)))) + +(SETQ REPLIST + '(I (YOU) + MY (YOUR) + ME (YOU) + YOU (ME) + YOUR (MY) + MINE (YOURS) + YOURS (MINE) + OUR (YOUR) + OURS (YOURS) + WE (YOU) + DUNNO (DO NOT KNOW) + YES (/) + NO/, (/) + YES/, (/) + YA (I) + WANNA (WANT TO) + GOTTA (HAVE TO) + GONNA (GOING TO) + NEVER (DOES NOT EVER) + DOESN/'T (DOES NOT) + DON/'T (DO NOT) + AREN/'T (ARE NOT) + ISN/'T (IS NOT) + WON/'T (WILL NOT) + CAN/'T (CANNOT) + HAVEN/'T (HAVE NOT) + I/'M (YOU ARE) + OURSELVES (YOURSELVES) + MYSELF (YOURSELF) + YOURSELF (MYSELF) + YOU/'RE (I AM) + YOU/'VE (I HAVE) + I/'VE (YOU HAVE) + I/'LL (YOU WILL) + YOU/'LL (I SHALL) + I/'D (YOU WOULD) + YOU/'D (I WOULD) + HERE (THERE) + PLEASE (/) + OH/, (/) + OH (/) + SHOULDN/'T (SHOULD NOT) + WOULDN/'T (WOULD NOT) + WON/'T (WILL NOT) + HASN/'T (HAS NOT))) + +(DEFUN REPLACE (SENT RLIST) + (PROG (TEMP FOO) + AGAIN + (COND ((NULL SENT)(RETURN TEMP))) + (SETQ FOO (MEMQ (KAR SENT) RLIST)) + (SETQ FOO (COND (FOO (CADR FOO)) + (T (LIST (KAR SENT))))) + (SETQ TEMP (CONCAT TEMP FOO)) + (SETQ SENT (KDR SENT)) + (GO AGAIN))) + +(SETQ EOF -1.) + +(DEFUN FILEINPUTCHECK () + (AND + (ERRSET (IOTA ((STREAM (LIST '(DSK KMP) (STATUS UNAME) 'DOX))) + (DO ((C (TYI STREAM EOF) (TYI STREAM EOF)) + (L ())) + ((= C EOF) + (SETQ FILEINPUT (IMPLODE (NREVERSE L))) + (DELETEF STREAM)) + (COND ((NOT (OR (= C 3.) (= C 0.) (= C 12.))) + (PUSH C L))))) + NIL) + 'FILETYPEOUT)) + +(DEFUN WHEREGO (SENT) + (COND ((NULL SENT)(OR (FILEINPUTCHECK) ($ WHEREOUTP))) + ((NULL (MEANING (KAR SENT))) + (WHEREGO (KDR SENT))) + (T (PROGN (SETQ FOUND (KAR SENT)) + (MEANING (KAR SENT)))))) + +(DEFUN PART (LST NUM) + (COND ((ATOM LST) LST) + ((GREATERP NUM (LENGTH LST)) NIL) + ((LESSP NUM 2)(KAR LST)) + (T (PART (KDR LST)(SUB1 NUM))))) + +(DEFUN INDEX (LST ELEM) + (COND ((NOT (MEMQ ELEM LST)) 0) + (T (+ (- (LENGTH LST) + (LENGTH (MEMQ ELEM LST))) + 1)))) + +(DEFUN SVO (SENT KEY TYPE MEM) + (PROG (FOO) + (SETQ FOO (MEMQ (PART SENT (- (INDEX SENT KEY) TYPE)) SENT)) + (SETQ MEM (AND (SUBJSEARCH SENT KEY TYPE) MEM)) + V (SETQ FOO (KDR FOO)) + (COND ((VERBP (KAR FOO))(SETQ VERB (KAR FOO))) + ((NULL (KDR FOO))(SETQ VERB (KAR FOO))) + (T (GO V)) ) + (SETQ OBJ (GETNOUN (KDR FOO))) + (COND ((EQUAL OBJECT 'I)(SETQ OBJECT 'ME)) + ((EQUAL SUBJ 'ME)(SETQ SUBJ 'I))) + (COND (MEM (REMEMBER (LIST SUBJ VERB OBJ)))) )) + +(DEFUN POSSESS (SENT KEY) + (PROG (COUNT) + (SETQ COUNT (INDEX SENT KEY)) + (COND ((EQUAL COUNT 1)(SETQ OWNER 'YOUR)) + (T (PROG (TEMP)(SETQ OWNER (PART SENT (SUB1 COUNT))) + (SETQ TEMP (EXPLODE OWNER)) + (COND ((AND (NOT + (EQUAL 'S (PART TEMP + (LENGTH TEMP)))) + (NOT (EQUAL OWNER 'MY)) + (NOT (EQUAL OWNER 'HER)) + (NOT (EQUAL OWNER 'THEIR))) + (SETQ OWNER 'YOUR)))))))) + +(SETQ LINEL (LINEL TYO)) + +(DEFUN TXTYPE(A) + (TERPRI) + (WHILE (NOT A) + (COND ((> (+ (FLATC (KAR A)) (CHARPOS T) -2.) LINEL) + (TERPRI))) + (PRINC (KAR A)) + (PRINC SPACE) + (SETQ A (CDR A))) + (TERPRI)) + +(DEFUN LIST1 (X)(COND ((ATOM X)(COND ((NULL X) NIL)(T (LIST X))))(T X))) + +(DEFUN BUILD (STR1 STR2) + (COND ((NULL STR1) STR2)((NULL STR2) STR1) + ((AND (ATOM STR1) + (ATOM STR2)) + (IMPLODE (CONCAT (EXPLODEC STR1)(EXPLODEC STR2)))) + (T NIL))) + +(DEFUN CONCAT (X Y) + (COND ((NULL X)(COND ((NULL Y) NIL)(T (LIST1 Y)))) + ((NULL Y)(LIST1 X)) + ((ATOM X)(COND ((ATOM Y)(LIST1 X Y))(T (APPEND (LIST1 X) Y)))) + ((ATOM Y)(APPEND X (LIST1 Y))) + (T (APPEND X Y)))) + + +(DEFUN ASSM(PROTO) + (COND ((NULL PROTO) NIL) + ((ATOM (KAR PROTO)) + (CONS (KAR PROTO) (ASSM (KDR PROTO)))) + (T (CONCAT (UNIX-EVAL (KAR PROTO))(ASSM (KDR PROTO)))))) + +(DEFUN // (X) X) + +(SETQ HOWDYFLAG NIL) + +(DEFUN DOC nargs + (SETQ OBSERVATION-LIST ()) + (COND ((ATOM (ERRSET + (PROG (LINCOUNT REPETITIVE-SHORTNESS **MAD**) + (SETQ REPETITIVE-SHORTNESS (CONS 0. 0.)) + (TTY-OFF) + (SETQ LINCOUNT 0.) + (COND ((zerop nargs) + (TYPE '(I AM THE PSYCHIATRIST/. ($ PLEASE) + ($ DESCRIBE) YOUR ($ PROBLEMS)(// PERIOD))) )) + (SETQ LOVER '(YOUR PARTNER)) + (SETQ SUBJ NIL VERB NIL OBJ NIL OBJECT NIL HISTORY NIL + FOUND NIL SENT NIL OWNER NIL) +TOP (SETQ LINCOUNT (1+ LINCOUNT)) + (SETQ BAK SENT) + (SETQ SENT (TXREAD)) + (COND + ((EQUAL SENT '(FOO)) + (TYPE '(BAR! ($ PLEASE)($ CONTINUE))) + (GO TOP)) + ((OR (MEMBER SENT '((GOOD BYE) (SEE YOU LATER) (I QUIT) (SO LONG) + (GO AWAY) (GET LOST))) + (MEMQ (KAR SENT) + '(BYE HALT BREAK QUIT DONE EXIT GOODBYE + BYE/, STOP PAUSE GOODBYE/, STOP PAUSE))) + (TTY-ON) + (RETURN 'GOOD-BYE)) + ((EQUAL (KAR SENT) 'WHATMEANS) (PROGN (DEF (CADR SENT))(GO TOP))) + ((EQUAL SENT '(PARSE)) (PROGN + (TYPE (LIST 'SUBJ '= SUBJ COMMA SPACE SPACE + 'VERB '= VERB NEWLINE + 'OBJECT 'PHRASE '= OBJ + COMMA + 'NOUN 'FORM '= OBJECT NEWLINE + 'CURRENT 'KEYWORD 'IS FOUND + COMMA SPACE + 'MOST 'RECENT 'POSSESSIVE + 'IS OWNER NEWLINE + 'SENTENCE 'USED 'WAS + '/././. + '(// BAK)))(GO TOP))) + ((EQUAL (KAR SENT) 'FORGET) (PROGN (SET (CADR SENT) NIL) + (TYPE '(($ ISEE)($ PLEASE) + ($ CONTINUE)(// PERIOD) )) + (GO TOP))) + ((DEFQ SENT) (DEFINE SENT FOUND))) + (COND ((GREATERP (LENGTH SENT) 12)(SHORTEN SENT))) + (COND ((EQUAL SENT '(DDT))(VALRET '|:YOU CAN TALK TO DDT:VK |) + (TYPE '(($ PLEASE)($ CONTINUE) DISCUSSING YOUR ($ PROBLEMS)))(GO TOP)) +) + (SETQ SENT (CORRECT-SPELLING (REPLACE SENT REPLIST))) + (COND ((AND (NOT (MEMQ 'ME SENT))(NOT (MEMQ 'I SENT)) + (MEMQ 'AM SENT))(SETQ SENT (REPLACE SENT '(AM (ARE)))))) + (COND ((LESSP (LENGTH SENT) 2) + (COND ((EQ (MEANING (CAR SENT)) 'HOWDY) + (GO HOWDY))) + (GO SHORT))) + (COND ((MEMQ 'AM SENT)(SETQ SENT (REPLACE SENT '(ME (I)))))) + (FIXUP) + (COND ((AND (EQ (CAR SENT) 'DO) (EQ (CADR SENT) 'NOT)) + (COND ((ZEROP (RANDOM 3.)) + (TYPE '(ARE YOU ($ AFRAIDOF) THAT?)) + (GO TOP)) + ((ZEROP (RANDOM 2.)) + (TYPE '(DON/'T TELL ME WHAT TO DO/. I AM THE + PSYSCHIATRIST HERE!)) + (GO RTHING)) + (T + (TYPE '(($ WHYSAY) THAT I SHOULDN/'T (CDDR SENT) + (// QMARK))) + (GO TOP))))) +GOTOIT (GO (WHEREGO SENT)) +DESIRE1 + (GO ($ WHEREOUTP)) +FILETYPEOUT + (CURSORPOS 'A) + (PRINC FILEINPUT) + (CURSORPOS 'A) + (GO TOP) +HUH (TYPE ($ HUHLST)) + (GO TOP) +RTHING (TYPE ($ THLST)) + (GO TOP) +REMEM (COND ((NULL HISTORY)(GO HUH)) ) + (TYPE ($ REMLST)) + (GO TOP) +HOWDY (COND ((NOT HOWDYFLAG) + (TYPE '(($ HELLO) WHAT BRINGS YOU TO SEE ME?)) + (SETQ HOWDYFLAG T)) + (T + (TYPE '(($ IBELIEVE) WE/'VE INTRODUCED OURSELVES ALREADY/.)) + (TYPE '(($ PLEASE) ($ DESCRIBE) ($ THINGS) (// PERIOD))))) + (GO TOP) +WHEN (COND ((LESSP (LENGTH (MEMQ FOUND SENT)) 3)(GO SHORT)) ) + (SETQ SENT (KDR (MEMQ FOUND SENT))) + (FIXUP) + (TYPE '(($ WHATWHEN)(// SENT)(// QMARK))) + (GO TOP) +CONJ (COND ((LESSP (LENGTH (MEMQ FOUND SENT)) 4)(GO SHORT)) ) + (SETQ SENT (KDR (MEMQ FOUND SENT))) + (FIXUP) + (COND ((EQUAL (KAR SENT) 'OF) + (TYPE '(ARE YOU ($ SURE) THAT IS THE REAL REASON?)) + (SETQ THINGS (CONS (KDR SENT) THINGS)) + (GO TOP) )) + (REMEMBER SENT) + (TYPE ($ BECLST)) + (GO TOP) +SHORT (COND ((= (CAR REPETITIVE-SHORTNESS) (1- LINCOUNT)) + (RPLACD REPETITIVE-SHORTNESS (1+ (CDR REPETITIVE-SHORTNESS)))) + (T + (RPLACD REPETITIVE-SHORTNESS 1.))) + (RPLACA REPETITIVE-SHORTNESS LINCOUNT) + (COND ((> (CDR REPETITIVE-SHORTNESS) 6.) + (COND ((NOT **MAD**) + (TYPE '(($ AREYOU) JUST TRYING TO SEE WHAT KIND OF THINGS + I HAVE IN MY VOCABULARY? PLEASE TRY TO + CARRY ON A REASONABLE CONVERSATION!)) + (SETQ **MAD** T) + (GO TOP)) + (T + (TYPE '(I GIVE UP/. YOU NEED A LESSON IN CREATIVE + WRITING /././.)) + (TTY-ON) + (PUSH MONOSYLLABLES OBSERVATION-LIST) + (RETURN 'I-QUIT))))) + (COND ((EQUAL SENT (ASSM '(YES))) + (TYPE '(($ ISEE) ($ INTER) ($ WHYSAY) THIS IS SO?))) + ((EQUAL SENT (ASSM '(BECAUSE))) + (TYPE ($ SHORTBECLST))) + ((EQUAL SENT (ASSM '(NO))) + (TYPE ($ NEGLST))) + (T (TYPE ($ SHORTLST)))) + (GO TOP) +ALCOHOL (TYPE ($ DRNK))(GO TOP) +LOVE LOVES +DESIRE (SETQ FOO (MEMQ FOUND SENT)) + (COND ((LESSP (LENGTH FOO) 2)(GO (BUILD (MEANING FOUND) 1))) + ((NOT (EQ (CADR FOO) 'TO))(GO (BUILD (MEANING FOUND) 1)) ) ) + (SVO SENT FOUND 1 NIL) + (REMEMBER (LIST SUBJ 'WOULD 'LIKE OBJ)) + (TYPE ($ WHYWANT)) (GO TOP) +DRUG (TYPE ($ DRUGS))(REMEMBER (LIST 'YOU 'USED FOUND))(GO TOP) +TOKE (TYPE ($ TOKLST))(GO TOP) +STATE (TYPE ($ STATES))(REMEMBER (LIST 'YOU 'WERE FOUND))(GO TOP) +MOOD (TYPE ($ MOODS))(REMEMBER (LIST 'YOU 'FELT FOUND))(GO TOP) +FEAR (SETQ FOUND (SETPREP SENT FOUND)) + (TYPE ($ FEARS))(REMEMBER (LIST 'YOU 'WERE 'AFRAID 'OF FOUND))(GO TOP) +HATE (SVO SENT FOUND 1 T) + (COND ((MEMQ 'NOT SENT) (FORGET) (GO HUH) )) + (COND ((EQUAL SUBJ 'YOU)(TYPE '(WHY DO YOU (// VERB)(// OBJ)(// QMARK) +))) + (T (TYPE '(($ WHYSAY)(LIST SUBJ VERB OBJ))))) + (GO TOP) +SYMPTOMS (TYPE '(($ MAYBE) YOU SHOULD CONSULT A DOCTOR OF MEDICINE/, + I AM A PSYCHIATRIST)) + (GO TOP) +HATES (SVO SENT FOUND 1 T) + (TYPE '(($ WHYSAY)(LIST SUBJ VERB OBJ))) + (GO TOP) +LOVES1 + (SVO SENT FOUND 1 T) +QLOVES (TYPE '(($ BOTHER)(LIST SUBJ VERB OBJ))) + (GO TOP) +LOVE1 (SVO SENT FOUND 1 T) + (COND ((MEMQ 'NOT SENT) (FORGET) (GO HUH) )) + (COND ((EQUAL OBJECT 'SOMETHING) + (SETQ OBJECT '(THIS PERSON YOU LOVE)))) + (COND ((EQUAL SUBJ 'YOU)(PROGN (SETQ LOVER OBJECT) + (COND ((EQUAL LOVER '(THIS PERSON YOU LOVE)) + (SETQ LOVER '(YOUR PARTNER)) + (FORGET) + (TYPE '(WITH WHOM ARE YOU IN LOVE?)) + (GO TOP))) + (TYPE '(($ PLEASE) + ($ DESCRIBE) + ($ RELATION) + (// LOVER) + (// PERIOD) )) )) + ((EQUAL SUBJ 'I) + (TXTYPE '(WE WERE DISCUSSING YOU!))) + (T (FORGET) + (SETQ OBJ 'SOMEONE) + (SETQ VERB (BUILD VERB 'S)) + (GO QLOVES) ) ) + (GO TOP) +MACH (SETQ FOUND (PLURAL FOUND)) + (TYPE ($ MACHLST)) + (GO TOP) +SEXNOUN SEXVERB + (COND ((OR (MEMQ 'ME SENT)(MEMQ 'MYSELF SENT)(MEMQ 'I SENT)) + (GO FOUL) )) + (TYPE ($ SEXLST))(GO TOP) +DEATH (TYPE ($ DEATHLST)) + (GO TOP) +FOUL (TYPE ($ FOULLST)) + (GO TOP) +FAMILY (POSSESS SENT FOUND) + (TYPE ($ FAMLST)) + (GO TOP) + ) + T ))(DOC)) + (T + (TERPRI TYO) + (PRINC '|MY SECRETARY WILL SEND YOU A BILL.| TYO) + (TERPRI TYO) + (SUICIDE)))) + + +(SETQ WHEREOUTP '( HUH REMEM RTHING ) ) + +(DEFUN $ FEXPR (WHAT) + (PROG (VV FIRST) + (SETQ VV (UNIX-EVAL (CAR WHAT))) + (SETQ FIRST (KAR VV)) + (SETQ VV (APPEND (KDR VV)(LIST FIRST))) + (SET (CAR WHAT) VV) + (RETURN FIRST) )) + + + +(DEFUN CHARBAK (A P) + (COND ((EQUAL TTY 9.) + (COND ((NOT A) + (PRINC (ASCII 7.))) + (T (CURSORPOS 'X TYO)))) + (T (COND ((NOT A) (PRINC (ASCII 7.))) + (P (PRINC (ASCII A))) + (T (PRINC '\) + (PRINC (ASCII A))))))) + + +(SETQ FOO + (SYSCALL 3 'TTYGET TYI)) ;GET THE ORIGINAL DATA + +(COND ((MEMQ (STATUS UNAME) '(KMP EJS CGR ERIC RWK TNP TURNIP)) + (SETQ KMPMODE T)) + (T (SETQ KMPMODE NIL))) + +(COND (KMPMODE + (SETQ *RSET T) + (SETQ ERRLIST '((TTY-ON) + (TERPRI) + (PRINC (ASCII 7.)) + (PRINC '|>*BEEP*<|))) + (SETQ EXIT '(LAMBDA () (^G))) + (DEFPROP DEBUG ((MC RWK) DEBUG) AUTOLOAD)) + (T + (SETQ ERRLIST '((TERPRI) + (PRINC (ASCII 7.)) + (DOC))) + (SSTATUS TTYINT 2. 7.) + (SSTATUS TTYINT 4. NIL) + (SSTATUS TTYINT 17. 7.) + (SSTATUS TTYINT 19. NIL) + (SSTATUS TTYINT 23. NIL) + (SSTATUS TTYINT 24. 7.) + (SETQ EXIT 'QUIT))) + + +(SSTATUS FEATURE NOLDMSG) +(SETQ IBASE 10. BASE 10.) +(SETQ LINEL 78.) + +;;; +;;; The following are library functions necessary to this program +;;; + +(DEFUN MEMLIST (X Y) + (APPLY 'OR (MAPCAR (FUNCTION (LAMBDA (X) (LIST 'QUOTE (MEMQ X Y)))) + X))) +(SETQ SMALL-LETTERS (EXPLODEC '|abcdefghijklmnopqrstuvwxyz|)) + +(DEFUN CAPS (X) (CAR (EXPLODEN (KAPS (ASCII X))))) + +(DEFUN KAPS (X) + (COND + ((MEMQ X SMALL-LETTERS) + (CDR (ASSOC X '((|a| . A)(|b| . B)(|c| . C)(|d| . D) + (|e| . E)(|f| . F)(|g| . G)(|h| . H) + (|i| . I)(|j| . J)(|k| . K)(|l| . L) + (|m| . M)(|n| . N)(|o| . O)(|p| . P) + (|q| . Q)(|r| . R)(|s| . S)(|t| . T) + (|u| . U)(|v| . V)(|w| . W)(|x| . X) + (|y| . Y)(|z| . Z))))) + (T X))) + +;;; +;;; The function build will take a two atoms and build them together +;;; like implode, but will not ignore multiple characters like implode +;;; would. +;;; + +(DEFUN BUILD (X Y) + (COND ((NOT (ATOM X)) + (TERPRI) + (PRINC + '|Error: First arg to BUILD not an atom. It will be ignored.| +) + (PRINC X) + (BUILD NIL Y)) + ((NOT (ATOM Y)) + (TERPRI) + (PRINC + '|Error: 2nd arg to BUILD not an atom. It will be ignored.|) + (PRINC Y) + (BUILD X NIL)) + ((NULL X) Y) + ((NULL Y) X) + (T (IMPLODE (APPEND (DELETE '/| (DELETE '// (EXPLODE X))) + (DELETE '/| (DELETE '// (EXPLODE Y)))))))) + +;;; +;;; The ADDPROP function will add an item to the list in the property +;;; slot desginated in the arg-list. +;;; + +(DEFUN ADDPROP (ATOM-NAME NEW-PROP PROP-NAME) + (PROG (OLD-PROP) + (SETQ OLD-PROP (GET ATOM-NAME PROP-NAME)) + (COND ((NULL NEW-PROP) NIL) + ((NULL OLD-PROP) + (PUTPROP ATOM-NAME (LIST NEW-PROP) PROP-NAME)) + ((ATOM OLD-PROP) + (PUTPROP ATOM-NAME (LIST NEW-PROP OLD-PROP) PROP-NAME)) + (T (PUTPROP ATOM-NAME + (CONS NEW-PROP OLD-PROP) + PROP-NAME))))) + + + +(DEFUN TTY-OFF () + (SYSCALL 0 'TTYSET + TYI + (BOOLE 1 (CAR FOO) 3272356035.) + (BOOLE 1 (CADR FOO) 3272356035.))) + +(DEFUN TTY-ON () + (SYSCALL 0 'TTYSET + TYI + (CAR FOO) + (CADR FOO))) + + +(SETQ S-QUOTE '/') +(SETQ OPEN-QUOTES '/'/') +(SETQ CLOSE-QUOTES '/`/`) +(SETQ SPACE '/ ) +(SETQ COMMA '/,) +(SETQ PERIOD '/./ ) +(SETQ SEMICOLON '/;) +(SETQ EXCLAM '!/ ) +(SETQ DOTDOTDOT '/./././ ) +(SETQ EXCLAM-3 '!!!/ ) +(SETQ COLON ':/ ) +(SETQ QMARK '?/ ) +(SETQ HYPHEN '-) +(SETQ NEWLINE (ASCII 13.)) +(SETQ TAB (ASCII 9.)) + +(DEFUN NON-PUNCTUATION (X) (NOT (PUNCTUATION X))) + +(DEFUN PUNCTUATION (X) (MEMQ X (LIST + COMMA SPACE PERIOD HYPHEN S-QUOTE DOTDOTDOT + QMARK COLON SEMICOLON EXCLAM EXCLAM-3 + OPEN-QUOTES CLOSE-QUOTES))) + +;;; +;;; The line-read function will read line by line, allowing deletes and +;;; printing deleted regions backwards between backslashes ... It will +;;; exit upon reading of either a double-carriage return or a carriage +;;; return preceded by a period, exclamation mark, or a question mark. +;;; + +(declare (special *echostream*)) + +(setq *echostream* tyo) + +(DEFUN LINE-READ () + (PROG (LINE C B P A TEMP) + (SETQ P NIL) + TOP (SETQ C (CAPS (TYI TYI))) + R1 (COND ((EQUAL C 9.) (SETQ C 32.)) + ((AND (GREATERP C 64.) + (LESSP C 91.) + (EQ B 45.)) + (SETQ LINE (APPEND LINE (LIST 45.)))) + ((EQUAL C 10.) (SETQ C 13.))) + (COND ((OR (EQUAL C 127.) (EQUAL C 8.)) ;RUBOUT (BACKSPACE) + (SETQ LINE (CHAR-RUBOUT LINE)) + (SETQ A (GET 'CHAR-RUBOUT 'CHAR)) + (CHARBAK A P) + (SETQ P T) + (SETQ B (CAR (LAST LINE))) + (GO TOP))) + (COND ((EQUAL C 12.) ;CONTROL-L + (TERPRI) + (CURSORPOS 'C TYO) + (PRINC (IMPLODE LINE)) + (SETQ P NIL) + (GO TOP)) + ((EQUAL C 27.) + (PRINC (ASCII 7.)) + (GO TOP)) + ((AND (NOT (EQUAL TTY 9.)) P) + (PRINC '\) + (SETQ P NIL))) + (COND ((OR (MEMBER C '(18. 21. 13. 11. 4.)) + (GREATERP C 26.)) + (and *echostream* (PRINC (ASCII C) *echostream*)))) + (COND ((EQUAL C 46.) + (SETQ LINE (APPEND LINE (LIST 46.))) + (GO OUTCHECK)) + ((EQUAL C 33.) + (SETQ LINE (APPEND LINE (LIST 33.))) + (GO OUTCHECK)) + ((EQUAL C 63.) + (COND ((NULL LINE) + (SETQ LINE (LIST 87. 72. 65. 84. 63.))) + (T (SETQ LINE (APPEND LINE (LIST 63.))))) + (GO OUTCHECK)) + ((EQUAL C 13.) + (COND ((EQUAL B 45.) ;HYPHENATION + (SETQ B (CAR (LAST LINE))) + (GO TOP))) + (SETQ B NIL) + (SETQ LINE (APPEND LINE (LIST 32.))) + (GO TOP)) + ((OR (EQUAL C 21.) (EQUAL C 4.)) ;CONTROL-U, CONTROL-D + (SETQ B NIL) + (SETQ LINE NIL) + (TERPRI TYO) + (GO TOP)) + ((OR (EQUAL C 18.) (EQUAL C 11.)) ;CONTROL-R, CONTROL-K + (TERPRI) + (PRINC (IMPLODE LINE)) + (GO TOP)) + ((EQUAL C 45.) + (SETQ B 45.) + (GO TOP)) + ((AND (LESSP C 58.) ;RECOVER MINUS + (GREATERP C 47.) ;SIGN FOR NUMBERS + (EQUAL B 45.)) + (SETQ LINE (APPEND LINE (LIST 45.))))) + BACK + (SETQ LINE (APPEND LINE (LIST C))) + (SETQ B C) + (GO TOP) + OUTCHECK + (COND ((NULL LINE) (GO TOP)) ;NO TEXT + (T (RETURN LINE))))) + + +(DEFUN CHAR-RUBOUT (CHAR-LIST) ;Helping function + (COND ((NULL CHAR-LIST) ;for LINE-READ + (PUTPROP 'CHAR-RUBOUT NIL 'CHAR) + NIL) + ((ATOM CHAR-LIST) (ERR)) + ((NULL (CDR CHAR-LIST)) + (PUTPROP 'CHAR-RUBOUT (CAR CHAR-LIST) 'CHAR) + NIL) + (T (APPEND (LIST (CAR CHAR-LIST)) + (CHAR-RUBOUT (CDR CHAR-LIST)))))) + + +;;; +;;; The following functions will read a set of input and parse it into +;;; a list of sentences +;;; + +(DEFUN PARSE-READ () (PARSE-INPUT (LINE-READ))) + +(DEFUN PARSE-INPUT (LINE) + (PROG2 (PUTPROP 'SENTENCE NIL 'TYPE) + (REVERSE (CDR (DO ((WORD (PARSE-WORD LINE) (PARSE-WORD LINE)) + (PARAGRAPH (NCONS NIL)) + (A NIL)) + ((NULL WORD) PARAGRAPH) + (SETQ A (GET 'WORD-BREAK 'TYPE)) + (SETQ PARAGRAPH + (PARSE-PARAGRAPH A WORD PARAGRAPH))))) + (PUTPROP 'SENTENCE (REVERSE (GET 'SENTENCE 'TYPE)) 'TYPE))) + +(DEFUN PARSE-PARAGRAPH (BREAK WORD PARAGRAPH) + (COND ((EQUAL BREAK 32.) ;SPACE + (CONS + (APPEND (CAR PARAGRAPH) + WORD) + (CDR PARAGRAPH))) + ((EQUAL BREAK 63.) ;QUESTION MARK + (ADDPROP 'SENTENCE 'QUESTION 'TYPE) + (CONS NIL + (CONS (APPEND (CAR PARAGRAPH) + WORD) + (CDR PARAGRAPH)))) + ((OR (EQUAL BREAK 46.) + (EQUAL BREAK 33.) ;EXCLAM + (EQUAL BREAK 59.)) ;PERIOD/SEMICOLON + (ADDPROP 'SENTENCE 'STATEMENT 'TYPE) + (CONS NIL + (CONS (APPEND (CAR PARAGRAPH) + WORD) + (CDR PARAGRAPH)))) + ((EQUAL BREAK 44.) ;COMMA + (CONS + (APPEND (CAR PARAGRAPH) + (APPEND WORD (LIST COMMA))) + (CDR PARAGRAPH))) + ((EQUAL BREAK 58.) ;COLON + (CONS + (APPEND (CAR PARAGRAPH) + (APPEND WORD (LIST COLON))) + (CDR PARAGRAPH))))) + + +(DEFUN PARSE-WORD (LINE) + (PROG (WORD) + (SETQ WORD NIL) + (COND ((OR (NULL LINE) + (AND (EQUAL (LENGTH LINE) 1.) + (WORD-BREAK (CAR LINE)))) + (RETURN NIL))) + (DO ((C (CAR LINE) (CAR LINE)) + (L (CDR LINE) (CDR LINE))) + ((NOT (WORD-BREAK C))) + (COND ((NULL L) (RETURN NIL))) + (RPLACA LINE (CAR L)) + (RPLACD LINE (CDR L))) + (COND ((NULL LINE) (RETURN NIL))) + (DO ((C (CAR LINE) (CAR LINE)) + (L (CDR LINE) (CDR LINE))) + ((WORD-BREAK C)) + (SETQ WORD (CONS C WORD)) + (COND ((NULL L) (RETURN NIL))) + (RPLACA LINE (CAR L)) + (RPLACD LINE (CDR L))) + (RETURN (LIST (IMPLODE (REVERSE WORD)))))) + +(DEFUN WORD-BREAK (X) + (PUTPROP 'WORD-BREAK X 'TYPE) + (COND ((OR (EQUAL X 32.) ;SPACE + (EQUAL X 33.) ;EXCLAMATION MARK + (EQUAL X 44.) ;COMMA + (EQUAL X 46.) ;PERIOD + (EQUAL X 58.) ;COLON + (EQUAL X 59.) ;SEMI-COLON + (EQUAL X 63.)) T) ;QUESTION MARK + (T NIL))) + + +(DEFUN TXREAD () + (PROG (A B) + TOP (SETQ A (DELETE COMMA (CAR (PARSE-READ)))) + (SETQ B (CAR (GET 'SENTENCE 'TYPE))) + (COND ((EQ B 'STATEMENT) + (RETURN A)) + ((EQ B 'QUESTION) + (TYPE ($ QLIST)) + (TYPE '(($ PLEASE) + ($ DESCRIBE) + ($ SOMETHING) + ABOUT + ($ THINGS) + (// PERIOD))))) + (GO TOP))) + +(DOC)) \ No newline at end of file diff --git a/src/games/eliza.(init) b/src/games/eliza.(init) new file mode 100644 index 00000000..3f6fe4c5 --- /dev/null +++ b/src/games/eliza.(init) @@ -0,0 +1,5 @@ +(comment) +(progn + (load '|dsk:games;eliza fasl|) + (close infile) + (^g)) \ No newline at end of file diff --git a/src/games/go.(init) b/src/games/go.(init) new file mode 100644 index 00000000..f17dfea8 --- /dev/null +++ b/src/games/go.(init) @@ -0,0 +1,16 @@ +(comment Setup for RKW's Go Program) + +(progn + (sstatus features noldmsg) + (setq *nopoint t) + (load '|dsk: games; go1 fasl|) + (load '|dsk: games; go2 fasl|) + (setq fasload nil) ; So no Cautions for redefined functions. + (load '|dsk: games; gobrd fasl|) + (sstatus ttyint 26. (status ttyint 2)) ; ^Z does breakpoints + (sstatus ttyint 2 '(lambda (foo bar) (print-board))) ; ^B print-board. + (princ '|RKW's Go Program...|) + (setsyntax '/ + '/ '/ ) + (start) + '||) diff --git a/src/games/guess.21 b/src/games/guess.21 new file mode 100644 index 00000000..ea9346cc --- /dev/null +++ b/src/games/guess.21 @@ -0,0 +1,105 @@ +;;; -*- Midas -*- Game idea by RAE / Code by KMP +title Guess - Guess a number + +a=:1 +b=:2 +c=:3 +ttyo=:4 +ttyi=:5 +char=:6 +where=:7 +wins=:10 + +;;; Define some helpful macros + +.insrt syseng;$call macro + +define sysc3 op,val1,val2,val3 + .call [ setz ? sixbit /op/ ? movem arg1 ? movem arg2 ? movem arg3 ((setz)) ] +termin + +define type &string + movei a,<.length string> + move b,[440700,,[ascii string]] + $call siot,[#ttyo,b,a] + .lose %lsfil +termin + +;;; Main program + +guess: $call open,[#ttyo,[sixbit/tty/]][][#.uao\%tjdis] + .lose %lsfil + + $call open,[#ttyi,[sixbit/tty/]][][#.uai] + .lose %lsfil + + movei where,[ jrst death ] + + setz wins, + +;(SYSCALL 0 'TTYSET TYO ; bit 3.2 (%TSSII) of TTYSTS +; (CAR (STATUS TTY)) (CADR (STATUS TTY)) +; (BOOLE 7 1_19. (CADDR (STATUS TTY)))) + + $call ttyget,[#ttyi][a,b,c] + jrst suicide + ior c,[2,,] + $call ttyset,[#ttyi,a,b,c] + jrst suicide + type "AAre you thinking of a number? " + jrst win2 + +askhim: type "AOk. Is your number 7? " + movei where,die +ask1: .iot ttyi,char ; Read a char + andi char,137 ; Uppercase + cain char,"Y ; If a y, ... + jrst win ; We win + cain char,"N ; If an n, ... + jrst askhim ; Loop + caie char,"Q ; If a q, ... + cain char,^Q ; or control-q + jrst [ type "AYou can't quit.AIs your number 7? " + jrst ask1 ] + cain char,^Z + jrst [ type "AYou can't Control-Z out!AIs your number 7? " + jrst ask1 ] + cain char,^G + jrst [ type "AYou can't ^G out ... I'm going to win.AIs your number 7? " + jrst ask1 ] + type " (Y or N) " ; Give help + jrst ask1 ; and loop + +win: aos wins, ; Count wins + type "AI win..." ; Rub it in +win1: type "Want to play again? " ; Maybe new round +win2: .iot ttyi,char ; Read a char + andi char,137 ; Uppercase + cain char,"Y ; If a y, ... + jrst askhim ; Start over + cain char,"N ; If an n, ... + jrst @where ; Die + type " (Y or N) " ; Give help + jrst win2 ; and loop + +die: cain wins,1 + jrst [ type "ABeat you today, huh?" + jrst death ] + cain wins,2 + jrst [ type "ATwo for me and *none* for you ..." + jrst death ] + cain wins,3 + jrst [ type "AHey, I'm getting pretty good at this. Won 3 of 3" + jrst death ] + caig wins,5 + jrst [ type "AYou're just not winning!" + jrst death ] + type "AYou'd probably win more if you didn't pick 7" + +death: type "ABetter luck next time...A" + .logout 1, ; Kill job + +suicid: type "AUnknown error. Please report this.A" + jrst death + +end guess \ No newline at end of file diff --git a/src/games/lsrrtn.1 b/src/games/lsrrtn.1 new file mode 100644 index 00000000..1c5a514e --- /dev/null +++ b/src/games/lsrrtn.1 @@ -0,0 +1,140 @@ +title LLSRTN - LISP interface to -*-MIDAS-*- inquir lookups + +.fasl +.insrt sys:.fasl defs + +;;Set up and include the inquire database hacking routines + +lsrtns"$$ulnm==0 ;don't need last name search +lsrtns"$$ulnp==0 ;don't need abbrev l.name lookup +lsrtns"$$unam==0 ;don't need name permutation + +;;define some acs for lsrtns use +lsrtns"a==t +lsrtns"b==tt +lsrtns"c==d +lsrtns"d==r +lsrtns"e==f + +.insrt syseng;lsrtns + +;;---------------------------------------------------------------- + +;;(LSRMAP ) +;;opens up and maps in the inquir database for looking up people. +;;Returns a file object to be passed to other routines. +;;Uses GETCOR to reserve address space. Don't try this too many times +;;since the addr space isn't reused. + +.entry LSRMAP SUBR 1+1 + + jsp t,fxnv1 ;get & save # pages to use, a->tt + push fxp,tt +;; (open '|inquir;lsr1 >| '(in)) + movei a,.atom INQUIR/;LSR1/ > + movei b,.sx (IN) + call 2,.function OPEN + push p,a +;; extract I/O channel number from the file array, into TT + movei tt,f.chan + move tt,@ttsar(a) + push fxp,tt +;; get pages via getcor + move tt,-1(fxp) ;# pages + pushj p,getcor ;request addr space from Lisp + jumpe tt,corlos ;its addr is returned zero if none avbl + idivi tt,2000 ;cvt to page number + movn d,-1(fxp) ;get number of pages requested to construct + hrl tt,d ;aobjn to them +;; construct args for lsrmap + move lsrtns"b,tt ;aobjn to free page range + move lsrtns"a,(fxp) ;disk channel number +;; Get the INQUIR data base mapped in + pushj p,lsrtns"lsrmap ;try to map in the data base + jrst lsrluz ;no skip if it lost +;; I guess we won, clean up and return the file object. +opnbye: sub fxp,[2,,2] + pop p,a + popj p, + +;; Random error routines, return () instead of file obj. +corlos: +lsrluz: move a,(p) ;get the file obj + call 1,.function CLOSE ;close it + setzm (p) ;return () + jrst opnbye + +;;---------------------------------------------------------------- + +;;(LSRUNM ) +;;Returns a magic number to be passed to LSRITM, etc., or -1 if uname unknown. +;;Actually, the "magic number" is the entry's core address returned +;;by the lib subr. + +.entry LSRUNM SUBR 2+1 + + push p,cfix1 ;NCALLable! + movei tt,f.chan ;pick up disk channel number + move tt,@ttsar(a) + push fxp,tt ;and save it + move a,b ;(car (pnget 6)) + movei b,.atom #6. + call 2,.function PNGET + hlrz a,(a) + move lsrtns"b,(a) ;set up uname in 6bit for lsrunm + pop fxp,lsrtns"a ;the channel + pushj p,lsrtns"lsrunm ;get entry addr in lsrtns"b + movni lsrtns"b,1 ;-1 for loss + move tt,lsrtns"b ;move to where Lisp wants it. + popj p, + +;;---------------------------------------------------------------- + +;;(LSRITM ) +;;returns the slot of the entry returned +;;by LSRUNM. +;;This file sets the symbols I$UNAM etc to the correct values. +;;Look after this function, and in :INFO LIB LSRTNS . + +.entry LSRITM SUBR 2+1 + + jsp t,fxnv1 ;item number, a->tt + jsp t,fxnv2 ;address, b->d + push fxp,d ;save so we don't have to worry about ac corres + movem tt,lsrtns"a + pop fxp,lsrtns"b + pushj p,lsrtns"lsritm ;returns bp in lsrtns"a + skipa d,[440700,,[0]] ;unless there was no skip: use null string then + move d,lsrtns"a ;d is input bp + setz b, ;start with () +chlp: ildb tt,d ;get a char + jumpe tt,chlpx ;zero terminates + jsp t,fxcons ;turn into fixnum + call 2,.function CONS ;cons onto list + move b,a + jrst chlp ;go for another char +chlpx: move a,b ;reverse the list and atomify + call 1,.function NREVERSE + jcall 1,.function IMPLODE + +.sxeva (SETQ I$UNAM #0 ) ;UNAME +.sxeva (SETQ I$NAME #1 ) ;FULL NAME +.sxeva (SETQ I$NICK #2 ) ;NICKNAME +.sxeva (SETQ I$SSN #3 ) ;SOC SEC NUMBER +.sxeva (SETQ I$MITA #4 ) ;MIT ADDRESS +.sxeva (SETQ I$MITT #5 ) ;MIT TELEPHONE NUMBER +.sxeva (SETQ I$HOMA #6 ) ;HOME ADDRESS +.sxeva (SETQ I$HOMT #7 ) ;HOME TELEPHONE NUMBER +.sxeva (SETQ I$SUPR #10 ) ;SUPERVISOR(S) +.sxeva (SETQ I$PROJ #11 ) ;PROJECT +.sxeva (SETQ I$DIR #12 ) ;FILE DIR NAMES +.sxeva (SETQ I$AUTH #13 ) ;AUTHORIZATION +.sxeva (SETQ I$GRP #14 ) ;GROUP AFFILIATION +.sxeva (SETQ I$REL #15 ) ;RELATION TO GROUP +.sxeva (SETQ I$BRTH #16 ) ;BIRTHDAY +.sxeva (SETQ I$REM #17 ) ;REMARKS +.sxeva (SETQ I$NETA #20 ) ;NETWORK ADDRESS +.sxeva (SETQ I$ALTR #21 ) ;USER AND TIME OF LAST ALTERATION +.sxeva (SETQ I$MACH #22 ) ;ITS-S TO BE KNOWN ON. + +fasend diff --git a/src/games/lsrrtn.insert b/src/games/lsrrtn.insert new file mode 100644 index 00000000..2c4c372d --- /dev/null +++ b/src/games/lsrrtn.insert @@ -0,0 +1,135 @@ +;;; -*- LISP -*- +;;; +;;; Functions defined +;;; +;;; (OPEN-INQUIR-FILE) +;;; Must be done before these other things can happen +;;; +;;; (LOOKUP-INQUIR-INFO ) +;;; Macro to look up a certain tag in the INQUIR database +;;; +;;; (GET-USER-NAME ) +;;; +;;; SUBR returns something of the form +;;; ((last-name first-name middle-name) title lineage alias? nickname) +;;; or NIL if no such user. +;;; +;;; TITLE is one a word like [MR, MRS, ... DR, ...] (see code +;;; for currently used list) +;;; +;;; LINEAGE is one of II, III, or JR +;;; +;;; NIL is returned for unspecified elements. Alias's are tried to be +;;; traced through. If something was an alias, the ALIAS? flag is non-NIL +;;; all other info is as if it had been info about who it is an alias for. +;;; Multiple aliases should be traced through correctly. +;;; +;;; (CLOSE-INQUIR-FILE) +;;; Should be done after all LOOKUP-INQUIR-INFO's are done to +;;; close our INQUIR disk channel. +;;; + +(DEFPROP LSRMAP ((DSK games) LSRRTN FASL) AUTOLOAD) + +(DECLARE (SPECIAL *INQUIR-FILE-OBJECT*) + (*EXPR LSRMAP LSRITM LSRUNM)) + +(DEFUN OPEN-INQUIR-FILE () ; Allocate 15 pages for this map + (SETQ *INQUIR-FILE-OBJECT* (LSRMAP 15.)) + T) + +(DEFUN CLOSE-INQUIR-FILE () + (CLOSE *INQUIR-FILE-OBJECT*) + T) + +(DEFUN LOOKUP-INQUIR-INFO MACRO (FORM) + (LET (((UNAME DATA) (CDR FORM))) + `(LSRITM ',(OR (CDR (ASSQ DATA '((UNAME . 0.) + (FULL-NAME . 1.) + (NICKNAME . 2.) + (SOCIAL-SECURITY-NUMBER . 3.) + (MIT-ADDRESS . 4.) + (MIT-TELEPHONE-NUMBER . 5.) + (HOME-ADDRESS . 6.) + (HOME-TELEPHONE-NUMBER . 7.) + (SUPERVISOR . 8.) + (PROJECT . 9.) + (FILE-DIRECTORY-NAMES . 10.) + (AUTHORIZATION . 11.) + (GROUP-AFFILIATION . 12.) + (RELATION TO GROUP . 13.) + (BIRTHDAY . 14.) + (REMARKS . 15.) + (NETWORK-ADDRESS . 16.) + (LAST-ALTERATION . 17.) + (MACHINES-KNOWN-ON . 18.)))) + (ERROR '|Unknown INQUIR Keyword| DATA)) + (LSRUNM *INQUIR-FILE-OBJECT* ,UNAME)))) + +(DEFUN UNAME? (X) (AND (SYMBOLP X) + (PLUSP (LSRUNM *INQUIR-FILE-OBJECT* X)))) + +(DECLARE (*EXPR PARSE$MAKE-WORDS)) + +(DEFPROP PARSE$MAKE-WORDS ((games) PARSE FASL) AUTOLOAD) + +(DEFUN GET-USER-NAME (WHO) + (COND ((NOT (UNAME? WHO)) NIL) + (T + (LET* ((DATA (LOOKUP-INQUIR-INFO WHO FULL-NAME)) + (TOKENS (PARSE$MAKE-WORDS (EXPLODEC DATA))) + (LAST-NAME) (FIRST-NAME) (MIDDLE) (TITLE-ETC) (LINEAGE) + (ALIAS ())) + (DO () + ((NOT + (AND (EQ (CADR TOKENS) '/,) + (EQ (CAR (LAST TOKENS)) 'FOR) + (MEMQ (LOOKUP-INQUIR-INFO WHO GROUP-AFFILIATION) + '(/@ /O))))) + (SETQ ALIAS T) + (SETQ WHO (CAR TOKENS)) + (SETQ TOKENS + (PARSE$MAKE-WORDS + (EXPLODEC + (SETQ DATA + (LOOKUP-INQUIR-INFO WHO FULL-NAME)))))) + (SETQ TOKENS (DELETE '/. TOKENS)) + (COND ((SETQ TITLE-ETC (CAR (OR (MEMQ 'MR TOKENS) + (MEMQ 'MRS TOKENS) + (MEMQ 'MISS TOKENS) + (MEMQ 'MS TOKENS) + (MEMQ 'DR TOKENS)))) + (SETQ TOKENS (DELETE TITLE-ETC TOKENS)))) + (COND ((SETQ LINEAGE (CAR (OR (MEMQ 'II TOKENS) + (MEMQ 'III TOKENS) + (MEMQ 'JR TOKENS)))) + (SETQ TOKENS (DELETE LINEAGE TOKENS)))) + (COND ((NOT (MEMQ '/, TOKENS)) ; What a loser... + (POP TOKENS FIRST-NAME) + (COND ((CDR TOKENS) + (POP TOKENS MIDDLE) + (POP TOKENS LAST-NAME)) + (T + (POP TOKENS LAST-NAME)))) + ((EQ (CADR TOKENS) '/,) + (SETQ TOKENS (DELETE '/, TOKENS)) + (POP TOKENS LAST-NAME) + (POP TOKENS FIRST-NAME) + (POP TOKENS MIDDLE)) + (T + (SETQ FIRST-NAME (CADR (MEMQ '/, TOKENS))) + (SETQ LAST-NAME (DO ((L () (CONS (CAR TOKS) L)) + (TOKS TOKENS (CDR TOKS))) + ((EQ (CAR TOKS) '/,) + (IMPLODE + (MAPCAN 'EXPLODEC + (NREVERSE L)))))))) + `( (,LAST-NAME + ,FIRST-NAME + ,@(COND (MIDDLE (NCONS MIDDLE)))) + ,TITLE-ETC + ,LINEAGE + ,ALIAS + ,(LET ((NICKNAME (LOOKUP-INQUIR-INFO WHO NICKNAME))) + (COND ((EQ NICKNAME '||) NIL) + (T NICKNAME)))))))) diff --git a/src/games/parse.20 b/src/games/parse.20 new file mode 100644 index 00000000..dfe27ad9 --- /dev/null +++ b/src/games/parse.20 @@ -0,0 +1,226 @@ +;;; -*- LISP -*- + +;;; This is KMP's Word Parsing Package. +;;; +;;; The only user function is PARSE$MAKE-WORDS(Char-List) which +;;; will take a list of ascii characters and convert them into +;;; a list of words (each punctuating object being treated as a +;;; word. +;;; +;;; Supporting functions defined are: +;;; +;;; Definition Predicate Other +;;; +;;; PARSE$PUNCTUATION PARSE$PUNCTUATION? +;;; PARSE$DELIMITER PARSE$DELIMITER? +;;; PARSE$SPECIAL-CHAR PARSE$SPECIAL-CHAR? +;;; PARSE$STRAY-CHAR? +;;; PARSE$QUOTE PARSE$QUOTE? +;;; PARSE$CAPS +;;; PARSE$ALPHABETIC PARSE$ALPHABETIC? +;;; PARSE$NUMERIC? + +;;; Turn of load messages + +(SSTATUS FEATURE NOLDMSG) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;; Standard Predicates ;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; PARSE$CAPS +;;; Returns ascii->ascii or numeric->numeric capitalized character. + +(DEFUN PARSE$CAPS (X) + (COND ((NUMBERP X) + (COND ((AND (> X 96.) (< X 123.)) (- X 32.)) + (T X))) + (T + (ASCII (PARSE$CAPS (GETCHARN X 1.)))))) + +;;; PARSE$ALPHABETIC? +;;; Predicate returns T if arg represents an alpha character. Accepts +;;; ascii or numeric arg. + +(DEFUN PARSE$ALPHABETIC? (C) + (COND ((NUMBERP C) (AND (> C 64.) (< C 91.))) ; A <= C <= Z + (T (PARSE$ALPHABETIC? (GETCHARN C 1.))))) + +;;; PARSE$DIGIT? +;;; Predicate returns T if arg represents a digital character. Accepts +;;; ascii or numeric arg. + +(DEFUN PARSE$DIGIT? (N) + (COND ((NUMBERP N) (AND (> N 47.) (< N 58.))) ; 0 <= N <= 9 + (T (PARSE$DIGIT? (GETCHARN N 1.))))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Punctuation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; PARSE$PUNCTUATION? +;;; Is [ascii] character punctuation? + +(DEFUN PARSE$PUNCTUATION? (X) (GET X 'PARSE$PUNCTUATION)) + +;;; PARSE$PUNCTUATION +;;; Make [ascii] character into punctuation. + +(DEFUN PARSE$PUNCTUATION (X) (PUTPROP X T 'PARSE$PUNCTUATION)) + +;;; PARSE$QUOTE? +;;; Is [ascii] character a quotation designator? + +(DEFUN PARSE$QUOTE? (X) (GET X 'PARSE$QUOTE)) + +;;; PARSE$QUOTE +;;; Make [ascii] character into quotation designator. + +(DEFUN PARSE$QUOTE (X) (PUTPROP X T 'PARSE$QUOTE)) + +;;; Make these chars into delimiters (single character objects) + +(MAPC 'PARSE$PUNCTUATION + (LIST (ASCII 33.) ; + '|''| ; (Pseudo-punctuation generated below) + (ASCII 40.) ; + (ASCII 41.) ; + (ASCII 44.) ; + '-- ; (Pseudo-punctuation generated below) + (ASCII 46.) ; + (ASCII 58.) ; + (ASCII 59.) ; + (ASCII 63.) ; + (ASCII 91.) ; + (ASCII 93.))); + +;;;;;;;;;;;;;;;;;;;;;;;;;;; Other Delimiters ;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; PARSE$DELIMITER? +;;; Is [ascii] character a delimiter? + +(DEFUN PARSE$DELIMITER? (X) + (OR (PARSE$PUNCTUATION? X) (GET X 'PARSE$DELIMITER))) + +;;; PARSE$DELIMITER +;;; Make [ascii] character a delimiter. + +(DEFUN PARSE$DELIMITER (X) (PUTPROP X T 'PARSE$DELIMITER)) + +;;; Make these characters into delimiters (white space) + +(MAPC 'PARSE$DELIMITER + (LIST (ASCII 9.) ; + (ASCII 10.) ; + (ASCII 13.) ; + (ASCII 32.))); + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;; Special Characters ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; PARSE$SPECIAL-CHAR? +;;; Is [ascii] character a special (legal) character? + +(DEFUN PARSE$SPECIAL-CHAR? (X) (GET X 'PARSE$SPECIAL-CHAR)) + +;;; PARSE$SPECIAL-CHAR +;;; Make [ascii] character into a special character. + +(DEFUN PARSE$SPECIAL-CHAR (X) (PUTPROP X T 'PARSE$SPECIAL-CHAR)) + +;;; Make and a speical char (to be treated like +;;; an alphabetic character). + +(PARSE$SPECIAL-CHAR '/') +(PARSE$SPECIAL-CHAR '-) + +;;; PARSE$FUNNY-CHAR? +;;; A printing ascii char, but not a commonly seen one. + +(DEFUN PARSE$FUNNY-CHAR? (X) (GET X 'PARSE$FUNNY-CHAR)) + +;;; Set up FUNNY-CHAR definitions + +(DO ((I 33. (1+ I))) + ((> I 126.)) + (LET ((X (ASCII I))) + (AND (NOT (GET X 'PARSE$FUNNY-CHAR)) + (NOT (PARSE$PUNCTUATION? X)) + (NOT (PARSE$DELIMITER? X)) + (NOT (PARSE$ALPHABETIC? X)) + (NOT (PARSE$DIGIT? X)) + (NOT (PARSE$SPECIAL-CHAR? X)) + (PUTPROP X T 'PARSE$FUNNY-CHAR)))) + +;;; PARSE$STRAY-CHAR? +;;; Is [ascii] character a random character of unknown type? + +(DEFUN PARSE$STRAY-CHAR? (X) + (NOT (OR (PARSE$DELIMITER? X) + (PARSE$PUNCTUATION? X) + (PARSE$FUNNY-CHAR? X) + (PARSE$ALPHABETIC? X) + (PARSE$SPECIAL-CHAR? X) + (PARSE$DIGIT? X)))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Main Word Parser ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; PARSE$MAKE-WORDS +;;; Take a list of [ascii] characters and return a list of atoms that can +;;; be made from those characters. + +(DEFUN PARSE$MAKE-WORDS (CHAR-LIST) + (DO ((C CHAR-LIST (CDR C)) + (CHAR) + (WORD NIL) + (SENT NIL)) + ((NULL C) + (COND (WORD (NREVERSE (CONS (IMPLODE (NREVERSE WORD)) SENT))) + (T (NREVERSE SENT)))) + (SETQ CHAR (PARSE$CAPS (CAR C))) + (COND ((AND (EQ CHAR '-) + (EQ (CADR C) '-)) + (SETQ C (CDR C)) ; Gobble second - + (SETQ CHAR '--)) ; Join hyphens to a dash + ((AND (NOT WORD) + (PARSE$QUOTE? CHAR)) + (DO () ((NOT (PARSE$QUOTE? (CAR C)))) (POP C)) ; Strip quotes + (DO () ((OR (NULL C) (PARSE$QUOTE? (CAR C)))) + (PUSH (CAR C) WORD) + (POP C)) + (DO () ((NOT (PARSE$QUOTE? (CADR C)))) (POP C)); Strip quotes + (PUSH '|``| SENT) + (PUSH (NCONS (IMPLODE + (SUBST '| | (ASCII 13.) (NREVERSE WORD)))) + SENT) + (PUSH '|''| SENT) + (SETQ WORD NIL) + (SETQ CHAR '*DUMMY*))) ; This won't get cons'd in + (COND ((PARSE$STRAY-CHAR? CHAR) + (COMMENT IGNORE IT)) + ((AND (EQ CHAR '-) + (EQ (CADR C) (ASCII 13.))) + (COMMENT IGNORE HYPHEN -- GOBBLE ) + (SETQ C (CDR C))) + ((OR (PARSE$PUNCTUATION? CHAR) + (PARSE$FUNNY-CHAR? CHAR)) + (COND (WORD + (SETQ SENT + (CONS CHAR + (CONS (IMPLODE (NREVERSE WORD)) + SENT))) + (SETQ WORD NIL)) + (T + (SETQ SENT (CONS CHAR SENT))))) + ((PARSE$DELIMITER? CHAR) + (COND + (WORD (SETQ SENT (CONS (IMPLODE (NREVERSE WORD)) SENT)) + (SETQ WORD NIL)))) + ((OR (PARSE$ALPHABETIC? CHAR) + (PARSE$SPECIAL-CHAR? CHAR) + (PARSE$DIGIT? CHAR)) + (SETQ WORD (CONS CHAR WORD)))))) + + diff --git a/src/games/pattrn.7 b/src/games/pattrn.7 new file mode 100644 index 00000000..c51486db --- /dev/null +++ b/src/games/pattrn.7 @@ -0,0 +1,279 @@ +;;; -*- LISP -*- +;;; PATTERN: A Library of Pattern Matching Routines + +;;; MATCH +;;; This function allows the following syntax +;;; +;;; (MATCH ) +;;; +;;; Returns T iff is of the form specified by +;;; +;;; is a list with the description... +;;; +;;; ( ...) +;;; +;;; is one of the following forms: +;;; +;;; Matches an atom that is EQ to it +;;; +;;; (?) Matches any single S-Expression +;;; +;;; (? ) Matches any single S-Expression and assigns +;;; to tag the value of the thing matched +;;; +;;; (?= ) Matches any single S-Expression for which +;;; is true +;;; +;;; (?= ) Matches any single S-Expression for which +;;; is true, assigns matched thing to +;;; +;;; ($) Matches a single S-Expression or none. +;;; +;;; ($ ) Matches a single S-Expression or none, +;;; assigning matched item to . +;;; +;;; ($= ) Matches a single S-Expression if it makes +;;; true, or none. +;;; +;;; ($= ) Matches a single S-Expression if it makes +;;; true, or none, assigns thing +;;; matched to +;;; +;;; (*) Matches any series of S-Expressions. +;;; +;;; (* ) Matches any series of S-Expressions, assigning +;;; to a list of the matched things. +;;; +;;; (*= ) Matches any series of things that return true +;;; for +;;; +;;; (*= ) Matches any series of things that return true +;;; for ; gets list of things matched +;;; +;;; is a list +;;; + +;;; MATCH +;;; This function looks at all constant terms in a pattern, and makes +;;; sure they at least occur in the same order in item being tested. +;;; If they don't, the match fails. If they do, the normal (hairy) +;;; matching scheme is attempted. + +(DEFUN MATCH (PP XX) + (DO ((P PP (CDR P)) + (X XX)) + ((NULL P) (MATCH1 PP XX)) + (COND ((ATOM (CAR P)) + (SETQ X (MEMQ (CAR P) X)) + (COND ((NULL X) (RETURN NIL))))))) + +;;; Macros needed for making my code size below a bit more compressed + + ;; (TAILSTRIP ) + ;; removes the last element of a list. + ;; Equivalent to (DEFUN TAILSTRIP (X) (NREVERSE (CDR (REVERSE X)))) + ;; but a slight bit faster. + +(DEFUN TAILSTRIP (X) + ((LAMBDA (R) + (DO ((X X (CDR X)) + (L (SETQ R (NCONS ())) (CDR L))) + ((NULL (CDR X)) (CDR R)) + (RPLACD L (NCONS (CAR X))))) + NIL)) + + ;; (POP* ...) + ;; Same as (PROGN (POP ) (POP ) ...) + +(DEFUN POP* MACRO (X) + `(PROGN ,@(MAPCAR (FUNCTION (LAMBDA (X) `(SETQ ,X (CDR ,X)))) + (CDR X)))) + +;;; MATCH1 +;;; This is the real brains behind the matcher. It is called only from +;;; MATCH, however, which does some preprocessing. + +(DEFUN MATCH1 (P X) + (DO ((PATTERN) + (FUNCTION-VALUE) + (STARFLAG)) + ((NULL P) (NULL X)) + (COND ((ATOM (CAR P)) ; Atom must match exactly + (COND ((NULL X) (RETURN NIL))); This can't match a null list + (COND ((EQ (CAR P) (CAR X)) ; If matched... + (POP* P X) ; Pop pattern & test list + (SETQ STARFLAG NIL)) ; Terminate * search + (T ; Else (no atomic match) + (RETURN NIL)))) ; Match failed + ((EQ (CAAR P) '?) ; ? may match any single thing + (COND ((NULL X) (RETURN NIL))); This can't match a null list + (COND ((CDAR P) ; Maybe assign match to a var + (SET (CADAR P) (CAR X)))) + (POP* P X) ; Pop pattern & test list + (SETQ STARFLAG NIL)) ; Terminate * search + ((EQ (CAAR P) '?=) ; Match w/ predication + (COND ((NULL X) (RETURN NIL))); This can't match a null list + (COND ((NOT (FUNCALL (CADAR P) (CAR X))) ; Try predicate + (RETURN NIL))) ; Fail if predicate loses + (COND ((CDDAR P) ; Maybe assign match to a var + (SET (CADDAR P) (CAR X)))) + (POP* P X) ; Pop pattern & test list + (SETQ STARFLAG NIL)) ; Terminate * search + (T + (SETQ PATTERN (CAR (LAST P))) ; Work on last elements for + ; a while... + (COND ((ATOM PATTERN) ; If last element is an atom + (COND ((NULL X) ; This can't match a null list + (RETURN NIL))) + (COND ((NOT (EQ (CAR (LAST X)) PATTERN)) + (RETURN NIL))) ; Fail if doesn't match + (SETQ P (TAILSTRIP P)) ; Pop last element of pattern + (SETQ X (TAILSTRIP X)) ; Pop last element of test list + (SETQ STARFLAG NIL)) ; Terminate * search + ((EQ (CAR PATTERN) '?) ; Last element of ? matches! + (COND ((NULL X) ; This can't match a null list + (RETURN NIL))) + (COND ((CDR PATTERN) ; Maybe assign match to a var + (SET (CADR PATTERN) (CAR (LAST X))))) + (SETQ P (TAILSTRIP P)) ; Pop last element of pattern + (SETQ X (TAILSTRIP X)) ; Pop last element of test list + (SETQ STARFLAG NIL)) ; Terminate * search + ((EQ (CAR PATTERN) '?=) ; Predicated match last element + (COND ((NULL X) ; This can't match a null list + (RETURN NIL))) + (COND ((NOT (FUNCALL (CADR PATTERN) (CAR (LAST X)))) + (RETURN NIL))) ; If pred fails, match fails + (COND ((CDDR PATTERN) ; Maybe assign match to a var + (SET (CADDR PATTERN) (CAR (LAST X))))) + (SETQ P (TAILSTRIP P)) ; Pop last element of pattern + (SETQ X (TAILSTRIP X)) ; Pop last of element test list + (SETQ STARFLAG NIL)) ; Terminate * search + ((EQ (CAR (SETQ PATTERN (CAR P))) '$) + ; $ can optionally match + (COND ((MATCH1 (CDR P) X) ; Test first ignoring $ + (COND ((CDR PATTERN) ; Maybe set a variable + (SET (CADR PATTERN) NIL))) ; to match + (RETURN T))) ; We won without it + (COND ((CDR PATTERN) ; Maybe set a variable to + (SET (CADR PATTERN) (CAR X)))) ; thing matched + (POP* P X) ; Pop pattern and test list + (SETQ STARFLAG NIL)) ; Terminate * search + ((EQ (CAR PATTERN) '$=) ; Match 1 or 0 with predication + (COND ((MATCH1 (CDR P) X) ; Try first without using $= + (COND ((CDDR PATTERN) ; Maybe set variable to + (SET (CADDR PATTERN) NIL))) ; match + (RETURN T))) ; We won + (COND ((NOT (FUNCALL (CADR PATTERN) (CAR X))) ; Apply + (RETURN NIL))) ; predicate - if NIL then fail + (COND ((CDDR PATTERN) ; Maybe set variable to + (SET (CADDR PATTERN) (CAR X)))) ; thing matched + (POP* P X) ; Pop pattern and test list + (SETQ STARFLAG NIL)) ; Terminate * search + ((EQ (CAR PATTERN) '*) ; * matches any sequence + (COND ((NULL X) ; If no more elements, + (RETURN ; make sure no pending + (MATCH1 (CDR P) NIL))) ; patterns lose. + ((MATCH1 (CDR P) X) ; Else match first without * + (COND ((AND (NOT STARFLAG) + (CDR PATTERN)) ;Maybe clear + (SET (CADR PATTERN) NIL))) ; variable + (RETURN T))) ; We won + (COND ((CDR PATTERN) ; If there's a var to set + (COND (STARFLAG ; add element to end of var + (SET (CADR PATTERN) ; add to var's val + (NCONC (EVAL (CADR PATTERN)) + (NCONS (CAR X))))) + (T ; if var not initialized + (SET (CADR PATTERN) ;set to () + (NCONS (CAR X))))))) + (POP* X) ; Pop test list + (SETQ STARFLAG T)) ; Note * search in effect + ((EQ (CAR PATTERN) '*=) ; Match any predicated sequence + (COND ((NULL X) ; If no more test list + (RETURN ; Insure no pending patterns + (MATCH1 (CDR P) NIL))) ; are violated + ((MATCH1 (CDR P) X) ; Else try wihtout + (COND ((AND (NOT STARFLAG) (CDDR PATTERN)) + (SET (CADDR PATTERN) NIL))) + (RETURN T))) + (SETQ FUNCTION-VALUE (FUNCALL (CADR PATTERN) (CAR X))) + (COND ((NOT FUNCTION-VALUE) (RETURN NIL))) + (COND ((CDDR PATTERN) + (COND (STARFLAG + (SET (CADDR PATTERN) + (NCONC (EVAL (CADDR PATTERN)) + (NCONS (CAR X))))) + (T + (SET (CADDR PATTERN) + (NCONS (CAR X))))))) + (SETQ X (CDR X)) + (SETQ STARFLAG T)) + (T ; Unknown pattern form? + (RETURN NIL))))))) ; Fail + +(DEFUN MATCH-VAR-GET (X) + (COND ((ATOM X) NIL) + ((MEMQ (CAR X) '(* ?)) (AND (CDR X) (LIST (CADR X) NIL))) + (T (AND (CDDR X) (LIST (CADDR X) NIL))))) + +(DEFUN ELIMINATE-REDUNDANCIES (X) + (DO ((L X (CDDR L)) + (R NIL)) + ((NULL L) (NREVERSE R)) + (COND ((NOT (MEMQ (CAR L) R)) + (SETQ R (CONS (CADR L) (CONS (CAR L) R))))))) + +(DEFUN MATCH-VARS (L) + (APPLY 'NCONC + (MAPCAR (FUNCTION (LAMBDA (P) (MAPCAN 'MATCH-VAR-GET P))) L))) + +;;; MATCHES +;;; This is a convenience macro that takes the syntax: +;;; +;;; (MATCHES
... ) +;;; +;;; will be EVAL'ed +;;; 's will not be EVAL'd +;;; +;;; It will expand to the following: +;;; +;;; (PROGN (SETQ NIL NIL NIL ... NIL) +;;; (OR (MATCH ' ) +;;; (MATCH ' ) +;;; (MATCH ' ) +;;; ... +;;; (MATCH ' ) +;;; (SETQ NIL NIL ... NIL))) +;;; +;;; ... are the variables that may be set by the Matcher. +;;; The are initialized to NIL and if the Matches fail, they are +;;; re-initialized to NIL to avoid chance of getting garbage left over in +;;; them. + +(DEFUN (MATCHES MACRO) (X) + (LET* (((OBJECT . PATTERNS) (CDR X)) + (INITS (ELIMINATE-REDUNDANCIES (MATCH-VARS PATTERNS)))) + (COND (INITS (PUSH 'SETQ INITS))) + (COND ((NULL PATTERNS) NIL) + ((> (LENGTH PATTERNS) 1.) + `(OR ,@(MAPCAN + (FUNCTION + (LAMBDA (X) + (COND (INITS + `(,INITS (MATCH ',X ,OBJECT))) + (T + `((MATCH ',X ,OBJECT)))))) + PATTERNS) + ,@(COND (INITS (NCONS INITS))))) + (T + (COND (INITS + `(OR ,INITS + (MATCH ',(CAR PATTERNS) ,OBJECT) + ,INITS)) + (T + `(MATCH ',(CAR PATTERNS) ,OBJECT))))))) + + +;;; Note this package has loaded + +(SSTATUS FEATURE PATTERN) \ No newline at end of file diff --git a/src/games/qb.(init) b/src/games/qb.(init) new file mode 100644 index 00000000..d585a050 --- /dev/null +++ b/src/games/qb.(init) @@ -0,0 +1,8 @@ +(comment) +(progn +(load '|dsk:games;qb fasl|) +(setq errlist '((gc) + (qubic))) +(setsyntax '/ +'/ '/ ) +(qubic)) diff --git a/src/games/sprout.rules b/src/games/sprout.rules new file mode 100644 index 00000000..1de043b7 --- /dev/null +++ b/src/games/sprout.rules @@ -0,0 +1,359 @@ + + THE RULES OF SPROUTS, THE ONLY TOPOLOGICAL GAME + INVENTED BY JOHN HORTON CONWAY AND MIKE PATERSON + PRESENTED ORIGINALLY IN SCI. AMER. MATH GAMES 1967.JUL + DESCRIBED HERE BY ROBERT MAAS 1977.AUG.01 + +Sprouts is a two-person game with alternating play. There can +be no draw, one person wins or the other does. The longest +game possible is 3*N-1 halfmoves and the typical game is 7*N/3 +halfmoves (where N is the number of dots in the starting +situation, as described below), thus with N in the range 2:7 +the typical game lasts between 4 and 16 moves (beginners start +at N=2 and work up, becoming experts when they have mastered +N=7) resulting in short snappy contests. + +PLAYING SURFACE: The game is played on either a sphere or a +plane, at least in principle it is; actually the game is played +in the interior of some small playing area that has been marked +on a sheet of paper, 2" by 2" square is sufficient for a game +when N=2,3,4,5 and slightly larger squares for N=6 and N=7. +The only utensils needed are a pencil or pen for drawing +freehand dots and lines in the playing area. + +INITIAL SITUATION: The game starts with N dots drawn somewhere +inside the playing area. It is preferable to arrange the dots +as far from each other and from the edges of the playing area as +possible, usually people arrange them in a circle about half the +diameter of the playing area centered in the playing area. + +LEGAL MOVE, BASIC: A legal move consists of drawing a line from +some already-existing dot to another already-existing dot, subject +to the restrictions listed below, then placing a new dot on the +midpoint of the line (segment). The line drawn may curve in order +to connect back to its starting point or in order to go around +obstacles that block a staight path, or to cause certain dots and +lines to be on the left side separated from other dots and lines +on the right side of the new line drawn. + +RESTRICTIONS: Each line (segment) drawn when making a move must +not touch itself (except at endpoints when connecting a dot back +to itself) nor cross or brush against any other dot or line, thus +it is impossible to cross a closed-curve in order to connect some +dot inside it to another dot outside it. -- Also, it is illegal +to make any move that causes any dot to have more than 3 (three) +connections to it. Note that drawing a loop from a dot back to +itself counts as two connections to that dot. Note also that +the new dot created during each move already has a line coming into +it from each side thus already has two connections at its birth, +thus allowing only one additional connection to it. + +END OF GAME, WINNER: The game is over when there is no legal +move remaining. The last person who was able +to make a legal move is the winner. + +NOTATION USED TO PLAY GAME OVER TELEPHONE AND/OR TERMINAL, AND +USED TO RECORD A GAME: The syntax is

:- (/) +where

is the name of the player making the move, is +the number of the move (each new move creates a new dot, the original +dots are numbered 1,2,..,N and the new dots are numbered N+1, N+2, +etc. -- each move is numbered according to the new dot created by +that move, thus the first move is numbered N+1 rather than 1), + and are the two dots connected by the line segment, +if the move is ambiguous then and are supplied listing the +dots that appear on the left and right of the new segment going +from to (thinking of the playing area as a roadmap, +with lines representing highways, dots representing intersections, +and unmarked areas representing city parks -- when - +completes a closed curve because and were already +connected by some other highway before the current move, to figure +out what and are you imagine letting your pet dog take a +walk out either your left window or right window respectively, with +the restriction that your dog may not cross a highway, the +intersections your dog can stick his nose into are listed in +and for the two walks he can take respectively -- when the +highways form a peninsula or isthmus so that a dot on the neck +(thin part) of the peninsula or isthmus can be sniffed by a dog +from opposite sides while remaining in the same city park (without +crossing any highway), and such a dot is or , then the +dots immediately adjacent on the left and right as is +departed or is reached, are included in and +respectively to remove the ambiguity as to the resultant +configuration), and denotes carriage-return with +accompanying linefeed. Note that the parenthesi and slash are +omitted when neither a closed curve nor a peninsula/isthmus +connection is made, or when no ambiguity is made by the omission +of and completely. When there is a choice between two +moves, one of which have an and and the other of which +doesn't, between exactly the same and , however, the +parenthesis must be supplied in both cases to avoid ambiguity +(note, some versions of the program, if you type in just -, +will assume you intend the (/) version i.e. null and , +however it is bad when playing a human to fail to specify in +this case). + +EXAMPLES OF NOTATION FOR MAKING MOVES: Let us suppose that +FOO and BAZ are playing a game with N=2, with FOO playing first. +FOO may open the game by connecting dot#1 to dot#2, thus +FOO 3: 1-2 +or FOO may connect dot#1 to itself either making a small loop, or +making a loop clockwise around dot#2, or making a loop CCW around +dot#2, but all these three moves are equivalent strategically +hence can be denoted by either +FOO 3: 1-1 (2/) +or by +FOO 3: 1-1 (/2) +(technically these moves are different in that 1-3-1 was traced +in the reverse direction in one from the other, thus with car +moving in reverse direction left and right are reversed so that +dot#2 changes apparant sides, but due to symmetry the resultant +situations are identical hence the user can be sloppy in notation +in this case) +or FOO may connect dot#2 to itself, denoted by +FOO 3: 2-2 (1/) +or by +FOO 3: 2-2 (/1) +Note that although 1-1 (2/) and 2-2 (1/) are equivalent strategically, +the notation used for subsequent moves is different, thus the +player must specify which move he is making in order for play of +the game by notation to proceed. Thus there are two totally +different opening moves, one of which has 2 ways to do it with +numbered dots. + Let us suppose player FOO makes this opening move: +FOO 3: 1-2 +Player BAZ now has three totally different replies: +BAZ 4: 1-2 (both ways to draw it are equivalent) +BAZ 4: 1-3 (2/) or 1-3 (/2) or 2-3 (1/) or 2-3 (/1) + all of which are strategically equivalent but notationally + different hence must be correctly typed one of four ways +BAZ 4: 1-1 or 2-2 (unnecessary to specify 1-1 (3/) or 1-1 (/3) + because the resulting situations are identical) + Let us suppose player BAZ makes the reply: +BAZ 4: 1-3 (2/) +now player FOO has the choice of +FOO 5: 1-4 (/) +FOO 5: 1-4 (2/) +FOO 5: 2-2 +FOO 5: 1-2 (equivalent to 4-2 strategically but must be + specified correctly because notation would be different in + that case) + Let us suppose player FOO makes the move: +FOO 5: 1-4 (2/) +now player BAZ has the choice of +BAZ 6: 2-5 +BAZ 6: 2-2 + Let us suppose player BAZ makes the move: +BAZ 6: 2-5 +now player FOO has the choice of +FOO 7: 2-6 (4/) +FOO 7: 2-6 (/1) +but both moves are equivalent, and normally / is omitted +for dots that can't be connected to anything because they +already have three connections, thus the notation for both moves is +FOO 7: 2-6 (/) +which may be abbreviated to +FOO 7: 2-6 + After playe FOO makes the move +FOO 7: 2-6 +there is no legal move, so FOO wins the game. The complete record +of the game is: +SPROUTS GAME, 2 DOTS +FOO 3: 1-2 +BAZ 4: 1-3 (2/) +FOO 5: 1-4 (2/) +BAZ 6: 2-5 +FOO 7: 2-6 + +NOTATION FOR SITUATIONS: Note that the above notation is for +describing a half-move to be made, not the complete situations that +result between half-moves, just like in Chess the notation N-B5 +denotes a half-move not the complete board situation. Sprouts also +has a way to represent a complete situation just like Chess +has its notation rnb1kbnr/ppppqppp/8/8/3Pp2N/8/PPP1PPPP/RNBQKB1R. +to represent a complete board position. In fact the LISP +internal representation of this notation is actually used by +Sprouts-playing programs to keep track of the situation during +the course of a game or during analysis. A Sprouts situation +is represented by a 3-level list, which is presented externally +by merely calling the LISP function PRINT or by a more fancy +variation of PRINT written specially for Sprouts, together with +a table of how many connections remain to be made to each dot. +People who have never programmed in LISP will probably find this +notation difficult to understand, in which case this section +should be omitted when reading this file. + The table of lives is the easy part. It is simply a list +of how many lives each dot has remaining, thus after the first +two half-moves in the example game, the table of lives would be +(1 2 0 1) which means dot#1 has 1 life, dot#2 has 2 lives, dot#3 +has 0 lives, and dot#4 has 1 life. + The three-level list is more complicated. The top level +is a list of regions (city parks) altogether. Each second level +is the list of separate pieces of highway adjoining the park +(in the top-level list) that points to it, thus to get between +the various pieces of highway one must drive across the park. +Each third level is a list of intersections on that piece of +highay adjoining that park, however the intersections are listed +in sequence from left to right as one would read off the numbers +while standing in the park and facing the highway segment. + Note that arbitrary permutation of regions doesn't change +the situation, also that within each region arbitrary permutation +of highway segments doesn't change the situation, also that rotation +of the numbers of intersections on a highway segment doesn't change +the situation but that any other permutation of numbers of +intersections on a highway segment will result in a different +situation, or more commonly an impossible configuration. + Below are listed the life table and the 3-level list which +denote the situations that occur in the example game above, together +with the moves (same as shown above) which transform each situation +into the next. Each situation is shown in fully-verbose mode (all +dots shown even though they have no connections remaining to make +hence are irrelevant to the later game) and in terse mode (all +fully-dead dots deleted from the notation, and all regions where +no further connections can be made deleted from the notation): +INITIAL SITUATION: (3 3) (((1) (2))) +MOVE: FOO 3: 1-2 +RESULTANT SITUATION: (2 2 1) (((1 3 2 3))) +MOVE: BAZ 4: 1-3 (2/) +VERBOSE SITUATION: (1 2 0 1) (((1 4 3)) ((1 3 2 3 4))) +TERSE SITUATION: (1 2 0 1) (((1 4)) ((1 2 4))) +MOVE: FOO 5: 1-4 (2/) +VERBOSE SITUATION: (0 2 0 0 1) (((1 4 3)) ((1 5 4)) ((1 3 2 3 4 5))) +TERSE SITUATION: (0 2 0 0 1) (((2 5))) +MOVE: BAZ 6: 2-5 +VERBOSE SITUATION: (0 1 0 0 0 1) (((1 4 3)) ((1 5 4)) ((2 3 4 5 6)) ((1 3 2 6 5))) +TERSE SITUATION: (0 1 0 0 0 1) (((2 6)) ((2 6))) +MOVE: FOO 7: 2-6 +VERBOSE SITUATION DEPENDS ON WHICH OF TWO EQUIVALENT MOVES WAS DONE. +TERSE SITUATION: (0 0 0 0 0 0 1) () + Note that at the end of the game the terse situation 3-level +list is always exactly NIL (the empty list). + There are two reasons for having notation for a situation. +One reason is to describe a situation without repeating all the moves +that led up to it, in order to resolve a dispute in the middle of +a game when somehow one player or the other has screwed up his +playing area and wants to know what the other's looks like. The +other is when using a program to analyze a situation there must be +some way to type in the desired situation. + When a program types out a situation, instead of using +PRINT or PRINC to type out its internal representation as shown +above, usually a more human-readable version is used, shown here: +(after the second move) +SPROUTS SITUATION: + REGION #1: + BOUNDARY #1: 1[1],4[1] + REGION #2: + BOUNDARY #1: 1[1],2[2],4[1] +Note that the numbers inside brackets are the numbers of lives +taken from the life table. The numbers outside brackets are +the numbers identifying the dots which appear as elements in the +third level of the 3-level list. Here's a more complicated +example from a game with N=4: +SPROUTS GAME, 4 DOTS +FOO 5: 1-1 (2/3,4) +BAZ 6: 3-5 +FOO 7: 3-6 (4/) +SPROUTS SITUATION: + REGION #1: + BOUNDARY #1: 2[3] + BOUNDARY #2: 1[1] + REGION #2: + BOUNDARY #1: 4[3] + BOUNDARY #2: 1[1],7[1],3[1] + REGION #3: + BOUNDARY #1: 3[1],7[1] + +CANONICAL NOTATION FOR SPROUTS SITUATIONS: When analyzing Sprouts +it is useful to identify situations that are equivalent so as to +avoid analyzing both versions of it and thus doubling ones work. +One way to do this is to find some canonical form of notation to +represent situations and to alphabetize or hash these representations +to make it easy to determine whether a situation that turns up is +one that has already been indexed and possibly analyzed. The +notation that I have adopted for this purpose involves replacing +the number that designates a dot by the number that designates the +number of lives it has remaining (thus eliminating duplicate entries +due to different names for a dot that plays exactly the same role +in equivalent situations), except that when a dot is shared between +two regions or between two sides of an isthmus or peninsula it is +necessary to handle it in a unique way. A minute's thought makes +it apparant that the only way a dot can still be alive while appearing +in two different places in the TERSE notation given above is if it +has exactly one life. Even a dot with exactly one life (which +always lies across a peninsula or isthmus or is shared between two +regions in the VERBOSE notation above) can occur just once if +it adjoins two regions one of which is dead in the sense of no +chance to connect to anything else alive in that region. Thus four +cases exist for each dot, unshared dots with 1 2 or 3 lives each, +which can be replaced by the number of lives, and shared dots with +exactly 1 life each, which are handled specially. What is done for +1-life shared dots is to number them 4,5,6,... After choosing the +numbering for 1-life shared dots, a recursive short of the 3-level +structure is done, sorting rotationally-only at the third level, +and sorting fully at the top level and the second level. One +additional symmetry is present, namely that reversing the third +level lists throughout any top level (region) element doesn't +change the situation strategically. Thus the complete brute-force +algorithm for finding canonical form is to replace shared 1-life +dots in all k factorial ways (where k is the number of them) and +performing the following algorithm on each way: + In each region, try reversing and not reversing all + third-level lists, performing the following algorithm + on each: + Sort each third-level cyclically. + Sort the second-level list of third-level + lists completely. + Sort the list of two elements you get from the two + calls to the sub-algorithm you just did, and select + the first element. + Now make a list out of the results for each region + and sort it completely. +Now make a list of length k factorial of the results from all the +permutations on names 4,5,6,... for shared 1-life dots and sort +them completely, then select the first element as the answer, +the result that is returned from the canonical-form routine. Here +are the canonical forms that result from the sample game above: +CANONICAL FORM: (((3) (3))) +MOVE: FOO 3: 1-2 +CANONICAL FORM: (((2 4 2 4))) +MOVE: BAZ 4: 1-3 (2/) +CANONICAL FORM: (((2 4 5)) ((4 5))) +MOVE: FOO 5: 1-4 (2/) +CANONICAL FORM: (((1 2))) +MOVE: BAZ 6: 2-5 +CANONICAL FORM: (((4 5)) ((4 5))) +MOVE: FOO 7: 2-6 +CANONICAL FORM: () + The only reason I can think of you would want to use this +canonical notation is when looking at output from my computer +program, or when describing an abstract situation to someone without +bothering him with the details of how it was arrived at in a game. + Here's the 4-dot situation mentionned earlier, using +canonical notation: +(((3) (4)) ((3) (4 5 6)) ((5 6))) + The major disadvantage of canonical notation is the large +amount of compute time it takes to perform k factorial recursive +sorts when k is large. For example when given the situation in +terse notation: + (1 1 1 1 1 1) (((1 4) (2 6)) ((2 6)) ((1 4) (3 5)) ((3 5))) +it takes seven hundred and twenty recursive sorts to determine +that the canonical notation is: + (((4 5)) ((6 7)) ((4 5) (8 9)) ((6 7) (8 9))) +(actually "8" would come out "10" and "9" would come out "11" + because my program currently uses base eight rather than + base ten) which would take several minutes on the SU-AI KL-10 +machine using compiled UCI-LISP (I haven't tried it in compiled +MACLISP yet). + It is an unsolved problem how to find the canonical form +in fewer than k factorial recursive sorts; as far as I know +nobody has found a faster way to do it and nobody has proven it +impossible. A solution to the general problem of finding the +canonical numbering of vertices of a graph would have important +applications in Dendral (classifying molecules), Macsyma (finding +canonical forms for tensors and other formulas so that like terms +can be combined and their coefficients added), and of course +Sprouts and other game-playing programs that want to store away +situations they've already analyzed to avoid re-analyzing them +when an equivalent situation occurs under different circumstances. +I have some techniques that might minimize average-time, but +haven't fully checked them out. + diff --git a/src/games/stone.(init) b/src/games/stone.(init) new file mode 100644 index 00000000..6b0d5aea --- /dev/null +++ b/src/games/stone.(init) @@ -0,0 +1,7 @@ +(COMMENT) +(PROGN (LOAD '((dsk games) STONE FASL)) + (setq errlist '((gc) + (stone-game))) + (STONE-GAME) + (VALRET '|:KILL/ +| ) ) diff --git a/src/games/think.(init) b/src/games/think.(init) new file mode 100644 index 00000000..c2ac6a50 --- /dev/null +++ b/src/games/think.(init) @@ -0,0 +1,8 @@ +;;; -*- LISP -*- +;;; Think-A-Dot Init file + +(COMMENT) + +(PROGN + (CLOSE (PROG2 T INFILE (INPUSH -1.))) + (LOAD '|DSK:games;THINK FASL|)) diff --git a/src/games/think.2 b/src/games/think.2 new file mode 100644 index 00000000..6b1edcbb --- /dev/null +++ b/src/games/think.2 @@ -0,0 +1,491 @@ +;;; -*- LISP -*- +;;; A B C +;;; D E +;;; F G H + +(COND ((NOT (MEMQ 'CURSORPOS (STATUS FILEM TYO))) + (CURSORPOS 'A TYO) + (PRINC '|Sorry, THINK-A-DOT currently only works on display terminals.|) + (TERPRI TYO) + (QUIT))) + +(SSTATUS RANDOM (APPLY '* (APPEND (STATUS DATE) (STATUS DAYTIME)))) + +(EVAL-WHEN (EVAL COMPILE) + (SSTATUS MACRO /# '(LAMBDA () ((LAMBDA (IBASE) (READ)) 2.)))) + +(EVAL-WHEN (EVAL COMPILE) + (DO ((C (TYI) (TYI)) + (L () (CONS C L))) + ((= C 31.) (SETQ LONG-RULES (MAKNAM (NREVERSE L)))))) + + Think-a-dot is sold as a children's game, but can be played by +people of all ages. It allows as much or as little planning as you want +to put into it. + The equipment needed is a plastic box with colored dots on the +side of it and 5 holes (three on top, one on each side), as shown on the +next screen. (Note: A well-designed think-a-dot simulator running on a PDP-10 +may substitute for the plastic box.) + + A B C + ___ ___ ___ + ---------------------------- + | | + | (A) (B) (C) | + | Blue Yellow Blue | + | | + | | + | (D) (E) | + | Yellow Yellow | + | | + | | + | (F) (G) (H) | + | Blue Yellow Blue | + | | + || || + P1 || || P2 + ------------------------------ + + Balls are dropped into the holes depending on which side of the +board they come out on, that player plays next. (It is deterministic +which side of the board they will come out on, as will be seen in a +minute). + When a ball falls into a hole, it will strike the dot just +below it, changing its color from blue to yellow or yellow to blue +as appropriate. Depending on the resulting color, the ball will then +fall to either the right or the left and strike the next dot below it. +When it reaches the bottom dot, it will roll out of the box and it will +be the player's turn whose side it rolled out on. + + In this version of think we use "/" and "\" to represent the two +states of the `dots.' This makes it easier to tell what the internal +state of the machine is. If you are unsure of what happens when a ball +is dropped, play around with the game before starting a game. + For example, note that when you start with state 11111111 and then +drop a ball into "A" what happens is that it hits node "A" and falls to the +right (complementing "A"). It then hits node "D" and falls to the right +(complementing it) and finally hits "G" falling to the right (complementing +it). + If the ball falls out to the left or the right of node "F", or to +the left of node "G", it will be player 1's turn. If it falls to the +right of node "G" or either side of node "H" it will be player 2's turn. + + If you get stuck, ask a 6-year-old or a mathemetician to help you. +(Note that this box can be viewed as a finite state machine with 256 states, +only 128 of which are reachable from any given state (parity of the +initial situation is a factor)). Good luck! + + + +(EVAL-WHEN (EVAL COMPILE) + (DO ((C (TYI) (TYI)) + (L () (CONS C L))) + ((= C 31.) (SETQ SHORT-RULES (MAKNAM (NREVERSE L)))))) +[A,B,C] will drop a ball in the hole above corresponding location. +For scored games... starts. "Q" quits. restarts game. +Just for fun... "R" randomize board (conserving parity). +complements a single switch (reading a switch name). "^S" stores +the current state for later recall. "^R" recalls a previously +stored state. The characters "/", "\", "-", and "+" initialize +the board in various interesting ways. +And finally... "H" gives full documentation, "^Q" quits program. + + +(DEFUN -*-SHORT-RULES-*- MACRO (()) `',SHORT-RULES) + +(DEFUN -*-LONG-RULES-*- MACRO (()) `',LONG-RULES) + +(SETQ SHORT-RULES (-*-SHORT-RULES-*-) LONG-RULES (-*-LONG-RULES-*-)) + +(DEFUN LAMBDA MACRO (X) (LIST 'FUNCTION X)) + +(NOINTERRUPT T) + +(DECLARE (*FEXPR *DROP *INIT) + (SPECIAL OBJECT-LIST PARITY-LIST + TTY-SPEC-INFO \ // MODE REMEMBER + SHORT-RULES LONG-RULES)) + +(SETQ OBJECT-LIST '(A B C D E F G H)) +(SETQ PARITY-LIST '(A B C F G H)) + +(DEFPROP A (F . D) POINTER) +(DEFPROP B (D . E) POINTER) +(DEFPROP C (E . H) POINTER) +(DEFPROP D (F . G) POINTER) +(DEFPROP E (G . H) POINTER) + +;;; Display locations + +(DEFPROP A (2 . 6.) WHERE) +(DEFPROP B (2 . 10.) WHERE) +(DEFPROP C (2 . 14.) WHERE) +(DEFPROP D (4 . 8.) WHERE) +(DEFPROP E (4 . 12.) WHERE) +(DEFPROP F (6 . 6.) WHERE) +(DEFPROP G (6 . 10.) WHERE) +(DEFPROP H (6 . 14.) WHERE) + +;;; State + +(DEFUN *INIT FEXPR (DIR) + (COND ((INIT (CAR DIR)) + (TERPRI TYO) + (PRINC '|(Initialized)| TYO) + (WASH)))) + +(DEFUN INIT (DIR) + (COND ((GET 'GAME 'BEING-PLAYED) + (TERPRI TYO) + (PRINC '|(Game in progress. Can't quit now!)| TYO) + ()) + (T + (LET ((STATE (CASEQ DIR (+ '\) (- '//)))) + (MAPC (LAMBDA (X) (PUTPROP X STATE 'STATE)) + OBJECT-LIST) + T)))) + +(INIT '+) + +(DEFUN INVERT (X) (CDR (ASSQ X '((// . \) (\ . //))))) + +(DEFUN STATE (X) (GET X 'STATE)) + +(DEFUN *COMPLEMENT (X) + (LET ((STATE (INVERT (STATE X)))) + (PUTPROP X STATE 'STATE) + STATE)) + +(DEFUN COMPLEMENT FEXPR (X) (*COMPLEMENT (CAR X))) + +(DEFUN DISPLAY () + (CURSORPOS 0. 0. TYO) + (CURSORPOS 'L TYO) + (COND (MODE + (PRINC '|Score is | TYO) + (PRINC // TYO) + (PRINC '| to | TYO) + (PRINC \ TYO) + (PRINC '|. | TYO) + (PRINC MODE TYO)) + (T + (PRINC '|State= | TYO) + (LET ((BASE 2.)) + (MAPCAR 'PRINC + (EXTEND + (MAPCAR (FUNCTION (LAMBDA (X) (- X 48.))) + (EXPLODEN (SGET)))))))) + (MAPC 'DISPLAY-STATE OBJECT-LIST) + (CURSORPOS 'A TYO) + (TERPRI TYO) + (COND ((GET 'GAME 'BEING-PLAYED) + (COND ((EQ (GET 'GAME 'WHOSE-TURN) '//) + (PRINC '| <- You play next.| TYO)) + (T + (PRINC '| You play next. ->| TYO)))))) + + +(DEFUN DISPLAY-STATE (X) + (LET (((H . V) (GET X 'WHERE)) + (STATE (STATE X))) + (CURSORPOS H V TYO) + (PRINC X) + (CURSORPOS 'D TYO) + (CURSORPOS 'B TYO) + (PRINC '| | TYO) + (CURSORPOS 'B TYO) + (PRINC (OR (GET X STATE) STATE) TYO))) + +(DEFUN PROMPT () + (GAME-END-CHECK) + (DISPLAY) + (TERPRI TYO) + (TERPRI TYO) + (TYI TYI)) + +(DEFUN WASH () (CURSORPOS 'E TYO)) + +(DEFUN EXECUTE () + (UNWIND-PROTECT (PROGN (TTY-OFF) (EXECUTE1)) (TTY-ON))) + +(SETQ DIAMOND-1 #01011010) +(SETQ DIAMOND-2 #10100101) + +(DEFUN EXECUTE1 () + (CURSORPOS 'C TYO) + (DO ((C (PROMPT) (PROMPT))) + ((= C 17.) (PRINC '|Quit.| TYO) (QUIT) T) + (COND ((OR (= C 65.) (= C 97.)) (*DROP A)) + ((OR (= C 66.) (= C 98.)) (*DROP B)) + ((OR (= C 67.) (= C 99.)) (*DROP C)) + ((OR (= C 82.) (= C 114.)) (*RANDOMIZE)) + ((OR (= C 81.) (= C 113.)) + (TERPRI TYO) + (COND ((GET 'GAME 'BEING-PLAYED) + (TYO 7. TYO) + (SETQ MODE '|(Game Halted)|) + (REMPROP 'GAME 'BEING-PLAYED) + (PRINC '|(Game Halted)| TYO)) + (T + (PRINC '|(No game to halt?)| TYO))) + (WASH)) + ((= C 92.) (*INIT +)) + ((= C 47.) (*INIT -)) + ((= C 43.) + (TERPRI TYO) + (COND ((NOT (GET 'GAME 'BEING-PLAYED)) + (SRESET DIAMOND-2) + (PRINC '|(Diamond 2)| TYO)) + (T + (PRINC '|(Game in progress?)| TYO))) + (WASH)) + ((= C 45.) + (TERPRI TYO) + (COND ((NOT (GET 'GAME 'BEING-PLAYED)) + (SRESET DIAMOND-1) + (PRINC '|(Diamond 1)| TYO)) + (T + (PRINC '|(Game in progress?)| TYO))) + (WASH)) + ((= C 12.) (CURSORPOS 'C TYO)) + ((= C 13.) (GAME-BEGIN)) + ((= C 10.) (GAME-RESTART)) + ((OR (= C 32.) (= C 9.))) + ((= C 19.) (SREMEMBER)) + ((= C 18.) (SRECALL)) + ((= C 27.) (ALTER)) + ((OR (= C 63.) (= C 2120.)) + (SHORT-RULES)) + ((OR (= C 72.) (= C 104.)) + (LONG-RULES)) + (T + (TYO 7. TYO) + (TERPRI TYO) + (PRINC '|(Type "?" for help)| TYO) + (WASH))))) + +(DEFUN *DROP FEXPR (X) + (SETQ X (CAR X)) + (TERPRI TYO) + (PRINC `(|Drop| ,X) TYO) + (WASH) + (DROP X)) + +(DEFUN DROP (X) + (LET* ((STATE (STATE X)) + (POINTER (GET X 'POINTER)) + (NEXT (CASEQ STATE (// (CAR POINTER)) (\ (CDR POINTER))))) + (*COMPLEMENT X) + (COND (NEXT (DROP NEXT)) + ((EQ X 'F) (DEFPROP GAME // WHOSE-TURN)) + ((EQ X 'G) (PUTPROP 'GAME STATE 'WHOSE-TURN)) + (T (DEFPROP GAME \ WHOSE-TURN))))) + +(DEFUN INIT-TURN () + (PUTPROP 'GAME (COND ((MAYBE) '//) (T '\)) 'WHOSE-TURN)) + +(DEFUN ALTER () + (COND ((NOT (GET 'GAME 'BEING-PLAYED)) + (CURSORPOS NIL 0. TYO) + (CURSORPOS 'L TYO) + (PRINC '|Complement: | TYO) + (LET ((C (TYI TYI))) + (SETQ C (ASCII (COND ((AND (> C 96.) (< C 123.)) + (SETQ C (- C 32.))) + (T C)))) + (TERPRI TYO) + (COND ((MEMQ C OBJECT-LIST) + (*COMPLEMENT C) + (PRINC `(,C |has been complemented|) TYO)) + (T + (PRINC `(|No node | ,C |... Request ignored|) TYO))) + (WASH))) + (T + (TERPRI TYO) + (PRINC '|(Game in progress. Don't try to cheat!)| TYO) + (WASH)))) + +(DEFUN MAYBE () (ZEROP (RANDOM 2.))) + +(DEFUN *RANDOMIZE () + (COND ((GET 'GAME 'BEING-PLAYED) + (TERPRI TYO) + (PRINC '|(Can't Randomize. Game in progress)| TYO)) + (T + (RANDOMIZE) + (PARITY-CHECK) + (TERPRI TYO) + (PRINC '|(Randomized)| TYO))) + (WASH)) + +(DEFUN RANDOMIZE () + (MAPC (LAMBDA (X) (COND ((MAYBE) (*COMPLEMENT X)))) + OBJECT-LIST)) + +(SETQ MODE () // 0. \ 0.) + +(DEFUN GAME-END-CHECK () + (COND ((GET 'GAME 'BEING-PLAYED) + (DO ((S (STATE (CAR OBJECT-LIST))) + (X (CDR OBJECT-LIST) (CDR X))) + ((NULL X) + (TYO 7. TYO) + (SET S (1+ (EVAL S))) + (SETQ MODE '|(Game Over)|) + (REMPROP 'GAME 'BEING-PLAYED)) + (COND ((NOT (EQ S (STATE (CAR X)))) + (RETURN ()))))))) + +(DEFUN GAME-BEGIN () + (COND ((GET 'GAME 'BEING-PLAYED) + (TERPRI TYO) + (PRINC '|(Game already going?)| TYO)) + (T + (SETQ MODE '|(Game in Progress)|) + (INIT-TURN) + (PUTPROP 'GAME T 'BEING-PLAYED) + (COND ((ZEROP (RANDOM 2.)) + (SRESET DIAMOND-1)) + (T + (SRESET DIAMOND-2))) + (PRINC '|(Game started)| TYO) + (WASH)))) + +(DEFUN GAME-RESTART () + (COND ((GET 'GAME 'BEING-PLAYED) + (TERPRI TYO) + (PRINC '|(Game already going?)| TYO)) + (T + (SETQ MODE '|(Game in Progress)|) + (PUTPROP 'GAME T 'BEING-PLAYED) + (PRINC '|(Game started)| TYO) + (WASH)))) + +(DEFUN PARITY-CHECK () + (LET ((P PARITY-LIST)) + (DO ((X P (CDR X)) + (I 0.)) + ((NULL X) + (COND ((ODDP (+ I)) (*COMPLEMENT (NTH (RANDOM 6.) P))))) + (COND ((EQ (STATE (CAR X)) '//) (SETQ I (1+ I))))))) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;; TTY On/Off Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; This section of code written by RWK. + +;;; If this is the first time loading the file, save out info on tty +;;; initial specifications. + +(COND ((NOT (BOUNDP 'TTY-SPEC-INFO)) + (SETQ TTY-SPEC-INFO (SYSCALL 3. 'TTYGET TYI)))) + +;;; TTY-OFF +;;; Turns off automatic echo of input chars on the tty. + +(DEFUN TTY-OFF () + (SYSCALL 0 'TTYSET TYI + (BOOLE 1 (CAR TTY-SPEC-INFO) 3272356035.) + (BOOLE 1 (CADR TTY-SPEC-INFO) 3272356035.))) + +;;; TTY-ON +;;; Re-enable automatic echo of input-chars on the tty. + +(DEFUN TTY-ON () + (SYSCALL 0 'TTYSET TYI + (CAR TTY-SPEC-INFO) + (CADR TTY-SPEC-INFO))) + + +(DEFUN SGET () + (LET ((IBASE 2.)) + (READLIST (APPEND (MAPCAR 'SGET1 OBJECT-LIST) '(32.))))) + +(DEFUN SGET1 (X) + (COND ((EQ (STATE X) '//) '/0) + (T '/1))) + +(DEFUN SRESET (X) + (LET ((BASE 2.)) + (MAPC 'SRESET1 + (EXTEND (MAPCAR (FUNCTION (LAMBDA (X) (- X 48.))) (EXPLODEN X))) + OBJECT-LIST))) + +(DEFUN EXTEND (X) + (COND ((= (LENGTH X) (LENGTH OBJECT-LIST)) X) + (T (EXTEND (CONS 0. X))))) + +(DEFUN SRESET1 (STATE OBJECT) + (PUTPROP OBJECT + (COND ((ZEROP STATE) '//) + (T '\)) + 'STATE)) + +(DEFUN SRECALL () + (TERPRI TYO) + (COND ((NOT (GET 'GAME 'BEING-PLAYED)) + (SRESET REMEMBER) + (PRINC '|(State Recalled)| TYO)) + (T + (PRINC '|(Game in progress. Can't hack states.)| TYO))) + (WASH)) + +(DEFUN SREMEMBER () + (TERPRI TYO) + (SETQ REMEMBER (SGET)) + (PRINC '|(State Stored)| TYO) + (WASH)) + + +(DEFUN SHORT-RULES () + (PRINC SHORT-RULES TYO) + (WASH)) + +(DEFUN LONG-RULES () + (CURSORPOS 'C TYO) + (*CATCH 'MORE-FLUSH + (PROGN + (DO ((I 1. (1+ I)) + (END (FLATC LONG-RULES)) + (C)) + ((> I END)) + (SETQ C (GETCHARN LONG-RULES I)) + (COND ((= C 12.) + (TERPRI TYO) + (CURSORPOS 'E TYO) + (CLEAR-INPUT TYI) + (PRINC '|--Type a Space to See More--| TYO) + (COND ((NOT (= (TYI TYI) 32.)) + (*THROW 'MORE-FLUSH T))) + (CURSORPOS 0. 0. TYO)) + ((= C 13.) + (CURSORPOS 'L TYO) + (TYO C TYO)) + (T + (TYO C TYO)))) + (TERPRI TYO) + (PRINC '|--Pause--| TYO) + (CURSORPOS 'E TYO) + (TYI TYI))) + (CURSORPOS 'C TYO)) + + +(DO ((I 0. (1+ I))) + ((> I 127.)) + (SSTATUS TTYINT I NIL)) +(SSTATUS TOPLEVEL '(PROGN (CLEAR-INPUT TYI) (EXECUTE))) +(SETQ TTY-RETURN '(LAMBDA N (CURSORPOS 'C TYO) + (DISPLAY) + (TERPRI TYO) + (TERPRI TYO))) + +(LET ((INIT-FILE (PROBEF `((DSK ,(STATUS HSNAME)) ,(STATUS USERID) THINK)))) + (COND (INIT-FILE (LOAD INIT-FILE)))) + +(INIT '+) + +(SETQ REMEMBER 0.) + +(NOINTERRUPT NIL) + diff --git a/src/games/wa.(init) b/src/games/wa.(init) new file mode 100644 index 00000000..053892ab --- /dev/null +++ b/src/games/wa.(init) @@ -0,0 +1,349 @@ + +(comment) + +(progn ;don't print out stuff + (princ '|Please wait while I get ready|) + (alloc '(REGPDL 120000.)) + (alloc '(SPECPDL 48000.)) + (alloc '(FIXPDL 24000.)) + (alloc '(LIST 75000.)) + (alloc '(SYMBOL 48000.)) + (alloc '(FIXNUM 75000.)) + (alloc '(FLONUM 75000.)) + (alloc '(BIGNUM 12000.)) + (alloc '(ARRAY 12000.)) + +(setsyntax '/ +'/ '/ ) + (defprop debug ((dsk rwk) debug fasl) autoload) + (defprop bt ((dsk rwk) debug fasl) autoload) + (setq *rset t) + ;;; SC-HELP calls for human intervention when appropriate. + + (defun g-*uwrite (name mode newdefault) + (DECLARE (SPECIAL UWRITE OUTFILES)) + (cond (uwrite + (setq outfiles (delq uwrite outfiles)) + (close uwrite) + (setq uwrite nil))) + ((lambda (file) + (setq outfiles + (cons (setq uwrite file) + outfiles)) + (car (defaultf newdefault))) + (open name mode))) + +(DEFUN G-TERPRI NIL + (DECLARE (SPECIAL GV-CURSORPOS G-SILENT *SS-ACTIVE)) + (SETQ GV-CURSORPOS 0.) + (COND ((AND G-SILENT + (OR *SS-ACTIVE + (NOT (CURSORPOS)) + (= (CDR (CURSORPOS)) 0.))) + (SETQ ^W T) + (TYO 13.) + (SETQ ^W NIL)) + (T (TYO 13.)))) + +(DEFUN SC-HELP (CAUSE) + (G-TSAY '(|****** This student's model is beyond my limitations. ******|)) + (COND ((< SL-REPEAT 0.0) + (SETQ SL-REPEAT 0.9) + (SC-UPDATE-MODEL))) + (SETQ SC-NOTEST CAUSE)) + + (DEFUN GCI-CREATE NARGS + (CONS (ARG 1.) + (GCI-WCREATE (ARG 1.) + NIL + (COND ((> (ARG NIL) 1.) (ARG 2.)))))) + + ;;; GCI-WCREATE does the actual work of WGI-CREAT. + + (DEFUN GCI-WCREATE (NUM LIST VALS) + (COND ((< NUM 1.) (RPLACD (LAST LIST) LIST)) + (T (GCI-WCREATE (1- NUM) + (CONS (GCI-VAL VALS) LIST) + (CDR VALS))))) + + ;;; GCI-VAL returns the appropriate value. + + (DEFUN GCI-VAL (VALS) (COND ((ATOM VALS) NIL) (T (CAR VALS)))) + + (ENDPAGEFN TYO NIL) + (SETSYNTAX 46. 128. NIL) + (SETQ IBASE 10. + BASE 10. + *NOPOINT T + *SS-ACTIVE nil + *SS-VERSION NIL + WE-VERSION '|eight| + WEV-RECREATE NIL + WE-GAME-HIST NIL + DB-NUM-CRULES 6. + DB-NUM-RULES 19. + DB-NUM-PROP 7. + DB-NUM-DPROP 18. + DB-DATE 0. + WAV-TOLD-RULE NIL + CX-WHY-BETTER NIL + CX-WHY-WORSE NIL + EGV-PLURAL 'EGV-PLURAL + EGV-BECAUSE '(|, because|) + EG-SPEC 'EG-SPEC + SC-LREPEAT 0.0 + SC-UREPEAT 5.0 + SC-LFORGET 2.0 + SC-UFORGET 30.0 + LEG-THEREFORE (GCI-CREATE 3. + '((|, and so|) + (|. Therefore|) + (|. Hence|))) + LEG-ALSO (GCI-CREATE 3. + '((|. Also,|) + (|, and|) + (|. Likewise,|))) + LEG-CONVERSELY (GCI-CREATE 2. + '((|. Conversely,|) + (|. In contrast,|))) + LEG-HOWEVER (GCI-CREATE 2. + '((|. However|) (|, but|))) + LWA-TELL-C4 (GCI-CREATE 3. + '((LIST '|I don't know,| + DB-NAME + '|, but|) + (LIST '|Well,| + DB-NAME + '|, I think that|) + (LIST '|You know,| + DB-NAME + '|,|))) + LWAW-TELL-WANDER (GCI-CREATE 3. + '((LIST DB-NAME + '|, we seem to be going in circles|) + (LIST '|I seem to remember just| + '|coming from that cave,| + DB-NAME) + (LIST '|We seem to be wandering aimlessly,| + DB-NAME))) + G-DOUBLESPACE NIL + G-LAST 32. + G-BLAST 32. + G-BBLAST 46. + G-SILENT nil + G-READ-NUM 1. + GV-CURSORPOS 0. + XP-P12-CHANGED NIL + SC-INCREASE-FORGET NIL + SC-DECREASE-FORGET NIL + SC-INCREASE-REPEAT NIL + SC-DECREASE-REPEAT NIL + SF-VAR-LIST '(DB-UNAME DB-NAME + DB-LAST-DATE + DB-NUMWINS + DB-NUMLOSSES + DB-MOVES + DB-DEBUG + DB-COMMENT + SL-REPEAT + SL-FORGET + SL-RECEPTIVITY + SL-HEARD-OF + WA-CAN-BACKTRACK + WA-TOLD-BACKTRACK + WE-MOVE-NUM + SL-LAST-LEARNED + SC-INITIALIZED + SL-TUTOR + DB-GAME-NUM + DB-HISTORY)) + (ARRAY ADB-CAVE T 1. DB-NUM-PROP) + (ARRAY ADB-DCAVE T 1. DB-NUM-DPROP 1.) + (ARRAY AEG-TELL-AVOID T 3. 3.) + (ARRAY ADB-TELL-WARNING T 3. 3.) + (ARRAY ADB-TELL-DANGER T 3. 3.) + (ARRAY ASK-WDRULES FIXNUM (1+ DB-NUM-RULES) 2. 3.) + (ARRAY ASK-DRULES FLONUM (1+ DB-NUM-RULES) 2. 3.) + (ARRAY AWE-EXPL-RULES T 16.) + (ARRAY ASL-PHASE-RULES T 5. 3.) + (ARRAY ASL-NEXT-RULES T 5. 3.) + (ARRAY ASL-PNUM-DANGERS T 5. 3.) + (ARRAY ASKC-RULES T 8. 3.) + (ARRAY AEG-NUMBER T 10.) + (MAPC (FUNCTION (LAMBDA (X) (*ARRAY X T 3.))) + '(AXS-CHANGED-SETS AEG-DANGER-SING AEG-DANGER-PLUR + ASL-WORK-ON-RULES AXR-FOUND-N AXS-EXACT-CAVES + AXS-PARTIAL-SETS AXS-COMPLETE-SETS + APS-RULE-ARRAY AEG-WARNING-PRES AEG-WARNING-PAST + ASC-INITIALIZED AEG-ENCOUNTER AWA-TOLD-RULES)) + (MAPC (FUNCTION (LAMBDA (X) (*ARRAY X 'FIXNUM 3.))) + '(ADB-NUM-DANGERS ADB-WARNING-DIST AXR-NUM-IDENTIFIED + ASL-PHASE ADB-DIST-START)) + (MAPC (FUNCTION (LAMBDA (X) (*ARRAY X 'FLONUM 3.))) + '(AXX-EST-NUM-DANGERS AXP-PROB12)) + (MAPC (FUNCTION (LAMBDA (X Y) + (DECLARE (SPECIAL EGV-PLURAL)) + (PUTPROP EGV-PLURAL Y X))) + '(|is cave| |is| |can| |could| |is rule|) + '(|are caves| |are| |can| |could| |are rules|)) + (MAPC (FUNCTION (LAMBDA (X Y) + (DECLARE (SPECIAL EG-SPEC)) + (PUTPROP EG-SPEC Y X))) + '(|were| |fell|) + '(|would have been| |would have fallen|)) + (MAPC (FUNCTION (LAMBDA (X Y) (STORE (ASKC-RULES X 1.) Y))) + '(7. 6. 5. 4. 3. 2. 1. 0.) + '(0. 2. 1. 2. 0. 0. 0. 0.)) + (MAPC (FUNCTION (LAMBDA (X A B C D E F G H I) + (STORE (ASL-PHASE-RULES X 0.) A) + (STORE (ASL-PHASE-RULES X 1.) B) + (STORE (ASL-PHASE-RULES X 2.) C) + (STORE (ASL-NEXT-RULES X 0.) D) + (STORE (ASL-NEXT-RULES X 1.) E) + (STORE (ASL-NEXT-RULES X 2.) F) + (STORE (ASL-PNUM-DANGERS X 0.) G) + (STORE (ASL-PNUM-DANGERS X 1.) H) + (STORE (ASL-PNUM-DANGERS X 2.) I))) + '(4. 3. 2. 1. 0.) + '((14.) (6. 10. 12. 13.) (4. 7. 11.) (0. 3. 5.) (1.)) + '((14.) (6. 9. 10. 12. 13.) (4. 7. 11.) (0. 3. 5.) + (1.)) + '((12. 13.) (6. 8. 9. 10. 11. 15.) (4. 7.) + (0. 2. 3. 5. 19.) (1.)) + '((14.) (12. 13.) (4. 7. 11.) (3. 5.) (1.)) + '((14.) (12. 13.) (4. 7. 11.) (3. 5.) (1.)) + '((12. 13.) (11.) (4. 7.) (3. 5. 19.) (1.)) + '(4. 3. 3. 2. 1.) + '(2. 3. 3. 2. 1.) + '(2. 1. 1. 1. 1.)) + (MAPC (FUNCTION (LAMBDA (W A B C D E) + (STORE (ASL-PHASE W) 0.) + (STORE (ASL-WORK-ON-RULES W) + (ASL-PHASE-RULES 0. W)) + (STORE (AEG-ENCOUNTER W) A) + (STORE (AEG-WARNING-PRES W) B) + (STORE (AEG-WARNING-PAST W) C) + (STORE (AEG-DANGER-SING W) D) + (STORE (AEG-DANGER-PLUR W) E))) + '(0. 1. 2.) + '((|were| |picked up by|) (|fell| |into|) + (|were| |eaten by|)) + '((|hear squeaking|) (|feel a breeze|) + (|smell the Wumpus|)) + '((|heard squeaking|) (|felt a breeze|) + (|smelled the Wumpus|)) + '((|bats|) (|a pit|) (|the Wumpus|)) + '((|bats|) (|pits|) (|the Wumpus|))) + (MAPC (FUNCTION (LAMBDA (X Y) (STORE (AEG-NUMBER X) Y))) + '(9. 8. 7. 6. 5. 4. 3. 2. 1. 0.) + '((|ten|) (|nine|) (|eight|) (|seven|) (|six|) + (|five|) (|four|) (|three|) (|two|) (|one|))) + (MAPC (FUNCTION (LAMBDA (X Y) (STORE (AWE-EXPL-RULES X) Y))) + '(15. 14. 13. 12. 11. 10. 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.) + '((|P15, Shooting Principle, Whenever the probability of| + |the Wumpus being in a cave exceeds 0.25, it is safer to| + |shoot into the cave before visitng it. Hence, the more| + |likely it is that the Wumpus is in the cave, the less| + |likely it is that the player will be killed.|) + (|P14, Adjust For Multiple Evidence Principle, In cases| + |where P13 is applied, the other members of said| + |cave-set are less likely to contain the danger.|) + (|P13, Multiple Evidence Principle, if there is multiple| + |evidence that a given cave contains a danger (i.e. it| + |is a member of two cave-sets), then it is more likely| + |that the given cave contains the danger.|) + (|P12, Explain Away Evidence Principle, When it is noted| + |that there are two cave-sets, one of which is a subset| + |of the other, there is no evidence that those caves| + |in the superset and not in the subset whether or| + |not said caves contain a danger (as the caves in the| + |subset completely explain the warning) so the| + |probability is reduced to some consistent value.|) + (|P11, Equal Likelihood Principle, An estimation of| + |the probability for a given cave is 1N, where N| + |is the number of caves in the smallest cave-set| + |of which said cave is a member.|) + (|L10, Certain caves can be marked as "more than zero| + |away" based on consideration of the different| + |complete cave-sets and the number of dangers. |) + (|L9, If the player encountered a danger in a cave,| + |then the cave does not contain a danger of higher| + |priority, i.e. the Wumpus eats the player before| + |he can fall into a pit, and he will fall into a| + |pit before he is picked up by bats.|) + (|L8, When the algorithm is creating cave-sets and| + |it encounters a cave which would be N caves away| + |but which is also "more than N away", then that cave| + |can not have any contributions to the cave-set. |) + (|L7, If a cave is "more than (N-1) away" and| + |"less than (N+1) away", then it is "N away". |) + (|L6, If all of a caves neighbors are "more than| + |(N-1) away", then it can be marked "more than N away". |) + (|L5, If a cave is marked "more than N away" then all| + |of its neighbors can be marked as "more than (N-1) away". |) + (|L4, If a cave is visited and there is a warning,| + |then that cave is "less than (N-1) away". |) + (|L3, If a cave is visited and there is not a warning,| + |then that cave is "more than N away" where N| + |is the distance that the warning propagates. |) + (|L2, If the player shoots an arrow into a cave| + |and does not kill the Wumpus, then that cave can| + |be marked as "more than zero away" (Wumpus). |) + (|L1, A cave can be marked as "more than zero| + |away" if it was safely visited. |) + (|L0, A cave can be marked as "zero away" if it| + |was visited and found to contain a danger. |))) + ;;; The other dangers are set when it is known how many there are. + (MAPC (FUNCTION (LAMBDA (W A X Y Z) + (STORE (AEG-TELL-AVOID W Z) A) + (STORE (ADB-TELL-WARNING W Z) X) + (STORE (ADB-TELL-DANGER W Z) Y))) + '(0. 1. 2. 0. 1. 2. 0. 1. 2.) + '((APPEND '(|it is not wise to visit caves with bats| + |because while THEY will not harm us| + |they will carry us to another cave which| + |could contain|) (AEG-DANGER-SING 1.) '(|or|) (AEG-DANGER-SING 2.)) + (APPEND + '(|we should avoid bats because they| + |could drop us in a cave with|) + (AEG-DANGER-SING 1.) + '(|or|) + (AEG-DANGER-SING 2.)) + '(|it is best to avoid bats as they could carry us to a fatal cave|) + (APPEND '(|we should try not to stumble into|) + (AEG-DANGER-SING 1.) + '(|as it would be fatal|)) + '(|we should avoid pits as they are fatal|) + '(|pits are dangerous as falling into one is fatal|) + (APPEND '(|it is best to avoid|) + (AEG-DANGER-PLUR 2.) + '(|as|) + (AEG-DANGER-PLUR 2.) + '(|eats unwary players who stumble into his lair|)) + '(|we should avoid Wumpii as they eat unwary players|) + '(|Wumpii are dangerous as they have insatiable| + |appetites for bumbling players|)) + '((|Squeak. I hear bats, they must be in one of the neighboring caves. |) + (|Squeak. I hear bats. |) (|Squeak. |) + (|Brrrr. I feel a breeze! We must be next to a pit. |) + (|Brrrr. I feel a breeze. |) (|Brrrr. |) + (|Whew, what a stench! That is the smell of the Wumpus. | + |It means that we are within two caves of the Wumpus. |) + (|What a stench! The Wumpus is near. |) + (|What a stench! |)) + '((|Bon Voyage! We have been picked up by bats! |) + (|Bon Voyage! Bats have picked us up. |) + (|Bon Voyage! |) + (|So Loonnngggggggg. We have fallen into a pit. |) + (|So Loonnngggggggg. We have fallen in a pit. |) + (|So Loonnngggggggg. |) + (|Oh no, the Wumpus is in here! Chomp Chomp Chomp. |) + (|Oh no, it's the Wumpus! Chomp Chomp Chomp. |) + (|Chomp Chomp Chomp. |)) + '(0. 0. 0. 1. 1. 1. 2. 2. 2.)) + (terpri) + (load '((dsk games) wa fasl)) + (princ '|thanks for waiting, we are about to begin|) + (restart)) + + \ No newline at end of file diff --git a/src/games/wa.10 b/src/games/wa.10 new file mode 100644 index 00000000..f8da722c --- /dev/null +++ b/src/games/wa.10 @@ -0,0 +1,6901 @@ + +;;; The functions have been organized into different modules +;;; as described in the paper about the Wumpus-Advisor. +;;; To help clarify the boundaries between the different +;;; functions and their respective domains, global variables +;;; and functions have been given prefixes to denote what +;;; tasks they are related to. In some cases it was not clear +;;; exactly what the prefix should have been, and so one +;;; was assigned somewhat arbitrarily. (This applies to the +;;; grey area between tasks). The reader can use the prefix as +;;; a general guide to the purpose of the different functions. +;;; +;;; WE_ This prefix indicates that the function +;;; is part of the highest level executive. +;;; +;;; WG_ This prefix is for functions dealing strictly with the +;;; game of the Wumpus itself. +;;; +;;; G_ This prefix is for general purpose routines that are used +;;; by many different modules and which expand LISP's capabilities. +;;; +;;; D_ This prefix is for the database maintenance routines. +;;; +;;; WA_ This prefix indicates that the function is considered +;;; to be part of the Wumpus-Advisor module. +;;; +;;; X_ This prefix is for the routines of the Wumpus Expert. +;;; +;;; C_ This prefix is for functions of the Move-Comparer +;;; module. +;;; +;;; PS_ This prefix is for the routines of the Psychologist module. +;;; +;;; S_ This is the prefix for the Student Model (a subset of the +;;; data base routines?). +;;; +;;; E_ This prefix is for functions of the English-Generation +;;; module. +;;; +;;; A__ Look again, this is not a function. It is an array. +;;; All arrays have the prefix of the module which +;;; maintains them preceded by an "A". (A prefix prefix?) +;;; +;;; L__ is the prefix prefix for variables which are circular lists. +;;; +;;; A "_" at the end of a prefix indicates that this slot may +;;; be used to further specify a sub-module within the given +;;; module. +;;; +;;; If the standard prefix is followed by an "R", then that +;;; function is a reference function, intended mainly to supply +;;; information to other modules. +;;; +;;; If the standard prefix is followed by a "V" then this is +;;; a variable which is set/used by a function of the same name. +;;; +;;; If the standard prefix is followed by a "T", then this +;;; function performs some tests before performing the expected tasks. +;;; +;;; Note that the three dangers are represented by numbers for +;;; efficiency, zero for bats, one for pits, and two for Wumpii. +;;; +;;; The information about the warren is stored in arrays. +;;; Danger specific information is keyed by: CAVE, ITEM, and DANGER. +;;; ITEMs are as follows +;;; 0 ... WG-DANGER +;;; 1 ... XD-MORE-THAN +;;; 2 ... XD-WHY-MORE-THAN +;;; 3 ... XD-LESS-THAN +;;; 4 ... XD-WHY-LESS-THAN +;;; 5 ... XD-EXACTLY +;;; 6 ... XD-WHY-EXACTLY +;;; 7 ... XS-MEMBER +;;; 8 ... XP-REDUNDANT +;;; 9 ... XP-PROB +;;; 10 .. XP-WHY-PROB +;;; 11 .. XP-P11 +;;; 12 .. XP-WHY-P12 +;;; 13 .. XP-P13 +;;; 14 .. XP-P14 +;;; 15 .. XP-WHY-P11 +;;; 16 .. XS-NUM +;;; 17 .. CX-PROB +;;; +;;; Other information about caves is keyed by: CAVE and ITEM. +;;; ITEMs are as follows: +;;; 0 ... WG-NEIGHBORS +;;; 1 ... WG-WARNINGS +;;; 2 ... XD-VISITED +;;; 3 ... XX-COST +;;; 4 ... XX-GAIN +;;; 5 ... XX-INDEX +;;; 6 ... XX-DANGERS + +(DECLARE (MUZZLED T)) + +(DECLARE (FIXNUM CAVE DANGER RULE O-CAVE O-DIST I J ORIGIN DIST B-MOVE W-MOVE)) + +(DECLARE (FLONUM PROB)) + +(DECLARE (*LEXPR SAVE WE-TELL-INFO-WORK WAW-GIVE-ROUTE GP-UNION + GC-MEMBER GC-AVERAGE WE-EXPL-RULE GCI-CREATE)) + +(DECLARE (*EXPR SC-HELP ENDPAGE CLOSE DEFAULTF MERGEF)) + +(DECLARE (ARRAY* (NOTYPE AEG-NUMBER 1. AXS-CHANGED-SETS 1. AEG-DANGER-SING 1. + AEG-DANGER-PLUR 1. ASL-WORK-ON-RULES 1. AXR-FOUND-N 1. + AXS-EXACT-CAVES 1. AXS-PARTIAL-SETS 1. AXS-COMPLETE-SETS 1. + APS-RULE-ARRAY 1. AEG-WARNING-PRES 1. AWE-EXPL-RULES 1. + AEG-WARNING-PAST 1. AEG-ENCOUNTER 1. AWA-TOLD-RULES 1. + ASL-PNUM-DANGERS 2. AEG-TELL-AVOID 2. ASL-PHASE-RULES 2. + ASL-NEXT-RULES 2. ADB-DCAVE 2. ADB-CAVE 2. ASKC-RULES 2. + ASC-INITIALIZED 1. ADB-TELL-DANGER 2. ADB-TELL-WARNING 2.) + (FIXNUM ADB-NUM-DANGERS 1. ADB-WARNING-DIST 1. + AXR-NUM-IDENTIFIED 1. ASL-PHASE 1. + ADB-DIST-START 1. ASK-WDRULES 3.) + (FLONUM AXX-EST-NUM-DANGERS 1. AXP-PROB12 1. ASK-DRULES 3.))) + +(DEFUN BEGIN NIL + (or (boundp we-version)(di-database)) + (SUSPEND)(*SS-INITIALIZE) (RESTART)) + +(DEFUN RESTART NIL + (DECLARE (SPECIAL *SS-ACTIVE G-SILENT)) + (or (boundp we-version)(di-database)) + (DI-INITIALIZE) + (WE-SESSION-LOOP) + (DB-END-SESSION) + (G-RISAY '(|I am returning you to top level|)) + (quit) + 'TRUTH) + +(DEFUN NOLINK NIL (*RSET T) (NOUUO T) (SSTATUS UUOLINKS)) + +;;; WE-SESSION-LOOP is the highest level loop of the executive. +;;;It cycles the player through the different games. + +(DEFUN WE-SESSION-LOOP NIL + (DECLARE (SPECIAL DB-NUMWINS WE-NORESTART DB-NUMLOSSES DB-HISTORY)) + (PROG NIL + AGAIN(COND ((DB-DEFINE-GAME) NIL) (T (GO END))) + (DB-INIT-NEWGAME) + LOOP (COND + ((WE-GAME-LOOP) + (SETQ DB-NUMWINS (1+ DB-NUMWINS) DB-HISTORY (CONS 1. DB-HISTORY))) + (WE-NORESTART + (SETQ DB-NUMLOSSES (1+ DB-NUMLOSSES) DB-HISTORY (CONS 0. DB-HISTORY))) + (T + (SETQ DB-NUMLOSSES (1+ DB-NUMLOSSES) DB-HISTORY (CONS 0. DB-HISTORY)) + (G-RSAY + '(|Would you like to take back your last move? |)) + (COND ((GQ-EVAL (G-READ 'NEW-GAME)) + (GO LOOP))))) + END (DB-END-GAME) + (G-RSAY (APPEND '(|Your record is|) + (EG-NUMBER DB-NUMWINS) + '(|wins and|) + (EG-NUMBER DB-NUMLOSSES) + '(|losses. |))) + (G-RSAY '(|Would you like to play again? |)) + (COND ((GQ-EVAL (G-READ 'NEW-GAME)) (GO AGAIN))))) + +;;; WE-GAME-LOOP is the executive that cycles through +;;;the different moves of the game. + +(DEFUN WE-GAME-LOOP NIL + (DECLARE (SPECIAL WE-DONE WE-RETURN WE-MOVE WE-LAST-MOVE + XD-VISITED-CAVES WG-HERE WE-DONE WE-MOVE-NUM)) + (DO ((WE-DONE NIL) (WE-RETURN NIL)) + (WE-DONE WE-RETURN) + (WA-SAYSTATUS) + (G-RSAY '(|What now? |)) + (WE-ERR-CHECK '(WA-UPDATE WG-HERE)) + (SETQ WE-MOVE (G-READ 'MOVE)) + (G-TERPRI) + (G-TERPRI) + (COND ((EQ WE-MOVE 'SHOOT) + (WE-SHOOT) + (SETQ WE-MOVE-NUM (1+ WE-MOVE-NUM))) + ((WE-CHECK-MOVE WE-MOVE)) + ((WE-ERR-CHECK '(WA-ANALYZE WE-MOVE))) + (T (SETQ WE-LAST-MOVE WG-HERE) + (SC-UPDATE-RECEPTIVITY WE-MOVE) + (COND ((NOT (MEMBER WE-MOVE XD-VISITED-CAVES)) + (SETQ WE-MOVE-NUM (1+ WE-MOVE-NUM)))) + (WG-MOVETO WE-MOVE))))) + +;;; WE-CHECK-MOVE is the function which insures that the move is a legal move. +;;;It returns nil if the move is a good move. + +(DEFUN WE-CHECK-MOVE (MOVE) + (DECLARE (SPECIAL WAD-KNOWNAREA WG-HERE WE-NORESTART WE-DONE + DB-NUM-CAVES)) + (COND + ((EQ MOVE 'ROUTE) (WE-GIVE-ROUTE) T) + ((EQ MOVE 'INFO) + (WA-UPDATE-FRINGE WG-HERE) + (WE-TELL-INFO) + T) + ((EQ MOVE 'VISITED) + (WA-UPDATE-FRINGE WG-HERE) + (WE-TELL-VISITED) + T) + ((EQ MOVE 'QUIT) + (SETQ WE-NORESTART T) + (SETQ WE-DONE T)) + ((NOT (FIXP MOVE)) + (G-RSAY '(|Please enter one of the following:|)) + (G-RISAY '(|A neighboring cave number. |)) + (G-RISAY '(|SHOOT, if you would like to shoot an arrow. |)) + (G-RISAY + '(|VISITED, if you would like to know the| + |caves we have visited. |)) + (G-RISAY + '(|INFO, if you would like to know about a| + |cave that we have already visited. |)) + (G-RISAY '(|ROUTE, if you would like a route to a cave. |)) + (G-RISAY + '(|(SAVE), if you would like to send some comments to my programmer. |)) + (G-RISAY '(|QUIT, if you would like to quit this game. |)) + T) + ((GP-CAVE-CHECK MOVE) T) + ((= MOVE WG-HERE) T) + ((MEMBER MOVE (WGR-NEIGHBORS WG-HERE)) NIL) + ((MEMBER MOVE WAD-KNOWNAREA) + (G-RSAY (LIST '|We can not go directly to cave| + MOVE + '|from cave| + WG-HERE + '|. |)) + T) + (T (G-RSAY (LIST '|We can not get to cave| + MOVE + '|from here. |)) + T))) + +;;; WE-TELL-VISITED tells the user what caves he has visited. + +(DEFUN WE-TELL-VISITED NIL + (DECLARE (SPECIAL XD-VISITED-CAVES)) + (G-RSAY (APPEND '(|We have visited|) + (EG-INSERT-AND '|cave| XD-VISITED-CAVES) + '(|. |)))) + +;;; WE-TELL-INFO tells the player about a cave that +;;;has been previously visited. + +(DEFUN WE-TELL-INFO NIL + (DECLARE (SPECIAL XD-VISITED-CAVES)) + (PROG (RESPONSE) + (WE-TELL-INFO-WORK) + LOOP (G-RSAY + '(|Would you like to find out about another cave? |)) + (SETQ RESPONSE (G-READ 'NO)) + (COND ((MEMBER RESPONSE XD-VISITED-CAVES) + (WE-TELL-INFO-WORK RESPONSE) + (GO LOOP)) + ((GQ-EVAL RESPONSE) (WE-TELL-INFO))))) + +;;; WE-TELL-INFO-WORK does the actual work of WE-TELL-INFO. + +(DEFUN WE-TELL-INFO-WORK NARGS + (PROG (CAVE) + (COND + ((= (ARG NIL) 0.) + (G-RSAY '(|What cave would you like to know about? |)) + (SETQ CAVE (G-READ 'CAVE))) + (T (SETQ CAVE (ARG 1.)))) + (G-TERPRI) + (COND + ((GP-CAVE-CHECK CAVE)) + ((NOT (XDR-VISITEDP CAVE)) + (G-RSAY (APPEND '(|We have not yet visited cave|) + (LIST CAVE '|. |)))) + (T + (G-RSAY (APPEND '(|The neighbors of cave|) + (LIST CAVE) + (EG-INSERT-AND '|is cave| + (WGR-NEIGHBORS CAVE)) + '(|. |))) + (G-RSAY + (APPEND + '(|It has|) + (EG-INSERT-AND + '|warning| + (MAPCAR + (FUNCTION + (LAMBDA (X) + (IMPLODE + (APPEND '(34.) + (EXPLODEN (CAR (ADB-TELL-WARNING 2. X))) + '(34.))))) + (WGR-WARNINGS CAVE))) + '(|. |))))) + (G-TERPRI))) + +;;; WE-GIVE-ROUTE gives routes to the player. + +(DEFUN WE-GIVE-ROUTE NIL + (DECLARE (SPECIAL WG-HERE WAD-FRINGE)) + (WAD-UPDATE-DIST WG-HERE) + (PROG (RESPONSE) + (WAW-GIVE-ROUTE) + LOOP (G-RSAY + '(|Would you like to give another destination? |)) + (SETQ RESPONSE (G-READ 'NO)) + (COND ((AND (MEMBER RESPONSE WAD-FRINGE) + (NOT (MEMBER RESPONSE + (WGR-NEIGHBORS WG-HERE)))) + (WAW-GIVE-ROUTE RESPONSE) + (GO LOOP)) + ((GQ-EVAL RESPONSE) (WE-GIVE-ROUTE))))) + +;;;....WE-SHOOT is the shoot function used by the WUMPUS-ADVISOR. + +(DEFUN WE-SHOOT NIL + (DECLARE (SPECIAL WE-SHOT WG-HERE WE-DONE)) + (WA-UPDATE-FRINGE WG-HERE) + (G-RSAY '(|Into which cave would you like to shoot? |)) + (SETQ WE-SHOT (G-READ 'SHOOT)) + (COND ((GP-CAVE-CHECK WE-SHOT)) + ((= WE-SHOT WG-HERE) + (G-RSAY '(|You have just shot yourself! |)) + (SETQ WE-DONE T)) + ((NOT (MEMBER WE-SHOT (WGR-NEIGHBORS WG-HERE))) + (G-RSAY (LIST '|You cant't shoot from cave| + WG-HERE + '|to| + WE-SHOT + '|. |))) + ((WE-ERR-CHECK '(WA-SHOOT-ANALYZE WE-SHOT))) + (T (SC-UPDATE-RECEPTIVITY (LIST 'SHOOT WE-SHOT)) + (WG-SHOOT WE-SHOT)))) + +;;; WE-NOTE-DANGER is called anytime a danger is encountered. + +(DEFUN WE-NOTE-DANGER (DANGER) + (DECLARE (SPECIAL WE-MOVE)) + (WA-TELL-DANGER DANGER) + (COND (WE-MOVE (*SXD-MARK-DANGER WE-MOVE DANGER) + (XD-MARK-DANGER WE-MOVE DANGER) + (SETQ WE-MOVE NIL)))) + +;;;********* The following routines are debugging routines. ******** +;;; WE-ERR-CHECK is intended to catch errors before the student +;;;is made aware of them. + +(DEFUN WE-ERR-CHECK (LIST) + (DECLARE (SPECIAL WEV-ERROR DB-DEBUG)) + (PROG (TEMP) + (COND (WEV-ERROR NIL) + (DB-DEBUG (RETURN (EVAL LIST))) + ((EQ (ERRSET (SETQ TEMP (EVAL LIST)) NIL) NIL) + (WE-ERROR LIST) + (RETURN NIL)) + (T (RETURN TEMP))))) + +;;; WE-ERROR is called whenever the Wumpus Advisor discovers an error. + +(DEFUN WE-ERROR (FUNC) + (DECLARE (SPECIAL DB-NAME WEV-ERROR WE-DONE WE-RETURN)) + (G-TSAY (LIST '|Bug at| FUNC '!)) + (COND + ((NOT WEV-ERROR) + (G-RISAY (LIST DB-NAME + '|, I am feeling very sick. I have called| + '|my doctor, but I don't think I will be| + '|able to finish this game. Would you like| + '|to finish this game alone? |)) + (COND ((NOT (GQ-EVAL (G-READ 'NO))) + (SETQ WE-DONE T WE-RETURN T))))) + (SETQ WEV-ERROR T) + (SAVE FUNC) + '(|Blah! |)) + +;;; SAVE saves all relevant imformation about the game. + +(DEFUN SAVE NARGS + (DECLARE (SPECIAL DB-UNAME WE-VERSION WE-GAME-HIST DB-TIME + DB-USER-ID WE-LAST-SESSION WE-THIS-SESSION + DB-OLD-USER-FILE DB-DEBUG)) + (PROG (TEMP MESSAGE) + (COND + ((= (ARG NIL) 0.) + (G-RSAY + '(|Please enter your impression of what| + |the problem is. End your comments| + |with two semicolons (followed by a| + |space). For example.... |)) + (G-RISAY '(|The problem is ... ;;|)) + (G-TERPRI) + (SETQ MESSAGE (G-READ-RESPONSE))) + (T (SETQ MESSAGE (ARG 1.)))) + (SETQ TEMP (STATUS CRUNIT)) + (G-APPEND-FILE (LIST 'bugs8 DB-USER-ID 'second 'ejs)) + (SETQ ^R T ^W T) + (PRIN1 (LIST DB-TIME + DB-DEBUG + WE-GAME-HIST + WE-VERSION + WE-LAST-SESSION + WE-THIS-SESSION + DB-OLD-USER-FILE + MESSAGE)) + (APPLY 'UFILE (LIST 'bugs8 DB-USER-ID 'second 'ejs)) + (SETQ ^R NIL ^W NIL) + (APPLY 'CRUNIT TEMP) + (COND ((= (ARG NIL) 0.) + (G-TSAY '(|*** Save finished. ***|)))))) + + +;;; WE-RECREATE is used to recreate a game situation that has been +;;;saved. It assumes that BEGIN has been called at least once. + +(DEFUN WE-RECREATE NIL + (DECLARE (SPECIAL FILE INFO HER-VERSION USER-FILE MESSAGE DB-TIME + WEV-RECREATE WE-VERSION G-DOUBLESPACE WE-LAST-SESSION + WE-THIS-SESSION)) + (PROG (FILE INFO HER-VERSION USER-FILE MESSAGE) + (SETQ G-DOUBLESPACE NIL) + (G-RSAY '(|What file would you like for me to read? |)) + (SETQ FILE (G-READ NIL)) + (APPLY 'UREAD FILE) + (SETQ ^Q T + INFO (READ)) + (MAPC 'SET + '(DB-TIME DB-DEBUG WEV-RECREATE HER-VERSION + WE-LAST-SESSION WE-THIS-SESSION USER-FILE + MESSAGE) + INFO) + (SF-STORE-USER-FILE USER-FILE) + ;;; Note that the moves were stored in reverse order. + (SETQ WEV-RECREATE (REVERSE WEV-RECREATE)) + (G-RSAY (LIST '|She was playing on version| + HER-VERSION + '|. |)) + (G-RSAY (LIST '|I am version| + WE-VERSION + '|. |)) + (G-RSAY (APPEND '(|Her message was:|) + (LIST MESSAGE) + '(|. |))) + (DB-DEFINE-GAME) + (DB-INIT-NEWGAME) + (G-RSAY '(|Would you like for me to make the moves? |)) + (COND ((GQ-EVAL (READ))) + (T (G-RSAY (APPEND '(|Her moves were;|) + WEV-RECREATE)) + (SETQ WEV-RECREATE NIL))) + (WE-GAME-LOOP))) + +;;; WE-*COMMANDS tells the user the different * commands that are available. + +(DEFUN WE-*COMMANDS NIL + (G-RSAY '(|The following commands are available:|)) + (G-RISAY '(|*? to print this out. |)) + (G-RISAY '(|*MODEL to see the Student Knowledge Model. |)) + (G-RISAY '(|*VARIABLE to see the Student Model variables. |)) + (G-RISAY + '(|*NOTUTOR to keep the Advisor from tutoring the student. |)) + (G-RISAY + '(|*TUTOR to turn on the Wumpus Advisor's tutor (this is the default). |)) + (G-RISAY + '(|*SEQUENCE to go through the standard sequence of warrens. |)) + (G-RISAY + '(|*COMMENT to have Wusor print out pedagaogical comments. |)) + (G-RISAY + '(|*NOCOMMENT to turn off the pedagogical commands. |)) + (G-RISAY + '(|*INDEX to get the expert's evaluation of the fringe caves. |)) + (G-RISAY + '(|*PROB (followed by a cave and a danger's initial) gives| + |the probability that a particular danger is in a cave. |)) + (G-RISAY + '(|*RULES (followed by a cave and a danger's initial) gives| + |the rules used in computing a probability for a cave. |)) + (G-RISAY + '(|*EXPL-RULES explains the meaning of various rules.|)) + (G-RISAY + '(|*EXPLAIN (followed by a cave and a danger's initial)| + |explains a probability for a cave. |)) + (G-RISAY '(|*CHEAT to get the location of the dangers. |)) + (G-RISAY + '(|*NUMB causes Wusor to output the interaction number. |)) + (G-RISAY '(|*NONUMB turns off these interaction numbers. |)) + (G-RISAY '(|*DEBUG to output any error messages, etc.. |)) + (G-RISAY '(|*NODEBUG to turn off the debugging features. |)) + (G-RISAY + '(|*EXEC to allow the evaluation of S-expressions. |))) + +;;; WE-CHEAT This function prints out where the bats, pits, and Wumpus are. + +(DEFUN WE-CHEAT NIL + (DECLARE (SPECIAL DB-NUM-CAVES)) + (G-RSAY '(| Cave Neighbors Wumpus Pit Bat|)) + (DO ((CAVNUM 0. (1+ CAVNUM))) + ((> CAVNUM (1- DB-NUM-CAVES))) + (G-RSAY (LIST '| | CAVNUM)) + (G-PSAY (WGR-NEIGHBORS CAVNUM) 8.) + (DO ((DANGER 2. (1- DANGER)) + (CURSOR 22. (+ CURSOR 5.))) + ((< DANGER 0.)) + (G-PSAY (COND ((WGR-DANGERP CAVNUM DANGER) '(Y)) + (T '(N))) + CURSOR)))) + +;;; WE-WRITE-INDEX outputs the experts work for the caves it is sent. + +(DEFUN WE-WRITE-INDEX (CAVE-LIST) + (COND + ((NULL CAVE-LIST) + (G-RISAY + '(|A "*" after the cave number indicates that these figures| + |reflect shooting into the cave before visiting it.|)) + (G-RSAY '(|Cave Cost Gain Index|))) + (T (WE-WRITE-INDEX (CDR CAVE-LIST)) + (G-RSAY (LIST '| | + (GP-MAKN (CAR CAVE-LIST) + (COND ((XPR-SHOOTP (CAR CAVE-LIST)) + '*) + (T '| |))))) + (G-PSAY (LIST (XXR-COST (CAR CAVE-LIST))) 8.) + (G-PSAY (LIST (XXR-GAIN (CAR CAVE-LIST))) 22.) + (G-PSAY (LIST (XXR-INDEX (CAR CAVE-LIST))) 36.)))) + +;;; WE-PROB explains the prob for a cave. + +(DEFUN WE-PROB NIL + (PROG (CAVE DANGER) + (SETQ CAVE (WE-GET-CAVE) DANGER (WE-GET-DANGER)) + (G-RISAY (APPEND '(|The probability of|) + (AEG-DANGER-SING DANGER) + (LIST '|being in cave| + CAVE + '|is|) + (LIST (XPR-PROB CAVE DANGER) + '|. |))))) + +;;; WE-RULES gives the rules used in the computation of the probability. + +(DEFUN WE-RULES NIL + (PROG (CAVE DANGER) + (SETQ CAVE (WE-GET-CAVE) DANGER (WE-GET-DANGER)) + (G-RISAY + (APPEND + '(|The rules used in the computation of the probability of|) + (AEG-DANGER-SING DANGER) + (LIST '|in cave| CAVE) + (EG-INSERT-AND '|is rule| + (CXR-PROB CAVE DANGER)) + '(|. |))))) + +;;; WE-EXPL-RULES explains a series of rules. + +(DEFUN WE-EXPL-RULES NIL + (PROG (RESPONSE) + (WE-EXPL-RULE) + LOOP (G-RSAY + '(|Would you like to find out about another rule? |)) + (SETQ RESPONSE (G-READ 'NO)) + (COND ((GP-NUM-TEST RESPONSE 20.) + (WE-EXPL-RULE RESPONSE) + (GO LOOP)) + ((GQ-EVAL RESPONSE) (WE-EXPL-RULES))))) + +;;; WE-EXPL-RULE does the actaul explanations. + +(DEFUN WE-EXPL-RULE NARGS + (PROG (RESPONSE) + (COND ((= (ARG NIL) 0.) + (G-RSAY '(|Please a rule number (0 to 15). |)) + (SETQ RESPONSE (G-READ 0.))) + (T (SETQ RESPONSE (ARG 1.)))) + (COND ((GP-NUM-TEST RESPONSE 16.) + (G-RSAY (AWE-EXPL-RULES RESPONSE))) + (T (G-RSAY (LIST '|There is no rule| + RESPONSE + '|. |)))))) + +;;; WE-EXPLAIN explains the probability for a given danger and cave. + +(DEFUN WE-EXPLAIN NIL + (PROG (CAVE DANGER) + (SETQ CAVE (WE-GET-CAVE) DANGER (WE-GET-DANGER)) + (G-RISAY (APPEND (EXR-PROB CAVE DANGER NIL) + '(|. |))) + (WA-MARK-RULES '|explain|))) + +;;; WE-GET-CAVE gets a cave number from the player. + +(DEFUN WE-GET-CAVE NIL + (DECLARE (SPECIAL DB-NUM-CAVES)) + (PROG (RESPONSE) + (COND ((GP-NUM-TEST (SETQ RESPONSE (G-SREAD 'CAVE)) + DB-NUM-CAVES) + (RETURN RESPONSE)) + (T (G-RSAY '(|Please enter a cave number. |)) + (RETURN (WE-GET-CAVE)))))) + +;;; WE-GET-DANGER gets the danegr from the player. + +(DEFUN WE-GET-DANGER NIL + (PROG (RESPONSE) + (COND + ((EQ (SETQ RESPONSE (G-SREAD 'B)) 'B) + (RETURN 0.)) + ((EQ RESPONSE 'P) (RETURN 1.)) + ((EQ RESPONSE 'W) (RETURN 2.)) + (T + (G-RSAY + '(|Please enter a danger's initial (B, P, or W). |)) + (RETURN (WE-GET-DANGER)))))) + +;;; WE-EXECUTE allows a debugger to execute commands +;;;without stopping the game. + +(DEFUN WE-EXECUTE NIL + (PROG (VAR) + (G-RSAY '(|Please enter an S-Expression. |)) + (COND ((SETQ VAR (G-READ NIL)) + (G-RSAY (ERRSET (EVAL VAR) T)) + (WE-EXECUTE))))) + + + +;;;************* The Wumpus Advisor Routines. ************ +;;; WA-ANALYZE analyzes the players desire to move to CAVE. +;;;A retrun value of NIL indicates that the player should be +;;;allowed to go ahead with the move. + +(DEFUN WA-ANALYZE (MOVE) + (DECLARE (SPECIAL WAM-NEXT-MOVE WA-CAN-BACKTRACK WE-LAST-MOVE + SL-REPEAT SL-TUTOR)) + (PS-UPDATE-MODEL MOVE) + (COND (WAM-NEXT-MOVE (WAM-TRANSPOSE-MOVE MOVE)) + ((EQUAL MOVE WE-LAST-MOVE) + (SETQ WA-CAN-BACKTRACK (1+$ WA-CAN-BACKTRACK)) + NIL) + ((NOT SL-TUTOR) NIL) + ((WAW-ROUTE-CHECK MOVE)) + ((XDR-VISITEDP MOVE) NIL) + ((SL-ADVISEP MOVE) NIL) + ((< WA-CAN-BACKTRACK SL-REPEAT) (WA-BACKTRACK MOVE)) + ((WA-CHECK-BETTER MOVE) (GQ-GO-AHEAD MOVE)) + ((WA-SHOOT-CHECK MOVE)))) + +;;; WA-SHOOT-ANALYZE analyzes the players desire shoot into CAVE. +;;;A return value of NIL indicates that the player should be +;;;allowed to go ahead with the shot. + +(DEFUN WA-SHOOT-ANALYZE (CAVE) + (DECLARE (SPECIAL WG-ARROWS LWA-CRULES DB-NAME)) + (COND + ((XPR-SHOOTP CAVE) (PS-MARK-SHOT CAVE) NIL) + ((SL-ADVISEP (LIST 'SHOOT CAVE)) NIL) + ((GC-MEMBER LWA-CRULES 9. 1.) NIL) + ((CMR-SAFEP CAVE '(2.)) + (G-RISAY + (APPEND (EXR-PROB CAVE 2. NIL) + '(|, and, if we shoot an arrow into cave|) + (LIST CAVE) + '(|, it could ricochet back and kill us. |))) + (PS-UNMARK-SHOT CAVE) + (WA-TOLD-RULE 15. 2.) + (WA-NOTE-ADVICE -1. (LIST 'SHOOT CAVE) 9.) + (WA-MARK-RULES 9.) + (GQ-SHOOT-ANYWAY CAVE)) + ((> (XPR-PROB CAVE 2.) 0.3) NIL) + ((NOT (WGR-EXTRA-ARROWS)) + (G-RISAY + (APPEND + '(|As we only have|) + (EG-NUMBER WG-ARROWS) + (EGT-PLURAL '(|arrow|) WG-ARROWS) + '(|left,|) + (LIST DB-NAME) + '(|, it might be wise to save this| + |arrow until we are more certain| + |of the location of|) + (AEG-DANGER-SING 2.) + '(|. |))) + (WA-NOTE-ADVICE -1. (LIST 'SHOOT CAVE) 9.) + (GQ-SHOOT-ANYWAY CAVE)) + ((> (XPR-PROB CAVE 2.) 0.21) NIL) + ((SLR-OK-RULESP (CXR-PROB CAVE 2.) 2.) + (G-RISAY + (APPEND + (EXR-PROB CAVE 2. NIL) + (LIST '|,| DB-NAME) + '(|, and a missed arrow is more dangerous than that. |))) + (PS-UNMARK-SHOT CAVE) + (WA-NOTE-ADVICE -1. (LIST 'SHOOT CAVE) 9.) + (WA-MARK-RULES 9.) + (GQ-SHOOT-ANYWAY CAVE)) + ((> (XPR-PROB CAVE 2.) 0.15) NIL) + (T + (G-RISAY + (APPEND + (LIST DB-NAME) + '(|, it is unlikely that cave|) + (LIST CAVE '|contains|) + (AEG-DANGER-SING 2.) + '(|, and we are more likely to be| + |killed by a missed arrow richocheting| + |through the warren. |))) + (PS-UNMARK-SHOT CAVE) + (WA-NOTE-ADVICE -1. (LIST 'SHOOT CAVE) 9.) + (GQ-SHOOT-ANYWAY CAVE)))) + +;;;....WA-SAYSTATUS outputs the game info as appropriate. + +(DEFUN WA-SAYSTATUS NIL + (DECLARE (SPECIAL WEV-ERROR WG-HERE)) + (G-RSAY (LIST '|We are now at cave| + WG-HERE + '|. |)) + (G-RSAY (APPEND '(|The neighboring caves are|) + (EG-INSERT-AND '|cave| + (WGR-NEIGHBORS WG-HERE)) + '(|. |))) + (COND ((NOT WEV-ERROR) + (MAPC (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL WG-HERE)) + (*SXD-MARK-NOWARNING WG-HERE X) + (XD-MARK-NOWARNING WG-HERE X))) + (GP-REMOVE-LIST '(0. 1. 2.) + (MAPC 'WA-NOTE-WARNING + (WGR-WARNINGS WG-HERE)))) + (*SXD-MARK-VISITED WG-HERE '(0. 1. 2.)) + (XD-MARK-VISITED WG-HERE '(0. 1. 2.))) + (T (MAPC 'WA-NOTE-WARNING + (WGR-WARNINGS WG-HERE)))) + (G-TERPRI)) + +;;; WA-UPDATE updates the database as necessary for each move. + +(DEFUN WA-UPDATE (CAVE) + (DECLARE (SPECIAL XX-CHANGED WAD-FRINGE WE-MOVE)) + (COND ((OR (MEMBER CAVE WAD-FRINGE) + ;;; This is in case we are picked up by bats. + (NOT WE-MOVE)) + (SETQ XX-CHANGED T) + (WA-UPDATE-FRINGE CAVE))) + (XX-UPDATE)) + +;;; WA-UPDATE-FRINGE updates the fringe, dist caves, and best-moves. + +(DEFUN WA-UPDATE-FRINGE (CAVE) + (DECLARE (SPECIAL WAW-GIVEN-ROUTE)) + (WAD-UPDATE-DIST CAVE) + (XX-UPDATE-MOVES) + (SETQ WAW-GIVEN-ROUTE NIL)) + +;;; WA-TELL-DANGER tells the player he has encountered a danger. + +(DEFUN WA-TELL-DANGER (DANGER) + (G-RSAY (ADB-TELL-DANGER (ASK-WDRULES 17. 0. DANGER) DANGER)) + (COND ((< (ASK-WDRULES 17. 0. DANGER) 2.) + (STORE (ASK-WDRULES 17. 0. DANGER) + (1+ (ASK-WDRULES 17. 0. DANGER)))))) + +;;; WA-NOTE-WARNING tells the player when he receives a warning. + +(DEFUN WA-NOTE-WARNING (DANGER) + (DECLARE (SPECIAL WEV-ERROR WG-HERE)) + (COND ((NOT WEV-ERROR) (XD-MARK-WARNING WG-HERE DANGER))) + (*SXD-MARK-WARNING WG-HERE DANGER) + (G-RSAY (ADB-TELL-WARNING (ASK-WDRULES 16. 0. DANGER) DANGER)) + (COND ((< (ASK-WDRULES 16. 0. DANGER) 2.) + (STORE (ASK-WDRULES 16. 0. DANGER) + (1+ (ASK-WDRULES 16. 0. DANGER)))))) + +;;; WA-BACKTRACK tells the student about backtracking if +;;;it is appropriate. (i.e. there is a good example). + +(DEFUN WA-BACKTRACK (MOVE) + (DECLARE (SPECIAL BETTER-MOVE XD-VISITED-CAVES WG-HERE)) + (PROG (BETTER-CAVE BETTER-MOVE TEMP) + (COND + ((NOT (XXR-DANGERS MOVE))) + ((SETQ + BETTER-CAVE + (GM-FIRST-TRUE + (FUNCTION + (LAMBDA (X) + (DECLARE (SPECIAL BETTER-MOVE WG-HERE)) + (COND + ((WGR-WARNINGS X) NIL) + ((SETQ + BETTER-MOVE + (GM-FIRST-TRUE + (FUNCTION (LAMBDA (Y) + (DECLARE (SPECIAL WAD-FRINGE WG-HERE)) + (AND (MEMBER Y WAD-FRINGE) + (NOT (MEMBER Y (WGR-NEIGHBORS WG-HERE)))))) + (WGR-NEIGHBORS X))))))) + XD-VISITED-CAVES)) + ;;; If controls gets to here, there was + ;;;a BETTER-MOVE (and BETTER-CAVE). + (WA-TELL-BACKTRACK MOVE BETTER-CAVE BETTER-MOVE TEMP) + (RETURN (COND ((GQ-GO-AHEAD MOVE)) + (T (WA-UPDATE-FRINGE WG-HERE) NIL))))))) + +;;; WA-TELL-BACKTRACK actually tells the player +;;;of the advantages of backtracking. + +(DEFUN WA-TELL-BACKTRACK (MOVE BETTER-CAVE BETTER-MOVE TEMP) + (DECLARE (SPECIAL WA-TOLD-BACKTRACK DB-NAME)) + (MAPC 'WA-TOLD-RULE + '(1. 1. 1.) + '(0. 1. 2.)) + (WA-NOTE-ADVICE BETTER-MOVE MOVE 8.) + (COND + (WA-TOLD-BACKTRACK (G-RISAY (LIST DB-NAME '|,|))) + ((SETQ WA-TOLD-BACKTRACK T) + (G-RSAY (LIST DB-NAME + '|, did you know that we can backtrack| + '|to caves that we have already visited? |)) + (COND ((GQ-EVAL (G-READ 'NO)) + (G-RISAY '(|Oh,... well then|))) + (T (G-RISAY '(|Well we can, so|)))))) + (G-SAY + (APPEND '(|why not go back to cave|) + (LIST BETTER-CAVE) + '(|where we didn't get any warnings at all. |) + '(|From there we can safely go to cave|) + (LIST BETTER-MOVE) + '(|without risking|) + (EG-DANGERS (XXR-DANGERS MOVE)) + '(|. |) + (COND ((SETQ TEMP (EGT-TELL-AVOID (XXR-DANGERS MOVE))) + (APPEND TEMP '(|. |)))))) + (WA-MARK-RULES 8.) + (*SS-TOLD-MOVE BETTER-MOVE MOVE 8.)) + +;;; WA-CHECK-BETTER sees if their is a better move that is +;;;explainable. If so, it tells the student about it and +;;;asks the student if he wants to go ahead with his move. + +(DEFUN WA-CHECK-BETTER (MOVE) + (DECLARE (SPECIAL MOVE DB-NUM-CRULES LWA-CRULES SL-MODE WG-HERE XX-BEST-MOVES)) + (PROG (BETTER-MOVES DANGERS) + (WA-UPDATE-FRINGE WG-HERE) + (COND + ((SETQ + BETTER-MOVES + (GM-ALL-TRUE + (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL MOVE LWA-BAD-MOVES LWA-GOOD-MOVES)) + (AND (NOT (GC-MEMBER LWA-GOOD-MOVES + X)) + (NOT (GC-MEMBER LWA-BAD-MOVES + X)) + (XXR-BETTER-MOVEP X MOVE)))) + XX-BEST-MOVES)) + ;;; If control gets to here there were better moves. + (G-RSAY '(|Hummmm. |)) + (G-TSAY + (APPEND + '(|*** Better moves which I have not| + |mentioned to the student recently are|) + (EG-INSERT-AND '|cave| BETTER-MOVES) + '(|. ***|))) + (SETQ DANGERS (XXR-DANGERS MOVE)) + ;;; Here we compute whether or not it is acceptable + ;;;to explain a given combination rule according + ;;;to how recently said rule was last explained. + (DO ((I 0. (1+ I))) + ((> I DB-NUM-CRULES)) + (STORE (ASKC-RULES I 2.) + (OR SL-MODE + (NOT (GC-MEMBER LWA-CRULES + I + (ASKC-RULES I 1.)))))) + (COND ((WA-CHECK-C6 (CAR XX-BEST-MOVES) MOVE) + (RETURN T)) + ((AND (ASKC-RULES 5. 2.) + (NOT (XSR-MEMBER MOVE 2.)) + (WA-CHECK-C5 BETTER-MOVES MOVE)) + (RETURN T)) + ((AND (ASKC-RULES 7. 2.) + (WA-CHECK-C7 BETTER-MOVES MOVE)) + (RETURN T)) + ((NOT DANGERS) NIL) + ((WA-CRULES BETTER-MOVES + MOVE + DANGERS + NIL + DANGERS) + (RETURN T))))))) + +;;; WA-CRULES implements rules C0 thru C4. They are combined +;;;together as for each cave, at most one rule can apply. It +;;;looks at the best move first, if for some reason that move +;;;can not be explained, it looks at the next move and so on. +;;;S-DANGERS contains those dangers which could be the identical. +;;;To insure that all possibilities are tried, it both chooses +;;;the first danger in O-DANGERS and doesn't choose it until +;;;there are no more caves in O-DANGERS. Then it begins its +;;;checks. At this point O-DANGERS is reset to those dangers +;;;which H-MOVE possesses, but the selected move does not (supposedly). + +(DEFUN WA-CRULES (BETTER-MOVES H-MOVE H-DANGERS S-DANGERS O-DANGERS) + (COND ((NULL BETTER-MOVES) NIL) + ;;; Choose all possibilities. + (O-DANGERS (OR (WA-CRULES BETTER-MOVES + H-MOVE + H-DANGERS + (CONS (CAR O-DANGERS) + S-DANGERS) + (CDR O-DANGERS)) + (WA-CRULES BETTER-MOVES + H-MOVE + H-DANGERS + S-DANGERS + (CDR O-DANGERS)))) + ;;; Does C0 apply? + ((AND (NULL S-DANGERS) + (CMR-SAFEP (CAR BETTER-MOVES) '(0. 1. 2.))) + ;;; If inappropriate to speak, return NIL (no speak). + (COND ((ASKC-RULES 0. 2.) + (WA-TELL-C0 (CAR BETTER-MOVES) + H-MOVE + H-DANGERS)))) + ;;; Does C1 apply? + ((AND (NULL S-DANGERS) + (ASKC-RULES 1. 2.) + (SLC-KNOWS-RULEP 0.) + (CMR-BETTER-PROBSP (CAR BETTER-MOVES) + H-MOVE + H-DANGERS) + (CMR-SAFEP (CAR BETTER-MOVES) + (GP-REMOVE-LIST '(0. 1. 2.) + H-DANGERS))) + (WA-TELL-C1 (CAR BETTER-MOVES) H-MOVE H-DANGERS)) + ;;; Does C4 apply? + ((AND (NULL S-DANGERS) + (ASKC-RULES 4. 2.) + (NOT (MEMBER 0. H-DANGERS)) + (EQUAL (XXR-DANGERS (CAR BETTER-MOVES)) + '(0.))) + (WA-TELL-C4 (CAR BETTER-MOVES) H-MOVE H-DANGERS NIL)) + ;;; We have tried all possibilities for this cave, + ;;;so try next cave. + ((NULL S-DANGERS) + (WA-CRULES (CDR BETTER-MOVES) + H-MOVE + H-DANGERS + NIL + H-DANGERS)) + ;;; Does C2 apply? + ((AND (CMR-SAME-DANGERSP H-MOVE + (CAR BETTER-MOVES) + S-DANGERS) + (SETQ O-DANGERS (GP-REMOVE-LIST H-DANGERS + S-DANGERS)) + (CMR-SAFEP (CAR BETTER-MOVES) + (GP-REMOVE-LIST '(0. 1. 2.) + S-DANGERS))) + ;;; If inappropriate to speak, return NIL (no speak). + (COND ((ASKC-RULES 2. 2.) + (WA-TELL-C2 (CAR BETTER-MOVES) + H-MOVE + S-DANGERS + O-DANGERS)))) + ;;; Does C3 apply? (Note that O-DANGERS is set with + ;;;a value only if S-DANGERS were O.K.) + ((AND O-DANGERS + (ASKC-RULES 3. 2.) + (SLC-KNOWS-RULEP 1.) + (SLC-KNOWS-RULEP 2.) + (CMR-BETTER-PROBSP (CAR BETTER-MOVES) + H-MOVE + (GP-REMOVE-LIST H-DANGERS + S-DANGERS)) + (CMR-SAFEP (CAR BETTER-MOVES) + (GP-REMOVE-LIST '(0. 1. 2.) + (APPEND S-DANGERS + H-DANGERS)))) + (WA-TELL-C3 (CAR BETTER-MOVES) + H-MOVE + S-DANGERS + O-DANGERS)) + ;;; Does C4 apply, but with dangers in common. + ((AND O-DANGERS + (ASKC-RULES 4. 2.) + (NOT (MEMBER 0. H-DANGERS)) + (GP-EQUIV (XXR-DANGERS (CAR BETTER-MOVES)) + (CONS 0. S-DANGERS))) + (WA-TELL-C4 (CAR BETTER-MOVES) + H-MOVE + O-DANGERS + S-DANGERS)))) + +;;; WA-TELL-C0 does the actual explanation of C0. + +(DEFUN WA-TELL-C0 (B-MOVE H-MOVE H-DANGERS) + (DECLARE (SPECIAL DB-NAME)) + (G-RISAY + (APPEND (LIST DB-NAME) + '(|, we don't need to risk|) + (EG-DANGERS H-DANGERS) + (LIST '|in cave| H-MOVE '|as cave|) + (LIST B-MOVE '|is safe. |) + (EXR-SAFE-CAVE B-MOVE + (CMR-EXPLAIN-DANGER B-MOVE + B-MOVE + H-DANGERS)) + (COND ((GP-TEST H-DANGERS) + (APPEND (LIST '|. Likewise, cave| + B-MOVE) + '(|is safe from the other dangers|)))) + '(|. |))) + (WA-TOLD-MOVE B-MOVE H-MOVE 0.)) + +;;; WA-TELL-C1 does the actual explanation of C1 if appropriate. + +(DEFUN WA-TELL-C1 (B-MOVE H-MOVE H-DANGERS) + (DECLARE (SPECIAL DB-NAME)) + (G-RISAY + (APPEND + (LIST DB-NAME) + '(|, it isn't necessary to take such large risks with|) + (EG-DANGERS H-DANGERS))) + (WA-COMP-PROBS B-MOVE H-MOVE H-DANGERS) + (WA-TOLD-MOVE (WA-COMP-CHECK B-MOVE) H-MOVE 1.)) + +;;; WA-TELL-C2 does the actual explanation of C2. + +(DEFUN WA-TELL-C2 (B-MOVE H-MOVE S-DANGERS O-DANGERS) + (DECLARE (SPECIAL DB-NAME)) + (G-RISAY + (APPEND + (LIST DB-NAME) + '(|, I can see why we are risking|) + (EG-DANGERS S-DANGERS) + '(|, but we don't need to risk|) + (EG-DANGERS O-DANGERS) + '(|. |) + (EXR-SAFE-CAVE B-MOVE + (CMR-EXPLAIN-DANGER B-MOVE B-MOVE O-DANGERS)) + (COND ((GP-TEST O-DANGERS) + (APPEND (LIST '|. Likewise, cave| B-MOVE) + '(|is safe from the other dangers|)))) + (EG-THEREFORE) + '(|we might want to explore cave|) + (LIST B-MOVE '|instead of cave| H-MOVE '|. |))) + (WA-TOLD-MOVE B-MOVE H-MOVE 2.)) + +;;; WA-TELL-C3 does the actual explanation of C3 if appropriate. + +(DEFUN WA-TELL-C3 (B-MOVE H-MOVE S-DANGERS O-DANGERS) + (DECLARE (SPECIAL DB-NAME)) + (G-RISAY + (APPEND '(|I can see why we are risking|) + (EG-DANGERS S-DANGERS) + (LIST '|,| DB-NAME) + '(|, but we don't need to take such large risks with|) + (EG-DANGERS O-DANGERS))) + (WA-COMP-PROBS B-MOVE H-MOVE O-DANGERS) + (WA-TOLD-MOVE (WA-COMP-CHECK B-MOVE) H-MOVE 3.)) + +;;; WA-TELL-C4 explains instances of C4 to the student. + +(DEFUN WA-TELL-C4 (B-MOVE H-MOVE O-DANGERS S-DANGERS) + (DECLARE (SPECIAL LWA-TELL-C4 DB-NAME)) + (COND + (S-DANGERS (G-RISAY (APPEND (LIST DB-NAME) + '(|I can see why we are risking|) + (EG-DANGERS S-DANGERS) + '(|, but|)))) + (T (G-RISAY (EVAL (GC-NEXT LWA-TELL-C4))))) + (G-SAY (APPEND '(|I would rather risk bats in cave|) + (LIST B-MOVE '|than|) + (EG-DANGERS O-DANGERS) + (LIST '|in cave| H-MOVE '|. |))) + (WA-TOLD-MOVE B-MOVE H-MOVE 4.)) + +;;; WA-CHECK-C5 checks if C5 applies and explains if appropriate. + +(DEFUN WA-CHECK-C5 (BETTER-MOVES H-MOVE) + (COND ((NULL BETTER-MOVES) NIL) + ((AND (NOT (XSR-GET-MEMBER-SETS (CAR BETTER-MOVES) 2.)) + (XSR-MEMBER (CAR BETTER-MOVES) 2.) + (SLR-OK-RULESP (CXR-VALUE (CAR BETTER-MOVES)) 2.)) + (WA-TELL-C5 (CAR BETTER-MOVES) H-MOVE)) + (T (WA-CHECK-C5 (CDR BETTER-MOVES) H-MOVE)))) + +;;; WA-TELL-C5 tells the player about C5, etc.. + +(DEFUN WA-TELL-C5 (B-MOVE H-MOVE) + (DECLARE (SPECIAL DB-NAME)) + (G-RISAY + (APPEND (LIST '|cave| B-MOVE) + '(|is a very good cave to explore,|) + (LIST DB-NAME '|, as we know that|) + (EXT-CAVE-SET (CAAR (XSR-MEMBER B-MOVE 2.)) + 2. + T + (CADAR (XSR-MEMBER B-MOVE 2.))) + (EG-THEREFORE) + '(|if we visit cave|) + (LIST B-MOVE) + '(|we will gain information about the location of|) + (AEG-DANGER-SING 2.) + '(|. |))) + (WA-TOLD-MOVE B-MOVE H-MOVE 5.)) + +;;; WA-COMP-PROBS makes a comparison of two probs for DANGERS. + +(DEFUN WA-COMP-PROBS (BETTER WORSE DANGERS) + (DECLARE (SPECIAL BETTER WHY-BETTER WHY-WORSE DB-NAME)) + (PROG (T-DANGER WHY-BETTER WHY-WORSE) + ;;; First insure that there will actually be a comparison. + (SETQ + DANGERS + (GM-ALL-TRUE + (FUNCTION (LAMBDA (X) (DECLARE (SPECIAL BETTER)) + (NOT (GP-EQ (XPR-PROB BETTER X) + 0.0)))) + DANGERS) + T-DANGER + (CAR (CMR-EXPLAIN-DANGER BETTER WORSE DANGERS))) + (WA-SET-WHY BETTER WORSE T-DANGER) + (G-SAY + (APPEND + '(|. |) + (EC-EXPL-PROBS BETTER WHY-BETTER WORSE WHY-WORSE T-DANGER) + (COND ((GP-TEST DANGERS) + (APPEND '(|. Likewise cave|) + (LIST BETTER) + '(|involves less risk from|) + (EG-DANGERS (GP-DELETE T-DANGER + DANGERS))))) + (EG-THEREFORE) + (LIST '|,| DB-NAME) + (LIST '|, we might want to explore cave| BETTER) + '(|instead. |))))) + +;;; WA-SET-WHY chooses the appropriate rationale for the explanation + +(DEFUN WA-SET-WHY (BETTER WORSE DANGER) + (DECLARE (SPECIAL CX-COMPARE CX-WHY-BETTER CX-WHY-WORSE + WHY-BETTER WHY-WORSE)) + (COND ((AND (EQUAL CX-COMPARE (LIST BETTER WORSE)) + (NOT (SLR-OK-RULESP (APPEND (XPR-WHY-PROB WORSE DANGER) + (XPR-WHY-PROB BETTER DANGER)) + DANGER))) + (SETQ WHY-BETTER CX-WHY-BETTER + WHY-WORSE CX-WHY-WORSE)) + (T (SETQ WHY-BETTER (CAR (XPR-WHY-PROB BETTER DANGER)) + WHY-WORSE (CAR (XPR-WHY-PROB WORSE DANGER)))))) + +;;; WA-COMP-CHECK returns the appropriate good move. Depending +;;;on whether P15 was in the explanation. + +(DEFUN WA-COMP-CHECK (MOVE) + (COND ((AND (XPR-SHOOTP MOVE) (MEMBER 15. (AWA-TOLD-RULES 2.))) + (LIST 'SHOOT MOVE)) + (T MOVE))) + +;;; WA-SHOOT-CHECK advises the player-to shoot-when appropriate. + +(DEFUN WA-SHOOT-CHECK (MOVE) + (DECLARE (SPECIAL DB-NAME)) + (COND + ((XPR-SHOOTP MOVE) + (G-RISAY + (APPEND '(|As it is|) + (EG-PROBABLE (XPR-GET-P14 MOVE 2.) NIL) + (LIST '|that cave| MOVE '|contains|) + (AEG-DANGER-SING 2.) + (LIST '|,| DB-NAME) + '(|, you might want to shoot an arrow into cave|) + (LIST MOVE) + (COND ((GP-EQ (XPR-GET-P14 MOVE 2.) 1.0) + '(|. |)) + (T '(|before we visit it. |))))) + (PS-MARK-NO-SHOT MOVE) + (WA-NOTE-ADVICE (LIST 'SHOOT MOVE) MOVE 9.) + (WA-MARK-RULES 9.) + (G-RSAY (LIST '|Would you like to shoot an arrow into cave| + MOVE + '|instead? |)) + (COND ((GQ-EVAL (G-READ 'DECIDE-NO)) + (WG-SHOOT MOVE) + T) + ((GQ-GO-AHEAD MOVE)))))) + +;;; WA-CHECK-C6 checks to see if C6 is applicable, and, if so, it +;;;makes the appropriate explanation. + +(DEFUN WA-CHECK-C6 (BEST H-MOVE) + (DECLARE (SPECIAL WA-TOLD-C6 DB-NAME)) + (COND + ((MEMBER BEST WA-TOLD-C6) NIL) + ((AND (ASKC-RULES 6. 2.) + (EQUAL (XXR-DANGERS BEST) '(0.)) + (> (XPR-PROB BEST 0.) 0.5)) + (G-RISAY + (APPEND + (LIST DB-NAME) + '(|, we seem to be surrounded by dangers. | + |It seems that bats are our best bet as| + |they might carry us to a safer| + |section of the warren. |) + (EXR-CAVE-PROB BEST 0. NIL) + '(|, and so cave|) + (LIST BEST) + '(|looks like a good move to me. |))) + (SETQ WA-TOLD-C6 (GP-CONS BEST WA-TOLD-C6)) + (WA-TOLD-MOVE BEST H-MOVE 6.)))) + +;;; WA-CHECK-C7 determines if C7 is applicable. + +(DEFUN WA-CHECK-C7 (B-CAVES H-MOVE) + (COND ((NULL B-CAVES) NIL) + ((AND (XPR-SHOOTP (CAR B-CAVES)) + (SLR-OK-RULESP (CXR-PROB (CAR B-CAVES) 2.) 2.)) + (WA-TELL-C7 (CAR B-CAVES) H-MOVE)) + ((WA-CHECK-C7 (CDR B-CAVES) H-MOVE)))) + +;;; WA-TELL-C7 advises the palyer to shoot into CAVE instead +;;;of visiting another cave. + +(DEFUN WA-TELL-C7 (CAVE H-MOVE) + (DECLARE (SPECIAL DB-NAME)) + (G-RISAY (APPEND (LIST '|Well,| DB-NAME '|,|) + ((GP-MAKN 'EXR-PROB (CADR (XPR-WHY-PROB CAVE 2.))) + CAVE + 2. + NIL) + '(|, and I would advise that we shoot into cave|) + (LIST CAVE '|. |))) + (WA-TOLD-MOVE (LIST 'SHOOT CAVE) H-MOVE 7.)) + +;;; WA-TOLD-MOVE marks that student has been told BETTER-MOVE. + +(DEFUN WA-TOLD-MOVE (BETTER-MOVE H-MOVE RULE) + (SKC-TOLD-RULE RULE) + (WA-MARK-RULES RULE) + (WA-NOTE-ADVICE BETTER-MOVE H-MOVE RULE) + (*SS-TOLD-MOVE BETTER-MOVE H-MOVE RULE) + T) + +;;; WA-NOTE-ADVICE notes that the advice has been given. + +(DEFUN WA-NOTE-ADVICE (BETTER WORSE RULE) + (DECLARE (SPECIAL LWA-CRULES LWA-GOOD-MOVES LWA-BAD-MOVES + LWA-MOVE-NUMS WE-MOVE-NUM)) + (GC-PUT LWA-CRULES RULE) + (GC-PUT LWA-GOOD-MOVES BETTER) + (GC-PUT LWA-BAD-MOVES WORSE) + (GC-PUT LWA-MOVE-NUMS WE-MOVE-NUM)) + +;;; WA-TOLD-RULE marks that the user will be told a rule. +;;;It is called by the English routines, which is somewhat +;;;kludge like, but ..... + +(DEFUN WA-TOLD-RULE (RULE DANGER) + (DECLARE (SPECIAL WAV-TOLD-RULE)) + (SETQ WAV-TOLD-RULE T) + (STORE (AWA-TOLD-RULES DANGER) + (GP-CONS RULE (AWA-TOLD-RULES DANGER)))) + +;;; WA-MARK-RULES actually marks the rules and explains them. + +(DEFUN WA-MARK-RULES (RULE) + (DECLARE (SPECIAL WAV-TOLD-RULE)) + (COND + (WAV-TOLD-RULE + (G-TSAY + (APPEND + '(|*** I have used:|) + (EG-INSERT-AND + NIL + (DO ((I 0. (1+ I)) (VAL NIL)) + ((> I 2.) VAL) + (COND ((AWA-TOLD-RULES I) + (SC-ADVISED (AWA-TOLD-RULES I) I) + (SETQ VAL + (CONS (EG-TOLD-RULES (AWA-TOLD-RULES I) + I) + VAL)))))) + '(|in explaining combination rule|) + (LIST RULE) + '(|. ***|))) + (DO ((I 0. (1+ I))) + ((> I 2.)) + (DO ((LIST (AWA-TOLD-RULES I) (CDR LIST))) + ((NULL LIST)) + (*SSK-TOLD-RULE (CAR LIST) I) + (SK-TOLD-RULE (CAR LIST) I)) + (STORE (AWA-TOLD-RULES I) NIL))) + (T + (G-TSAY + (APPEND '(|*** I have told the student combination rule|) + (LIST RULE) + '(|. ***|))))) + (SETQ WAV-TOLD-RULE NIL)) + +;;; ****** Wumpus Advisor Routines concerned with Distance, etc***** +;;; The following routines keep track of which caves +;;;can be reached in a given number of moves using the most direct +;;;route. wAs a side-effect they also keep track of which caves +;;;are in the known-area, which caves are on the fringe area, etc. +;;; WAD-GET-DIST returns all the caves that can be reached in DIST +;;;moves by the player if he takes the most direct route. The +;;;starting point is at DIST 0 and is the last fringe cave the +;;;player visited (usually). + +(DEFUN WAD-GET-DIST (DIST) (EVAL (GP-MAKN 'WAD-DIST- DIST))) + +;;; WAD-UPDATE-DIST is the function which ensures that the distances +;;;are correct before each move. It must be called prior to any +;;;extensive analysis. + +(DEFUN WAD-UPDATE-DIST (ORIGIN) + (DECLARE (SPECIAL WAW-ROUTE XD-VISITED-CAVES WAD-FRINGE WAD-KNOWNAREA)) + (DO ((DIST 0. (1+ DIST)) + (START (LIST ORIGIN)) + (KNOWN NIL (WAD-GET-DIST DIST)) + (NEW (LIST ORIGIN) (GP-DIST-AREA START 1.)) + (FRINGE NIL + (GP-UNION FRINGE + (GP-REMOVE-LIST NEW XD-VISITED-CAVES)))) + ((NULL START) + (SET (GP-MAKN 'WAD-DIST- DIST) NIL) + (SETQ WAD-KNOWNAREA KNOWN) + (SETQ WAD-FRINGE FRINGE) + (SETQ WAW-ROUTE (LIST ORIGIN))) + (SETQ START (GP-INTERSECTION (GP-REMOVE-LIST NEW KNOWN) + XD-VISITED-CAVES)) + (SET (GP-MAKN 'WAD-DIST- DIST) (GP-UNION NEW KNOWN)))) + +;;;********* Wumpus Advisor Routines dealing with routes. ********** +;;; WAW-ROUTE-CHECK checks to insure that the player does not spend an +;;;inordinate amount of time in the visited area. + +(DEFUN WAW-ROUTE-CHECK (MOVE) + (DECLARE (SPECIAL WAW-ROUTE WAD-FRINGE)) + (COND ((MEMBER MOVE WAD-FRINGE) NIL) + ((MEMBER MOVE WAW-ROUTE) (WAW-CORRECT-ROUTE MOVE)) + (T (SETQ WAW-ROUTE (CONS MOVE WAW-ROUTE)) NIL))) + +;;; WAW-CORRECT-ROUTE notifies the student that he is wandering +;;;and asks the student if he would like a route to a cave. + +(DEFUN WAW-CORRECT-ROUTE (MOVE) + (DECLARE (SPECIAL LWAW-TELL-WANDER WG-HERE)) + (G-RISAY (EVAL (GC-NEXT LWAW-TELL-WANDER))) + (G-SAY '(|, would you like a route to a cave? |)) + (COND ((GQ-EVAL (G-READ 'NO)) + (WA-UPDATE-FRINGE WG-HERE) + (WAW-GIVE-ROUTE) + T) + (T (WA-UPDATE-FRINGE MOVE) NIL))) + +;;; WAW-GIVE-ROUTE explains the best route to a destination +;;;supplied by the student or (ARG 1). + +(DEFUN WAW-GIVE-ROUTE NARGS + (DECLARE (SPECIAL WAW-GIVEN-ROUTE WG-HERE WAD-KNOWNAREA DB-NAME)) + (PROG (ROUTE DESTINATION) + (COND ((= (ARG NIL) 0.) + (G-RSAY '(|What cave would you like to go to? |)) + (SETQ DESTINATION (G-READ 'CAVE))) + (T (SETQ DESTINATION (ARG 1.)))) + (COND ((GP-CAVE-CHECK DESTINATION)) + ((= DESTINATION WG-HERE) + (G-RSAY '(|We're already there! |))) + ((MEMBER DESTINATION (WGR-NEIGHBORS WG-HERE)) + (G-RSAY (LIST '|Just move to cave| + DESTINATION + '|. |))) + ((MEMBER DESTINATION WAD-KNOWNAREA) + (SETQ WAW-GIVEN-ROUTE (CONS DESTINATION + WAW-GIVEN-ROUTE) + ROUTE (WAW-FIND-ROUTE DESTINATION 0.)) + (G-RSAY (APPEND '(|To get to cave|) + (LIST DESTINATION) + '(|,|) + (LIST DB-NAME) + '(|, we could move to|) + (EG-INSERT-AND '|cave| + (CDR ROUTE)) + '(|. |)))) + (T (G-RSAY (LIST '|We have not explored enough| + '|to develop a route to cave| + DESTINATION + '|from cave| + WG-HERE + '|. |)))))) + +;;; WAW-FIND-ROUTE finds a route to the given destination and returns it. + +(DEFUN WAW-FIND-ROUTE (DESTINATION DIST) + (DECLARE (SPECIAL DIST DB-ROUTE)) + (COND + ((MEMBER DESTINATION (WAD-GET-DIST DIST)) + (SETQ DB-ROUTE (LIST DESTINATION))) + (T + (SETQ DB-ROUTE (WAW-FIND-ROUTE DESTINATION (1+ DIST))) + (SETQ + DB-ROUTE + (CONS + (GM-FIRST-TRUE + (FUNCTION (LAMBDA (X) (DECLARE (SPECIAL DIST)) + (MEMBER X (WAD-GET-DIST DIST)))) + (XDR-VISITED-NEIGHBORS (CAR DB-ROUTE))) + DB-ROUTE))))) + +;;;********** Wumpus Advisor Routines to Modify the Game ********* +;;; WAM-TRANSPOSE-MOVE transposes the player's move if necessary. + +(DEFUN WAM-TRANSPOSE-MOVE (MOVE) + (DECLARE (SPECIAL WAM-NEXT-MOVE WG-HERE)) + (COND ((= WAM-NEXT-MOVE MOVE)) + ((MEMBER WAM-NEXT-MOVE (WGR-NEIGHBORS WG-HERE)) + (WGM-TRANSPOSE WAM-NEXT-MOVE MOVE)) + ((NOT (WGR-SAFEP MOVE)) + (DO ((CAVES (WGR-NEIGHBORS WG-HERE) (CDR CAVES))) + ((NULL CAVES)) + (COND ((WGR-SAFEP (CAR CAVES)) + (G-TSAY '(|*** I transposing the player's| + |move to avoid a danger. ***|)) + (WGM-TRANSPOSE (CAR CAVES) MOVE) + (SETQ CAVES NIL)))))) + (SETQ WAM-NEXT-MOVE NIL)) + +;;; WAM-MODIFY-GAME does the initial modification of the game. + +(DEFUN WAM-MODIFY-GAME NIL + (DECLARE (SPECIAL WAM-NEXT-MOVE DB-PHASE WG-HERE DB-NUM-CAVES TEST-PHASE)) + (SETQ WAM-NEXT-MOVE -1.) + (DO ((WORK-LIST (LIST DB-PHASE (1- DB-PHASE) (1+ DB-PHASE)) + (CDR WORK-LIST)) + (TEST-PHASE)) + ((NULL WORK-LIST)) + (SETQ TEST-PHASE (CAR WORK-LIST)) + (DO ((T-CAVE (RANDOM DB-NUM-CAVES) (GP-RANDEL O-CAVES)) + (O-CAVES (GP-ORDLST DB-NUM-CAVES))) + ((OR (NULL T-CAVE) (= TEST-PHASE -1.) (= TEST-PHASE 5.))) + (COND ((OR (NOT (WGR-SAFEP T-CAVE)) (WAM-BAD-CAVE T-CAVE)) + (SETQ O-CAVES (DELETE T-CAVE O-CAVES))) + ((WAM-OK-NEIGHBORS T-CAVE + (CAR (WGR-WARNINGS T-CAVE)) + (WGR-NEIGHBORS T-CAVE)) + (G-TSAY (LIST '|*** I am altering the game to| + '|create a situation appropriate| + '|for a player of phase| + TEST-PHASE + '|. ***|)) + (SETQ O-CAVES NIL WG-HERE T-CAVE)) + (T (SETQ O-CAVES (DELETE T-CAVE O-CAVES))))) + (COND ((NOT (= WAM-NEXT-MOVE -1.)) (SETQ WORK-LIST NIL))))) + +;;; WAM-BAD-CAVE checks out if CAVE is not a good starting cave. + +(DEFUN WAM-BAD-CAVE (CAVE) + (DECLARE (SPECIAL TEST-PHASE)) + (COND ((> TEST-PHASE 3.) (MEMBER 2. (WGR-WARNINGS CAVE))) + ((< TEST-PHASE 1.) (WGR-WARNINGS CAVE)) + ((EQUAL '(0.) (WGR-WARNINGS CAVE)) NIL) + ((EQUAL '(1.) (WGR-WARNINGS CAVE)) NIL) + (T T))) + +;;; WAM-OK-NEIGHBORS checks out to insure that there is an +;;;acceptable neighbor. + +(DEFUN WAM-OK-NEIGHBORS (CAVE WARNING W-CAVES) + (DECLARE (SPECIAL WAM-NEXT-MOVE)) + (COND ((NULL W-CAVES) NIL) + ((WAM-OK-WORK CAVE WARNING (CAR W-CAVES)) + (SETQ WAM-NEXT-MOVE (CAR W-CAVES))) + ((WAM-OK-NEIGHBORS CAVE WARNING (CDR W-CAVES))))) + +;;; WAM-OK-WORK does the actual checking for a particular neighbor. + +(DEFUN WAM-OK-WORK (CAVE WARNING NEIGHBOR) + (DECLARE (SPECIAL TEST-PHASE)) + (COND ((NOT (WGR-SAFEP NEIGHBOR)) NIL) + ((< TEST-PHASE 1.) (GP-INTERSECTION (WGR-WARNINGS NEIGHBOR) '(0. 1.))) + ((> TEST-PHASE 3.) T) + ;;; Throw out caves with bad geometry. + ;;; Phases 1 and 3 require a neighbor in common. + ((AND (OR (= TEST-PHASE 1.) (= TEST-PHASE 3.)) + (NOT (GP-INTERSECTION (WGR-NEIGHBORS CAVE) + (WGR-NEIGHBORS NEIGHBOR)))) + NIL) + ;;; Phase 2 requires a neighbor have a smaller cave-set. + ((AND (= TEST-PHASE 2.) + (NOT (< (LENGTH (WGR-NEIGHBORS NEIGHBOR)) + (LENGTH (WGR-NEIGHBORS CAVE))))) + NIL) + ((= TEST-PHASE 1.) + (EQUAL (WGR-WARNINGS NEIGHBOR) + (GP-DELETE WARNING '(0. 1.)))) + ;;; Hence we must have Phases 2 or 3. + (T (EQUAL (LIST WARNING) (WGR-WARNINGS NEIGHBOR))))) + +;;;************** The Wumpus Expert Routines ************* +;;; The logical rules are broken down into eight major +;;;categories. The four probability rules are also shown. +;;; For efficiency each rule that is to be taught has been +;;;aasigned a unique number (as shown after the rule memonic.) +;;;These numbers are used to access the arrays of the student-model. +;;;The last three entries are mainly entries in the student-model. +;;; +;;; L0 (0) A cave can be marked as "zero away" if it was +;;; visited and found to contain a "DANGER". +;;; +;;; L1 (1) A cave can be marked as "more than zero away" +;;; if it was safely visited. +;;; +;;; L2 (2) If the player shoots an arrow into a cave and +;;; does not kill the Wumpus, then that cave can +;;; be marked as "more than zero away" (Wumpus). +;;; +;;; L3 (3) If a cave is visited and there is not a warning, +;;; then that cave is "more than N away" where N +;;; is the distance that the warning propagates. +;;; +;;; L4 (4) If a cave is visited and there is a warning, then +;;; that cave is "less than (N+1) away". +;;; +;;; L5 (5) If a cave is marked "more than N away" then all +;;; of its neighbors must be at least "more than (N-1) +;;; away". +;;; +;;; L6 (6) If all of a caves neighbors are at least "more than +;;; (N-1) away", then it must be "more than N away". +;;; +;;; L7 (7) If a cave is "more than (N-1) away" and "less than +;;; (N+1) away", then it is "N away". +;;; +;;; L8 (8) When the algorithm is creating cave-sets and it +;;; encounters a cave which would be N caves away but +;;; which is also "more than N away", then that cave +;;; can not have any contributions to the cave-set. +;;; +;;; L9 (9) If a cave was found to contain a danger (through +;;; visitation), then it does not contain a danger of +;;; higher priority. +;;; +;;; L10 (10) Certain caves can be marked as "more than zero away" +;;; based on consideration of the different cave-sets. +;;; +;;; P11 (11) An estimationof the probability for a given cave is +;;; 1/N, where N is the number of caves in the smallest +;;; cave-set of which said cave is a member. +;;; +;;; P12 (12) For cases where there are two cave-sets, one of which +;;; is a subset of the other, there is no evidence at all +;;; with respect to the caves in the super-set, but not +;;; in the subset (as the caves in the subset completely +;;; explain the warning.) so the probability should be +;;; reduced to some consistent value. +;;; +;;; P13 (13) If a cave is a member of two cave-sets, then its +;;; probability should be increased above that assigned by P11. +;;; +;;; P14 (14) In cases where P13 is applied, the other members of said +;;; cave-sets should heve their probabilities reduced. +;;; +;;; P15 (15) This for those situations where the probability +;;; for the Wumpus being in a cave exceeds the probability +;;; for an arrow killing the player. +;;; +;;; R16 (16) This is for telling the student of warnings and +;;; their meanings. +;;; +;;; R17 (17) This is for telling the student about encounters +;;; with dangers. +;;; +;;; R18 (18) This is to advise the player to avoid dangers. +;;; +;;; For the exact formulas used for the probablity rules, +;;;see the paper about the Wumpus-Advisor. +;;; +;;; XX-UPDATE is the executive of the expert routines and +;;;evaluates the different moves. + +(DEFUN XX-UPDATE NIL + (DECLARE (SPECIAL XX-CHANGED WAD-FRINGE)) + (XX-UPDATE-WORK '(0. 1. 2.)) + (COND (XX-CHANGED (XX-COMBINE-PROB WAD-FRINGE) + (XX-UPDATE-MOVES) + (SETQ XX-CHANGED NIL)))) + +;;; XX-UPDATE-WORK computes the different probabilities for each danger. + +(DEFUN XX-UPDATE-WORK (DANGER-LIST) + (DECLARE (SPECIAL XX-CHANGED)) + (PROG (DANGER) + (COND + ((NULL DANGER-LIST)) + ((AXS-CHANGED-SETS (CAR DANGER-LIST)) + (SETQ XX-CHANGED T) + (XX-UPDATE-WORK (CDR DANGER-LIST)) + (SETQ DANGER (CAR DANGER-LIST)) + (XR-COUNT-NUM + (GP-INTERSECTION (AXS-CHANGED-SETS DANGER) + (AXS-COMPLETE-SETS DANGER)) + (AXS-COMPLETE-SETS DANGER) + DANGER) + (XP-RESET-PROB (AXS-CHANGED-SETS DANGER) NIL DANGER) + ;;; This is to reset CHANGED-SETS as the + ;;;probabilities have been updated. + (STORE (AXS-CHANGED-SETS DANGER) NIL)) + (T (XX-UPDATE-WORK (CDR DANGER-LIST)))))) + +;;; XX-MARK-SAFE is called whenever a cave is found by the database +;;;routines to be safe. + +(DEFUN XX-MARK-SAFE (CAVE DANGER) + ;;; These calls are necessary else the new + ;;;probs would never be calculated. + (XP-PUT-P11 CAVE -1.0 DANGER) + (XP-PUT-WHY-P11 CAVE NIL DANGER) + (XP-PUT-WHY-P12 CAVE NIL DANGER) + (XP-PUT-P13 CAVE -1.0 DANGER) + (XP-PUT-P14 CAVE -1.0 DANGER)) + +;;; XX-COMBINE-PROB combines the probabilities and calculates the INDEX. + +(DEFUN XX-COMBINE-PROB (WORK-CAVES) + (DECLARE (SPECIAL CAVE XX-BAT-KILL)) + (PROG (CAVE) + (COND + ((NULL WORK-CAVES)) + (T + (SETQ CAVE (CAR WORK-CAVES)) + (XX-COMBINE-PROB (CDR WORK-CAVES)) + (XX-PUT-DANGERS + CAVE + (GM-ALL-TRUE + (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL CAVE)) + (OR (AND (= X 2.) + (XPR-SHOOTP CAVE)) + (GP-LT 0.0 + (XPR-PROB CAVE X))))) + '(0. 1. 2.))) + (XX-PUT-COST + CAVE + (COND ((XPR-SHOOTP CAVE) (XPR-PROB CAVE 2.)) + (T (-$ 1.0 + (XX-MULT-PROB CAVE + '(0. 1. 2.) + (LIST XX-BAT-KILL + 1.0 + 1.0)))))) + (XX-PUT-GAIN CAVE + (+$ (*$ (XX-VALUE-MOVE CAVE) + (XX-MULT-PROB CAVE + '(0. 1. 2.) + '(1.0 1.0 1.0))) + (*$ (XX-VALUE-BAT) + (XPR-PROB CAVE 0.) + (XX-MULT-PROB CAVE + '(1. 2.) + '(1.0 1.0))) + (COND ((XPR-SHOOTP CAVE) + (*$ 5.0 (XPR-GET-P14 CAVE 2.))) + (T 0.0)))) + (XX-PUT-INDEX CAVE + (COND ((XDR-VISITEDP CAVE) -1.0) + ((GP-EQ 0.0 (XXR-COST CAVE)) + (*$ 10000.0 (XXR-GAIN CAVE))) + (T (//$ (XXR-GAIN CAVE) + (XXR-COST CAVE))))))))) + +;;; XX-MULT-PROB multiplies (1-P*V) for each danger sent. + +(DEFUN XX-MULT-PROB (CAVE DANGERS VALUES) + (COND ((NULL DANGERS) 1.0) + (T (*$ (XX-MULT-PROB CAVE (CDR DANGERS) (CDR VALUES)) + (-$ 1.0 + (*$ (CAR VALUES) + (XPR-PROB CAVE (CAR DANGERS)))))))) + +;;; XX-VALUE-MOVE returns the expected value from visiting a cave. +;;; Note that the two following routines presume a normal value of 1.0 +;;;for caves that are visited safely. + +(DEFUN XX-VALUE-MOVE (CAVE) + (COND ((XDR-VISITEDP CAVE) 0.0) + ((XSR-MEMBER CAVE 2.) 1.1) + (T 1.0))) + +;;; XX-VALUE-BAT returns the expected value from being picked up +;;;by bats. + +(DEFUN XX-VALUE-BAT NIL + (DECLARE (SPECIAL XD-VISITED-CAVES DB-NUM-CAVES)) + (//$ (-$ (FLOAT DB-NUM-CAVES) + (FLOAT (LENGTH XD-VISITED-CAVES)) + (AXX-EST-NUM-DANGERS 1.) + (AXX-EST-NUM-DANGERS 2.)) + (-$ (FLOAT DB-NUM-CAVES) (AXX-EST-NUM-DANGERS 0.)))) + +;;; XX-INIT-DANGER-EST initializes the array AXX-EST-NUM-DANGER +;;;and sets XX-BAT-KILL. + +(DEFUN XX-INIT-DANGER-EST NIL + (DECLARE (SPECIAL XX-BAT-KILL DB-NUM-CAVES)) + (DO ((I 2. (1- I)) (NOT-PROB 1.0)) + ((< I 0.) + (SETQ XX-BAT-KILL + (//$ (+$ (AXX-EST-NUM-DANGERS 1.) + (AXX-EST-NUM-DANGERS 2.)) + (-$ (FLOAT DB-NUM-CAVES) + (AXX-EST-NUM-DANGERS 0.))))) + (STORE (AXX-EST-NUM-DANGERS I) + (*$ NOT-PROB (FLOAT (ADB-NUM-DANGERS I)))) + (SETQ NOT-PROB + (*$ NOT-PROB + (//$ (FLOAT (- DB-NUM-CAVES (ADB-NUM-DANGERS I))) + (FLOAT DB-NUM-CAVES)))))) + +;;; XX-UPDATE-MOVES orders moves according to INDEX/DIST. + +(DEFUN XX-UPDATE-MOVES NIL + (DECLARE (SPECIAL WAD-FRINGE XX-BEST-MOVES)) + (SETQ XX-BEST-MOVES (XX-INSERT (CDR WAD-FRINGE) + (LIST (CAR WAD-FRINGE))))) + +;;; XX-INSERT orders the moves according to index. + +(DEFUN XX-INSERT (CAVE-LIST RESULT) + (COND ((NULL CAVE-LIST) RESULT) + ;;; does it go at the start? + ((GP-LT (XXR-INDEX (CAR RESULT)) (XXR-INDEX (CAR CAVE-LIST))) + (XX-INSERT (CDR CAVE-LIST) + (CONS (CAR CAVE-LIST) RESULT))) + ;;; are we at the end? + ((NULL (CDR RESULT)) + (XX-INSERT (CDR CAVE-LIST) + (GP-INSERT RESULT (CAR CAVE-LIST)))) + ;;; does it go right here? + ((GP-LT (XXR-INDEX (CADR RESULT)) + (XXR-INDEX (CAR CAVE-LIST))) + (XX-INSERT (CDR CAVE-LIST) + (GP-INSERT RESULT (CAR CAVE-LIST)))) + ;;; no, so try the next slot. + (T (XX-INSERT (LIST (CAR CAVE-LIST)) (CDR RESULT)) + (XX-INSERT (CDR CAVE-LIST) RESULT)))) + +;;; XXR-INDEX returns the expert's index for CAVE. + +(DEFUN XXR-INDEX (CAVE) (ADB-CAVE CAVE 5.)) + +;;; XX-PUT-INDEX puts the INDEX into the arrays. + +(DEFUN XX-PUT-INDEX (CAVE VALUE) (STORE (ADB-CAVE CAVE 5.) VALUE)) + +;;; XXR-COST gives the COST. + +(DEFUN XXR-COST (CAVE) (ADB-CAVE CAVE 3.)) + +;;; XX-PUT-COST puts the COST into the arrays. + +(DEFUN XX-PUT-COST (CAVE VALUE) (STORE (ADB-CAVE CAVE 3.) VALUE)) + +;;; XXR-GAIN returns the GAIN. + +(DEFUN XXR-GAIN (CAVE) (ADB-CAVE CAVE 4.)) + +;;; XX-PUT-GAIN puts the GAIN into the arrays. + +(DEFUN XX-PUT-GAIN (CAVE VALUE) (STORE (ADB-CAVE CAVE 4.) VALUE)) + +;;; XXR-DANGERS retruns those dangers which are +;;;currently applicable for CAVE. + +(DEFUN XXR-DANGERS (CAVE) (ADB-CAVE CAVE 6.)) + +;;; XX-PUT-DANGERS puts the DANGERS into the arrays. + +(DEFUN XX-PUT-DANGERS (CAVE VALUE) (STORE (ADB-CAVE CAVE 6.) VALUE)) + +;;; XXR-BETTER-MOVEP returns BETTER if it is in fact the better move. + +(DEFUN XXR-BETTER-MOVEP (BETTER WORSE) + (COND ((GP-LT (XXR-INDEX WORSE) (XXR-INDEX BETTER)) BETTER))) + +;;; XXR-WHY-MORE-THAN returns the preferred reason +;;;for a "more than" class. + +(DEFUN XXR-WHY-MORE-THAN (CAVE DIST DANGER) + (COND ((AND (= DIST 0.) (XDR-VISITEDP CAVE)) 1.) + (T (CAR (XDR-WHY-MORE-THAN CAVE DANGER))))) + +;;; XXT-GET-NODIST-SET returns the NODIST set ommiting +;;;the L10 caves DEPENDING depending on TEST. + +(DEFUN XXT-GET-NODIST-SET (O-CAVE DIST DANGER TEST) + (COND ((NOT TEST) + (XSR-GET-NODIST-SET O-CAVE DIST DANGER)) + (T (DO ((CAVES (XSR-GET-NODIST-SET O-CAVE DIST DANGER) + (CDR CAVES)) + (VAL)) + ((NULL CAVES) VAL) + (COND ((= (XXR-WHY-MORE-THAN (CAR CAVES) + DIST + DANGER) + 10.) + NIL) + (T (SETQ VAL (CONS (CAR CAVES) VAL)))))))) + +;;;******* The Data Base Routines of the Expert. ******** +;;;*********** This is Stage 1 of the Algorithm ************ +;;; Along with classifying the caves under "XD" properties, +;;;these routines also mark the justification under "XW" +;;;properties. Note that the outer routines are called as +;;;the player is notified of the dangers and warnings. +;;;(This simplifies the logic of the expert.) +;;; +;;; XD-MARK-DANGER marks a danger whenever it has been visited. +;;;It implements L0 and L9. + +(DEFUN XD-MARK-DANGER (CAVE DANGER) + (DECLARE (SPECIAL CAVE)) + ;;; This implements L9. + (MAPC + (FUNCTION (LAMBDA (X) + (XD-PUT-MORE-THAN CAVE 0. '(9.) X))) + (GP-REMOVE-LIST '(0. 1. 2.) (GP-ORDLST (1+ DANGER)))) + (XD-PUT-WHY-EXACTLY CAVE '(0.) DANGER) + (XD-PUT-EXACTLY CAVE 0. DANGER) + (XS-CREATE-CAVE-SET CAVE 0. DANGER)) + +;;; XD-MARK-VISITED updates the data base after a cave +;;;has been visited (safely). It implements L1. + +(DEFUN XD-MARK-VISITED (CAVE DANGER-LIST) + (DECLARE (SPECIAL CAVE DANGER-LIST XD-VISITED-CAVES DB-MOVES)) + (PROG (DANGER) + (SETQ DANGER (CAR DANGER-LIST)) + (COND ((XDR-VISITEDP CAVE) + (XD-PUT-VISITED CAVE + (CONS DB-MOVES + (XDR-VISITEDP CAVE)))) + ((NULL DANGER-LIST) + (XD-PUT-VISITED CAVE + (CONS DB-MOVES + (XDR-VISITEDP CAVE))) + (SETQ XD-VISITED-CAVES + (CONS CAVE XD-VISITED-CAVES))) + (T (XD-MARK-VISITED CAVE (CDR DANGER-LIST)) + (XD-PUT-MORE-THAN CAVE 0. '(1.) DANGER) + ;;; The next two calls are in case + ;;;they were missed earlier because the + ;;;cave had not been visited. + (XD-PROPAGATE-DIST (WGR-NEIGHBORS CAVE) + CAVE + (1- (XDR-MORE-THAN CAVE + DANGER)) + DANGER) + (XD-CHECK-NEIGHBORS (LIST CAVE) DANGER) + (XS-CAVE-CHECK CAVE + (XDR-MORE-THAN CAVE DANGER) + DANGER) + (XS-NEIGHBOR-CHECK (WGR-NEIGHBORS CAVE) + DANGER))))) + +;;; XD-MARK-SHOT is called after an unsuccessful shot. +;;;It implements L2. + +(DEFUN XD-MARK-SHOT (CAVE) + (DECLARE (SPECIAL XX-CHANGED WAD-FRINGE)) + (SETQ XX-CHANGED T) + (XD-PUT-MORE-THAN CAVE 0. '(2.) 2.) + (COND ((NOT (WGR-EXTRA-ARROWS)) (XP-SET-PROB WAD-FRINGE 2.)))) + +;;; XD-MARK-NOWARNING is called whenever a warning is received. +;;;It implements L3. + +(DEFUN XD-MARK-NOWARNING (CAVE DANGER) + (XD-PUT-MORE-THAN CAVE + (ADB-WARNING-DIST DANGER) + '(3.) + DANGER)) + +;;; XD-MARK-WARNING is called whenever a warning is received and +;;;implements rule L4. + +(DEFUN XD-MARK-WARNING (CAVE DANGER) + (XD-PUT-WHY-LESS-THAN CAVE '(4.) DANGER) + (XD-PUT-LESS-THAN CAVE (1+ (ADB-WARNING-DIST DANGER)) DANGER) + (XD-EXACT-CHECK CAVE DANGER)) + +;;; XD-MARK-SAFE-L10 marks that a cave is safe because of L10. + +(DEFUN XD-MARK-SAFE-L10 (CAVE-LIST CAUSE DANGER) + (COND ((NULL CAVE-LIST)) + (T (XD-MARK-SAFE-L10 (CDR CAVE-LIST) CAUSE DANGER) + (XD-PUT-MORE-THAN (CAR CAVE-LIST) + 0. + (LIST 10. CAUSE) + DANGER)))) + +;;; XD-PROPAGATE-DIST checks to see if a DIST can be +;;;propagated. It implements L5. + +(DEFUN XD-PROPAGATE-DIST (CAVE-LIST CAVE DIST DANGER) + (COND ((NULL CAVE-LIST)) + (T (XD-PROPAGATE-DIST (CDR CAVE-LIST) CAVE DIST DANGER) + (XD-PUT-MORE-THAN (CAR CAVE-LIST) + DIST + (LIST 5. CAVE) + DANGER)))) + +;;; XD-PUT-MORE-THAN actually adds the DIST specified and performs +;;;the requisite checks. (Calling other routines as necessary.) + +(DEFUN XD-PUT-MORE-THAN (CAVE DIST REASON DANGER) + (COND ((> DIST (XDR-MORE-THAN CAVE DANGER)) + (COND ((= (XDR-MORE-THAN CAVE DANGER) -1.) + (XX-MARK-SAFE CAVE DANGER))) + (XD-MARK-MORE-THAN CAVE DIST DANGER) + (XD-PUT-WHY-MORE-THAN CAVE REASON DANGER) + (XD-EXACT-CHECK CAVE DANGER) + ;;; Don't propagate L6. + (COND ((= (CAR REASON) 6.) NIL) + (T (XD-PROPAGATE-DIST (XDR-KNOWN-NEIGHBORS CAVE) + CAVE + (1- DIST) + DANGER))) + (XD-CHECK-NEIGHBORS (XDR-KNOWN-NEIGHBORS CAVE) DANGER) + (XS-CAVE-CHECK CAVE DIST DANGER)) + ;;; This is to have the simplest rule possible under reason. + ((AND (> DIST -1.) + (= DIST (XDR-MORE-THAN CAVE DANGER)) + (< (CAR REASON) + (CAR (XDR-WHY-MORE-THAN CAVE DANGER)))) + (XD-PUT-WHY-MORE-THAN CAVE REASON DANGER)))) + +;;; XD-CHECK-NEIGHBORS sees if L6 applies to any of the caves it is sent. + +(DEFUN XD-CHECK-NEIGHBORS (CAVE-LIST DANGER) + (COND ((NULL CAVE-LIST)) + ((XDR-VISITEDP (CAR CAVE-LIST)) + (XD-CHECK-NEIGHBORS (CDR CAVE-LIST) DANGER) + (DO ((WORST 100. + (MIN WORST + (XDR-MORE-THAN (CAR LIST) DANGER))) + (LIST (WGR-NEIGHBORS (CAR CAVE-LIST)) (CDR LIST))) + ((NULL LIST) + ;;; It is useless to have a "more than" greater than N. + (COND ((> (ADB-WARNING-DIST DANGER) WORST) + (XD-PUT-MORE-THAN (CAR CAVE-LIST) + (1+ WORST) + '(6.) + DANGER)))))) + (T (XD-CHECK-NEIGHBORS (CDR CAVE-LIST) DANGER)))) + +;;; XD-EXACT-CHECK is called anytime a new property is assigned +;;;to see if L7 applies. + +(DEFUN XD-EXACT-CHECK (CAVE DANGER) + (COND + ((> (XDR-EXACTLY CAVE DANGER) -1.) NIL) + ((> (+ 3. (XDR-MORE-THAN CAVE DANGER)) + (XDR-LESS-THAN CAVE DANGER)) + (XD-PUT-WHY-EXACTLY CAVE '(7.) DANGER) + (XS-CREATE-CAVE-SET + CAVE + (XD-PUT-EXACTLY CAVE + (1+ (XDR-MORE-THAN CAVE DANGER)) + DANGER) + DANGER)))) + +;;; XDR-VISITEDP is a predicate which returns the move +;;;numbers in which a cave was visited in this game. + +(DEFUN XDR-VISITEDP (CAVE) (ADB-CAVE CAVE 2.)) + +;;; XD-PUT-VISITED puts the move numbers into the arrays. + +(DEFUN XD-PUT-VISITED (CAVE VALUE) (STORE (ADB-CAVE CAVE 2.) VALUE)) + +;;; XDR-VISITED-NEIGHBORS returns all of the neighbors of the cave +;;;that have been visited. + +(DEFUN XDR-VISITED-NEIGHBORS (CAVE) + (GM-ALL-TRUE 'XDR-VISITEDP (WGR-NEIGHBORS CAVE))) + +;;; XDR-KNOWN-NEIGHBORS returns all the neighbors of the given +;;;cave that the student knows about. + +(DEFUN XDR-KNOWN-NEIGHBORS (CAVE) + (COND ((XDR-VISITEDP CAVE) (WGR-NEIGHBORS CAVE)) + (T (XDR-VISITED-NEIGHBORS CAVE)))) + +;;; XDR-EXACTLY returns the EXACTLY distance (if applicable). + +(DEFUN XDR-EXACTLY (CAVE DANGER) (ADB-DCAVE CAVE 5. DANGER)) + +;;; XD-PUT-EXACTLY puts the EXACTLY value into the arrays. + +(DEFUN XD-PUT-EXACTLY (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 5. DANGER) VALUE)) + +;;; XDR-WHY-EXACTLY returns why a cvae is classified as EXACTLY. + +(DEFUN XDR-WHY-EXACTLY (CAVE DANGER) (ADB-DCAVE CAVE 6. DANGER)) + +;;; XD-PUT-WHY-EXACTLY puts the reason for the EXACTLY value +;;;into the arrays. + +(DEFUN XD-PUT-WHY-EXACTLY (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 6. DANGER) VALUE)) + +;;; XDR-MORE-THAN returns the dist that is assigned to CAVE +;;;under the property of "more than". (It is a utility routine.) + +(DEFUN XDR-MORE-THAN (CAVE DANGER) (ADB-DCAVE CAVE 1. DANGER)) + +;;; XD-MARK-MORE-THAN puts the MORE-THAN value into the arrays. + +(DEFUN XD-MARK-MORE-THAN (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 1. DANGER) VALUE)) + +;;; XDR-WHY-MORE-THAN returns the justification for the "more than" value. + +(DEFUN XDR-WHY-MORE-THAN (CAVE DANGER) (ADB-DCAVE CAVE 2. DANGER)) + +;;; XD-PUT-WHY-MORE-THAN puts the reason for the MORE-THAN value +;;;into the arrays. + +(DEFUN XD-PUT-WHY-MORE-THAN (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 2. DANGER) VALUE)) + +;;; XDR-LESS-THAN gets the LESS-THAN value from the arrays. + +(DEFUN XDR-LESS-THAN (CAVE DANGER) (ADB-DCAVE CAVE 3. DANGER)) + +;;; XD-PUT-LESS-THAN puts the LESS-THAN value into the arrays. + +(DEFUN XD-PUT-LESS-THAN (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 3. DANGER) VALUE)) + +;;; XDR-WHY-LESS-THAN gets the reason for the LESS-THAN value +;;;from the arrays. + +(DEFUN XDR-WHY-LESS-THAN (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 4. DANGER) VALUE)) + +;;; XD-PUT-WHY-LESS-THAN puts the reason for the +;;;LESS-THAN value into the arrays. + +(DEFUN XD-PUT-WHY-LESS-THAN (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 4. DANGER) VALUE)) + +;;;********* Expert Routines which update the Cave-Sets. ******** +;;; As the database used by these routines is not quite +;;;self-explanatory (to me), a brief blurb is added to help out. +;;; +;;; XS-NUM is used for caves which are "N away" and contains the +;;; current estimate/actual number of caves in the cave-set. +;;; +;;; XS-DIST-SET is used for caves that are "N away" and contains +;;; the end node caves of the expansion toward the cave-set. +;;; A cave at dist N would be the originating cave, and the caves +;;; at dist 0 would be members of the cave-set. The idea is +;;; to expand until there are only caves at dist zero, but this +;;; can not always be done as in some cases the neighbors of +;;; a cave are not known. +;;; +;;; XS-NODIST-SET contains those caves which were previously members +;;; of the DIST-SET at the given dist, but were disqualified +;;; because of its "more than N away" classification. This list +;;; is kept to aid in the development of explanations. +;;; +;;; XS-MEMBER is used for caves that have been put onto a DIST-SET. +;;; It contains the originating cave and the dist. +;;; +;;; XS-CREATE-CAVE-SET is called whenever an exact-cave is found. +;;;It creates the particulsar cave-set. + +(DEFUN XS-CREATE-CAVE-SET (CAVE DIST DANGER) + (XS-ADD-TO-LIST CAVE (LIST CAVE) DIST DANGER)) + +;;; XS-ADD-TO-LIST adds caves onto the DIST-SET at the given DIST. +;;;In general, O-CAVE is the originating cave, and M-CAVE is +;;;the member cave. + +(DEFUN XS-ADD-TO-LIST (O-CAVE ADD-CAVES DIST DANGER) + (PROG (M-CAVE) + (SETQ M-CAVE (CAR ADD-CAVES)) + (COND + ((NULL M-CAVE)) + ;;; check to see if the cave has already been added. + ((MEMBER M-CAVE (XSR-TOTAL-DIST-SET O-CAVE DIST DANGER)) + (XS-ADD-TO-LIST O-CAVE (CDR ADD-CAVES) DIST DANGER)) + (T + (XS-ADD-TO-LIST O-CAVE (CDR ADD-CAVES) DIST DANGER) + (XS-PUT-MEMBER M-CAVE + (GP-CONS (LIST O-CAVE DIST) + (XSR-MEMBER M-CAVE DANGER)) + DANGER) + (XS-PUT-DIST-SET O-CAVE + (GP-CONS M-CAVE + (XSR-GET-DIST-SET O-CAVE + DIST + DANGER)) + DIST + DANGER) + (XS-PUT-TOTAL-SET O-CAVE + (GP-CONS M-CAVE + (XSR-TOTAL-DIST-SET O-CAVE + DIST + DANGER)) + DIST + DANGER) + (XS-PUT-NUM O-CAVE + (+ (XS-NUM-EST DIST) + (XSR-GET-NUM O-CAVE DANGER)) + DANGER) + (XS-CAVE-CHECK-WORK M-CAVE + (LIST (LIST O-CAVE DIST)) + (XDR-MORE-THAN M-CAVE DANGER) + DANGER) + (XS-MARK-CHANGED O-CAVE DANGER))))) + +;;; XS-CAVE-CHECK checks out if a given cave should still be +;;;on the DIST-SETs that it is on. + +(DEFUN XS-CAVE-CHECK (CAVE DIST DANGER) + (XS-CAVE-CHECK-WORK CAVE (XSR-MEMBER CAVE DANGER) DIST DANGER)) + +;;; XS-CAVE-CHECK-WORK checks to see if the cave should still +;;;be on individual DIST-SETs. + +(DEFUN XS-CAVE-CHECK-WORK (M-CAVE WORK-LIST DIST DANGER) + (PROG (O-CAVE O-DIST) + (COND ((NULL WORK-LIST) (RETURN T))) + (XS-CAVE-CHECK-WORK M-CAVE (CDR WORK-LIST) DIST DANGER) + (SETQ O-CAVE (CAAR WORK-LIST) O-DIST (CADAR WORK-LIST)) + (COND + ((> (1+ DIST) O-DIST) + ;;; These functions implement L8. + (XS-PUT-NODIST-SET + O-CAVE + (GP-CONS M-CAVE + (XSR-GET-NODIST-SET O-CAVE O-DIST DANGER)) + O-DIST + DANGER) + (XS-REMOVE-CAVE M-CAVE O-CAVE O-DIST DANGER) + (XS-MARK-CHANGED O-CAVE DANGER)) + ;;; If we have dist 0 then don't propagate further. + ((< O-DIST 1.)) + ((XDR-VISITEDP M-CAVE) + (XS-ADD-TO-LIST + O-CAVE + (GP-REMOVE-LIST (WGR-NEIGHBORS M-CAVE) + (XSR-TOTAL-DIST-SET O-CAVE + O-DIST + DANGER)) + (1- O-DIST) + DANGER) + (XS-REMOVE-CAVE M-CAVE O-CAVE O-DIST DANGER) + (XS-MARK-CHANGED O-CAVE DANGER)) + (T (XS-ADD-TO-LIST O-CAVE + (XDR-KNOWN-NEIGHBORS M-CAVE) + (1- O-DIST) + DANGER))))) + +;;; XS-REMOVE-CAVE is a function to do some of the tasks of +;;;removing a cave from the DIST-SET. + +(DEFUN XS-REMOVE-CAVE (M-CAVE O-CAVE O-DIST DANGER) + (COND ((MEMBER M-CAVE + (XSR-TOTAL-DIST-SET O-CAVE O-DIST DANGER)) + (XS-PUT-DIST-SET O-CAVE + (DELETE M-CAVE + (XSR-GET-DIST-SET O-CAVE + O-DIST + DANGER)) + O-DIST + DANGER) + (XS-PUT-NUM O-CAVE + (- (XSR-GET-NUM O-CAVE DANGER) + (XS-NUM-EST O-DIST)) + DANGER) + (XS-PUT-MEMBER M-CAVE + (DELETE (LIST O-CAVE O-DIST) + (XSR-MEMBER M-CAVE DANGER)) + DANGER)))) + +;;; XS-MARK-CHANGED marks that a cave-set has been changed. + +(DEFUN XS-MARK-CHANGED (CAVE DANGER) + (STORE (AXS-CHANGED-SETS DANGER) + (GP-CONS CAVE (AXS-CHANGED-SETS DANGER))) + (COND ((XSR-COMPLETE-CAVE-SETP CAVE DANGER) + (STORE (AXS-PARTIAL-SETS DANGER) + (GP-DELETE CAVE (AXS-PARTIAL-SETS DANGER))) + (STORE (AXS-COMPLETE-SETS DANGER) + (GP-CONS CAVE (AXS-COMPLETE-SETS DANGER)))) + (T (STORE (AXS-PARTIAL-SETS DANGER) + (GP-CONS CAVE (AXS-PARTIAL-SETS DANGER)))))) + +;;; XS-NEIGHBOR-CHECK is to propagate cave-sets around caves +;;;that have not been visited. It is only essential when the +;;;warning propagates more than two caves, but it can be +;;;helpful in explanations when the warning propagates two caves. + +(DEFUN XS-NEIGHBOR-CHECK (CAVE-LIST DANGER) + (COND ((NULL CAVE-LIST)) + (T (XS-NEIGHBOR-CHECK (CDR CAVE-LIST) DANGER) + (COND ((XDR-VISITEDP (CAR CAVE-LIST))) + (T (XS-CAVE-CHECK (CAR CAVE-LIST) + (XDR-MORE-THAN (CAR CAVE-LIST) + DANGER) + DANGER)))))) + +;;; XS-NUMEST estimates the size of the cave-set for a given distance. + +(DEFUN XS-NUM-EST (DIST) + ;;;This is a cheap hack that works for now. + (EXPT 2. DIST)) + +;;; XSR-GET-CAVE-SET reurns the cave-set attached to CAVE. + +(DEFUN XSR-GET-CAVE-SET (CAVE DANGER) + (XSR-GET-DIST-SET CAVE 0. DANGER)) + +;;; XSR-GET-MEMBER-SETS returns the originating caves of the +;;;cave-sets of which M-CAVE is a member. + +(DEFUN XSR-GET-MEMBER-SETS (M-CAVE DANGER) + (DO ((WORK-LIST (XSR-MEMBER M-CAVE DANGER) (CDR WORK-LIST)) + (O-CAVE) + (O-DIST) + (VALUE NIL)) + ((NULL WORK-LIST) VALUE) + (SETQ O-CAVE (CAAR WORK-LIST) + O-DIST (CADAR WORK-LIST)) + (COND ((= O-DIST 0.) (SETQ VALUE (CONS O-CAVE VALUE)))))) + +;;; XSR-OTHER-CAVES returns the caves which have not been removed +;;;at DIST and then the probability that they are not applicable. + +(DEFUN XSR-OTHER-CAVES (O-CAVE DIST REDUCED-SET DANGER) + (DO ((I (XDR-EXACTLY O-CAVE DANGER) (1- I)) + (CAVES) + (VALUE) + (NUM 0.)) + ((NOT (> I DIST)) + (LIST VALUE + (//$ (FLOAT (LENGTH REDUCED-SET)) + (FLOAT (+ NUM (LENGTH REDUCED-SET)))))) + (SETQ CAVES (XSR-GET-DIST-SET O-CAVE I DANGER) + VALUE (GP-UNION CAVES VALUE) + NUM (+ NUM + (* (LENGTH CAVES) (XS-NUM-EST (- I DIST))))))) + +;;; XSR-REDUCED-SET returns those caves which were propagated. + +(DEFUN XSR-REDUCED-SET (O-CAVE DIST DANGER) + (GP-REMOVE-LIST (XSR-TOTAL-DIST-SET O-CAVE DIST DANGER) + (XSR-GET-NODIST-SET O-CAVE DIST DANGER))) + +;;; XSR-TOTAL-DIST-SET returns all caves at DIST. + +(DEFUN XSR-TOTAL-DIST-SET (CAVE DIST DANGER) + (ADB-DCAVE CAVE (XSR-PROP-NUM 0. DIST DANGER) DANGER)) + +;;; XS-PUT-TOTAL-SET puts the TOTAL-SET. + +(DEFUN XS-PUT-TOTAL-SET (CAVE VALUE DIST DANGER) + (STORE (ADB-DCAVE CAVE (XSR-PROP-NUM 0. DIST DANGER) DANGER) + VALUE)) + +;;; XSR-GET-DIST-SET gets the DIST-SET because of the complicated access +;;;procedure. + +(DEFUN XSR-GET-DIST-SET (CAVE DIST DANGER) + (ADB-DCAVE CAVE (XSR-PROP-NUM 1. DIST DANGER) DANGER)) + +;;; XS-PUT-DIST-SET putprops the DIST-SET because of the lengthy access +;;;procedure. + +(DEFUN XS-PUT-DIST-SET (CAVE VALUE DIST DANGER) + (STORE (ADB-DCAVE CAVE (XSR-PROP-NUM 1. DIST DANGER) DANGER) + VALUE)) + +;;; XSR-GET-NODIST-SET gets the NODIST-SET because of the lengthy access +;;;procedure. + +(DEFUN XSR-GET-NODIST-SET (CAVE DIST DANGER) + (ADB-DCAVE CAVE (XSR-PROP-NUM 2. DIST DANGER) DANGER)) + +;;; XS-PUT-NODIST-SET putprops the NODIST-SET because of the lengthy access +;;;procedure. + +(DEFUN XS-PUT-NODIST-SET (CAVE VALUE DIST DANGER) + (STORE (ADB-DCAVE CAVE (XSR-PROP-NUM 2. DIST DANGER) DANGER) + VALUE)) + +;;; XSR-PROP-NUM returns the appropriate property number for the arrays. + +(DEFUN XSR-PROP-NUM (TYPE-DIST DIST DANGER) + (DECLARE (SPECIAL DB-TOTAL-DIST DB-NUM-DPROP)) + (+ DB-NUM-DPROP + (* TYPE-DIST DB-TOTAL-DIST) + (ADB-DIST-START DANGER) + DIST)) + +;;; XSR-COMPLETE-CAVE-SETP returns T if the CAVE-SET +;;;attached to CAVE is complete. + +(DEFUN XSR-COMPLETE-CAVE-SETP (CAVE DANGER) + (DO ((DIST (XDR-EXACTLY CAVE DANGER) (1- DIST)) + (DONE NIL) + (VALUE NIL)) + (DONE VALUE) + (COND ((= DIST -1.) (SETQ DONE T)) + ((< DIST 1.) (SETQ DONE T VALUE T)) + ((XSR-GET-DIST-SET CAVE DIST DANGER) + (SETQ DONE T))))) + +;;; XSR-GET-NUM returns the size of the cave-set +;;;(sometimes an estimate.) + +(DEFUN XSR-GET-NUM (CAVE DANGER) (ADB-DCAVE CAVE 16. DANGER)) + +;;; XS-PUT-NUM puts NUM into the arrays. + +(DEFUN XS-PUT-NUM (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 16. DANGER) VALUE)) + +;;; XSR-MEMBER returns the ORIGIN/DIST pairs. + +(DEFUN XSR-MEMBER (CAVE DANGER) (ADB-DCAVE CAVE 7. DANGER)) + +;;; XS-PUT-MEMBER puts the MEMBER value into the arrays. + +(DEFUN XS-PUT-MEMBER (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 7. DANGER) VALUE)) + +;;;******** This is the Second Stage of the Algorithm. ********* +;;; XR-COUNT-NUM checks for groups of cave-sets that would +;;;require certain caves to be safe. + +(DEFUN XR-COUNT-NUM (CHANGED-SETS COMPLETE-SETS DANGER) + (DECLARE (SPECIAL DANGER)) + (COND ((< (LENGTH COMPLETE-SETS) (ADB-NUM-DANGERS DANGER))) + ((NULL CHANGED-SETS)) + (T (XR-COUNT-NUM (CDR CHANGED-SETS) COMPLETE-SETS DANGER) + (COND ((AXR-FOUND-N DANGER) + (XR-CHECK-SETS (AXR-FOUND-N DANGER) + COMPLETE-SETS + COMPLETE-SETS + DANGER))) + (XR-CHECK-SETS (LIST (CAR CHANGED-SETS)) + (GP-DELETE (CAR CHANGED-SETS) + COMPLETE-SETS) + COMPLETE-SETS + DANGER)))) + +;;; XR-CHECK-SETS does the actual searching and marking safe. +;;; Notice that it also keeps track of how many of the dangers +;;;have been identified. + +(DEFUN XR-CHECK-SETS (GOT-SETS CHOOSE-FROM COMPLETE-SETS DANGER) + (COND ((> (1+ (LENGTH GOT-SETS)) (ADB-NUM-DANGERS DANGER)) + ;;; We have chosen N caves, now test them. + (XR-CHECK-SET GOT-SETS COMPLETE-SETS DANGER)) + ;;; Check to see if there anymore caves to choose from. + ;;;If not, then check the ones we have. + ((NULL CHOOSE-FROM) + (XR-CHECK-SET GOT-SETS COMPLETE-SETS DANGER)) + ;;; The algorithm does a binary branch and tries BOTH + ;;;choosing the first choice and not choosing it. + (T (XR-CHECK-SETS GOT-SETS + (CDR CHOOSE-FROM) + COMPLETE-SETS + DANGER) + (XR-CHECK-SETS (CONS (CAR CHOOSE-FROM) GOT-SETS) + (CDR CHOOSE-FROM) + COMPLETE-SETS + DANGER)))) + +;;; XR-CHECK-SET checks to see if the GOT-SETS it is sent have +;;;no intersection, and if so it takes appropriate action. + +(DEFUN XR-CHECK-SET (GOT-SETS COMPLETE-SETS DANGER) + (DECLARE (SPECIAL DANGER)) + (DO + ((REST-OF GOT-SETS (CDR REST-OF)) + (UNION NIL + (GP-UNION UNION + (XSR-GET-CAVE-SET (CAR REST-OF) DANGER))) + (TOTAL 0. + (+ TOTAL + (LENGTH (XSR-GET-CAVE-SET (CAR REST-OF) DANGER))))) + ((OR (< (LENGTH UNION) TOTAL) (NULL REST-OF)) + (COND + ((< (LENGTH UNION) TOTAL)) + ((= (LENGTH GOT-SETS) (ADB-NUM-DANGERS DANGER)) + (STORE (AXR-NUM-IDENTIFIED DANGER) + (ADB-NUM-DANGERS DANGER)) + (STORE (AXR-FOUND-N DANGER) GOT-SETS) + (XD-MARK-SAFE-L10 + (GP-REMOVE-LIST + (APPLY + 'GP-UNION + (MAPCAR + (FUNCTION (LAMBDA (X) (XSR-GET-CAVE-SET X DANGER))) + (APPEND COMPLETE-SETS (AXS-PARTIAL-SETS DANGER)))) + UNION) + GOT-SETS + DANGER)) + ;;; This is to keep track of how many dangers have been identified. + ((> (LENGTH GOT-SETS) (AXR-NUM-IDENTIFIED DANGER)) + (STORE (AXR-NUM-IDENTIFIED DANGER) (LENGTH GOT-SETS))))))) + +;;;********** Probability Routines of the Expert. ************* +;;;********** This is the Third Stage of the Algorithm. ************* +;;; XP-RESET-PROB is the main function of the probability routines. +;;;It returns all those caves whose probabilities have been changed +;;;by either P12 or P14. Note that RESET-CAVES starts as NIL and is +;;;all the caves that P13 changes. + +(DEFUN XP-RESET-PROB (CHANGED-SETS RESET-CAVES DANGER) + (DECLARE (SPECIAL XP-P12-CHANGED)) + (PROG (PROB CAVE CAVE-SET NEW-RESET CHECK-CAVES) + (COND + ((NULL CHANGED-SETS) + (XP-P12-CALC DANGER) + (SETQ NEW-RESET + (GP-UNION XP-P12-CHANGED + (XP-P14 RESET-CAVES NIL DANGER))) + ;;; We have considered XP-P12-CHANGED caves. + (SETQ XP-P12-CHANGED NIL) + (XP-SET-PROB NEW-RESET DANGER) + (RETURN NEW-RESET)) + (T (SETQ CAVE (CAR CHANGED-SETS) + CAVE-SET (XSR-GET-CAVE-SET CAVE DANGER)) + (SETQ PROB + (//$ 1.0 (FLOAT (XSR-GET-NUM CAVE DANGER)))) + (XP-P11 CAVE CAVE-SET PROB DANGER) + (SETQ CHECK-CAVES + (XP-P12 CAVE + (AXS-COMPLETE-SETS DANGER) + DANGER)) + (SETQ RESET-CAVES + (GP-UNION (XP-P13 (APPEND CHECK-CAVES CAVE-SET) + DANGER) + RESET-CAVES)) + (RETURN (XP-RESET-PROB (CDR CHANGED-SETS) + RESET-CAVES + DANGER)))))) + +;;; XP-SET-PROB puts the preferred probability on +;;;the caves property list. + +(DEFUN XP-SET-PROB (WORK-CAVES DANGER) + (PROG (CAVE PROB TEMP) + (COND ((NULL WORK-CAVES) (RETURN NIL)) + (T (XP-SET-PROB (CDR WORK-CAVES) DANGER))) + (SETQ CAVE (CAR WORK-CAVES) + PROB (XPR-GET-P14 CAVE DANGER)) + (XP-PUT-WHY-PROB + CAVE + (COND ((< PROB 0.0) + (XP-PUT-PROB CAVE NIL DANGER) + (COND ((XPR-WHY-P12 CAVE DANGER) '(12.)))) + ((GP-EQ PROB + (SETQ TEMP (XPR-GET-P11 CAVE DANGER))) + (XP-PUT-PROB CAVE TEMP DANGER) + '(11.)) + ((GP-EQ PROB + (SETQ TEMP (XPR-GET-P13 CAVE DANGER))) + (XP-PUT-PROB CAVE TEMP DANGER) + '(13.)) + (T (XP-PUT-PROB CAVE PROB DANGER) '(14.))) + DANGER) + (COND ((AND (= DANGER 2.) + (> (XPR-PROB CAVE 2.) 0.25) + (WGR-EXTRA-ARROWS)) + (XP-PUT-WHY-PROB CAVE + (GP-CONS 15. + (XPR-WHY-PROB CAVE 2.)) + 2.) + (XP-PUT-PROB CAVE + (*$ 0.3333 + (-$ 1.0 (XPR-PROB CAVE 2.))) + 2.))))) + +;;; XP-P11 puts the new P11 value if applicable. + +(DEFUN XP-P11 (O-CAVE ADD-LIST PROB DANGER) + (COND ((NULL ADD-LIST)) + (T (XP-P11 O-CAVE (CDR ADD-LIST) PROB DANGER) + (COND ((< (XPR-GET-P11 (CAR ADD-LIST) DANGER) PROB) + (XP-PUT-P11 (CAR ADD-LIST) PROB DANGER) + (XP-PUT-WHY-P11 (CAR ADD-LIST) + O-CAVE + DANGER)))))) + +;;; XP-P12 marks those caves to which P12 applies. It also +;;;returns those caves which P13 ought to check. + +(DEFUN XP-P12 (O-CAVE COMPLETE-SETS DANGER) + ;;;This is to see if O-CAVE is a superset of any complete-set. + (XP-P12-WORK (GP-DELETE O-CAVE COMPLETE-SETS) + (LIST O-CAVE) + DANGER) + (COND + ((MEMBER O-CAVE COMPLETE-SETS) + ;;; This is to see if it is subset of another cave-set. + (XP-P12-WORK (LIST O-CAVE) + (GP-DELETE O-CAVE + (APPEND (AXS-PARTIAL-SETS DANGER) + COMPLETE-SETS)) + DANGER)))) + +;;; XP-P12-WORK does the searching for caves to which P12 applies. +;;;It also finds cave-sets that are redundant and/or unnecessary. +;;;It keeps a list of those caves which it has changed in XP-P12-CHANGED. + +(DEFUN XP-P12-WORK (SUBSET-CAVES SUPERSET-CAVES DANGER) + (PROG (SUBSET SUPERSET RESULT) + (COND + ((AND SUBSET-CAVES SUPERSET-CAVES) + (SETQ RESULT + (APPEND (XP-P12-WORK (CDR SUBSET-CAVES) + SUPERSET-CAVES + DANGER) + (XP-P12-WORK SUBSET-CAVES + (CDR SUPERSET-CAVES) + DANGER))) + (SETQ SUBSET (XSR-GET-CAVE-SET (CAR SUBSET-CAVES) + DANGER)) + (SETQ SUPERSET + (XSR-GET-CAVE-SET (CAR SUPERSET-CAVES) DANGER)) + (COND + ;;; Ensure that SUBSET is a good cave-set. + ((XPR-REDUNDANTP (CAR SUBSET-CAVES) DANGER)) + ;;; If anything is returned, SUBSET is not a subset. + ((GP-REMOVE-LIST SUBSET SUPERSET) (RETURN RESULT)) + (T + (RETURN (APPEND RESULT + (XP-P12-MARK (GP-REMOVE-LIST SUPERSET + SUBSET) + (CAR SUBSET-CAVES) + (CAR SUPERSET-CAVES) + DANGER))))))))) + +;;; XP-P12-MARK marks caves to which P12 aplies and marks +;;;redundant cave-sets. + +(DEFUN XP-P12-MARK (MARK-CAVES SUB-CAVE SUPER-CAVE DANGER) + (DECLARE (SPECIAL XP-P12-CHANGED)) + (COND ((NULL MARK-CAVES) + (XP-PUT-REDUNDANT SUPER-CAVE SUB-CAVE DANGER)) + (T (XP-P12-MARK (CDR MARK-CAVES) + SUB-CAVE + SUPER-CAVE + DANGER) + (SETQ XP-P12-CHANGED (GP-CONS (CAR MARK-CAVES) + XP-P12-CHANGED)) + (XP-PUT-P13 (CAR MARK-CAVES) -1.0 DANGER) + (XP-PUT-P14 (CAR MARK-CAVES) -1.0 DANGER) + (XP-PUT-WHY-P12 (CAR MARK-CAVES) + (GP-CONS (LIST SUB-CAVE SUPER-CAVE) + (XPR-WHY-P12 (CAR MARK-CAVES) + DANGER)) + DANGER))) + MARK-CAVES) + +;;; XP-P12-CALC calculates the probability for all P12 caves at this move. + +(DEFUN XP-P12-CALC (DANGER) + (DECLARE (SPECIAL XD-VISITED-CAVES DB-NUM-CAVES)) + (PROG (IDENTIFIED UNIDENTIFIED SAFE) + (SETQ IDENTIFIED (AXR-NUM-IDENTIFIED DANGER)) + (SETQ UNIDENTIFIED (- (ADB-NUM-DANGERS DANGER) + IDENTIFIED)) + (SETQ SAFE (LENGTH XD-VISITED-CAVES)) + (STORE (AXP-PROB12 DANGER) + (//$ (FLOAT UNIDENTIFIED) + (FLOAT (COND ((= (+ SAFE IDENTIFIED) + DB-NUM-CAVES) + 1.) + (T (- DB-NUM-CAVES + SAFE + IDENTIFIED)))))))) + +;;; XP-P13 resets the probabilities for P13. It returns +;;;the caves which it changes. + +(DEFUN XP-P13 (CHANGE-LIST DANGER) + (COND + ((NULL CHANGE-LIST) NIL) + (T + (DO + ((CAVE (CAR CHANGE-LIST)) + (CAVE-SETS (XPR-GOOD-MEMBER-SETS (CAR CHANGE-LIST) DANGER) + (CDR CAVE-SETS)) + (SAFE-PROB 1.0) + (FINAL-PROB 0.0)) + ((NULL CAVE-SETS) + (SETQ FINAL-PROB (-$ 1.0 SAFE-PROB)) + ;;; If the probability hasn't changed, don't do anything. + (COND ((OR (NULL (XPR-GOOD-MEMBER-SETS CAVE DANGER)) + (GP-EQ FINAL-PROB (XPR-GET-P13 CAVE DANGER))) + (XP-P13 (CDR CHANGE-LIST) DANGER)) + (T (XP-PUT-P13 CAVE FINAL-PROB DANGER) + (GP-CONS CAVE + (XP-P13 (CDR CHANGE-LIST) DANGER))))) + (SETQ SAFE-PROB + (*$ SAFE-PROB + (-$ 1.0 + (//$ 1.0 + (FLOAT (XSR-GET-NUM (CAR CAVE-SETS) + DANGER)))))))))) + +;;; XP-P14 updates the P14 probabilities. +;;;Note that it returns all those caves which it has recalculated. + +(DEFUN XP-P14 (RESET-CAVES CALC-CAVES DANGER) + (DECLARE (SPECIAL DANGER)) + (COND ((NULL RESET-CAVES) + (XP-P14-CALC CALC-CAVES DANGER) + CALC-CAVES) + (T (XP-P14 (CDR RESET-CAVES) + (GP-UNION (XP-P14-PROPAGATES (CAR RESET-CAVES) + DANGER) + CALC-CAVES) + DANGER)))) + +;;; XP-P14-PROPAGATES returns those caves which are +;;;related to CAVE in P14 calculations. + +(DEFUN XP-P14-PROPAGATES (CAVE DANGER) + (APPLY 'GP-UNION + (MAPCAR + (FUNCTION (LAMBDA (X) (XSR-GET-CAVE-SET X DANGER))) + (XPR-GOOD-MEMBER-SETS CAVE DANGER)))) + +;;; XP-P14-CALC does the actual calculations of P14. + +(DEFUN XP-P14-CALC (CALC-CAVES DANGER) + (PROG (CAVE MEMBER-SETS) + (COND + ((NULL CALC-CAVES)) + ((NOT (SETQ CAVE + (CAR CALC-CAVES) + MEMBER-SETS + (XPR-GOOD-MEMBER-SETS CAVE DANGER))) + (XP-P14-CALC (CDR CALC-CAVES) DANGER)) + (T + (XP-P14-CALC (CDR CALC-CAVES) DANGER) + (XP-PUT-P14 CAVE + (-$ (XPR-GET-P13 CAVE DANGER) + (*$ (//$ 1.0 + (FLOAT (LENGTH MEMBER-SETS))) + (XP-P14-SUM-PROB CAVE + MEMBER-SETS + DANGER))) + DANGER) + ;;; Do not allow P14 to reduce probs too much. + (COND ((< (XPR-GET-P14 CAVE DANGER) + (AXP-PROB12 DANGER)) + (XP-PUT-P14 CAVE + (+$ 1.0E-3 (AXP-PROB12 DANGER)) + DANGER))))))) + +;;; XP-P14-SUM-PROB does the inner sum of formula in paper. + +(DEFUN XP-P14-SUM-PROB (CAVE MEMBER-SETS DANGER) + (COND ((NULL MEMBER-SETS) 0.0) + ;;; If the cave-set has only one member, P14 does not apply. + ((= (XSR-GET-NUM (CAR MEMBER-SETS) DANGER) 1.) + (XP-P14-SUM-PROB CAVE (CDR MEMBER-SETS) DANGER)) + (T (DO ((WORK-CAVES (XPR-P13-CHANGED (CAR MEMBER-SETS) + DANGER) + (CDR WORK-CAVES)) + (SUM 0.0) + ;;; Remember that the algorithm passes over the cave itself. + (PROB -1.0 + (COND ((EQUAL (CAR WORK-CAVES) CAVE) -1.0) + ((CAR WORK-CAVES) + (XPR-GET-P13 (CAR WORK-CAVES) + DANGER)) + (T 2.0))) + (N (FLOAT (XSR-GET-NUM (CAR MEMBER-SETS) + DANGER)))) + ((= PROB 2.0) + (+$ (*$ SUM (//$ 1.0 (1-$ N))) + (XP-P14-SUM-PROB CAVE + (CDR MEMBER-SETS) + DANGER))) + (COND ((GP-EQ PROB -1.0)) + (T (SETQ SUM (-$ (+$ SUM PROB) + (//$ 1.0 N))))))))) + +;;; XPR-GOOD-MEMBER-SETS returns all good cave-sets. + +(DEFUN XPR-GOOD-MEMBER-SETS (CAVE DANGER) + (DO ((MEMBER-SETS (XSR-GET-MEMBER-SETS CAVE DANGER) + (CDR MEMBER-SETS)) + (VALUE)) + ((NULL MEMBER-SETS) VALUE) + (COND ((XPR-REDUNDANTP (CAR MEMBER-SETS) DANGER)) + (T (SETQ VALUE (CONS (CAR MEMBER-SETS) VALUE)))))) + +;;; XPR-REDUNDANTP returns the SUPER-SET which this +;;;cave-set redundant. + +(DEFUN XPR-REDUNDANTP (CAVE DANGER) (ADB-DCAVE CAVE 8. DANGER)) + +;;; XP-PUT-REDUNDANT puts the SUPER-SET into the arrays. + +(DEFUN XP-PUT-REDUNDANT (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 8. DANGER) VALUE)) + +;;; XPR-PROB returns the preferred probability. + +(DEFUN XPR-PROB (CAVE DANGER) + (COND ((> (XDR-MORE-THAN CAVE DANGER) -1.) 0.0) + ((ADB-DCAVE CAVE 9. DANGER)) + (T (XPR-GET-P12 CAVE DANGER)))) + +;;; XP-PUT-PROB puts the appropriate value into the array. + +(DEFUN XP-PUT-PROB (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 9. DANGER) VALUE)) + +;;; XPR-WHY-PROB returns the probability rule(s) +;;;that were applied. (P12 if no others) + +(DEFUN XPR-WHY-PROB (CAVE DANGER) + (COND ((> (XDR-MORE-THAN CAVE DANGER) -1.) NIL) + ((ADB-DCAVE CAVE 10. DANGER)) + ((AXR-FOUND-N DANGER) + (XD-MARK-SAFE-L10 (LIST CAVE) + (AXR-FOUND-N DANGER) + DANGER) + NIL) + (T '(12.)))) + +;;; XP-PUT-WHY-PROB puts the probability rules into the arrays. + +(DEFUN XP-PUT-WHY-PROB (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 10. DANGER) VALUE)) + +;;; XPR-GET-P11 returns the probability according to P11. +;;;It is -1.0 if P11 does not apply at all. + +(DEFUN XPR-GET-P11 (CAVE DANGER) (ADB-DCAVE CAVE 11. DANGER)) + +;;; XP-PUT-P11 puts the probability for P11. + +(DEFUN XP-PUT-P11 (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 11. DANGER) VALUE)) + +;;; XPR-WHY-P11 returns the cave which caused the P11 probability. + +(DEFUN XPR-WHY-P11 (CAVE DANGER) (ADB-DCAVE CAVE 15. DANGER)) + +;;; XP-PUT-WHY-P11 puts the reason for a P11 prob (originating cave). + +(DEFUN XP-PUT-WHY-P11 (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 15. DANGER) VALUE)) + +;;; XPR-GET-P12 returns the probability for P12 (otherwise -1.0). + +(DEFUN XPR-GET-P12 (CAVE DANGER) + (COND ((AND (< (XDR-MORE-THAN CAVE DANGER) 0.) + (NOT (XPR-GOOD-MEMBER-SETS CAVE DANGER))) + ;;;This is to insure the correct reason + ;;;is marked for a prob of zero. + (COND ((AXR-FOUND-N DANGER) + (XD-MARK-SAFE-L10 (LIST CAVE) + (AXR-FOUND-N DANGER) + DANGER) + 0.0) + (T (AXP-PROB12 DANGER)))) + (T -1.0))) + +;;; XPR-WHY-P12 returns the caves responsible for a +;;;P12 classification. + +(DEFUN XPR-WHY-P12 (CAVE DANGER) (ADB-DCAVE CAVE 12. DANGER)) + +;;; XP-PUT-WHY-P12 puts why there is a classification of P12. + +(DEFUN XP-PUT-WHY-P12 (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 12. DANGER) VALUE)) + +;;; XPR-GET-P13 returns the probability of P13 (otherwise -1.0). + +(DEFUN XPR-GET-P13 (CAVE DANGER) (ADB-DCAVE CAVE 13. DANGER)) + +;;; XP-PUT-P13 puts the prob of P13. + +(DEFUN XP-PUT-P13 (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 13. DANGER) VALUE)) + +;;; XPR-P13-CHANGED returns those members of a +;;;cave-set which have been reset by P13. + +(DEFUN XPR-P13-CHANGED (O-CAVE DANGER) + (DECLARE (SPECIAL DANGER)) + (GM-ALL-TRUE (FUNCTION (LAMBDA (X) (DECLARE (SPECIAL DANGER)) + (> (XPR-GET-P13 X DANGER) + (XPR-GET-P11 X DANGER)))) + (XSR-GET-CAVE-SET O-CAVE DANGER))) + +;;; XPR-GET-P14 returns the probability of P14 (otherwise -1.0). + +(DEFUN XPR-GET-P14 (CAVE DANGER) (ADB-DCAVE CAVE 14. DANGER)) + +;;; XP-PUT-P14 puts the prob for P14. + +(DEFUN XP-PUT-P14 (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 14. DANGER) VALUE)) + +;;; XPR-SHOOTP determines if it would be better to shoot +;;;into a given cave before visiting it. + +(DEFUN XPR-SHOOTP (CAVE) + (AND (XPR-WHY-PROB CAVE 2.) + (= (CAR (XPR-WHY-PROB CAVE 2.)) 15.))) + +;;; ************ The Move Comparer Routines. ************ +;;; CMR-SAFEP returns true if a cave is acceptably safe. + +(DEFUN CMR-SAFEP (CAVE DANGERS) + (COND ((NULL DANGERS) T) + ((< (XDR-MORE-THAN CAVE (CAR DANGERS)) 0.) NIL) + ((SLR-OK-RULESP (CXR-PROB CAVE (CAR DANGERS)) + (CAR DANGERS)) + (CMR-SAFEP CAVE (CDR DANGERS))))) + +;;; CMR-KNOWS-SAME determines if the two moves are the same or +;;;that the player recognized them as the same or worse. + +(DEFUN CMR-KNOWS-SAME (B-MOVE W-MOVE DANGERS) + (COND ((NULL DANGERS) T) + ((OR (CMR-SAME-DANGERSP W-MOVE B-MOVE (LIST (CAR DANGERS))) + (SLR-KNOWS-RULESP (CXR-BETTER W-MOVE B-MOVE (CAR DANGERS)) + (CAR DANGERS))) + (CMR-KNOWS-SAME B-MOVE W-MOVE (CDR DANGERS))))) + +;;; CMR-SAME-DANGERSP determines if two caves are identical with +;;;respect to DANGER (returns T) or if the player should have +;;;recognized that they were equivalent (returns the rules involved). + +(DEFUN CMR-SAME-DANGERSP (CAVE1 CAVE2 DANGERS) + (COND ((NULL DANGERS) T) + ((NOT (GP-EQ (XPR-PROB CAVE1 (CAR DANGERS)) + (XPR-PROB CAVE2 (CAR DANGERS)))) + NIL) + ((GP-EQUIV (CXR-PROB CAVE1 (CAR DANGERS)) + (CXR-PROB CAVE2 (CAR DANGERS))) + (CMR-SAME-DANGERSP CAVE1 CAVE2 (CDR DANGERS))) + ((AND (SLR-KNOWS-RULESP + (GP-UNION (CXR-PROB CAVE1 (CAR DANGERS)) + (CXR-PROB CAVE2 (CAR DANGERS))) + (CAR DANGERS)) + (CMR-SAME-DANGERSP CAVE1 CAVE2 (CDR DANGERS))) + (GP-UNION (CXR-PROB CAVE1 (CAR DANGERS)) + (CXR-PROB CAVE2 (CAR DANGERS)))))) + +;;; CMR-BETTER-PROBSP returns T if BETTER actually is better +;;;and the explanation is acceptable (for DANGERS). + +(DEFUN CMR-BETTER-PROBSP (BETTER WORSE DANGERS) + (COND ((NULL DANGERS) T) + ((CMR-BETTER-PROBP BETTER WORSE (CAR DANGERS)) + (CMR-BETTER-PROBSP BETTER WORSE (CDR DANGERS))))) + +;;; CMR-BETTER-PROBP returns T if BETTER is better +;;;for acceptable reasons. + +(DEFUN CMR-BETTER-PROBP (BETTER WORSE DANGER) + (COND ((GP-LT (XPR-PROB BETTER DANGER) (XPR-PROB WORSE DANGER)) + (SLR-OK-RULESP (CXR-BETTER BETTER WORSE DANGER) + DANGER)))) + +;;; CMR-C5-TEST tests to insure that all the PROBS +;;;are as bad or worse for DANGERS. + +(DEFUN CMR-C5-TEST (W-MOVE H-MOVE DANGERS) + (COND ((NULL DANGERS) T) + ((OR (CMR-SAME-DANGERSP W-MOVE + H-MOVE + (LIST (CAR DANGERS))) + (CMR-BETTER-PROBP W-MOVE H-MOVE (CAR DANGERS))) + (CMR-C5-TEST W-MOVE H-MOVE (CDR DANGERS))))) + +;;; CMR-EXPLAIN-DANGER returns those dangers for which the player +;;is not expected to know how to calculate the prob. + +(DEFUN CMR-EXPLAIN-DANGER (CAVE1 CAVE2 DANGERS) + (DO ((WORK-ON DANGERS (CDR WORK-ON)) + (DANGER) + (OK-DANGERS)) + ((NULL WORK-ON) + (COND ((NULL OK-DANGERS) (SETQ OK-DANGERS DANGERS))) + (COND ((MEMBER 2. OK-DANGERS) '(2.)) + ((MEMBER 1. OK-DANGERS) '(1.)) + (T '(0.)))) + (SETQ DANGER (CAR WORK-ON)) + (COND ((GP-EQ (XPR-PROB CAVE2 DANGER) 1.0) + (SETQ WORK-ON NIL + OK-DANGERS (LIST DANGER))) + ((NOT (AND (SLR-KNOWS-RULESP (CXR-PROB CAVE1 DANGER) DANGER) + (SLR-KNOWS-RULESP (CXR-PROB CAVE2 DANGER) DANGER))) + (SETQ OK-DANGERS (CONS DANGER OK-DANGERS)))))) + +;;; CXR-BETTER returns the rules for why B-CAVE is better. + +(DEFUN CXR-BETTER (B-CAVE W-CAVE DANGER) + (DECLARE (SPECIAL CX-COMPARE CX-WHY-BETTER CX-WHY-WORSE)) + (SETQ CX-COMPARE (LIST B-CAVE W-CAVE)) + ;;; As in paper, we must check for cases where default + ;;;assumptions of unsafe apply, i.e. when better is absolutely + ;;;safe or worse is absolute danger. When both special cases + ;;;apply, a tricky hack is used (a rare case). + (COND ((AND (GP-EQ (XPR-PROB W-CAVE DANGER) 1.0) + (GP-EQ (XPR-PROB B-CAVE DANGER) 0.0)) + (SETQ CX-COMPARE NIL) + (COND ((< (LENGTH (CXR-PROB B-CAVE DANGER)) + (LENGTH (CXR-PROB W-CAVE DANGER))) + (CXR-PROB B-CAVE DANGER)) + (T (CXR-PROB W-CAVE DANGER)))) + ((GP-EQ (XPR-PROB B-CAVE DANGER) 0.0) + (SETQ CX-COMPARE NIL) + (CXR-PROB B-CAVE DANGER)) + ((GP-EQ (XPR-PROB W-CAVE DANGER) 1.0) + (SETQ CX-COMPARE NIL) + (CXR-PROB W-CAVE DANGER)) + ((GP-LT (XPR-GET-P11 B-CAVE DANGER) + (XPR-GET-P11 W-CAVE DANGER)) + (SETQ CX-WHY-BETTER 11. + CX-WHY-WORSE 11.) + (CX-PROB11 (LIST B-CAVE W-CAVE) DANGER NIL)) + ((> (XPR-GET-P12 B-CAVE DANGER) -1.0) + (SETQ CX-WHY-BETTER 12. + CX-WHY-WORSE 11.) + (CXR-PROB B-CAVE DANGER)) + ((GP-LT (XPR-GET-P11 B-CAVE DANGER) + (XPR-GET-P13 W-CAVE DANGER)) + (SETQ CX-WHY-BETTER 11. + CX-WHY-WORSE 13.) + (CX-PROB11 (LIST B-CAVE) + DANGER + (CX-PROB13 (LIST W-CAVE) + DANGER + NIL))) + ((GP-LT (XPR-GET-P14 B-CAVE DANGER) + (XPR-GET-P11 W-CAVE DANGER)) + (SETQ CX-WHY-BETTER 14. + CX-WHY-WORSE 11.) + (CX-PROB14 (LIST B-CAVE) + DANGER + (CX-PROB11 (LIST W-CAVE) + DANGER + NIL))) + (T (SETQ CX-COMPARE NIL) + (GP-UNION (CXR-PROB B-CAVE DANGER) + (CXR-PROB W-CAVE DANGER))))) + +;;; CXR-PROB is the interface routine for CX-PROB. + +(DEFUN CXR-PROB (CAVE DANGER) + (DECLARE (SPECIAL WE-MOVE-NUM)) + (COND ((NOT (= (CAR (ADB-DCAVE CAVE 17. DANGER)) WE-MOVE-NUM)) + (STORE (ADB-DCAVE CAVE 17. DANGER) + (CONS WE-MOVE-NUM (CX-PROB CAVE DANGER NIL))))) + (CDR (ADB-DCAVE CAVE 17. DANGER))) + +;;; CX-PROB returns the rules necessary to explain +;;;the prob that was used by the expert. + +(DEFUN CX-PROB (CAVE DANGER REASONS) + ((GP-MAKN 'CX-PROB (CAR (XPR-WHY-PROB CAVE DANGER))) + (LIST CAVE) + DANGER + REASONS)) + +;;; CXR-CAVE-SET returns the rules involved with +;;;the list of cave-sets (originating caves). + +(DEFUN CXR-CAVE-SET (WORK-LIST DANGER REASONS) + (CX-CAVE-SET WORK-LIST DANGER REASONS NIL)) + +;;; CX-CAVE-SET, this interfacing is to prevent +;;;endless repititions of L10s. + +(DEFUN CX-CAVE-SET (WORK-LIST DANGER REASONS L10-SW) + (COND + ((NULL WORK-LIST) REASONS) + (T (SETQ REASONS + (CX-CAVE-SET (CDR WORK-LIST) DANGER REASONS L10-SW)) + (DO ((O-CAVE (CAR WORK-LIST)) + (VALUE (CXR-EXACTLY (CAR WORK-LIST) DANGER REASONS)) + (DIST (XDR-EXACTLY (CAR WORK-LIST) DANGER) (1- DIST)) + (TEMP)) + ((< DIST 1.) + (CXR-MORE-THAN (XXT-GET-NODIST-SET O-CAVE + 0. + DANGER + L10-SW) + 0. + DANGER + VALUE)) + (COND ((SETQ TEMP + (XSR-GET-NODIST-SET O-CAVE DIST DANGER)) + (SETQ VALUE + (CXR-MORE-THAN TEMP + DIST + DANGER + (GP-CONS 8. VALUE))))))))) + +;;; CXR-MORE-THAN returns the rules that were necessary +;;;to justify a "more than" class. + +(DEFUN CXR-MORE-THAN (WORK-CAVES DIST DANGER REASONS) + (PROG (CAVE REASON) + (COND ((NULL WORK-CAVES) (RETURN REASONS))) + (SETQ REASONS (CXR-MORE-THAN (CDR WORK-CAVES) + DIST + DANGER + REASONS) + CAVE (CAR WORK-CAVES) + REASON (XXR-WHY-MORE-THAN CAVE DIST DANGER)) + (RETURN + (COND ((> DIST (XDR-MORE-THAN CAVE DANGER)) + (WE-ERROR (LIST 'CXR-MORE-THAN + CAVE + DIST + DANGER)) + REASONS) + ((= DIST -1.) REASONS) + ((= REASON 5.) + (COND ((AND (= (XDR-MORE-THAN CAVE DANGER) 0.) + (> (ADB-WARNING-DIST DANGER) 1.)) + (SETQ REASONS (GP-CONS 19. REASONS)))) + (CXR-MORE-THAN (CDR (XDR-WHY-MORE-THAN CAVE + DANGER)) + (1+ DIST) + DANGER + (GP-CONS 5. REASONS))) + ((= REASON 6.) + (CXR-MORE-THAN (WGR-NEIGHBORS CAVE) + (1- DIST) + DANGER + (GP-CONS 6. REASONS))) + ((= REASON 10.) + (CX-CAVE-SET (CADR (XDR-WHY-MORE-THAN CAVE + DANGER)) + DANGER + (GP-CONS 10. REASONS) + T)) + (T (GP-CONS REASON REASONS)))))) + +;;; CXR-EXACTLY returns the reasons for an EXACTLY classification. + +(DEFUN CXR-EXACTLY (CAVE DANGER REASONS) + (COND ((= (CAR (XDR-WHY-EXACTLY CAVE DANGER)) 0.) + (GP-CONS 0. REASONS)) + (T (CXR-MORE-THAN (LIST CAVE) + (XDR-MORE-THAN CAVE DANGER) + DANGER + (GP-UNION '(7. 4.) REASONS))))) + +;;; CXR-VALUE returns the reasons for an increased cave-value. + +(DEFUN CXR-VALUE (CAVE) + (CXR-EXACTLY (CAAR (XSR-MEMBER CAVE 2.)) 2. NIL)) + +;;; CX-PROBNIL adds why the given caves are safe. (no rule) + +(DEFUN CX-PROBNIL (CAVE-LIST DANGER REASONS) + (COND ((NULL CAVE-LIST) REASONS) + ((GP-LT 0.0 (XPR-PROB (CAR CAVE-LIST) DANGER)) + (CX-PROBNIL (CDR CAVE-LIST) + DANGER + (CX-PROB12 (LIST (CAR CAVE-LIST)) + DANGER + REASONS))) + (T (CX-PROBNIL (CDR CAVE-LIST) + DANGER + (CXR-MORE-THAN (LIST (CAR CAVE-LIST)) + 0. + DANGER + REASONS))))) + +;;; CX-PROB11 gathers the reasons for a PROB11 probability. + +(DEFUN CX-PROB11 (CAVE-LIST DANGER REASONS) + (COND + ((NULL CAVE-LIST) REASONS) + ;;; If L0 applied, P11 is not necessary to justify PROB. + ((AND (GP-EQ (XPR-GET-P11 (CAR CAVE-LIST) DANGER) 1.0) + (EQUAL (XPR-WHY-P11 (CAR CAVE-LIST) DANGER) (CAR CAVE-LIST))) + (GP-CONS 0. REASONS)) + (T (CX-PROB11 (CDR CAVE-LIST) + DANGER + (CXR-CAVE-SET (LIST (XPR-WHY-P11 (CAR CAVE-LIST) + DANGER)) + DANGER + (GP-CONS 11. REASONS)))))) + +;;; CX-PROB12 returns the reasons for PROB12. + +(DEFUN CX-PROB12 (CAVE-LIST DANGER REASONS) + (COND + ((NULL CAVE-LIST) REASONS) + (T + (CX-PROB12 (CDR CAVE-LIST) + DANGER + (CXR-CAVE-SET (APPLY 'APPEND + (XPR-WHY-P12 (CAR CAVE-LIST) + DANGER)) + DANGER + (GP-CONS 12. REASONS)))))) + +;;; CX-PROB13 adds on the reasons for a P13 prob. + +(DEFUN CX-PROB13 (WORK-LIST DANGER REASONS) + (COND + ((NULL WORK-LIST) REASONS) + (T (SETQ REASONS (CX-PROB13 (CDR WORK-LIST) DANGER REASONS)) + (COND ((XPR-WHY-P12 (CAR WORK-LIST) DANGER) + (SETQ REASONS + (CX-PROB12 (LIST (CAR WORK-LIST)) + DANGER + REASONS)))) + (CXR-CAVE-SET (XPR-GOOD-MEMBER-SETS (CAR WORK-LIST) DANGER) + DANGER + (GP-CONS 13. REASONS))))) + +;;; CX-PROB14 adds on the reasons for a P14 prob. + +(DEFUN CX-PROB14 (CAVE-LIST DANGER REASONS) + (DO ((CAVE-SETS (XPR-GOOD-MEMBER-SETS (CAR CAVE-LIST) DANGER) + (CDR CAVE-SETS)) + (VALUE (GP-CONS 14. REASONS))) + ((NULL CAVE-SETS) + (COND ((CDR CAVE-LIST) + (CX-PROB14 (CDR CAVE-LIST) DANGER VALUE)) + (T VALUE))) + (SETQ VALUE + (CXR-CAVE-SET (LIST (CAR CAVE-SETS)) DANGER VALUE) + VALUE + (CX-PROB13 (XPR-P13-CHANGED (CAR CAVE-SETS) DANGER) + DANGER + VALUE)))) + +;;; CX-PROB15 adds on the reasons for PROB15. + +(DEFUN CX-PROB15 (CAVE-LIST DANGER REASONS) + (COND + ((NULL CAVE-LIST) REASONS) + (T (CX-PROB15 (CDR CAVE-LIST) + DANGER + ((GP-MAKN 'CX-PROB + (CADR (XPR-WHY-PROB (CAR CAVE-LIST) + DANGER))) + (LIST (CAR CAVE-LIST)) + DANGER + (GP-CONS 15. REASONS)))))) + +;;; ************ Psychologist Functions ********* +;;; PS-UPDATE-MODEL compares moves and updates the student model. + +(DEFUN PS-UPDATE-MODEL (MOVE) + (DECLARE (SPECIAL DB-MOVES)) + (PROG (WORSE-CAVES DANGERS) + (SETQ DB-MOVES (1+ DB-MOVES)) + (COND ((XDR-VISITEDP MOVE) + (MAPC (FUNCTION (LAMBDA (X) (SK-MARK-RULE 1. X))) + '(0. 1. 2.)) + (RETURN NIL))) + (COND ((SETQ WORSE-CAVES (PS-WORSE-CAVES MOVE))) + (T (GO END))) + (G-TSAY + (APPEND + '(|*** Moves which the student seems to| + |have correctly identified as worse|) + (EG-INSERT-AND '|is cave| WORSE-CAVES) + '(|. ***|))) + (SETQ DANGERS (XXR-DANGERS MOVE)) + ;;; Is it possible that C5 applies? + (COND ((XSR-MEMBER MOVE 2.) + (PS-C5 WORSE-CAVES MOVE DANGERS))) + (COND ((NULL DANGERS) (PS-C0 WORSE-CAVES MOVE NIL)) + ((= (LENGTH DANGERS) 1.) + (PS-C1 WORSE-CAVES MOVE (CAR DANGERS) NIL) + (PS-C2 WORSE-CAVES MOVE DANGERS NIL)) + (T (PS-C2 WORSE-CAVES MOVE DANGERS NIL) + (PS-C3 WORSE-CAVES + MOVE + DANGERS + NIL + DANGERS + WORSE-CAVES))) + END (PS-DEGRADE-MODEL MOVE) + (SC-UPDATE-MODEL))) + +;;; PS-WORSE-CAVES returns those caves which the player +;;;is thought to have found some fault with. + +(DEFUN PS-WORSE-CAVES (MOVE) + (DECLARE (SPECIAL MOVE WAW-ROUTE WAW-GIVEN-ROUTE LWA-GOOD-MOVES XX-BEST-MOVES)) + (PROG (DIST FRINGE-CAVES) + (SETQ DIST (LENGTH (WAW-FIND-ROUTE MOVE 0.)) + DIST (+ DIST DIST -3. (- (LENGTH WAW-ROUTE)))) + (COND ((GC-MEMBER LWA-GOOD-MOVES MOVE) (RETURN NIL)) + ;;; If the player asked for a route to this cave, + ;;;he is presumed to have identified all worse caves. + ((MEMBER MOVE WAW-GIVEN-ROUTE) + (RETURN (PS-WORSE-WORK MOVE XX-BEST-MOVES))) + ((< DIST 1.) (RETURN NIL))) + (SETQ FRINGE-CAVES (GP-INTERSECTION XX-BEST-MOVES + (WAD-GET-DIST DIST))) + (RETURN (PS-WORSE-WORK MOVE FRINGE-CAVES)))) + +;;; PS-WORSE-WORK actually figures out which are worse. + +(DEFUN PS-WORSE-WORK (MOVE OTHERS) + (DECLARE (SPECIAL LWA-BAD-MOVES)) + (COND ((NULL OTHERS) NIL) + ((AND (NOT (GC-MEMBER LWA-BAD-MOVES (CAR OTHERS))) + (XXR-BETTER-MOVEP MOVE (CAR OTHERS))) + (CONS (CAR OTHERS) (PS-WORSE-WORK MOVE (CDR OTHERS)))) + (T (PS-WORSE-WORK MOVE (CDR OTHERS))))) + +;;; PS-C0 marks rules as appropriate for C0. + +(DEFUN PS-C0 (WORSE-MOVES B-MOVE MARKED) + (PROG (W-MOVE W-DANGERS W-DANGER) + (COND ((NULL WORSE-MOVES) + (COND (MARKED (SKC-MARK-RULE 0.))) + (RETURN NIL))) + (SETQ W-MOVE (CAR WORSE-MOVES) + W-DANGERS (XXR-DANGERS W-MOVE) + W-DANGER (CAR W-DANGERS)) + (COND ((AND W-DANGER + (OR (CDR W-DANGERS) + (MEMBER W-DANGER MARKED))) + (PS-C0 (CDR WORSE-MOVES) B-MOVE MARKED)) + (W-DANGER (PS-TEST-MARK (CXR-BETTER B-MOVE + (CAR WORSE-MOVES) + W-DANGER) + W-MOVE + 0. + W-DANGER) + (PS-C0 (CDR WORSE-MOVES) + B-MOVE + (CONS W-DANGER MARKED)))))) + +;;; PS-C1 marks rules as appropriate for C1. + +(DEFUN PS-C1 (WORSE-MOVES B-MOVE B-DANGER MARKED) + (PROG (W-MOVE W-DANGERS NEW-RULES) + (COND ((NULL WORSE-MOVES) + (COND (MARKED (SKC-MARK-RULE 1.))) + (RETURN NIL))) + (SETQ W-MOVE (CAR WORSE-MOVES) + W-DANGERS (XXR-DANGERS W-MOVE)) + (COND ((AND (NULL (CDR W-DANGERS)) + (= (CAR W-DANGERS) B-DANGER) + (SETQ NEW-RULES + (CMR-BETTER-PROBP B-MOVE + W-MOVE + B-DANGER))) + (SETQ NEW-RULES (GP-REMOVE-LIST NEW-RULES MARKED)) + (PS-TEST-MARK NEW-RULES W-MOVE 1. B-DANGER))) + (PS-C1 (CDR WORSE-MOVES) + B-MOVE + B-DANGER + (APPEND NEW-RULES MARKED)))) + +;;; PS-C2 marks rules as appropriate for C2. + +(DEFUN PS-C2 (WORSE-MOVES B-MOVE B-DANGERS MARKED) + (PROG (W-MOVE W-DANGERS O-DANGERS O-DANGER NOT-OK) + (COND ((NULL WORSE-MOVES) + (COND (MARKED (SKC-MARK-RULE 2.))) + (RETURN NIL))) + (SETQ W-MOVE (CAR WORSE-MOVES) + W-DANGERS (XXR-DANGERS W-MOVE) + O-DANGERS (GP-REMOVE-LIST W-DANGERS B-DANGERS) + NOT-OK (GP-REMOVE-LIST B-DANGERS W-DANGERS) + O-DANGER (CAR O-DANGERS)) + (COND ((OR (CDR O-DANGERS) + NOT-OK + (MEMBER O-DANGER MARKED) + (NOT (CMR-KNOWS-SAME B-MOVE + W-MOVE + B-DANGERS))) + (PS-C2 (CDR WORSE-MOVES) + B-MOVE + B-DANGERS + MARKED)) + (T (PS-TEST-MARK (CXR-BETTER B-MOVE W-MOVE O-DANGER) + W-MOVE + 2. + O-DANGER) + (PS-C2 (CDR WORSE-MOVES) + B-MOVE + B-DANGERS + (CONS O-DANGER MARKED)))))) + +;;; PS-C3 marks rules as appropriate for C3. + +(DEFUN PS-C3 (WORSE-MOVES B-MOVE B-DANGERS MARKED DANGER-LIST + OW-MOVES) + (PROG (W-MOVE W-DANGERS NEW-RULES C-DANGER R-DANGERS) + (COND ((NOT (OR DANGER-LIST WORSE-MOVES)) + (COND (MARKED (SKC-MARK-RULE 3.))) + (RETURN NIL)) + ((NULL WORSE-MOVES) + (PS-C3 OW-MOVES + B-MOVE + B-DANGERS + (COND (MARKED '(T))) + (CDR DANGER-LIST) + OW-MOVES) + (RETURN NIL))) + (SETQ W-MOVE (CAR WORSE-MOVES) + W-DANGERS (XXR-DANGERS W-MOVE) + C-DANGER (CAR DANGER-LIST) + R-DANGERS (GP-DELETE C-DANGER B-DANGERS)) + (COND ((AND (GP-EQUIV W-DANGERS B-DANGERS) + C-DANGER + R-DANGERS + (SETQ NEW-RULES + (CMR-BETTER-PROBP B-MOVE + W-MOVE + C-DANGER)) + (CMR-KNOWS-SAME B-MOVE W-MOVE R-DANGERS)) + (SETQ NEW-RULES (GP-REMOVE-LIST NEW-RULES MARKED)) + (PS-TEST-MARK NEW-RULES W-MOVE 3. C-DANGER))) + (PS-C3 (CDR WORSE-MOVES) + B-MOVE + B-DANGERS + (APPEND NEW-RULES MARKED) + DANGER-LIST + OW-MOVES))) + +;;; PS-C5 updates if C5 has applied. + +(DEFUN PS-C5 (WORSE-CAVES H-MOVE H-DANGERS) + (COND ((NULL WORSE-CAVES)) + ((AND (NOT (XSR-MEMBER (CAR WORSE-CAVES) 2.)) + (NOT (XPR-SHOOTP H-MOVE)) + (CMR-C5-TEST (CAR WORSE-CAVES) H-MOVE '(0. 1. 2.)) + (PS-TEST-MARK (CXR-VALUE H-MOVE) + (CAR WORSE-CAVES) + 5. + 2.)) + (SKC-MARK-RULE 5.)) + (T (PS-C5 (CDR WORSE-CAVES) H-MOVE H-DANGERS)))) + +;;; PS-MARK-SHOT notes that the player wisely +;;;chose to shoot into a cave. + +(DEFUN PS-MARK-SHOT (CAVE) + (SK-MARK-RULES + (PS-EXPL-MARK-SHOT (SLR-OK-RULESP (CXR-PROB CAVE 2.) 2.) + CAVE) + 2.)) + +;;; PS-EXPL-MARK-SHOT explains that said rules were marked. + +(DEFUN PS-EXPL-MARK-SHOT (RULES CAVE) + (COND + (RULES + (G-TSAY + (APPEND '(|*** By shooting into cave|) + (LIST CAVE) + '(|, the student has indicated a knowledge of|) + (EG-TOLD-RULES RULES 2.) + '(|. ***|))))) + RULES) + +;;; PS-EXPL-MARK explains why the given rules were marked. + +(DEFUN PS-TEST-MARK (RULES W-MOVE C-RULE DANGER) + (COND + ((NULL RULES) NIL) + ((SLR-OK-RULESP RULES DANGER) + (G-TSAY (APPEND '(|*** According to combination rule|) + (LIST C-RULE) + '(|, I am marking|) + (EG-TOLD-RULES RULES DANGER) + '(|because his move is better than cave|) + (LIST W-MOVE '|. ***|))) + (SK-MARK-RULES RULES DANGER) + RULES))) + +;;; PS-DEGRADE-MODEL is responsible for degrading +;;;the knowledge model. + +(DEFUN PS-DEGRADE-MODEL (MOVE) + (DECLARE (SPECIAL MOVE PS-EXPL-SWITCH DB-COMMENT XX-BEST-MOVES)) + (PROG (BETTER-MOVES PS-EXPL-SWITCH) + (COND + ((SETQ + BETTER-MOVES + (GM-ALL-TRUE + (FUNCTION (LAMBDA (X) (DECLARE (SPECIAL MOVE)) + (XXR-BETTER-MOVEP X MOVE))) + XX-BEST-MOVES)) + ;;; There were better moves. Note that PS-TEST-DEGRADE + ;;;sets the values of APS-RULE-ARRAY. + (PS-TEST-DEGRADE MOVE BETTER-MOVES) + (COND ((AND PS-EXPL-SWITCH DB-COMMENT) + (G-SAY '(|. ***|))) + (PS-EXPL-SWITCH (G-TSAY '(|. ***|)))) + (DO ((I 0. (1+ I))) + ((> I 2.)) + (PS-EXPL-UNMARK (APS-RULE-ARRAY I) I) + (SK-UNMARK-RULES (APS-RULE-ARRAY I) I) + (STORE (APS-RULE-ARRAY I) NIL)))))) + +;;; PS-TEST-DEGRADE determines which rules should be degraded. + +(DEFUN PS-TEST-DEGRADE (MOVE B-MOVES) + (COND ((NULL B-MOVES)) + (T (PS-TEST-DEGRADE MOVE (CDR B-MOVES)) + (PS-DEGRADE-WORK MOVE + (CAR B-MOVES) + '(0. 1. 2.) + NIL + NIL + NIL)))) + +;;; PS-DEGRADE-WORK does the actual work PS-TEST-DEGRADE. +;;; C-DANGERS are the dangers left to look at. +;;; S-DANGERS are dangers which were identifiably equivalent. +;;; B-DANGERS are dangers that were better by comparing probs. +;;; R-DANGERS are dangers that were better because they were safe. + +(DEFUN PS-DEGRADE-WORK (W-MOVE B-MOVE C-DANGERS S-DANGERS B-DANGERS R-DANGERS) + (DECLARE (SPECIAL PS-TEMP)) + (COND ((AND (NULL C-DANGERS) + (OR B-DANGERS R-DANGERS)) + (PS-EXPL-BETTER B-MOVE (APPEND B-DANGERS R-DANGERS) S-DANGERS) + (PS-STORE-DEGRADES W-MOVE B-MOVE B-DANGERS) + (PS-STORE-DEGRADES B-MOVE B-MOVE R-DANGERS) + (PS-STORE-DEGRADES W-MOVE B-MOVE S-DANGERS)) + ((NULL C-DANGERS)) + ((AND (GP-EQ 0.0 (XPR-PROB B-MOVE (CAR C-DANGERS))) + (GP-LT 0.0 (XPR-PROB W-MOVE (CAR C-DANGERS))) + (SLR-KNOWS-RULESP (CXR-PROB B-MOVE (CAR C-DANGERS)) + (CAR C-DANGERS))) + (PS-DEGRADE-WORK W-MOVE + B-MOVE + (CDR C-DANGERS) + S-DANGERS + B-DANGERS + (CONS (CAR C-DANGERS) R-DANGERS))) + ((AND (GP-LT (XPR-PROB B-MOVE (CAR C-DANGERS)) + (XPR-PROB W-MOVE (CAR C-DANGERS))) + (SLR-KNOWS-RULESP (CXR-BETTER B-MOVE + W-MOVE + (CAR C-DANGERS)) + (CAR C-DANGERS))) + (PS-DEGRADE-WORK W-MOVE + B-MOVE + (CDR C-DANGERS) + S-DANGERS + (CONS (CAR C-DANGERS) B-DANGERS) + R-DANGERS)) + ((SETQ PS-TEMP (CMR-SAME-DANGERSP B-MOVE W-MOVE (LIST (CAR C-DANGERS)))) + (PS-DEGRADE-WORK W-MOVE + B-MOVE + (CDR C-DANGERS) + (COND ((ATOM PS-TEMP) S-DANGERS) + (T (CONS (CAR C-DANGERS) S-DANGERS))) + B-DANGERS + R-DANGERS)) + (T NIL))) + +;;; PS-STORE-DEGRADES stores the applicable rules into the appropriate lists. + +(DEFUN PS-STORE-DEGRADES (W-MOVE B-MOVE DANGERS) + (DO ((M-DANGERS DANGERS (CDR M-DANGERS)) (M-DANGER)) + ((NULL M-DANGERS)) + (SETQ M-DANGER (CAR M-DANGERS)) + (STORE (APS-RULE-ARRAY M-DANGER) + (GP-UNION (COND ((GP-LT (XPR-PROB B-MOVE M-DANGER) + (XPR-PROB W-MOVE M-DANGER)) + (CXR-BETTER B-MOVE W-MOVE M-DANGER))) + (SLR-KNOWS-RULESP + (GP-UNION (CXR-PROB B-MOVE M-DANGER) + (CXR-PROB W-MOVE M-DANGER)) + M-DANGER) + (APS-RULE-ARRAY M-DANGER))))) + +;;; PS-EXPL-BETTER explains when a better move has been found. + +(DEFUN PS-EXPL-BETTER + (MOVE DANGERS S-DANGERS) + (DECLARE (SPECIAL PS-EXPL-SWITCH)) + (G-TSAY (APPEND (COND (PS-EXPL-SWITCH '(| |)) + (T (SETQ PS-EXPL-SWITCH T) + '(|*** According to my estimations, the| + |player should have identified that:/ + |))) (LIST '|cave| MOVE '|involves less risk from|) + (EG-DANGERS DANGERS) + (COND (S-DANGERS (APPEND + '(|and the same danger from|) + (EG-DANGERS S-DANGERS))))))) + +;;; PS-EXPL-UNMARK explains which rules were unmarked. + +(DEFUN PS-EXPL-UNMARK (RULES DANGER) + (COND (RULES (G-TSAY (APPEND '(|*** I am unmarking|) + (EG-TOLD-RULES RULES DANGER) + '(|. ***|))) + T)) + RULES) + +;;; PS-UNMARK-SHOT notes that the player shot when he should +;;;have known it was unnecessary. + +(DEFUN PS-UNMARK-SHOT (CAVE) + (COND ((XPR-SHOOTP CAVE) NIL) + ((GP-EQ (XPR-PROB CAVE 2.) 0.0) + (SK-UNMARK-RULES + (PS-EXPL-UNMARK-SHOT (SLR-KNOWS-RULESP (CXR-PROB CAVE 2.) 2.) + CAVE) + 2.)) + (T (SK-UNMARK-RULES + (PS-EXPL-UNMARK-SHOT + (GP-UNION (SLR-KNOWS-RULESP '(11. 15.) 2.) + (SLR-KNOWS-RULESP (CXR-PROB CAVE 2.) 2.)) + CAVE) + 2.)))) + +;;; PS-EXPL-UNMARK-SHOT comments about the above function. + +(DEFUN PS-EXPL-UNMARK-SHOT (RULES CAVE) + (COND + (RULES + (G-TSAY + (APPEND + '(|*** By shooting into cave|) + (LIST CAVE) + '(|the player has indicated that he has not really mastered|) + (EG-TOLD-RULES RULES 2.) + '(|. ***|))))) + RULES) + +;;; PS-MARK-NO-SHOT notes that the player did not shoot when he should +;;;have known it was wise to do so. + +(DEFUN PS-MARK-NO-SHOT (CAVE) + (SK-UNMARK-RULES + (PS-EXPL-MARK-NO-SHOT (SLR-KNOWS-RULESP (CXR-PROB CAVE 2.) + 2.) + CAVE) + 2.)) + +;;; PS-EXPL-MARK-NO-SHOT comments about the above function. + +(DEFUN PS-EXPL-MARK-NO-SHOT (RULES CAVE) + (COND + (RULES + (G-TSAY + (APPEND + '(|*** By not shooting into cave|) + (LIST CAVE) + '(|the player has indicated that he has not really mastered|) + (EG-TOLD-RULES RULES 2.) + '(|. ***|))))) + RULES) + +;;; **************** Student Model Functions ************* +;;; ******* Student Model Initialization Rouitnes. ******** +;;; +;;; The student knowledge array has three dimensions. +;;; They are: RULE, ITEM, and DANGER. +;;; An ITEM value of: +;;; 0 is for the number of times he has demonstrated a +;;; working knowledge of said rule (more or less). +;;; 1 is for when the player was presumed to have +;;; learned/forgotten said rule. +;;; 2 is for how often the player has been told said rule. +;;; 3 is for when the player was presumed to have heard-of +;;; said rule. +;;; SLI-FORGOT determines how large a decrement should be used. + +(DEFUN SLI-FORGOT (NOW LAST) + (DECLARE (SPECIAL SL-FORGET)) + (//$ (LOG (- NOW LAST -1.)) (LOG SL-FORGET))) + +;;; SLI-SET-VAL sets the ASK-DRULES value appropriately. + +(DEFUN SLI-SET-VAL (OLD-VALUE WHEN-VALUE INFO-TYPE DEGRADE RULE DANGER) + (DECLARE (SPECIAL WE-THIS-SESSION SL-HEARD-OF SL-REPEAT)) + (STORE (ASK-DRULES RULE INFO-TYPE DANGER) + (SLI-VALUE OLD-VALUE DEGRADE)) + (STORE (ASK-WDRULES RULE INFO-TYPE DANGER) + (COND (WHEN-VALUE) (T 0.))) + ;;; Did the player "forget" this rule. + (COND ((NULL OLD-VALUE) NIL) + ((AND (= INFO-TYPE 0.) + (SLR-KNOWS-RULEP RULE DANGER)) + (SL-TEST-PHASE DANGER)) + ((AND (= INFO-TYPE 1.) + (SLR-HEARD-OF-RULE RULE DANGER)) + NIL) + ((> OLD-VALUE + (COND ((= INFO-TYPE 0.) SL-REPEAT) + (T SL-HEARD-OF))) + ;;; Note that negative values indicate "forgot". + (STORE (ASK-WDRULES RULE INFO-TYPE DANGER) (- WE-THIS-SESSION))))) + +;;; SLI-VALUE determines what is an acceptable value to store. + +(DEFUN SLI-VALUE (VAL DEGRADE) + (COND ((NOT VAL) 0.0) ((> VAL DEGRADE) (-$ VAL DEGRADE)) (T 0.0))) + +;;; SLI-LEAST-PHASE returns the lowest phase of the student. + +(DEFUN SLI-LEAST-PHASE NIL + (DECLARE (SPECIAL SL-MODE)) + (DO ((I 0. (1+ I)) (MIN 4.)) + ((> I 2.) MIN) + (COND ((EQ SL-MODE 'SUPER) (SETQ I 3.)) + ((< (ASL-PHASE I) MIN) (SETQ MIN (ASL-PHASE I)))))) + +;;; SKI-PUT-MODEL takes its argument and initializes the +;;;student-model with it. + +(DEFUN SKI-PUT-MODEL (STUDENT-MODEL) + (DECLARE (SPECIAL DB-DATE DB-LAST-DATE DB-NUM-CRULES DB-NUM-RULES)) + (DO ((REST-OF-MODEL STUDENT-MODEL (CDR REST-OF-MODEL)) + (DEGRADE (SLI-FORGOT DB-DATE DB-LAST-DATE)) + (DANGER 0. (1+ DANGER))) + ((> DANGER 2.) + ;;; Don't degrade more than once. + (SETQ DB-LAST-DATE DB-DATE) + (DO ((I 0. (1+ I)) (VAL (CAR REST-OF-MODEL) (CDR VAL))) + ((> I DB-NUM-CRULES)) + (STORE (ASKC-RULES I 0.) + (SLI-VALUE (CAR VAL) DEGRADE)))) + ;;; First reset the phases to zero. + (SL-RESET-PHASE 0. DANGER) + (DO ((REST-OF-RULES (CAR REST-OF-MODEL) + (CDR REST-OF-RULES)) + (RULE 0. (1+ RULE))) + ((> RULE DB-NUM-RULES)) + (SLI-SET-VAL (CAAR REST-OF-RULES) + (CADAR REST-OF-RULES) + 0. + DEGRADE + RULE + DANGER) + (SLI-SET-VAL (CADDAR REST-OF-RULES) + (CADDR (CDAR REST-OF-RULES)) + 1. + DEGRADE + RULE + DANGER)))) + +;;; SKI-GET-MODEL gets the student-model from the different arrays. +;;;It works very closely with SKI-PUT-MODEL. + +(DEFUN SKI-GET-MODEL NIL + (DECLARE (SPECIAL DB-NUM-CRULES DB-NUM-RULES)) + (DO + ((DANGER 2. (1- DANGER)) + (GOTTEN-MODEL (LIST (DO ((I DB-NUM-CRULES (1- I)) (VAL NIL)) + ((< I 0.) VAL) + (SETQ VAL (CONS (ASKC-RULES I 0.) + VAL)))))) + ((< DANGER 0.) GOTTEN-MODEL) + (SETQ + GOTTEN-MODEL + (CONS (DO ((RULE DB-NUM-RULES (1- RULE)) (GOTTEN-RULES NIL)) + ((< RULE 0.) GOTTEN-RULES) + (SETQ GOTTEN-RULES + (CONS (LIST (ASK-DRULES RULE 0. DANGER) + (ASK-WDRULES RULE 0. DANGER) + (ASK-DRULES RULE 1. DANGER) + (ASK-WDRULES RULE 1. DANGER)) + GOTTEN-RULES))) + GOTTEN-MODEL)))) + +;;; *********** Wumpus Advisor Critic Routines. *********** +;;; SC-ADVISED notes that the player has been advised concerning +;;;the danger and sets ASC-INITIALIZED accordingly. +;;;ASC-INITIALIZED has four possible values. They are: +;;; 1- NIL indicating that this is a new player. +;;; 2- 'B indicating that this is a new player who +;;; is being moved back. +;;; 3- 'A indicating that the player is being advanced. +;;; 4- Number, indicating that the Critic stopped +;;; initializing on this move number. + +(DEFUN SC-ADVISED (RULES DANGER) + (COND ((FIXP (ASC-INITIALIZED DANGER)) NIL) + ((EQ (ASC-INITIALIZED DANGER) 'A) + (SC-STOP-INITIALIZING (CAR RULES) DANGER '(|needed advice on|))) + (T (STORE (ASC-INITIALIZED DANGER) 'B)))) + +;;; SC-UPDATE-RECEPTIVITY adjusts SL-RECEPTIVITY. + +(DEFUN SC-UPDATE-RECEPTIVITY (MOVE) + (DECLARE (SPECIAL LWA-GOOD-MOVES LWA-BAD-MOVES DB-NUM-CAVES SL-RECEPTIVITY)) + (PROG (VAL) + (SETQ VAL (COND ((AND (GP-NUM-TEST MOVE DB-NUM-CAVES) + (XDR-VISITEDP MOVE)) + 0.0) + ((GC-MEMBER LWA-GOOD-MOVES MOVE 2.) + (SC-EXPL-RECP MOVE + '|upgrading| + '|very recently| + '|good|) + 1.0) + ((GC-MEMBER LWA-GOOD-MOVES MOVE 5.) + (SC-EXPL-RECP MOVE + '|upgrading| + '|recently| + '|good|) + 0.5) + ((GC-MEMBER LWA-BAD-MOVES MOVE 2.) + (SC-EXPL-RECP MOVE + '|degrading| + '|very recently| + '|bad|) + -1.0) + ((GC-MEMBER LWA-BAD-MOVES MOVE 5.) + (SC-EXPL-RECP MOVE + '|degrading| + '|recently| + '|bad|) + -0.5) + (T 0.0))) + ;;; Note that low values of SL-RECEPTIVITY + ;;;allow the Advsior to speak more often. + (SETQ SL-RECEPTIVITY (-$ SL-RECEPTIVITY VAL)))) + +;;; SC-EXPL-RECP explains changes in the receptivity. + +(DEFUN SC-EXPL-RECP (MOVE CHANGE WHEN TYPE) + (G-TSAY + (APPEND (LIST '|*** I am| CHANGE) + '(|the player's receptivity because his move to cave|) + (LIST MOVE + '|is a move that I told him was| + TYPE) + (LIST WHEN '|. ***|)))) + +;;; SC-MARK-RULE analyzes the marking of the given rule. + +(DEFUN SC-MARK-RULE (RULE DANGER) + (DECLARE (SPECIAL SC-DECREASE-REPEAT SC-INCREASE-FORGET + WE-THIS-SESSION SL-REPEAT)) + (COND ((SLR-KNOWS-RULEP RULE DANGER)) + ((EQ (ASC-INITIALIZED DANGER) 'B) + (SC-STOP-INITIALIZING RULE DANGER '(|seems to be learning|))) + ((NOT (FIXP (ASC-INITIALIZED DANGER))) + (STORE (ASC-INITIALIZED DANGER) 'A) + (SC-KNOWS-RULE '|he is a new player| + RULE + DANGER)) + ;;; Note that negative values indicate that it was "forgotten". + ((< (ASK-WDRULES RULE 0. DANGER) + (MIN 0. (- 75. WE-THIS-SESSION))) + (SC-KNOWS-RULE '|he seems to have remembered it| + RULE + DANGER) + (SETQ SC-INCREASE-FORGET T)) + ((AND (> (ASK-DRULES RULE 0. DANGER) (-$ SL-REPEAT 2.0)) + (> (ASK-WDRULES RULE 0. DANGER) (ASC-INITIALIZED DANGER))) + (SETQ SC-DECREASE-REPEAT T)))) + +;;; SC-KNOWS-RULE notes that the player knows a rule. + +(DEFUN SC-KNOWS-RULE (REASON RULE DANGER) + (DECLARE (SPECIAL SL-REPEAT)) + (G-TSAY (APPEND '(|*** I am presuming that the player knows|) + (EG-TOLD-RULES (LIST RULE) DANGER) + (LIST '|since| REASON '|. ***|))) + (STORE (ASK-DRULES RULE 0. DANGER) (-$ SL-REPEAT 0.5))) + +;;; SC-UNMARK-RULE analyzes the unmarking of the given rule. + +(DEFUN SC-UNMARK-RULE (RULE DANGER) + (DECLARE (SPECIAL SC-DECREASE-FORGET SC-INCREASE-REPEAT + WE-THIS-SESSION SL-REPEAT)) + (COND + ((EQ (ASC-INITIALIZED DANGER) 'A) + (SC-STOP-INITIALIZING RULE DANGER '(|does not seem to know|))) + ((NOT (MEMBER RULE + (ASL-PHASE-RULES (ASL-PHASE DANGER) DANGER)))) + ((NOT (FIXP (ASC-INITIALIZED DANGER))) + (STORE (ASC-INITIALIZED DANGER) 'B) + (SC-UNLEARN-RULE '|he is a new player| RULE DANGER)) + ((> (ASK-DRULES RULE 0. DANGER) (+$ 2.0 SL-REPEAT))) + ((AND (> (ASK-WDRULES RULE 0. DANGER) (ASC-INITIALIZED DANGER)) + (< (ASK-WDRULES RULE 0. DANGER) WE-THIS-SESSION)) + (SC-UNLEARN-RULE + '|he seems to have forgotten it since last session| + RULE + DANGER) + (SETQ SC-DECREASE-FORGET T)) + ((> (ASK-WDRULES RULE 0. DANGER) (ASC-INITIALIZED DANGER)) + (SETQ SC-INCREASE-REPEAT T)))) + +;;; SC-UNLEARN-RULE notes that the player does not know a rule. + +(DEFUN SC-UNLEARN-RULE (REASON RULE DANGER) + (DECLARE (SPECIAL SL-REPEAT)) + (G-TSAY + (APPEND + '(|*** I am no longer presuming that the player knows|) + (EG-TOLD-RULES (LIST RULE) DANGER) + (LIST '|because| REASON '|. ***|))) + (STORE (ASK-DRULES RULE 0. DANGER) (+$ SL-REPEAT 0.5))) + +;;; SC-STOP-INITIALIZING stops the initializations. + +(DEFUN SC-STOP-INITIALIZING (RULE DANGER REASON) + (DECLARE (SPECIAL WE-MOVE-NUM)) + (STORE (ASC-INITIALIZED DANGER) WE-MOVE-NUM) + (G-TSAY (APPEND '(|*** I have stopped initializing the|) + '(|player's knowledge model for|) + (AEG-DANGER-SING DANGER) + '(|because he|) + REASON + (LIST '|rule| RULE '|. ***|)))) + +;;; SC-UPDATE-MODEL does the actual modifications of SL variables. + +(DEFUN SC-UPDATE-MODEL NIL + (DECLARE (SPECIAL I SC-UREPEAT SC-LREPEAT SC-UFORGET SC-LFORGET DB-NUM-RULES + SL-REPEAT SL-FORGET SL-HEARD-OF SL-MODE DB-DEBUG SC-NOTEST + SC-DECREASE-FORGET SC-DECREASE-REPEAT SC-INCREASE-FORGET + SC-INCREASE-REPEAT)) + (PROG (OLD-REPEAT NEW-REPEAT KNOWS-RULES FORGOT-RULES + NEW-RULES) + (SETQ OLD-REPEAT SL-REPEAT) + (COND + (SC-INCREASE-FORGET + (SETQ SL-FORGET (1+$ (*$ 1.1 (1-$ SL-FORGET)))) + (G-TSAY + '(|*** The player does not seem as forgetful| + |as I previously thought. ***|)))) + (COND + (SC-DECREASE-FORGET + (SETQ SL-FORGET (1+$ (*$ 0.9 (1-$ SL-FORGET)))) + (G-TSAY + '(|*** The player seems more forgetful| + |than I previously thought. ***|)))) + (COND + (SC-INCREASE-REPEAT + (SETQ SL-REPEAT (+$ SL-REPEAT 0.34)) + (G-TSAY + '(|*** My previous repetition factor for the| + |student seems to have been too low. ***|)))) + (COND + (SC-DECREASE-REPEAT + (SETQ SL-REPEAT (-$ SL-REPEAT 0.17)) + (G-TSAY + '(|*** My previous repetition factor for the| + |student seems to have been too high. ***|)))) + (SC-RESET-SWITCHES) + (COND + ((NOT (= SL-REPEAT OLD-REPEAT)) + (SETQ NEW-REPEAT SL-REPEAT + SL-HEARD-OF (1-$ SL-REPEAT)) + (G-TSAY + (APPEND + '(|*** I am giving the player a new repetition factor of|) + (LIST NEW-REPEAT '|. ***|))) + (DO + ((I 0. (1+ I))) + ((> I 2.)) + (SETQ + SL-REPEAT + OLD-REPEAT + KNOWS-RULES + (GM-ALL-TRUE (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL I)) + (SLR-KNOWS-RULEP X + I))) + (GP-ORDLST DB-NUM-RULES)) + SL-REPEAT + NEW-REPEAT + FORGOT-RULES + (GM-ALL-TRUE + (FUNCTION (LAMBDA (X) (DECLARE (SPECIAL I)) + (NOT (SLR-KNOWS-RULEP X I)))) + KNOWS-RULES) + NEW-RULES + (GM-ALL-TRUE (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL I)) + (SLR-KNOWS-RULEP X + I))) + (GP-REMOVE-LIST (GP-ORDLST DB-NUM-RULES) + KNOWS-RULES))) + (COND + ((OR FORGOT-RULES NEW-RULES) + (G-TSAY + (APPEND + '(|*** Because of the new repetition factor I am|) + (COND (FORGOT-RULES '(|no longer|)) + (T '(|now|))) + '(|presuming that he knows|) + (EG-TOLD-RULES (APPEND FORGOT-RULES NEW-RULES) I) + '(|. ***|))) + (MAPC (FUNCTION (LAMBDA (X) (DECLARE (SPECIAL I)) + (SL-LEARNED-RULE X I))) + NEW-RULES) + (MAPC (FUNCTION (LAMBDA (X) (DECLARE (SPECIAL I)) + (SL-UNLEARN-RULE X I))) + FORGOT-RULES)))))) + (COND ((OR SL-MODE DB-DEBUG SC-NOTEST) NIL) + ((OR (< SL-REPEAT SC-LREPEAT) + (> SL-REPEAT SC-UREPEAT) + (< SL-FORGET SC-LFORGET) + (> SL-FORGET SC-UFORGET)) + (SC-HELP '|learning model|))))) + +;;; SC-RESET-SWITCHES resets the switches to NIL. + +(DEFUN SC-RESET-SWITCHES NIL + (DECLARE (SPECIAL SC-DECREASE-FORGET SC-DECREASE-REPEAT SC-INCREASE-FORGET + SC-INCREASE-REPEAT)) + (SETQ SC-INCREASE-FORGET NIL + SC-DECREASE-FORGET NIL + SC-INCREASE-REPEAT NIL + SC-DECREASE-REPEAT NIL)) + +;;; ********** Student Learning Model Routines. ********* +;;; SL-LEARNED-RULE marks that the player knows the specified RULE. + +(DEFUN SL-LEARNED-RULE (RULE DANGER) + (DECLARE (SPECIAL SL-LAST-LEARNED WE-MOVE-NUM WA-CAN-BACKTRACK SL-REPEAT)) + (COND ((OR (NOT (FIXP (ASC-INITIALIZED DANGER))) + (< (ASK-WDRULES RULE 0. DANGER) (ASC-INITIALIZED DANGER))) + (SETQ SL-LAST-LEARNED WE-MOVE-NUM))) + (COND ((= RULE 1.) (SETQ WA-CAN-BACKTRACK (+$ SL-REPEAT 0.5)))) + (STORE (ASK-WDRULES RULE 0. DANGER) WE-MOVE-NUM) + (SL-TEST-PHASE DANGER) + (COND ((= DANGER 0.) (SL-TRANS-TEST 0. 1. RULE)) + ((= DANGER 1.) (SL-TRANS-TEST 1. 0. RULE)))) + +;;; SL-TEST-PHASE tests to see if the player has learned +;;;the rules necessary to advance to the next phase. + +(DEFUN SL-TEST-PHASE (DANGER) + (COND + ((= (ASL-PHASE DANGER) 4.)) + ((SLR-KNOWS-RULESP (ASL-NEXT-RULES (ASL-PHASE DANGER) DANGER) + DANGER) + (STORE (ASL-PHASE DANGER) (1+ (ASL-PHASE DANGER))) + (G-TSAY + (APPEND + '(|*** I am advancing the student to phase|) + (LIST (ASL-PHASE DANGER)) + '(|for|) + (AEG-DANGER-PLUR DANGER) + '(|as he has mastered|) + (EG-INSERT-AND '|rule| + (ASL-NEXT-RULES (1- (ASL-PHASE DANGER)) + DANGER)) + '(|. ***|))) + (STORE (ASL-WORK-ON-RULES DANGER) + (GP-UNION (ASL-WORK-ON-RULES DANGER) + (ASL-PHASE-RULES (ASL-PHASE DANGER) + DANGER))) + (SL-TEST-PHASE DANGER)))) + +;;; SL-TRANS-TEST transfers knowledge if appropriate. + +(DEFUN SL-TRANS-TEST (L-DANGER O-DANGER RULE) + (COND + ((AND (> (ASL-PHASE L-DANGER) 1.) + (> (ASL-PHASE O-DANGER) 1.) + (NOT (SLR-KNOWS-RULEP RULE O-DANGER))) + (G-TSAY + (APPEND '(|*** I am presuming a transfer of knowledge of|) + (EG-TOLD-RULES (LIST RULE) L-DANGER) + '(|to|) + (AEG-DANGER-PLUR O-DANGER) + '(|. ***|))) + (STORE (ASK-DRULES RULE 0. O-DANGER) + (ASK-DRULES RULE 0. L-DANGER)) + (SL-LEARNED-RULE RULE O-DANGER)))) + +;;; SL-UNLEARN-RULE notes that the player no longer knows a rule. + +(DEFUN SL-UNLEARN-RULE (RULE DANGER) + (DECLARE (SPECIAL WE-MOVE-NUM)) + (PROG (NEW-PHASE) + (STORE (ASK-WDRULES RULE 0. DANGER) WE-MOVE-NUM) + (DO ((I 0. (1+ I)) (DONE)) + (DONE) + (COND ((MEMBER RULE (ASL-NEXT-RULES I DANGER)) + (SETQ NEW-PHASE I DONE T)) + ((> I 4.) (SETQ NEW-PHASE 4. DONE T)))) + (COND + ((< NEW-PHASE (ASL-PHASE DANGER)) + (G-TSAY + (APPEND '(|*** I am moving the student back to phase|) + (EG-NUMBER NEW-PHASE) + '(|for|) + (AEG-DANGER-PLUR DANGER) + '(|as he doesn't seem to know rule|) + (LIST RULE '|. ***|))) + (SL-RESET-PHASE NEW-PHASE DANGER))))) + +;;; SL-RESET-PHASE sets the phase back to the appropriate phase. + +(DEFUN SL-RESET-PHASE (PHASE DANGER) + (STORE (ASL-PHASE DANGER) PHASE) + (STORE (ASL-WORK-ON-RULES DANGER) + (DO ((I 0. (1+ I)) (VAL)) + ((> I PHASE) VAL) + (SETQ VAL (GP-UNION (ASL-PHASE-RULES I DANGER) + VAL))))) + +;;; SL-ADVISEP returns NIL if it is acceptable to advise now. + +(DEFUN SL-ADVISEP (MOVE) + (DECLARE (SPECIAL SL-MODE LWA-GOOD-MOVES LWA-BAD-MOVES + LWA-MOVE-NUMS WE-MOVE-NUM SL-RECEPTIVITY)) + (AND (NOT SL-MODE) + (OR (> SL-RECEPTIVITY + (-$ (FLOAT WE-MOVE-NUM) + (GC-AVERAGE LWA-MOVE-NUMS))) + (GC-MEMBER LWA-GOOD-MOVES MOVE 3.) + (GC-MEMBER LWA-BAD-MOVES MOVE 3.)))) + +;;; SLR-KNOWS-RULESP returns RULES if the player is +;;;thought to know these rules. + +(DEFUN SLR-KNOWS-RULESP (RULES DANGER) + (COND ((NULL RULES) T) + ((AND (SLR-KNOWS-RULEP (CAR RULES) DANGER) + (SLR-KNOWS-RULESP (CDR RULES) DANGER)) + RULES) + (T NIL))) + +;;; SLR-KNOWS-RULEP returns the given rule if the player knows it. + +(DEFUN SLR-KNOWS-RULEP (RULE DANGER) + (DECLARE (SPECIAL SL-REPEAT)) + (> (ASK-DRULES RULE 0. DANGER) SL-REPEAT)) + +;;; SLR-OK-RULESP returns T if it is OK to teach these rules. + +(DEFUN SLR-OK-RULESP (RULES DANGER) + (COND ((NULL RULES) T) + ((AND (MEMBER (CAR RULES) (ASL-WORK-ON-RULES DANGER)) + (SLR-OK-RULESP (CDR RULES) DANGER)) + RULES) + (T NIL))) + +;;; SLR-HEARD-OF-RULE returns T if the player is familiar +;;;with the move. + +(DEFUN SLR-HEARD-OF-RULE (RULE DANGER) + (DECLARE (SPECIAL SL-HEARD-OF)) + (> (ASK-DRULES RULE 1. DANGER) SL-HEARD-OF)) + +;;; ********* Student Knowledge Model Routines. ********** +;;; SK-MARK-RULES marks that the student has applied RULES. + +(DEFUN SK-MARK-RULES (RULES DANGER) + (COND (RULES (SK-MARK-RULE (CAR RULES) DANGER) + (SK-MARK-RULES (CDR RULES) DANGER) + RULES))) + +;;; SK-MARK-RULE marks that the player has applied RULE. + +(DEFUN SK-MARK-RULE (RULE DANGER) + (SC-MARK-RULE RULE DANGER) + (SK-INCR-RULE RULE DANGER)) + +;;; SK-INCR-RULE does the actual incrementing of a rule. + +(DEFUN SK-INCR-RULE (RULE DANGER) + (DECLARE (SPECIAL SL-REPEAT)) + (STORE (ASK-DRULES RULE 0. DANGER) + (1+$ (ASK-DRULES RULE 0. DANGER))) + (COND ((AND (> (ASK-DRULES RULE 0. DANGER) SL-REPEAT) + (< (ASK-DRULES RULE 0. DANGER) (1+$ SL-REPEAT))) + (SL-LEARNED-RULE RULE DANGER)) + ((= DANGER 0.) (SK-TRANS-TEST 0. 1. RULE)) + ((= DANGER 1.) (SK-TRANS-TEST 1. 0. RULE)))) + +;;; SK-TRANS-TEST transfer knowledge if appropriate. + +(DEFUN SK-TRANS-TEST (L-DANGER O-DANGER RULE) + (COND ((> RULE 15.)) + ((SLR-KNOWS-RULEP O-DANGER RULE)) + ((AND (> (ASL-PHASE L-DANGER) 1.) + (> (ASL-PHASE O-DANGER) 1.)) + (STORE (ASK-DRULES RULE 0. O-DANGER) + (1+$ (ASK-DRULES RULE 0. O-DANGER)))))) + +;;; SK-TOLD-RULE marks that a student has been told an application +;;;of a rule. + +(DEFUN SK-TOLD-RULE (RULE DANGER) + (DECLARE (SPECIAL WE-MOVE-NUM SL-HEARD-OF)) + (COND ((NOT (SLR-HEARD-OF-RULE RULE DANGER)) + (SK-INCR-RULE RULE DANGER))) + (STORE (ASK-DRULES RULE 1. DANGER) + (1+$ (ASK-DRULES RULE 1. DANGER))) + (COND ((AND (> (ASK-DRULES RULE 1. DANGER) SL-HEARD-OF) + (< (ASK-DRULES RULE 1. DANGER) (1+$ SL-HEARD-OF))) + (STORE (ASK-WDRULES RULE 1. DANGER) WE-MOVE-NUM)))) + +;;; SK-UNMARK-RULES decrements the appropriate rules by one. + +(DEFUN SK-UNMARK-RULES (RULES DANGER) + (COND ((NULL RULES)) + (T (SK-UNMARK-RULES (CDR RULES) DANGER) + (SK-UNMARK-RULE (CAR RULES) DANGER) + RULES))) + +;;; SK-UNMARK-RULE decrements rule by one. + +(DEFUN SK-UNMARK-RULE (RULE DANGER) + (DECLARE (SPECIAL SL-MODE)) + (COND ((EQ SL-MODE 'SUPER)) + ((SLR-KNOWS-RULEP RULE DANGER) + (SC-UNMARK-RULE RULE DANGER) + (STORE (ASK-DRULES RULE 0. DANGER) + (1-$ (ASK-DRULES RULE 0. DANGER))) + (COND ((NOT (SLR-KNOWS-RULEP RULE DANGER)) + (SL-UNLEARN-RULE RULE DANGER)))) + (T (STORE (ASK-DRULES RULE 0. DANGER) + (1-$ (ASK-DRULES RULE 0. DANGER)))))) + +;;; ******** Student Model (Combination Rules). ********** +;;; SLC-KNOWS-RULEP returns T if the student knows the rule. + +(DEFUN SLC-KNOWS-RULEP (RULE) + (DECLARE (SPECIAL SL-REPEAT)) + (> (ASKC-RULES RULE 0.) SL-REPEAT)) + +;;; SKC-MARK-RULE marks that the student has applied this rule. + +(DEFUN SKC-MARK-RULE (RULE) + (STORE (ASKC-RULES RULE 0.) (1+$ (ASKC-RULES RULE 0.)))) + +;;; SKC-TOLD-RULE marks that the student has been told RULE. + +(DEFUN SKC-TOLD-RULE (RULE) + (DECLARE (SPECIAL SL-HEARD-OF)) + (COND ((< (ASKC-RULES RULE 0.) SL-HEARD-OF) (SKC-MARK-RULE RULE)))) + +;;; *********** Disc File Handling Routines. *********** +;;; SF-GET-DISC-FILE gets the file on the user off of disc. +;;;It then stores the values in the database and +;;;returns the file (if there was any). + +(DEFUN SF-GET-DISC-FILE (USER-NAME) + (SF-STORE-USER-FILE (SF-READ-DISC-FILE USER-NAME))) + +;;; SF-TELL-MODEL types out the current user model. + +(DEFUN SF-TELL-MODEL NIL + (DECLARE (SPECIAL DB-NUM-RULES)) + (G-RSAY '(|The following are the student model values. |)) + (G-RSAY '(|Rule Bats Pits Wumpus|)) + (DO ((I 0. (1+ I))) + ((> I DB-NUM-RULES)) + (G-RSAY (LIST '| | I)) + (DO ((J 0. (1+ J)) (C-POS 7. (+ 16. C-POS))) + ((> J 2.)) + (G-PSAY (LIST (GP-MAKN (ASK-DRULES I 0. J) + (SF-SUFFIX I J))) + C-POS))) + (G-RSAY + '(|An "*" indicates that the student is presumed| + |to have learned the rule in question, and a "-"| + |indicates that this rule is deemed acceptable| + |for teaching at this time. A "+" indicates that| + |the player is deemed to have "heard of" the rule| + |in question. |))) + +;;; SF-SUFFIX constructs the suffix that is appropriate. + +(DEFUN SF-SUFFIX (I J) + (GP-MAKN (COND ((SLR-KNOWS-RULEP I J) '*) + ((SLR-OK-RULESP (LIST I) J) '-) + (T '| |)) + (COND ((SLR-HEARD-OF-RULE I J) '+) + (T '| |)))) + +;;; SF-TELL-VARS tells about important variables of the student file. + +(DEFUN SF-TELL-VARS NIL + (DECLARE (SPECIAL SF-VAR-LIST DB-NUM-CRULES)) + (G-RSAY + (APPEND + '(|The student is thought to know|) + (EG-INSERT-AND '|combination rule| + (GM-ALL-TRUE 'SLC-KNOWS-RULEP + (GP-ORDLST DB-NUM-CRULES))) + '(|. |))) + (G-TERPRI) + (G-RSAY '(|Student variable values are:|)) + (MAPC (FUNCTION (LAMBDA (X) (G-RISAY (LIST X)) + (G-PSAY (LIST (EVAL X)) 26.))) + SF-VAR-LIST)) + +;;; SF-LOAD-DEMO loads in the appropriate demo if desired. + +(DEFUN SF-LOAD-DEMO NIL + (G-RSAY '(|Please enter the demo that you would like. |)) + (SF-GET-DEMO)) + +;;; SF-GET-DEMO does most of the actual work of getting the demo. + +(DEFUN SF-GET-DEMO NIL + (DECLARE (SPECIAL SL-MODE DB-NAME DB-UNAME)) + (G-RISAY '(|BEGINNER, for novices who are quick learners. |)) + (G-RISAY '(|NOVICE, if you have played a couple of games. |)) + (G-RISAY '(|AMATEUR, for players who are fairly good. |)) + (G-RISAY '(|MODERATE, if you are a moderately good player. |)) + (G-RISAY '(|ADVANCED, for skilled Wumpii hunters. |)) + (G-RISAY '(|EXPERT, for excellent players. |)) + (G-RISAY + '(|SUPER, an interesting mode for experienced Wumpus hunters. |)) + (G-RISAY + '(|NONE, for people who just realized they don't want a demo at all. |)) + (SETQ SL-MODE (G-READ 'MODE) DB-UNAME SL-MODE) + (COND ((EQ SL-MODE 'NONE) (SETQ SL-MODE NIL) NIL) + ((MEMBER SL-MODE + '(BEGINNER NOVICE AMATEUR MODERATE ADVANCED EXPERT SUPER)) + (SF-GET-DISC-FILE DB-UNAME) + (G-RSAY '(|Please enter your first name. |)) + (SETQ DB-NAME (G-LOWER-CASE (G-READ 'SYNDI) T)) + T) + (T (G-RSAY '(|Please enter one of:|)) + (SF-GET-DEMO)))) + +;;; SF-STORE-USER-FILE stores the file it is sent into the database. + +(DEFUN SF-STORE-USER-FILE (USER-FILE) + (DECLARE (SPECIAL USER-MODEL SC-INITIALIZED WEV-RECREATE DB-DATE + WE-LAST-SESSION WE-THIS-SESSION SF-VAR-LIST + DB-LAST-DATE SL-MODE WE-MOVE-NUM)) + (PROG (USER-MODEL) + (MAPC 'SET + (CONS 'USER-MODEL SF-VAR-LIST) + USER-FILE) + (MAPC + (FUNCTION (LAMBDA (X Y) (STORE (ASC-INITIALIZED X) Y))) + '(2. 1. 0.) + SC-INITIALIZED) + (COND ((OR WEV-RECREATE SL-MODE) + (SETQ DB-LAST-DATE DB-DATE)) + ((> DB-LAST-DATE DB-DATE) + (SETQ DB-LAST-DATE (- DB-LAST-DATE 360.)))) + ;;; This is to zero out any old values. + (SKI-PUT-MODEL NIL) + (SKI-PUT-MODEL USER-MODEL) + (COND ((EQ SL-MODE 'SUPER) + (DO ((I 0. (1+ I))) + ((> I 2.)) + (SL-RESET-PHASE 4. I)))) + (SETQ WE-LAST-SESSION WE-MOVE-NUM + WE-THIS-SESSION (1+ WE-MOVE-NUM) + WE-MOVE-NUM (1+ WE-THIS-SESSION)) + (RETURN USER-FILE))) + +;;; SF-READ-DISC-FILE reads the user file as indicated by +;;;the user-name which it is sent as an argument. +;;;If it does not find any such file it returns NIL. + +(DEFUN SF-READ-DISC-FILE (THE-NAME) + (PROG (ALL-FILES) + (UREAD wa plyrs8 dsk games) + (SETQ ^Q T + ALL-FILES (READ)) + (RETURN (DO ((A-FILE (CAR ALL-FILES) (CAR ALL-FILES)) + (A-NAME (CADAR ALL-FILES) + (CADAR ALL-FILES))) + ((NULL A-FILE)) + (SETQ ALL-FILES (CDR ALL-FILES)) + (COND ((EQUAL A-NAME THE-NAME) + (RETURN A-FILE))))))) + +;;; SF-SAVE-USER-FILE saves the user's file onto disc as updated +;;;by the current session. + +(DEFUN SF-SAVE-USER-FILE NIL + (DECLARE (SPECIAL DB-UNAME)) + (DO ((FILES (SF-READ-FILES) (CDR FILES)) + (RESULT)) + ((NULL FILES) + (SF-WRITE-FILES (CONS (SF-GET-USER-FILE) RESULT))) + (COND ((EQUAL DB-UNAME (CADAR FILES)) + (SETQ RESULT (APPEND RESULT (CDR FILES)) + FILES NIL)) + (T (SETQ RESULT (CONS (CAR FILES) RESULT)))))) + +;;; SF-GET-USER-FILE returns a list of all the +;;;information which composes the user file. + +(DEFUN SF-GET-USER-FILE NIL + (DECLARE (SPECIAL SC-INITIALIZED SF-VAR-LIST)) + (SETQ SC-INITIALIZED (MAPCAR 'ASC-INITIALIZED + '(0. 1. 2.))) + (MAPCAR 'EVAL + (CONS '(SKI-GET-MODEL) SF-VAR-LIST))) + +;;; SF-READ-FILES returns the list of all user files. + +(DEFUN SF-READ-FILES NIL + (UREAD wa plyrs8 dsk games) + (SETQ ^Q T) + (READ)) + +;;; SF-WRITE-FILES writes out the files, which it is sent +;;;sent as an argument. + +(DEFUN SF-WRITE-FILES (ALL-FILES) + (SETQ ^R T ^W T) + (PRIN1 ALL-FILES) + (UFILE wa plyrs8 dsk games) + (SETQ ^W NIL ^R NIL)) + +;;;******** English Generation Routines ************ +;;;******* English Routines which compare probs. ******* +;;; EC-EXPL-PROBS makes comparisons of two probabilities. + +(DEFUN EC-EXPL-PROBS (BETTER WHY-BETTER WORSE WHY-WORSE T-DANGER) + (COND ((GP-EQ (XPR-PROB WORSE T-DANGER) 1.0) + (EC-EXPL-CERTAIN WORSE T-DANGER)) + ((= WHY-BETTER 12.) + (EC-EXPL-PROB-12-ANY BETTER WORSE WHY-WORSE T-DANGER)) + ((= WHY-BETTER 14.) + (EC-EXPL-PROB-14-ANY BETTER WORSE T-DANGER)) + ((AND (= WHY-WORSE 13.) (NOT (= WHY-BETTER 13.))) + (EC-EXPL-PROB-ANY-13 BETTER WORSE T-DANGER)) + ((AND (= WHY-BETTER 11.) (= WHY-WORSE 11.)) + (EC-EXPL-PROB-11-11 BETTER WORSE T-DANGER)) + ((= WHY-BETTER 15.) + (EC-EXPL-PROB-15-ANY BETTER WORSE T-DANGER)) + (T (EC-EXPL-PROB-ANY-ANY BETTER WORSE T-DANGER)))) + +;;; EC-EXPL-PROB-ANY-ANY makes comparison of any two rules. + +(DEFUN EC-EXPL-PROB-ANY-ANY (BETTER WORSE T-DANGER) + (APPEND '(|it is true that|) + (EXR-PROB BETTER T-DANGER NIL) + (EG-HOWEVER) + (EXR-PROB WORSE T-DANGER 'UNSAFE))) + +;;; EC-EXPL-CERTAIN explains that the worse cave is +;;;certain to contain the danger. + +(DEFUN EC-EXPL-CERTAIN (WORSE T-DANGER) + (EXR-PROB WORSE T-DANGER NIL)) + +;;; EC-EXPL-PROB-11-11 compares two probs of P11. + +(DEFUN EC-EXPL-PROB-11-11 (BETTER WORSE T-DANGER) + (WA-TOLD-RULE 11. T-DANGER) + ;;; The COND is necessary because of the way + ;;;incomplete cave sets are explained. + (APPEND + (COND ((AND (XSR-COMPLETE-CAVE-SETP (XPR-WHY-P11 BETTER + T-DANGER) + T-DANGER) + (XSR-COMPLETE-CAVE-SETP (XPR-WHY-P11 WORSE + T-DANGER) + T-DANGER)) + (APPEND '(|It is true that|) + (EXT-CAVE-SET (XPR-WHY-P11 BETTER T-DANGER) + T-DANGER T 0.) + (EG-HOWEVER) + (EXT-CAVE-SET (XPR-WHY-P11 WORSE T-DANGER) + T-DANGER T 0.))) + (T (APPEND (EXT-CAVE-SET WORSE T-DANGER T 0.) + (EG-CONVERSELY) + (EXT-CAVE-SET BETTER T-DANGER T 0.)))) + (LIST '|. This makes it less likely that cave| + BETTER + '|contains|) + (AEG-DANGER-SING T-DANGER))) + +;;; EC-EXPL-PROB-15-ANY compares P15 with any rule. + +(DEFUN EC-EXPL-PROB-15-ANY (BETTER WORSE T-DANGER) + (APPEND (EXR-PROB15 BETTER T-DANGER 'SAFE) + (COND ((GP-EQ 0.0 (XPR-PROB BETTER T-DANGER)) NIL) + (T (APPEND '(|than if we visited cave|) + (LIST WORSE)))))) + +;;; EC-EXPL-PROB-ANY-13 compares P11 probs with P13 probs. + +(DEFUN EC-EXPL-PROB-ANY-13 (BETTER WORSE T-DANGER) + (APPEND (EXR-PROB13 WORSE T-DANGER NIL) + '(|. |) + (EXR-CAVE-PROB BETTER T-DANGER 'SAFE))) + +;;; EC-EXPL-PROB-14-ANY compares P14 to another prob. + +(DEFUN EC-EXPL-PROB-14-ANY (BETTER WORSE T-DANGER) + (APPEND (EXR-PROB14 BETTER T-DANGER NIL) + '(|. |) + (EXR-CAVE-PROB WORSE T-DANGER 'UNSAFE))) + +;;; EC-EXPL-PROB-12-ANY compares P12 with another prob. + +(DEFUN EC-EXPL-PROB-12-ANY (BETTER WORSE WHY-WORSE T-DANGER) + (COND ((= WHY-WORSE 12.) + (WE-ERROR 'EC-EXPL-PROB-12-ANY))) + (APPEND (EXR-PROB12 BETTER T-DANGER NIL) + '(|. There is evidence of|) + (AEG-DANGER-SING T-DANGER) + (LIST '|in cave| WORSE) + '(|which makes it a more dangerous cave|))) + +;;;****** English Routines Interfacing With the Expert ****** +;;; EXR-SAFE-CAVE explains why a cave is safe from DANGERS. + +(DEFUN EXR-SAFE-CAVE (CAVE DANGERS) + (COND + ((NULL DANGERS) NIL) + (T + (APPEND (EXR-MORE-THAN CAVE 0. (CAR DANGERS)) + (COND ((> (ASK-WDRULES 18. 0. (CAR DANGERS)) 2.) + (EGT-ALSO DANGERS)) + (T (APPEND '(|. |) + (EG-TELL-AVOID (LIST (CAR DANGERS))) + (COND ((GP-TEST DANGERS) + '(|. |)))))) + (EXR-SAFE-CAVE CAVE (CDR DANGERS)))))) + +;;; EXT-LIST-MORE-THAN explains why the list is more than +;;;the given DIST away from DANGER. Note that it return NIL +;;;if the student already knows all teh rules concerned, +;;;AND the GO-AHEAD switch is off. + +(DEFUN EXT-LIST-MORE-THAN (CAVE-LIST DIST DANGER GO-AHEAD) + (DECLARE (SPECIAL DIST DANGER VALUE)) + (PROG (KNOWS-CAVES VISITED-CAVES VALUE) + (COND + ;;; By definition a cave is more than -1. + ((= DIST -1.) (RETURN NIL)) + ((SETQ + KNOWS-CAVES + (GM-ALL-TRUE + (FUNCTION + (LAMBDA (X) + (DECLARE (SPECIAL DIST DANGER)) + (AND (> (1+ (XDR-MORE-THAN X DANGER)) DIST) + (SLR-KNOWS-RULESP (CXR-MORE-THAN (LIST X) + DIST + DANGER + NIL) + DANGER)))) + CAVE-LIST)) + (SETQ CAVE-LIST (GP-REMOVE-LIST CAVE-LIST KNOWS-CAVES)) + (SETQ VALUE (APPEND (EGT-ALL-OF DIST KNOWS-CAVES) + (EG-INSERT-AND '|cave| + KNOWS-CAVES) + (EGT-MORE-THAN DIST + DANGER + KNOWS-CAVES))))) + (COND + ((NOT (OR GO-AHEAD CAVE-LIST)) (RETURN NIL)) + ((AND (= DIST 0.) + (SETQ VISITED-CAVES + (GM-ALL-TRUE 'XDR-VISITEDP + CAVE-LIST))) + (WA-TOLD-RULE 1. DANGER) + (SETQ CAVE-LIST (GP-REMOVE-LIST CAVE-LIST + VISITED-CAVES)) + (SETQ VALUE + (APPEND (COND (VALUE (APPEND VALUE + (EGT-ALSO T)))) + '(|we have safely visited|) + (EG-INSERT-AND '|cave| + VISITED-CAVES))))) + (COND ((NULL CAVE-LIST) (RETURN VALUE))) + (RETURN + (APPEND + VALUE + (GM-MAPCAN + (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL DIST DANGER + VALUE)) + (APPEND (COND (VALUE (EGT-ALSO T)) + (T (SETQ VALUE T) + NIL)) + (EXR-MORE-THAN X + DIST + DANGER)))) + CAVE-LIST))))) + +;;; EXR-MORE-THAN returns the explanation for why CAVE +;;;is more than DIST away from DANGER. + +(DEFUN EXR-MORE-THAN (CAVE DIST DANGER) + (DECLARE (SPECIAL CAVE)) + (PROG (R-DIST REASON TEMP) + (SETQ R-DIST (XDR-MORE-THAN CAVE DANGER) + REASON (XXR-WHY-MORE-THAN CAVE DIST DANGER)) + (COND ((< R-DIST DIST) + (RETURN (WE-ERROR (LIST 'EXR-MORE-THAN + CAVE + DIST + DANGER)))) + ((= DIST -1.) (RETURN NIL))) + (WA-TOLD-RULE REASON DANGER) + (RETURN + (APPEND (LIST '|cave| CAVE) + (EGT-MORE-THAN DIST DANGER NIL) + '(|because|) + (COND ((= REASON 1.) + '(|we have safely visited it|)) + ((= REASON 2.) (EX-L2 DANGER)) + ((= REASON 3.) + (APPEND '(|we have been there|) + '(|and we did not|) + (AEG-WARNING-PRES DANGER))) + ((= REASON 5.) + (EX-L5 (LIST CAVE) DIST DIST DANGER)) + ((= REASON 6.) + (EX-L6 CAVE DIST DANGER TEMP)) + ((= REASON 9.) (EX-L9 CAVE DANGER TEMP)) + ((= REASON 10.) (EX-L10 CAVE DANGER))))))) + +;;; EX-L2 finishes an explanation of L2. + +(DEFUN EX-L2 (DANGER) + (APPEND '(|you shot an arrow there and you did not kill|) + (AEG-DANGER-SING DANGER))) + +;;; EX-L5 finishes explanations for L5. + +(DEFUN EX-L5 (HAVE-CAVES DIST O-DIST DANGER) + (COND ((= (XXR-WHY-MORE-THAN (CAR HAVE-CAVES) DIST DANGER) 5.) + (EX-L5 (CONS (CADR (XDR-WHY-MORE-THAN (CAR HAVE-CAVES) + DANGER)) + HAVE-CAVES) + (1+ DIST) + O-DIST + DANGER)) + ((MEMBER DANGER (WGR-WARNINGS (CAR HAVE-CAVES))) + (WE-ERROR (LIST 'EX-L5 (CAR HAVE-CAVES) DANGER))) + (T (WA-TOLD-RULE 3. DANGER) + (COND ((AND (= O-DIST 0.) + (> (ADB-WARNING-DIST DANGER) 1.)) + (SK-TOLD-RULE 19. DANGER))) + (APPEND '(|, if|) + (AEG-DANGER-SING DANGER) + '(|were|) + (COND ((< O-DIST 1.) '(|there|)) + ((= O-DIST 1.) '(|next to it|)) + (T (APPEND '(|within|) + (EG-NUMBER DIST) + '(|caves of it|)))) + '(|, we would have|) + (AEG-WARNING-PAST DANGER) + (LIST '|in cave| (CAR HAVE-CAVES)) + (COND ((< (ADB-WARNING-DIST DANGER) 2.) NIL) + ((SLR-HEARD-OF-RULE 5. DANGER) NIL) + (T (EG-WITHIN (LIST (CAR HAVE-CAVES)) + (LAST HAVE-CAVES) + DANGER))))))) + +;;; EX-L6 finishes the explanations for L6. + +(DEFUN EX-L6 (CAVE DIST DANGER TEMP) + (APPEND + (EGT-ALL-OF (1- DIST) (WGR-NEIGHBORS CAVE)) + '(|its|) + (EGT-PLURAL '(|neighbors|) (WGR-NEIGHBORS CAVE)) + (EGT-MORE-THAN (1- DIST) DANGER T) + ;;; Don't say anymore if the player knows all. + (COND ((SETQ TEMP + (EXT-LIST-MORE-THAN (WGR-NEIGHBORS CAVE) + (1- DIST) + DANGER + NIL)) + (APPEND '(|. |) + TEMP + (EG-THEREFORE) + '(|cave|) + (LIST CAVE) + (EGT-MORE-THAN DIST DANGER NIL)))))) + +;;; EX-L9 finishes the explanation for L9. + +(DEFUN EX-L9 (CAVE DANGER TEMP) + (DECLARE (SPECIAL CAVE)) + (APPEND + '(|if|) + (AEG-DANGER-SING DANGER) + '(|were there we|) + (EG-SPECULATIVE (AEG-ENCOUNTER DANGER)) + (AEG-DANGER-SING DANGER) + '(|before we|) + (AEG-ENCOUNTER + (SETQ TEMP + (GM-FIRST-TRUE (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL CAVE)) + (WGR-DANGERP CAVE X))) + '(2. 1. 0.)))) + (AEG-DANGER-SING TEMP))) + +;;; EX-L10 finishes explanations for L10. + +(DEFUN EX-L10 (CAVE DANGER) + (APPEND '(|we have isolated|) + (COND ((= (ADB-NUM-DANGERS DANGER) 2.) + '(|both of the|)) + ((GP-TEST (ADB-NUM-DANGERS DANGER)) + (APPEND '(|all|) + (EG-NUMBER (ADB-NUM-DANGERS DANGER)) + '(|of the|)))) + (AEG-DANGER-PLUR DANGER) + '(|. |) + ;;; Note that a limit of -1. flags L10. + (EXT-LIST-CAVE-SET (CADR (XDR-WHY-MORE-THAN CAVE + DANGER)) + DANGER + -1.) + (EG-THEREFORE) + (LIST '|cave| CAVE) + '(|can not contain|) + (AEG-DANGER-SING DANGER))) + +;;; EXT-EXACTLY returns an explanation. It is self pruning, +;;;and will return Nil when appropriate if GO-AHEAD is NIL. +;;; Note that EXT-CAVE-SET explains rule L0. + +(DEFUN EXT-EXACTLY (CAVE DANGER GO-AHEAD) + (PROG (VALUE MORE-THAN EXACTLY) + (WA-TOLD-RULE 7. DANGER) + (COND ((AND (NOT GO-AHEAD) + (SLR-KNOWS-RULESP (CXR-EXACTLY CAVE + DANGER + NIL) + DANGER)) + (RETURN NIL)) + ((NOT (XDR-WHY-EXACTLY CAVE DANGER)) + (RETURN (WE-ERROR (LIST 'EXT-EXACTLY + CAVE + DANGER))))) + (SETQ MORE-THAN (XDR-MORE-THAN CAVE DANGER) + EXACTLY (XDR-EXACTLY CAVE DANGER)) + (SETQ VALUE (COND ((SLR-KNOWS-RULEP 4. DANGER) NIL) + (T (EXR-LESS-THAN CAVE DANGER)))) + (SETQ + VALUE + (COND ((= EXACTLY 1.) VALUE) + (VALUE (APPEND VALUE + '(|. We also know that|) + (EXT-LIST-MORE-THAN (LIST CAVE) + MORE-THAN + DANGER + T) + (EG-THEREFORE) + (LIST '|cave| + CAVE + '|is|) + (EG-N-AWAY EXACTLY) + (AEG-DANGER-SING DANGER))) + ((SLR-KNOWS-RULESP (CXR-MORE-THAN (LIST CAVE) + MORE-THAN + DANGER + NIL) + DANGER) + NIL) + (T (APPEND '(|. This follows from the fact that|) + (EXT-LIST-MORE-THAN (LIST CAVE) + MORE-THAN + DANGER + T))))) + (RETURN (APPEND (LIST '|cave| CAVE) + '(|must be|) + (EG-N-AWAY EXACTLY) + (AEG-DANGER-SING DANGER) + VALUE)))) + +;;; EXR-LESS-THAN returns that a cave is "less-than". + +(DEFUN EXR-LESS-THAN (CAVE DANGER) + (WA-TOLD-RULE 4. DANGER) + (APPEND '(|because we|) + (AEG-WARNING-PAST DANGER) + (LIST '|in cave| CAVE) + (COND ((SLR-HEARD-OF-RULE 4. DANGER) NIL) + ((> (ADB-WARNING-DIST DANGER) 1.) + (APPEND '(|. This means that cave|) + (LIST CAVE '|is within|) + (EG-NUMBER (ADB-WARNING-DIST DANGER)) + '(|caves of|) + (AEG-DANGER-SING DANGER)))))) + +;;; EXT-LIST-CAVE-SET puts together explanations for CAVE-SETS. + +(DEFUN EXT-LIST-CAVE-SET (O-CAVES DANGER LIMIT) + (COND ((NULL O-CAVES) NIL) + (T (APPEND (EXT-CAVE-SET (CAR O-CAVES) DANGER T LIMIT) + (EGT-ALSO O-CAVES) + (EXT-LIST-CAVE-SET (CDR O-CAVES) + DANGER + LIMIT))))) + +;;; EXT-CAVE-SET returns an explanation for the specified cave-set +;;;depending on the student's knowledge and on GO-AHEAD. + +(DEFUN EXT-CAVE-SET (O-CAVE DANGER GO-AHEAD LIMIT) + (PROG (VALUE EXPLAIN-SET TOTAL-SET NODIST-SET OTHER-CAVES + PROB DIST TEMP REASONS L10-SW) + (COND ((< (SETQ DIST (XDR-EXACTLY O-CAVE DANGER)) 0.) + (RETURN (WE-ERROR (LIST 'EXT-CAVE-SET + O-CAVE + DANGER))))) + (COND ((= LIMIT -1.) (SETQ LIMIT 0. L10-SW T))) + (SETQ NODIST-SET + (XXT-GET-NODIST-SET O-CAVE LIMIT DANGER L10-SW) + TOTAL-SET + (XSR-TOTAL-DIST-SET O-CAVE LIMIT DANGER) + EXPLAIN-SET + (GP-REMOVE-LIST TOTAL-SET NODIST-SET) + TEMP + (XSR-OTHER-CAVES O-CAVE LIMIT EXPLAIN-SET DANGER) + OTHER-CAVES + (CAR TEMP) + PROB + (CADR TEMP) + VALUE + (EG-DIST-SET EXPLAIN-SET + OTHER-CAVES + PROB + NIL + LIMIT + DANGER) + REASONS + (CXR-CAVE-SET (LIST O-CAVE) DANGER NIL)) + (*SS-IMPLIED-RULES REASONS DANGER) + (COND ((SLR-KNOWS-RULESP REASONS DANGER) + (COND (GO-AHEAD (RETURN VALUE)) (T (RETURN NIL)))) + ((= DIST 0.) + (WA-TOLD-RULE 0. DANGER) + (RETURN (APPEND VALUE + '(|because we|) + (AEG-ENCOUNTER DANGER) + (AEG-DANGER-SING DANGER) + '(|when we visited it before|)))) + ((AND (= (ADB-WARNING-DIST DANGER) 1.) + (SLR-KNOWS-RULESP (GP-REMOVE-LIST REASONS '(7. 4.)) DANGER)) + (WA-TOLD-RULE 4. DANGER) + (WA-TOLD-RULE 7. DANGER) + (RETURN (APPEND VALUE + '(|because we|) + (AEG-WARNING-PAST DANGER) + (LIST '|in cave| O-CAVE))))) + (RETURN (APPEND VALUE + '(|. |) + (EXT-EXACTLY O-CAVE DANGER T) + (EX-DIST-SET O-CAVE + DANGER + (1- DIST) + LIMIT + L10-SW))))) + +;;; EX-DIST-SET explains each given dist set. + +(DEFUN EX-DIST-SET (ORIGIN DANGER DIST LIMIT L10-SW) + (PROG (REDUCED-SET TOTAL-SET NODIST-SET OTHER-CAVES PROB + TEMP) + (RETURN + (COND ((< DIST LIMIT) NIL) + (T (SETQ NODIST-SET + (XXT-GET-NODIST-SET ORIGIN + DIST + DANGER + L10-SW) + TOTAL-SET + (XSR-TOTAL-DIST-SET ORIGIN DIST DANGER) + REDUCED-SET + (GP-REMOVE-LIST TOTAL-SET NODIST-SET) + TEMP + (XSR-OTHER-CAVES ORIGIN + DIST + REDUCED-SET + DANGER) + OTHER-CAVES + (CAR TEMP) + PROB + (CADR TEMP)) + (COND ((AND NODIST-SET (> DIST 0.)) + (WA-TOLD-RULE 8. DANGER))) + (APPEND (EG-DIST-SET TOTAL-SET + OTHER-CAVES + PROB + (EG-THEREFORE) + DIST + DANGER) + (EG-HOWEVER) + (EXT-LIST-MORE-THAN NODIST-SET + DIST + DANGER + T) + (EG-DIST-SET REDUCED-SET + NIL + PROB + '(|. This means that|) + DIST + DANGER) + (EX-DIST-SET ORIGIN + DANGER + (1- DIST) + LIMIT + L10-SW))))))) + +;;; EXR-PROB returns an explanation for PROB with BIAS. + +(DEFUN EXR-PROB (CAVE DANGER BIAS) + ((GP-MAKN 'EXR-PROB (CAR (XPR-WHY-PROB CAVE DANGER))) + CAVE + DANGER + BIAS)) + +;;; EXR-PROBNIL returns the explanation for PROBNIL + +(DEFUN EXR-PROBNIL (CAVE DANGER BIAS) + BIAS + (EXT-LIST-MORE-THAN (LIST CAVE) 0. DANGER T)) + +;;; EXR-PROB11 returns an explanation of PROB11. + +(DEFUN EXR-PROB11 (CAVE DANGER BIAS) + (APPEND (EXT-CAVE-SET (XPR-WHY-P11 CAVE DANGER) DANGER T 0.) + ;;; Cave-sets of one are self-explanatory. + (COND ((GP-EQ (XPR-GET-P11 CAVE DANGER) 1.0) NIL) + (T (WA-TOLD-RULE 11. DANGER) + (APPEND (EG-THEREFORE) + (EXR-CAVE-PROB CAVE DANGER BIAS)))))) + +;;; EXR-PROB12 returns an explanation for PROB12. + +(DEFUN EXR-PROB12 (CAVE DANGER BIAS) + (COND + ((XPR-WHY-P12 CAVE DANGER) + (WA-TOLD-RULE 12. DANGER) + (APPEND + '(|it is true that|) + (EXT-CAVE-SET (CADAR (XPR-WHY-P12 CAVE DANGER)) DANGER T 0.) + (EG-HOWEVER) + (EXT-CAVE-SET (CAAR (XPR-WHY-P12 CAVE DANGER)) DANGER T 0.) + '(|. This explains all the evidence for|) + (AEG-DANGER-SING DANGER) + (EG-INSERT-AND + '|in cave| + (XSR-GET-CAVE-SET (CADAR (XPR-WHY-P12 CAVE DANGER)) + DANGER)) + (COND + ((CDR (XPR-WHY-P12 CAVE DANGER)) + (APPEND + '(|. Likewise, we can explain away all the other evidence of|) + (AEG-DANGER-SING DANGER) + (LIST '|in cave| CAVE '|. |))) + (T '(|. |))) + (EXR-UNSAFE CAVE DANGER BIAS))) + (T (EXR-UNSAFE CAVE DANGER BIAS)))) + +;;; EXR-UNSAFE simply returns that a cave is unsafe. + +(DEFUN EXR-UNSAFE (CAVE DANGER BIAS) + (APPEND '(|as we do not have any evidence of cave|) + (LIST CAVE '|containing|) + (AEG-DANGER-SING DANGER) + '(|, we can presume that|) + (EXR-CAVE-PROB CAVE DANGER BIAS))) + +;;; EXR-PROB13 returns an expalnation for PROB13. + +(DEFUN EXR-PROB13 (CAVE DANGER BIAS) + (WA-TOLD-RULE 13. DANGER) + (APPEND (EXT-LIST-CAVE-SET (XPR-GOOD-MEMBER-SETS CAVE DANGER) + DANGER + 0.) + '(|. This is multiple evidence of|) + (AEG-DANGER-SING DANGER) + (LIST '|in cave| CAVE '|which makes it|) + (EG-PROBABLE (XPR-PROB CAVE DANGER) BIAS) + (LIST '|that cave| CAVE '|contains|) + (AEG-DANGER-SING DANGER))) + +;;; EXR-PROB14 returns an explanation for PROB14. + +(DEFUN EXR-PROB14 (CAVE DANGER BIAS) + (DECLARE (SPECIAL DANGER)) + (PROG (MEMBER-SETS CHANGED-CAVES) + (WA-TOLD-RULE 14. DANGER) + (SETQ + MEMBER-SETS + (XPR-GOOD-MEMBER-SETS CAVE DANGER) + CHANGED-CAVES + (GP-UNION + (GM-MAPCAN (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL DANGER)) + (XPR-P13-CHANGED X + DANGER))) + MEMBER-SETS))) + (RETURN (APPEND (EXT-LIST-CAVE-SET MEMBER-SETS DANGER 0.) + (EG-HOWEVER) + '(|we have multiple evidence for|) + (EG-INSERT-AND '|cave| + CHANGED-CAVES) + (EG-THEREFORE) + (EXR-CAVE-PROB CAVE DANGER BIAS))))) + +;;; EXR-PROB15 returns an explanation for PROB15. + +(DEFUN EXR-PROB15 (CAVE DANGER BIAS) + (COND + ((EQ BIAS 'UNSAFE) + ((GP-MAKN 'EXR-PROB (CADR (XPR-WHY-PROB CAVE DANGER))) + CAVE + DANGER + BIAS)) + (T + (WA-TOLD-RULE 15. DANGER) + (APPEND + '(|we know that it is|) + (EG-PROBABLE (XPR-GET-P14 CAVE DANGER) NIL) + (LIST '|that cave| CAVE '|contains|) + (AEG-DANGER-SING DANGER) + (EG-THEREFORE) + '(|if we first shoot an arrow into cave|) + (LIST CAVE '|before visiting it, it is|) + (EG-PROBABLE (XPR-PROB CAVE DANGER) BIAS) + '(|that we will be killed by the arrow| + |(if it misses) or by|) + (AEG-DANGER-SING DANGER))))) + +;;; EXR-CAVE-PROB returns a caves PROB in words. + +(DEFUN EXR-CAVE-PROB (CAVE DANGER BIAS) + (APPEND '(|it is|) + (EG-PROBABLE (XPR-PROB CAVE DANGER) BIAS) + (LIST '|that cave| CAVE '|contains|) + (AEG-DANGER-SING DANGER))) + +;;;******** General Purpose English Routines. ******* +;;; EG-INSERT-AND takes a list, inserts commas, inserts "and", +;;;and adds the PRED (it omits additions as appropriate). + +(DEFUN EG-INSERT-AND (PRED CAVE-LIST) + (COND ((NULL CAVE-LIST) (LIST '|no| (EG-PLURAL PRED))) + ((= (LENGTH CAVE-LIST) 1.) (GP-CONS PRED CAVE-LIST)) + ((= (LENGTH CAVE-LIST) 2.) + (GP-CONS (EG-PLURAL PRED) + (LIST (CAR CAVE-LIST) + '|and| + (CADR CAVE-LIST)))) + (T (APPEND (GP-CONS (EG-PLURAL PRED) + (EG-INSERT-COMMAS CAVE-LIST)) + '(|and|) + (LAST CAVE-LIST))))) + +;;; EG-INSERT-COMMAS inserts commas into any list it is sent. + +(DEFUN EG-INSERT-COMMAS (LIST) + (COND ((CDR LIST) + (APPEND (LIST (CAR LIST) '|,|) + (EG-INSERT-COMMAS (CDR LIST)))))) + +;;; EG-NUMBER converts a decimal number to its word equivalent. + +(DEFUN EG-NUMBER (NUMBER) + (COND ((< NUMBER 1.) '(|no|)) + ((< NUMBER 11.) (AEG-NUMBER (1- NUMBER))) + (T (LIST NUMBER)))) + +;;; EG-DANGERS converts a list of dangers into words. + +(DEFUN EG-DANGERS (DANGERS) + (EG-INSERT-AND + NIL + (MAPCAR (FUNCTION (LAMBDA (X) (CAR (AEG-DANGER-PLUR X)))) + DANGERS))) + +;;; EG-PROBABLE is a function that receives a probability and returns a +;;;list of words that have about the same meaning. + +(DEFUN EG-PROBABLE (NUMBER BIAS) + (COND ((GP-EQ NUMBER 0.0) '(|not possible|)) + ((EQ BIAS 'SAFE) '(|less likely|)) + ((EQ BIAS 'UNSAFE) '(|more likely|)) + ((< NUMBER 0.1) '(|very unlikely|)) + ((< NUMBER 0.25) '(|unlikely|)) + ((< NUMBER 0.4) '(|possible|)) + ((< NUMBER 0.55) '(|quite possible|)) + ((< NUMBER 0.7) '(|probable|)) + ((< NUMBER 0.85) '(|very likely|)) + ((< NUMBER 1.0) '(|almost certain|)) + (T '(|certain|)))) + +;;; EG-THEREFORE has an unlimited supply of "therefore"s. + +(DEFUN EG-THEREFORE NIL + (DECLARE (SPECIAL LEG-THEREFORE)) + (GC-NEXT LEG-THEREFORE)) + +;;; EGT-ALSO has a never ending supply of "also"s. + +(DEFUN EGT-ALSO (TEST) + (DECLARE (SPECIAL LEG-ALSO)) + (COND ((GP-TEST TEST) (GC-NEXT LEG-ALSO)))) + +;;; EG-CONVERSELY has an unlimited supply of "conversely"s. + +(DEFUN EG-CONVERSELY NIL + (DECLARE (SPECIAL LEG-CONVERSELY)) + (GC-NEXT LEG-CONVERSELY)) + +;;; EG-HOWEVER has an unlimited supply of "however"s. + +(DEFUN EG-HOWEVER NIL + (DECLARE (SPECIAL LEG-HOWEVER)) + (GC-NEXT LEG-HOWEVER)) + +;;; EG-BECAUSE has an unlimited supply of "because"s. + +(DEFUN EG-BECAUSE NIL + (DECLARE (SPECIAL EGV-BECAUSE)) + EGV-BECAUSE) + +;;; EG-PLURAL returns the plural of ITEM. + +(DEFUN EG-PLURAL (ITEM) + (DECLARE (SPECIAL EGV-PLURAL)) + ;;; The plural of NIL is NIL? + (COND ((NOT ITEM) NIL) + ((GET EGV-PLURAL ITEM)) + (T (GP-MAKN ITEM '/s)))) + +;;; EGT-PLURAL returns the plural if TEST was a list or T. + +(DEFUN EGT-PLURAL (LIST TEST) + (COND ((GP-TEST TEST) (CONS (EG-PLURAL (CAR LIST)) (CDR LIST))) + (T LIST))) + +;;; EG-SPECULATIVE converts its argument into the speculative. + +(DEFUN EG-SPECULATIVE (LIST) + (DECLARE (SPECIAL EG-SPEC)) + (CONS (GET EG-SPEC (CAR LIST)) (CDR LIST))) + +;;; EGT-TELL-AVOID returns an explanation why +;;;the player should avoid the DANGERS. (sometimes) + +(DEFUN EGT-TELL-AVOID (DANGERS) + (EG-TELL-AVOID + (GM-ALL-TRUE (FUNCTION (LAMBDA (X) (< (ASK-WDRULES 18. 0. X) 3.))) + DANGERS))) + +;;; EG-TELL-AVOID produces the actual English. + +(DEFUN EG-TELL-AVOID (DANGERS) + (COND + ((NULL DANGERS) NIL) + (T + (STORE (ASK-WDRULES 18. 0. (CAR DANGERS)) + (1+ (ASK-WDRULES 18. 0. (CAR DANGERS)))) + (APPEND (EVAL (AEG-TELL-AVOID (1- (ASK-WDRULES 18. 0. (CAR DANGERS))) + (CAR DANGERS))) + (EGT-ALSO DANGERS) + (EG-TELL-AVOID (CDR DANGERS)))))) + +;;; EG-TOLD-RULES returns rules for a danger. + +(DEFUN EG-TOLD-RULES (RULES DANGER) + (APPEND (EG-INSERT-AND '|rule| RULES) + '(|for|) + (AEG-DANGER-PLUR DANGER))) + +;;; EGT-MORE-THAN returns a list saying more than DIST. + +(DEFUN EGT-MORE-THAN (DIST DANGER TEST) + (APPEND (COND ((< DIST 0.) + (WE-ERROR (LIST 'EGT-MORE-THAN + DIST + DANGER))) + ((AND (= DIST 0.) (GP-TEST TEST)) + '(|can contain|)) + ((= DIST 0.) '(|can not contain|)) + ((AND (= DIST 1.) (GP-TEST TEST)) + '(|are next to|)) + ((= DIST 1.) '(|is not next to|)) + (T (APPEND '(|is more than|) + (EG-NUMBER DIST) + '(|caves away from|)))) + (AEG-DANGER-SING DANGER))) + +;;; EGT-ALL-OF returns "all of" in conjunction with EGT-MORE-THAN. + +(DEFUN EGT-ALL-OF (DIST LIST) + (COND ((NOT (CDR LIST)) NIL) + ((AND (CDDR LIST) (< DIST 2.)) '(|none of|)) + ((< DIST 2.) '(|neither of|)) + ((CDDR LIST) '(|all of|)) + (T '(|both of|)))) + +;;; EG-WITHIN returns an explanation of the propagation of warnings. + +(DEFUN EG-WITHIN (T-ORIGIN EXPLAIN DANGER) + (APPEND '(|as cave|) + EXPLAIN + (COND ((= (ADB-WARNING-DIST DANGER) 1.) + '(|is next to cave|)) + (T (APPEND '(|is within|) + (EG-NUMBER (ADB-WARNING-DIST DANGER)) + '(|caves of cave|)))) + T-ORIGIN)) + +;;; EG-N-AWAY retrurs a list saying DIST away. + +(DEFUN EG-N-AWAY (DIST) + (COND ((< DIST 1.) '(|contains|)) + ((= DIST 1.) '(|next to|)) + (T (APPEND '(|exactly|) + (EG-NUMBER DIST) + '(|caves away from|))))) + +;;; EG-DIST-SET puts together English for a DIST-SET. + +(DEFUN EG-DIST-SET (NEW-CAVES OTHER-CAVES PROB PRED DIST DANGER) + (APPEND + (COND + (OTHER-CAVES (APPEND (COND (PRED '(|. |))) + '(|we do not know the neighbors of|) + (EG-INSERT-AND '|cave| + OTHER-CAVES) + (EG-HOWEVER) + '(|it is|) + (EG-PROBABLE PROB NIL) + '(|that|))) + ((GP-EQ PROB 1.0) PRED) + (T (APPEND PRED + '(|it is|) + (EG-PROBABLE PROB NIL) + '(|that|)))) + (COND ((GP-TEST NEW-CAVES) '(|one of|))) + (EG-INSERT-AND '|cave| NEW-CAVES) + (COND ((GP-TEST (1+ DIST)) + (APPEND '(|must be|) (EG-N-AWAY DIST))) + (T '(|contains|))) + (AEG-DANGER-SING DANGER))) + +;;;;**************** The Wumpus Game Routines. **************** +;;;WG-MOVETO ACCEPTS THE NUMBER OF THE CAVE TO WHICH THE +;;;PLAYER IS MOVING, CHECKS OUT THE MOVE, AND PERFORMS IT + +(DEFUN WG-MOVETO (CAVE) + (DECLARE (SPECIAL WE-NORESTART WG-HERE WE-DONE WE-MOVE DB-NUM-CAVES)) + (COND ((WGR-DANGERP CAVE 2.) + (COND (WE-MOVE (SETQ WE-NORESTART T))) + (WE-NOTE-DANGER 2.) + (SETQ WE-DONE T)) + ((WGR-DANGERP CAVE 1.) + (WE-NOTE-DANGER 1.) + (SETQ WE-DONE T)) + ((WGR-DANGERP CAVE 0.) + (WE-NOTE-DANGER 0.) + ;;;BATS CAN GO ANYWHERE- + (WG-MOVETO (RANDOM DB-NUM-CAVES))) + (T (SETQ WG-HERE CAVE)))) + +;;; WG-SHOOT is the Wumpus function to shoot an arrow. + +(DEFUN WG-SHOOT (CAVE) + (DECLARE (SPECIAL WG-ARROWS WE-DONE)) + (COND + ((WGR-EXTRA-ARROWS) + (SETQ WG-ARROWS (1- WG-ARROWS)) + (WG-SHOOT1 CAVE (1+ (RANDOM 4.)))) + (T (COND ((WG-SHOOT1 CAVE (1+ (RANDOM 4.))) T) + (T (G-RSAY '(|You are out of arrows, you lose! |)) + (SETQ WE-DONE T)))))) + +;;; WG-SHOOT1 does the actual work of shooting. + +(DEFUN WG-SHOOT1 (CAVE DIST-LEFT) + (DECLARE (SPECIAL WE-SHOT WE-DONE WE-RETURN WG-HERE DB-NAME)) + (COND ((< DIST-LEFT 1.) NIL) + ((WGR-DANGERP CAVE 2.) + (G-RSAY (LIST '|Congratulations,| + DB-NAME + '|, you have shot the Wumpus. |)) + (SETQ WE-RETURN T) + (SETQ WE-DONE T) + T) + ((= CAVE WG-HERE) + (G-RSAY '(|You have just shot yourself. |)) + (SETQ WE-DONE T) + NIL) + (T (G-RSAY '(|Poing|)) + (COND (WE-SHOT (*SXD-MARK-SHOT WE-SHOT) + (XD-MARK-SHOT WE-SHOT))) + (WG-SHOOT1 (GP-RANDEL (WGR-NEIGHBORS CAVE)) + (1- DIST-LEFT))))) + +;;;*********** Routines to Change the Warren. ************** +;;; WGM-TRANSPOSE does the actual transposition of two caves. + +(DEFUN WGM-TRANSPOSE (CAVE-1 CAVE-2) + (PROG (TEMP TEMP-1 TEMP-2) + (SETQ TEMP (WGR-WARNINGS CAVE-1)) + (WGI-MARK-WARNINGS CAVE-1 (WGR-WARNINGS CAVE-2)) + (WGI-MARK-WARNINGS CAVE-2 TEMP) + (DO ((DANGER 0. (1+ DANGER))) + ((> DANGER 2.)) + (SETQ TEMP (WGR-DANGERP CAVE-1 DANGER)) + (COND ((WGR-DANGERP CAVE-2 DANGER) + (WGI-STORE-DANGER CAVE-1 T DANGER)) + (T (WGI-STORE-DANGER CAVE-1 NIL DANGER))) + (COND (TEMP (WGI-STORE-DANGER CAVE-2 T DANGER)) + (T (WGI-STORE-DANGER CAVE-2 NIL DANGER)))) + (SETQ TEMP-1 (WGR-NEIGHBORS CAVE-1) + TEMP-2 (WGR-NEIGHBORS CAVE-2)) + (WGM-FIX-NEI CAVE-1 TEMP-1 (SUBST CAVE-2 CAVE-1 TEMP-2)) + (WGM-FIX-NEI CAVE-2 TEMP-2 (SUBST CAVE-1 CAVE-2 TEMP-1)))) + +;;; WGM-FIX-NEI changes the neighbors of a cave. + +(DEFUN WGM-FIX-NEI (CAVE O-NEI N-NEI) + (COND (O-NEI (WGM-UNMAKE-NEI CAVE (CAR O-NEI)) + (WGM-FIX-NEI CAVE (CDR O-NEI) N-NEI)) + (N-NEI (WGI-MAKNEI CAVE (CAR N-NEI)) + (WGM-FIX-NEI CAVE NIL (CDR N-NEI))))) + +;;; WGM-UNMAKE-NEI unmakes neighbors. + +(DEFUN WGM-UNMAKE-NEI (CAVE-1 CAVE-2) + (WGI-PUT-NEI CAVE-1 (GP-DELETE CAVE-2 (WGR-NEIGHBORS CAVE-1))) + (WGI-PUT-NEI CAVE-2 (GP-DELETE CAVE-1 (WGR-NEIGHBORS CAVE-2)))) + +;;;*********** Wumpus Game Initiaialization Routines. *********** +;;;WGI-INIT SETS UP FOR A NEW GAME + +(DEFUN WGI-INIT NIL + (DECLARE (SPECIAL WG-HERE DB-NUM-CAVES)) + (WGI-MAZE) + (MAPC + (FUNCTION + (LAMBDA (X) + (DECLARE (SPECIAL DB-NUM-CAVES)) + (WGI-PUT-DANGER (WGI-NOREPRAN (ADB-NUM-DANGERS X) + DB-NUM-CAVES) + X))) + '(2. 1. 0.)) + (DO ((START (RANDOM DB-NUM-CAVES) (RANDOM DB-NUM-CAVES))) + ((WGR-SAFEP START) (SETQ WG-HERE START)))) + +;;; WGI-MAZE CREATES A RANDOM NETWORK OF +;;;DB-NUM-CAVES CAVES. ....IT ALSO REMOVES THE OLD MAZE + +(DEFUN WGI-MAZE NIL + (DECLARE (SPECIAL DB-NUM-CAVES)) + (DO ((N 0. (1+ N)) (TP)) + ((= N 2.)) + (SETQ TP (WGI-REORDER (GP-ORDLST DB-NUM-CAVES))) + (WGI-MAKNEI (CAR TP) (WGI-LISNEI TP)))) + +;;; WGI-PUT-DANGER marks the caves it is sent as containing +;;;said DANGER, and then marks the warnings as appropriate. + +(DEFUN WGI-PUT-DANGER (CAVE-LIST DANGER) + (COND (CAVE-LIST (WGI-STORE-DANGER (CAR CAVE-LIST) T DANGER) + (WGI-PUT-WARNING (CAR CAVE-LIST) + (ADB-WARNING-DIST DANGER) + DANGER) + (WGI-PUT-DANGER (CDR CAVE-LIST) DANGER)))) + +;;; WGI-PUT-WARNING puts the warnings onto the necessary caves. + +(DEFUN WGI-PUT-WARNING (CAVE DIST DANGER) + (DECLARE (SPECIAL DANGER)) + (MAPC + (FUNCTION + (LAMBDA (X) (DECLARE (SPECIAL DANGER)) + (WGI-MARK-WARNINGS X + (GP-CONS DANGER + (WGR-WARNINGS X))))) + (GP-DIST-AREA (LIST CAVE) DIST))) + +;;; WGI-NEI PUTS N2 ON CAVE N1'S NEIGHBOR PROPERTY LIST + +(DEFUN WGI-NEI (N1 N2) + (PROG (NLST) + (SETQ NLST (WGR-NEIGHBORS N2)) + (OR (MEMBER N1 NLST) (WGI-PUT-NEI N2 (CONS N1 NLST))))) + +;;; WGI-LISNEI MAKES NEIGHBORS OUT OF NEIGHBORING ELEMENTS +;;;OF ITS INPUT. IT RETURNS THE LAST ELEMENT OF THE LIST. + +(DEFUN WGI-LISNEI (LIS) + (COND ((NULL (CADR LIS)) (CAR LIS)) + (T (WGI-MAKNEI (CAR LIS) (CADR LIS)) + (WGI-LISNEI (CDR LIS))))) + +;;;WGI-MAKNEI MAKES N1 AND N2 NEIGHBORS OF EACH OTHER + +(DEFUN WGI-MAKNEI (N1 N2) (PROG2 (WGI-NEI N1 N2) (WGI-NEI N2 N1))) + +;;; WGI-NTHEL RETURNS A LIST WITH THE NTH ELEMENT AT THE FRONT + +(DEFUN WGI-NTHEL (LST N) + (COND ((< N 2.) LST) + (T (WGI-INSERT2 (CAR LST) + (WGI-NTHEL (CDR LST) (1- N)))))) + +;;; WGI-INSERT2 PLACES EL SECOND IN THE LIST LST + +(DEFUN WGI-INSERT2 (EL LST) (CONS (CAR LST) (CONS EL (CDR LST)))) + +;;; WGI-NOREPRAN OUTPUTS NUM UNIQUE RANDOM NUMBERS FROM THE +;;;RANGE 0 TO RANGE -1 + +(DEFUN WGI-NOREPRAN (NUM RANGE) + (COND ((= NUM 1.) (LIST (RANDOM RANGE))) + (T (SETQ NUM (WGI-NOREPRAN (1- NUM) RANGE)) + (DO ((RNUM (RANDOM RANGE) (RANDOM RANGE))) + ((NOT (MEMBER RNUM NUM)) (CONS RNUM NUM)))))) + +;;; WGI-REORDER RETURNS ITS ARGUMENT LIST IN RANDOM ORDER + +(DEFUN WGI-REORDER (LST) + (PROG (N) + (COND ((NULL LST) NIL) + (T (SETQ N + (WGI-NTHEL LST + (1+ (RANDOM (LENGTH LST))))) + (RETURN (CONS (CAR N) + (WGI-REORDER (CDR N)))))))) + +;;;*********** Wumpus Game Routines to supply info. ********** +;;; WGR-NEIGHBORS returns a list of the cave's neighbors. + +(DEFUN WGR-NEIGHBORS (CAVE) (ADB-CAVE CAVE 0.)) + +;;; WGI-PUT-NEI stores the NEIGHBORS into the arrays. + +(DEFUN WGI-PUT-NEI (CAVE VALUE) (STORE (ADB-CAVE CAVE 0.) VALUE)) + +;;; WGR-DANGERP is a predicate that return T if the given +;;;DANGER is located in the given CAVE. + +(DEFUN WGR-DANGERP (CAVE DANGER) (ADB-DCAVE CAVE 0. DANGER)) + +;;; WGR-SAFEP returns T if the given cave is safe. + +(DEFUN WGR-SAFEP (CAVE) + (NOT (OR (WGR-DANGERP CAVE 0.) + (WGR-DANGERP CAVE 1.) + (WGR-DANGERP CAVE 2.)))) + +;;; WGI-STORE-DANGER marks the danger in the arrays. + +(DEFUN WGI-STORE-DANGER (CAVE VALUE DANGER) + (STORE (ADB-DCAVE CAVE 0. DANGER) VALUE)) + +;;; WGR-WARNINGS returns those dangers causing warnings at CAVE. + +(DEFUN WGR-WARNINGS (CAVE) (ADB-CAVE CAVE 1.)) + +;;; WGI-MARK-WARNINGS puts the WARNINGS into the arrays. + +(DEFUN WGI-MARK-WARNINGS (CAVE VALUE) + (STORE (ADB-CAVE CAVE 1.) VALUE)) + +;;; WGR-EXTRA-ARROWS returns T if the player has extra arrows. + +(DEFUN WGR-EXTRA-ARROWS NIL + (DECLARE (SPECIAL WG-ARROWS)) + (> WG-ARROWS 1.)) + +;;; ************************ Data Base Routines **************** +;;; This is the beginning of the routines that update the standard +;;;database for the program. They have a prefix of "D_". +;;; "DI" routines do the very first initializations. They initialize +;;;all the vital "inter-game" variables, finding about the player, etc. +;;; DI-DATABASE is called once for each new LISP. It fills the arrays, etc.. +;;; It is executed as part of the initializations. (Not compiled). + (DEFUN DI-DATABASE NIL + (DECLARE (SPECIAL TYO CX-WHY-BETTER CX-WHY-WORSE G-READ-NUM G-SILENT + G-LAST G-BLAST G-BBLAST DB-NUMLOSSES GV-CURSORPOS + DB-NUM-PROP WE-GAME-HIST SC-UREPEAT SC-LREPEAT DB-DATE + SC-LFORGET SC-UFORGET EGV-PLURAL EGV-BECAUSE DB-LAST-DATE + EG-SPEC LWAW-TELL-WANDER LWA-TELL-C4 LEG-HOWEVER + LEG-CONVERSELY LEG-ALSO LEG-THEREFORE WAV-TOLD-RULE + SC-DECREASE-FORGET SC-DECREASE-REPEAT SC-INCREASE-FORGET + SC-INCREASE-REPEAT *SS-VERSION *SS-ACTIVE + WEV-RECREATE WE-VERSION XP-P12-CHANGED G-DOUBLESPACE + SF-VAR-LIST DB-NUM-CRULES DB-NUM-RULES DB-NUM-DPROP)) + (ENDPAGEFN TYO NIL) + (SETSYNTAX 46. 128. NIL) + (SETQ IBASE 10. + BASE 10. + *NOPOINT T + *SS-ACTIVE NIL + *SS-VERSION NIL + WE-VERSION '|eight| + WEV-RECREATE NIL + WE-GAME-HIST NIL + DB-NUM-CRULES 6. + DB-NUM-RULES 19. + DB-NUM-PROP 7. + DB-NUM-DPROP 18. + DB-DATE (DI-DATE) + WAV-TOLD-RULE NIL + CX-WHY-BETTER NIL + CX-WHY-WORSE NIL + EGV-PLURAL 'EGV-PLURAL + EGV-BECAUSE '(|, because|) + EG-SPEC 'EG-SPEC + SC-LREPEAT 0.0 + SC-UREPEAT 5.0 + SC-LFORGET 2.0 + SC-UFORGET 30.0 + LEG-THEREFORE (GCI-CREATE 3. + '((|, and so|) + (|. Therefore|) + (|. Hence|))) + LEG-ALSO (GCI-CREATE 3. + '((|. Also,|) + (|, and|) + (|. Likewise,|))) + LEG-CONVERSELY (GCI-CREATE 2. + '((|. Conversely,|) + (|. In contrast,|))) + LEG-HOWEVER (GCI-CREATE 2. + '((|. However|) (|, but|))) + LWA-TELL-C4 (GCI-CREATE 3. + '((LIST '|I don't know,| + DB-NAME + '|, but|) + (LIST '|Well,| + DB-NAME + '|, I think that|) + (LIST '|You know,| + DB-NAME + '|,|))) + LWAW-TELL-WANDER (GCI-CREATE 3. + '((LIST DB-NAME + '|, we seem to be going in circles|) + (LIST '|I seem to remember just| + '|coming from that cave,| + DB-NAME) + (LIST '|We seem to be wandering aimlessly,| + DB-NAME))) + G-DOUBLESPACE NIL + G-LAST 32. + G-BLAST 32. + G-BBLAST 46. + G-SILENT NIL + G-READ-NUM 1. + GV-CURSORPOS 0. + XP-P12-CHANGED NIL + SC-INCREASE-FORGET NIL + SC-DECREASE-FORGET NIL + SC-INCREASE-REPEAT NIL + SC-DECREASE-REPEAT NIL + SF-VAR-LIST '(DB-UNAME DB-NAME DB-LAST-DATE DB-NUMWINS DB-NUMLOSSES + DB-MOVES DB-DEBUG DB-COMMENT SL-REPEAT SL-FORGET + SL-RECEPTIVITY SL-HEARD-OF WA-CAN-BACKTRACK + WA-TOLD-BACKTRACK WE-MOVE-NUM SL-LAST-LEARNED + SC-INITIALIZED SL-TUTOR DB-GAME-NUM DB-HISTORY)) + (ARRAY ADB-CAVE T 1. DB-NUM-PROP) + (ARRAY ADB-DCAVE T 1. DB-NUM-DPROP 1.) + (ARRAY AEG-TELL-AVOID T 3. 3.) + (ARRAY ADB-TELL-WARNING T 3. 3.) + (ARRAY ADB-TELL-DANGER T 3. 3.) + (ARRAY ASK-WDRULES FIXNUM (1+ DB-NUM-RULES) 2. 3.) + (ARRAY ASK-DRULES FLONUM (1+ DB-NUM-RULES) 2. 3.) + (ARRAY AWE-EXPL-RULES T 16.) + (ARRAY ASL-PHASE-RULES T 5. 3.) + (ARRAY ASL-NEXT-RULES T 5. 3.) + (ARRAY ASL-PNUM-DANGERS T 5. 3.) + (ARRAY ASKC-RULES T 7. 3.) + (ARRAY AEG-NUMBER T 10.) + (MAPC (FUNCTION (LAMBDA (X) (*ARRAY X T 3.))) + '(AXS-CHANGED-SETS AEG-DANGER-SING AEG-DANGER-PLUR + ASL-WORK-ON-RULES AXR-FOUND-N AXS-EXACT-CAVES + AXS-PARTIAL-SETS AXS-COMPLETE-SETS + APS-RULE-ARRAY AEG-WARNING-PRES AEG-WARNING-PAST + ASC-INITIALIZED AEG-ENCOUNTER AWA-TOLD-RULES)) + (MAPC (FUNCTION (LAMBDA (X) (*ARRAY X 'FIXNUM 3.))) + '(ADB-NUM-DANGERS ADB-WARNING-DIST AXR-NUM-IDENTIFIED + ASL-PHASE ADB-DIST-START)) + (MAPC (FUNCTION (LAMBDA (X) (*ARRAY X 'FLONUM 3.))) + '(AXX-EST-NUM-DANGERS AXP-PROB12)) + (MAPC (FUNCTION (LAMBDA (X Y) + (DECLARE (SPECIAL EGV-PLURAL)) + (PUTPROP EGV-PLURAL Y X))) + '(|is cave| |is| |can| |could| |is rule|) + '(|are caves| |are| |can| |could| |are rules|)) + (MAPC (FUNCTION (LAMBDA (X Y) + (DECLARE (SPECIAL EG-SPEC)) + (PUTPROP EG-SPEC Y X))) + '(|were| |fell|) + '(|would have been| |would have fallen|)) + (MAPC (FUNCTION (LAMBDA (X Y) (STORE (ASKC-RULES X 1.) Y))) + (GP-ORDLST 7.) + '(2. 1. 2. 0. 0. 0. 0.)) + (MAPC (FUNCTION (LAMBDA (X A B C D E F G H I) + (STORE (ASL-PHASE-RULES X 0.) A) + (STORE (ASL-PHASE-RULES X 1.) B) + (STORE (ASL-PHASE-RULES X 2.) C) + (STORE (ASL-NEXT-RULES X 0.) D) + (STORE (ASL-NEXT-RULES X 1.) E) + (STORE (ASL-NEXT-RULES X 2.) F) + (STORE (ASL-PNUM-DANGERS X 0.) G) + (STORE (ASL-PNUM-DANGERS X 1.) H) + (STORE (ASL-PNUM-DANGERS X 2.) I))) + (GP-ORDLST 5.) + '((14.) (6. 10. 12. 13.) (4. 7. 11.) (0. 3. 5.) (1.)) + '((14.) (6. 9. 10. 12. 13.) (4. 7. 11.) (0. 3. 5.) + (1.)) + '((12. 13.) (6. 8. 9. 10. 11. 15.) (4. 7.) + (0. 2. 3. 5. 19.) (1.)) + '((14.) (12. 13.) (4. 7. 11.) (3. 5.) (1.)) + '((14.) (12. 13.) (4. 7. 11.) (3. 5.) (1.)) + '((12. 13.) (11.) (4. 7.) (3. 5. 19.) (1.)) + '(4. 3. 3. 2. 1.) + '(2. 3. 3. 2. 1.) + '(2. 1. 1. 1. 1.)) + (MAPC (FUNCTION (LAMBDA (W A B C D E) + (STORE (ASL-PHASE W) 0.) + (STORE (ASL-WORK-ON-RULES W) + (ASL-PHASE-RULES 0. W)) + (STORE (AEG-ENCOUNTER W) A) + (STORE (AEG-WARNING-PRES W) B) + (STORE (AEG-WARNING-PAST W) C) + (STORE (AEG-DANGER-SING W) D) + (STORE (AEG-DANGER-PLUR W) E))) + '(0. 1. 2.) + '((|were| |picked up by|) (|fell| |into|) + (|were| |eaten by|)) + '((|hear squeaking|) (|feel a breeze|) + (|smell the Wumpus|)) + '((|heard squeaking|) (|felt a breeze|) + (|smelled the Wumpus|)) + '((|bats|) (|a pit|) (|the Wumpus|)) + '((|bats|) (|pits|) (|the Wumpus|))) + (MAPC (FUNCTION (LAMBDA (X Y) (STORE (AEG-NUMBER X) Y))) + (GP-ORDLST 10.) + '((|ten|) (|nine|) (|eight|) (|seven|) (|six|) + (|five|) (|four|) (|three|) (|two|) (|one|))) + (MAPC (FUNCTION (LAMBDA (X Y) (STORE (AWE-EXPL-RULES X) Y))) + (GP-ORDLST 16.) + '((|P15, Shooting Principle, Whenever the probability of| + |the Wumpus being in a cave exceeds 0.25, it is safer to| + |shoot into the cave before visitng it. Hence, the more| + |likely it is that the Wumpus is in the cave, the less| + |likely it is that the player will be killed.|) + (|P14, Adjust For Multiple Evidence Principle, In cases| + |where P13 is applied, the other members of said| + |cave-set are less likely to contain the danger.|) + (|P13, Multiple Evidence Principle, if there is multiple| + |evidence that a given cave contains a danger (i.e. it| + |is a member of two cave-sets), then it is more likely| + |that the given cave contains the danger.|) + (|P12, Explain Away Evidence Principle, When it is noted| + |that there are two cave-sets, one of which is a subset| + |of the other, there is no evidence that those caves| + |in the superset and not in the subset whether or| + |not said caves contain a danger (as the caves in the| + |subset completely explain the warning) so the| + |probability is reduced to some consistent value.|) + (|P11, Equal Likelihood Principle, An estimation of| + |the probability for a given cave is 1N, where N| + |is the number of caves in the smallest cave-set| + |of which said cave is a member.|) + (|L10, Certain caves can be marked as "more than zero| + |away" based on consideration of the different| + |complete cave-sets and the number of dangers. |) + (|L9, If the player encountered a danger in a cave,| + |then the cave does not contain a danger of higher| + |priority, i.e. the Wumpus eats the player before| + |he can fall into a pit, and he will fall into a| + |pit before he is picked up by bats.|) + (|L8, When the algorithm is creating cave-sets and| + |it encounters a cave which would be N caves away| + |but which is also "more than N away", then that cave| + |can not have any contributions to the cave-set. |) + (|L7, If a cave is "more than (N-1) away" and| + |"less than (N+1) away", then it is "N away". |) + (|L6, If all of a caves neighbors are "more than| + |(N-1) away", then it can be marked "more than N away". |) + (|L5, If a cave is marked "more than N away" then all| + |of its neighbors can be marked as "more than (N-1) away". |) + (|L4, If a cave is visited and there is a warning,| + |then that cave is "less than (N+1) away". |) + (|L3, If a cave is visited and there is not a warning,| + |then that cave is "more than N away" where N| + |is the distance that the warning propagates. |) + (|L2, If the player shoots an arrow into a cave| + |and does not kill the Wumpus, then that cave can| + |be marked as "more than zero away" (Wumpus). |) + (|L1, A cave can be marked as "more than zero| + |away" if it was safely visited. |) + (|L0, A cave can be marked as "zero away" if it| + |was visited and found to contain a danger. |))) +;;; The other dangers are set when it is known how many there are. + (MAPC (FUNCTION (LAMBDA (W A X Y Z) + (STORE (AEG-TELL-AVOID W Z) A) + (STORE (ADB-TELL-WARNING W Z) X) + (STORE (ADB-TELL-DANGER W Z) Y))) + '(0. 1. 2. 0. 1. 2. 0. 1. 2.) + '((APPEND '(|it is not wise to visit caves with bats| + |because while THEY will not harm us| + |they will carry us to another cave which| + |could contain|) (AEG-DANGER-SING 1.) '(|or|) (AEG-DANGER-SING 2.)) + (APPEND + '(|we should avoid bats because they| + |could drop us in a cave with|) + (AEG-DANGER-SING 1.) + '(|or|) + (AEG-DANGER-SING 2.)) + '(|it is best to avoid bats as they could carry us to a fatal cave|) + (APPEND '(|we should try not to stumble into|) + (AEG-DANGER-SING 1.) + '(|as it would be fatal|)) + '(|we should avoid pits as they are fatal|) + '(|pits are dangerous as falling into one is fatal|) + (APPEND '(|it is best to avoid|) + (AEG-DANGER-PLUR 2.) + '(|as|) + (AEG-DANGER-PLUR 2.) + '(|eats unwary players who stumble into his lair|)) + '(|we should avoid Wumpii as they eat unwary players|) + '(|Wumpii are dangerous as they have insatiable| + |appetites for bumbling players|)) + '((|Squeak. I hear bats, they must be in one of the neighboring caves. |) + (|Squeak. I hear bats. |) (|Squeak. |) + (|Brrrr. I feel a breeze! We must be next to a pit. |) + (|Brrrr. I feel a breeze. |) (|Brrrr. |) + (|Whew, what a stench! That is the smell of the Wumpus. | + |It means that we are within two caves of the Wumpus. |) + (|What a stench! The Wumpus is near. |) + (|What a stench! |)) + '((|Bon Voyage! We have been picked up by bats! |) + (|Bon Voyage! Bats have picked us up. |) + (|Bon Voyage! |) + (|So Loonnngggggggg. We have fallen into a pit. |) + (|So Loonnngggggggg. We have fallen in a pit. |) + (|So Loonnngggggggg. |) + (|Oh no, the Wumpus is in here! Chomp Chomp Chomp. |) + (|Oh no, it's the Wumpus! Chomp Chomp Chomp. |) + (|Chomp Chomp Chomp. |)) + '(0. 0. 0. 1. 1. 1. 2. 2. 2.))) + +;;; DI-INITIALIZE is called for each new session. Loads the new user-file, etc.. + +(DEFUN DI-INITIALIZE NIL + (DECLARE (SPECIAL LINEL G-WRITE-NUM DB-NUMWINS DB-NUMLOSSES DB-LAST-DATE SL-REPEAT + SC-NOTEST SC-INITIALIZED DB-COMMENT DB-USER-ID DB-DEBUG SL-TUTOR + *SS-VERSION *SS-ACTIVE G-SILENT WE-LAST-SESSION LWA-CRULES + WE-THIS-SESSION WAM-NEXT-MOVE WAW-GIVEN-ROUTE DB-DATE SL-FORGET + WA-CAN-BACKTRACK WA-TOLD-BACKTRACK SL-LAST-LEARNED SL-HEARD-OF + LWA-MOVE-NUMS SL-MODE WE-MOVE-NUM DB-MOVES SL-RECEPTIVITY + DB-GAME-NUM DB-HISTORY)) + (SETQ LINEL 60. + WE-MOVE-NUM 2. + WE-LAST-SESSION 0. + WE-THIS-SESSION 1. + WA-CAN-BACKTRACK 0.0 + WA-TOLD-BACKTRACK NIL + WAW-GIVEN-ROUTE NIL + WAM-NEXT-MOVE NIL + ;;; Set switch for interaction numbers to T iff + ;;;this is a printing terminal. + G-WRITE-NUM (COND ((= TTY 0.))) + DB-DEBUG NIL + DB-COMMENT *SS-ACTIVE + DB-NUMWINS 0. + DB-NUMLOSSES 0. + DB-MOVES 0. + ;;; Don't set DB-DATE if the Synthetic Student did. + DB-DATE (COND (*SS-ACTIVE DB-DATE) (T (DI-DATE))) + DB-LAST-DATE DB-DATE + SL-MODE NIL + SL-REPEAT 1.34 + SL-FORGET 4.9 + SL-RECEPTIVITY 6.0 + SL-HEARD-OF (1-$ SL-REPEAT) + SL-LAST-LEARNED 0. + SC-NOTEST NIL + SC-INITIALIZED '(NIL NIL NIL) + SL-TUTOR T + DB-GAME-NUM NIL + DB-HISTORY NIL) + (MAPC (FUNCTION (LAMBDA (X) (STORE (ASC-INITIALIZED X) NIL))) + (GP-ORDLST 3.)) + (DI-NEWS) + (G-RSAY '(|Please enter your login name so that my| + |programmer can reach you if he wishes. |)) + (SETQ DB-USER-ID (G-READ *SS-VERSION)) + (G-RISAY + '(|Would you like to run in demo mode? (Please| + |follow all reponses with a space.)|)) + (COND + ((AND (GQ-EVAL (G-READ 'WANT-DEMO)) (SF-LOAD-DEMO))) + (T + (COND ((NOT G-SILENT) + (CURSORPOS 'C) + (CURSORPOS 0. 0.))) + (G-RSAY + '(|Hello, my name is Wusor VIII. What is your name? | + |(Please type in your first and last name. | + |Follow all responses with a space.) |)) + (COND + ((DI-GET-NAME) + (G-RSAY + '(|I believe that we have hunted Wumpii| + |together before. Is that right? |)) + (COND + ((GQ-EVAL (G-READ 'PLAYED-BEFORE))) + (T + (G-RSAY + '(|This is very unusual. I have met another person| + |with the exact same name. Please enter a different| + |last name and remember to use it as your name in| + |all future games. |)) + (DI-REREAD-LAST-NAME)))) + (T (DIQ-INIT-FILE (DIQ-INTRO)))))) + (SETQ + LWA-MOVE-NUMS + (GCI-CREATE + 5. + (MAPCAR (FUNCTION (LAMBDA (X) + (DECLARE (SPECIAL WE-MOVE-NUM SL-RECEPTIVITY)) + (- WE-MOVE-NUM + (FIX (*$ SL-RECEPTIVITY + (FLOAT (1+ X))))))) + (GP-ORDLST 5.))) + LWA-CRULES + (GCI-CREATE 5.))) + +;;; DI-GET-NAME reads in the user's name and loads his file from +;;;disc if there is such a file. It returns T if there was a +;;;file on the user, and it returns NIL if there was no such file. + +(DEFUN DI-GET-NAME NIL + (DECLARE (SPECIAL DB-UNAME DB-NAME)) + (SETQ DB-UNAME (LIST (G-READ 'SYNDI) + (G-SREAD 'LAST-NAME))) + (SETQ DB-NAME (G-LOWER-CASE (CAR DB-UNAME) T)) + (G-RSAY (LIST '|Do I have your name right,| + DB-NAME + (G-LOWER-CASE (CADR DB-UNAME) T) + '|? |)) + (COND + ((GQ-EVAL (G-READ 'YES)) (SF-GET-DISC-FILE DB-UNAME)) + (T + (G-RSAY + '(|Then let's try to get it right. | + |Please retype your name. |)) + (DI-GET-NAME)))) + +;;; DI-REREAD-LAST-NAME rereads the user's last name to assign +;;;a unique user-name to everyone. + +(DEFUN DI-REREAD-LAST-NAME NIL + (DECLARE (SPECIAL DB-NAME DB-UNAME)) + (SETQ DB-UNAME (LIST (CAR DB-UNAME) (G-READ 'LAST-NAME))) + (COND + ((NULL (SF-GET-DISC-FILE DB-UNAME)) + (G-RSAY (LIST '|Now we've got it straight. Before we start,| + DB-NAME + '|I would like to ask you some questions. |)) + (DIQ-INIT-FILE NIL)) + (T + (G-RSAY + '(|Humm! This is very unusual. | + |Please try another last name. |)) + (DI-REREAD-LAST-NAME)))) + +;;; DI-DATE returns the date. + +(DEFUN DI-DATE NIL + (PROG (DATE DAY MONTH) + (SETQ DATE (STATUS DATE) + DAY (CADDR DATE) + MONTH (CADR DATE) + DATE (+ DAY (* MONTH 30.))) + (RETURN DATE))) + +;;; DI-NEWS is a place where the programmer can put things +;;;of relevance to the user. Later there will also be a +;;;function which gives the user a synopsis of the rules +;;;which the advisor thinks the player may have forgotten. + +(DEFUN DI-NEWS NIL + (DECLARE (SPECIAL G-SILENT G-DOUBLESPACE)) + (COND ((NOT G-SILENT) (CURSORPOS 'C) (CURSORPOS 0. 0.))) + (G-RSAY '(|Good Morning! My, but today is a beautiful day. |)) + (G-RSAY '(|It should be a lovely day for hunting Wumpii. |)) + (G-TERPRI) + (G-TERPRI) + (G-RSAY + '(|NOTES FROM THE PROGRAMMER: This is WUSOR VIII. | + |Please use Wusor only when system usage is low| + |as Wusor can eat up a lot of CPU time. | + |If you run into any problems please save the game| + |by typing "(SAVE)". If you would like to see the| + |pedagogical comments, try the *COMMENT and *NOCOMMENT| + |commands. For other such commands, do "*? ". |)) + (G-TERPRI)) + +;;; DI-INSTRUCTIONS gives the player instructions. + +(DEFUN DI-INSTRUCTIONS NIL + (DECLARE (SPECIAL G-SILENT G-DOUBLESPACE)) + (COND ((NOT G-SILENT) (CURSORPOS 'C) (CURSORPOS 0. 0.))) + (setq doublespace nil) + (G-RISAY + '(|You are a world-renowned hunter descending down| + |into the caves of darkness, lair of the infamous| + |man-eating Wumpus. To win the game,| + |you must first kill the Wumpus by shooting one of| + |your five arrows into his lair from a neighboring| + |cave. If you go into the cave of the Wumpus he| + |will eat you. Within the warren there are two| + |other kinds of dangers, bats and pits. The pits| + |are bottomless and fatal if you fall into one of them. If| + |you visit the home cave of bats they will pick you| + |up and carry you to another cave which might| + |contain the Wumpus or a pit (either of which is fatal). |)) + (G-RESET) + (G-RISAY + '(|You can gain information about the warren through| + |exploration. Anytime you visit a safe cave, you| + |will be told the number of the cave you are in and| + |the numbers of the caves connected to it. If bats| + |are in one of the neighboring caves you will hear| + |their high pitched squeaking. Likewise, if you are| + |next to a cave with a pit you will feel a chilling| + |breeze. If you are within two caves of the Wumpus,| + |you will smell his horrible stench. |)) + (G-RESET) + (G-RISAY + '(|As you explore, you should try| + |to keep a map showing everything you learn about the| + |warren. Your life depends on this map. |)) + (G-RESET) + (G-RISAY + '(|Before you shoot an arrow, you should consider the| + |fact that if the Wumpus is not in the cave, the| + |arrow will start ricocheting and may kill either| + |the Wumpus or yourself (and it is an agonizing| + |death). If it does start ricocheting, there is roughly| + |a one third chance that it will kill you. |)) + (G-RESET) + (G-RISAY + '(|Your only companion on the endeavor is the wise| + |old sage, Wusor. He will ask you "What now?" to| + |which you can reply with a neighboring cave that you| + |would like to visit, or "SHOOT",| + |indicating that you would like to shoot one of| + |your arrows into a neighboring cave. If you make a| + |hasty move, Wusor may stop you and give you| + |advice, but the final decision rests with you. |)) + (SETQ G-DOUBLESPACE NIL)) + +;;; ****** Initialization Questionaire Routines. ********** +;;; DIQ-INIT-FILE is the executive routine of the questionaire. +;;;It insures that the disc file and studentmodel are initialized +;;;appropriately. + +(DEFUN DIQ-INIT-FILE (BEFORE) + (DECLARE (SPECIAL SL-FORGET SL-HEARD-OF SL-REPEAT)) + (PROG (EDUCATION MATH-BIAS AGE TOTAL EXPERIENCE + FILE-NAME READ-FILE) + (SETQ EDUCATION (DIQ-EDUCATION) + MATH-BIAS (DIQ-MATH-BIAS) + AGE (DIQ-GET-AGE) + TOTAL (+$ (FLOAT AGE) (*$ MATH-BIAS + (FLOAT EDUCATION))) + SL-REPEAT (//$ (LOG 85.) (LOG TOTAL)) + SL-HEARD-OF (1-$ SL-REPEAT) + SL-FORGET (*$ 2.0 (LOG TOTAL)) + EXPERIENCE (DIQ-EXPERIENCE BEFORE) + FILE-NAME (DIQ-EVALUATE (//$ (FLOAT EXPERIENCE) SL-REPEAT)) + READ-FILE (SF-READ-DISC-FILE FILE-NAME)) + (SKI-PUT-MODEL (CAR READ-FILE)) + (SF-SAVE-USER-FILE))) + +;;; DIQ-EDUCATION reads in the player's education. + +(DEFUN DIQ-EDUCATION NIL + (PROG (RESPONSE) + (G-TERPRI) + (G-RSAY '(|I need to know how many years of education| + |have you completed? For example:|)) + (G-RISAY '(|If you are in the 8th grade, enter 7.|)) + (G-RISAY '(|If you are a Junior in college, enter 14.|)) + (G-RISAY '(|If you are a 2nd year grad student, enter 17.|)) + (G-RISAY '(|If you are a college grad, enter 16.|)) + (SETQ RESPONSE (G-READ 0.)) + (COND ((FLOATP RESPONSE) + (SETQ RESPONSE (FIX RESPONSE)))) + (COND ((AND (FIXP RESPONSE) + (> RESPONSE -1.)) + (RETURN (MIN RESPONSE 20.))) + (T (RETURN (DIQ-EDUCATION)))))) + +;;; DIQ-MATH-BIAS reads in the player's math bias and returns +;;;an appropriate value. + +(DEFUN DIQ-MATH-BIAS NIL + (PROG (RESPONSE RET-VAL) + (G-TERPRI) + (G-RSAY '(|What do think of the Math//Sciences? | + |(Please enter 1, 2, or 3). |)) + (G-RISAY '(|1) I hate it! |)) + (G-RISAY '(|2) I guess it is OK. |)) + (G-RISAY '(|3) I love it! |)) + (SETQ RESPONSE (G-READ 1.)) + (COND ((FLOATP RESPONSE) + (SETQ RESPONSE (1+ (FIX RESPONSE))))) + (COND ((AND (FIXP RESPONSE) + (> RESPONSE 0.) + (< RESPONSE 4.)) + (COND ((= RESPONSE 3.) + (SETQ RET-VAL 3.5)) + ((= RESPONSE 2.) + (SETQ RET-VAL 2.2)) + (T (SETQ RET-VAL 1.0))) + (RETURN RET-VAL)) + (T (RETURN (DIQ-MATH-BIAS)))))) + +;;; DIQ-GET-AGE gets and returns the player's age. + +(DEFUN DIQ-GET-AGE NIL + (PROG (RESPONSE) + (G-TERPRI) + (G-RISAY '(|Please enter your age (in years). |)) + (SETQ RESPONSE (G-READ 7.)) + (COND ((FLOATP RESPONSE) + (SETQ RESPONSE (FIX RESPONSE)))) + (COND ((AND (FIXP RESPONSE) + (> RESPONSE -1.)) + (RETURN (MAX 7. (MIN RESPONSE 25.)))) + (T (RETURN (DIQ-GET-AGE)))))) + +;;; DIQ-EXPERIENCE returns the player's game experience considering +;;;whether or not he read the rules. BEFORE is set to T only if +;;;the player has claimed to have played with the WA before. + +(DEFUN DIQ-EXPERIENCE (BEFORE) + (PROG (RET-VAL NEW-BEFORE) + (G-TERPRI) + (COND ((NOT BEFORE) + (G-RSAY + '(|Have you ever played the game of Wumpus before? |)) + (SETQ NEW-BEFORE (GQ-EVAL (G-READ 'NO))))) + (COND (BEFORE (SETQ RET-VAL (DIQ-NUM-GAMES))) + ((NOT NEW-BEFORE) + (G-RSAY '(|Would you like to read the instructions? |)) + (SETQ RET-VAL 0.)) + (T (SETQ RET-VAL (DIQ-NUM-GAMES)) + (G-RISAY + '(|The rules of the hunt are a little different| + |here than in many Wumpus games. Would you| + |like to scan through the rules? |)))) + (COND (BEFORE) + ((GQ-EVAL (G-READ 'NO)) + (SETQ RET-VAL (+ 2. RET-VAL)) + (DI-INSTRUCTIONS))) + (RETURN RET-VAL))) + +;;; DIQ-NUM-GAMES returns how many games the player has played. + +(DEFUN DIQ-NUM-GAMES NIL + (PROG (RESPONSE) + (G-TERPRI) + (G-RISAY '(|Please enter the number of Wumpus hunts| + |you have been on (approximately). |)) + (SETQ RESPONSE (G-READ 0.)) + (COND ((FLOATP RESPONSE) + (SETQ RESPONSE (FIX RESPONSE)))) + (COND ((AND (FIXP RESPONSE) + (> RESPONSE -1.)) + (RETURN (MIN RESPONSE 20.))) + (T (RETURN (DIQ-NUM-GAMES)))))) + +;;; DIQ-EVALUATE converts factor into an initialization value. + +(DEFUN DIQ-EVALUATE (FACTOR) + (DECLARE (SPECIAL WA-CAN-BACKTRACK SL-REPEAT)) + (COND ((< FACTOR 1.0) NIL) + ((< FACTOR 3.0) (SETQ WA-CAN-BACKTRACK (-$ SL-REPEAT 0.5)) NIL) + ((< FACTOR 6.0) (SETQ WA-CAN-BACKTRACK (+$ SL-REPEAT 0.5)) 'NOVICE) + ((< FACTOR 10.0) (SETQ WA-CAN-BACKTRACK (+$ SL-REPEAT 0.5)) 'AMATEUR) + ((< FACTOR 15.0) (SETQ WA-CAN-BACKTRACK (+$ SL-REPEAT 0.5)) 'MODERATE) + (T (SETQ WA-CAN-BACKTRACK (+$ SL-REPEAT 0.5)) 'ADVANCED))) + +;;; DIQ-INTRO gives a preface for all this question and +;;;determines if the player has ever played with the WA before. + +(DEFUN DIQ-INTRO NIL + (DECLARE (SPECIAL DB-NAME)) + (G-TERPRI) + (G-RISAY '(|I don't believe that we have met before.| + |Have we ever hunted Wumpii together? |)) + (COND ((NOT (GQ-EVAL (G-READ 'NO))) + (G-RSAY + (LIST '|Well,| + DB-NAME + '|, before we start I would like to| + '|ask you some questions. |)) + NIL) + (T (G-RSAY + (LIST '|I am really sorry,| + DB-NAME + '|, but I seem to have misplaced my| + '|records of our previous games. I| + '|need to ask you some questions before| + '|we can start.|)) + T))) + +;;; ****** Standard Data Base Routines. *********** +;;;DB-END-SESSION saves whatever is needed. + +(DEFUN DB-END-SESSION NIL + (DECLARE (SPECIAL DB-NAME)) + (G-RISAY + (APPEND + (LIST '|Well,| DB-NAME) + '(|, have a nice day. Please look me up next| + |time you want to go on a Wumpii hunt. |)))) + +;;; DB-END-GAME saves whatever is necessary. + +(DEFUN DB-END-GAME NIL + (DECLARE (SPECIAL SL-MODE)) + (COND ((NOT SL-MODE) (SF-SAVE-USER-FILE)))) + +;;; DB-INIT-NEWGAME initializes the global variables for the +;;;WUMPUS-ADVISOR and its sub-modules. + +(DEFUN DB-INIT-NEWGAME NIL + (DECLARE (SPECIAL CX-COMPARE G-READ-NUM DB-TIME G-SILENT SL-MODE + DB-NUM-PROP SC-NOTEST WE-NORESTART DB-DEBUG WE-MOVE + DB-COMMENT WA-TOLD-C6 WEV-RECREATE LWA-GOOD-MOVES + XD-VISITED-CAVES WEV-ERROR XX-CHANGED DB-NUM-DPROP + DB-OLD-USER-FILE WG-ARROWS WE-LAST-MOVE WG-HERE + DB-TOTAL-DIST SL-LAST-LEARNED LWA-BAD-MOVES + WE-MOVE-NUM WAD-FRINGE DB-NUM-CAVES DB-GAME-NUM)) + (G-RSAY '(|Just a second while I erase my blackboard.|)) + ;;; These calls insure that the cave arrays are the + ;;;correct size and have the correct starting values. + (*REARRAY 'ADB-CAVE T DB-NUM-CAVES DB-NUM-PROP) + ;;; This to insure that the array is initialized to NIL. + (*REARRAY 'ADB-DCAVE T 1. 1. 1.) + (*REARRAY 'ADB-DCAVE + T + DB-NUM-CAVES + (+ DB-NUM-DPROP (* 3. DB-TOTAL-DIST)) + 3.) + (DO ((I 0. (1+ I))) + ((= I DB-NUM-CAVES)) + (DO ((J 0. (1+ J)) + (VALUES '(NIL NIL NIL -1.0 -1.0 -1.0 NIL) + (CDR VALUES))) + ((> J (1- DB-NUM-PROP))) + (STORE (ADB-CAVE I J) (CAR VALUES))) + (DO ((J 0. (1+ J)) + (VALUES '(NIL -1. (-1.) 100. (-1.) -1. (-1.) NIL + NIL NIL NIL -1.0 NIL -1.0 -1.0 NIL 0. + (-1. NIL)) + (CDR VALUES))) + ((> J (1- DB-NUM-DPROP))) + (DO ((K 0. (1+ K))) + ((= K 3.)) + (STORE (ADB-DCAVE I J K) (CAR VALUES))))) + (COND (WEV-RECREATE NIL) + ((DB-RAND-READ) NIL) + (DB-GAME-NUM + (SETQ DB-TIME DB-GAME-NUM DB-GAME-NUM (1+ DB-GAME-NUM))) + (T (SETQ DB-TIME (REMAINDER (FIX (TIME)) 300.)))) + (SETQ DB-OLD-USER-FILE (SF-GET-USER-FILE)) + (G-TERPRI) + (COND ((NOT DB-COMMENT) (SETQ G-SILENT T))) + (SF-TELL-MODEL) + (SF-TELL-VARS) + (COND ((NOT DB-COMMENT) (SETQ G-SILENT NIL))) + (G-TSAY (LIST '|*** Time is| DB-TIME '|. ***|)) + (G-RSAY '(|O.K., now I will draw up a new warren. |)) + (DB-RAND-LOOP DB-TIME) + (COND ((OR SL-MODE DB-DEBUG SC-NOTEST) NIL) + ((> WE-MOVE-NUM (+ SL-LAST-LEARNED 100.)) + (SC-HELP '|not advancing|))) + (WGI-INIT) + (WAM-MODIFY-GAME) + (SETQ WE-MOVE NIL + WE-LAST-MOVE NIL + WE-NORESTART NIL + WAD-FRINGE (LIST WG-HERE) + WA-TOLD-C6 NIL + LWA-GOOD-MOVES (GCI-CREATE 5. + '(-1. -1. -1. -1. -1.)) + LWA-BAD-MOVES (GCI-CREATE 5. + '(-1. -1. -1. -1. -1.)) + WEV-ERROR NIL + XX-CHANGED T + XD-VISITED-CAVES NIL + CX-COMPARE NIL + WG-ARROWS 5. + G-READ-NUM 1.) + (DO ((I 0. (1+ I))) + ((> I 2.)) + (STORE (AXR-NUM-IDENTIFIED I) 0.) + (STORE (AXR-FOUND-N I) NIL) + (STORE (AXS-EXACT-CAVES I) NIL) + (STORE (AXS-CHANGED-SETS I) NIL) + (STORE (AXS-PARTIAL-SETS I) NIL) + (STORE (AXS-COMPLETE-SETS I) NIL) + (XP-P12-CALC I)) + (COND ((> (ADB-NUM-DANGERS 1.) 1.) + (STORE (AEG-DANGER-SING 0.) '(|bats|)) + (STORE (AEG-DANGER-PLUR 0.) '(|bats|))) + (T (STORE (AEG-DANGER-SING 0.) '(|the bats|)) + (STORE (AEG-DANGER-PLUR 0.) '(|the bats|)))) + (COND ((> (ADB-NUM-DANGERS 1.) 1.) + (STORE (AEG-DANGER-SING 1.) '(|a pit|)) + (STORE (AEG-DANGER-PLUR 1.) '(|pits|))) + (T (STORE (AEG-DANGER-SING 1.) '(|the pit|)) + (STORE (AEG-DANGER-PLUR 1.) '(|the pit|)))) + (COND ((> (ADB-NUM-DANGERS 2.) 1.) + (STORE (AEG-DANGER-SING 2.) '(|a Wumpus|)) + (STORE (AEG-DANGER-PLUR 2.) '(|Wumpii|))) + (T (STORE (AEG-DANGER-SING 2.) '(|the Wumpus|)) + (STORE (AEG-DANGER-PLUR 2.) '(|the Wumpus|)))) + (XX-INIT-DANGER-EST) + (*SDB-INIT-NEW-GAME)) + +;;; DB-DEFINE-GAME asks the user sufficient questions to +;;;define the game. It returns true after a successful +;;;read, false if it was unsuccessful. + +(DEFUN DB-DEFINE-GAME NIL + (DECLARE (SPECIAL WE-GAME-HIST SL-MODE DB-DEBUG DB-NUM-CAVES DB-GAME-NUM + DB-NUMLOSSES DB-PHASE DB-TOTAL-DIST DB-NAME)) + ;;; This is where recreations start, so the HIST is + ;;;cleared here. + (SETQ WE-GAME-HIST NIL + DB-PHASE + (COND ((NOT DB-GAME-NUM) (SLI-LEAST-PHASE)) + ((> DB-GAME-NUM 16.) 4.) + ((> DB-GAME-NUM 7.) 3.) + ((> DB-GAME-NUM 3.) 2.) + ((> DB-GAME-NUM 1.) 1.) + (T 0.))) + (COND + (DB-DEBUG (G-RSAY '(|Would you like to define the game? |)))) + (COND + ((OR (AND DB-DEBUG (GQ-EVAL (G-READ 'NO))) + (EQ SL-MODE 'SUPER)) + (STORE (ADB-WARNING-DIST 0.) (DB-READ-DIST '|bats'|)) + (STORE (ADB-WARNING-DIST 1.) (DB-READ-DIST '|pits'|)) + (STORE (ADB-WARNING-DIST 2.) + (DB-READ-DIST '|Wumpii's|)) + (SETQ DB-NUM-CAVES (DB-NUM-READ '|caves|)) + (STORE (ADB-NUM-DANGERS 2.) (DB-NUM-READ '|Wumpii|)) + (STORE (ADB-NUM-DANGERS 0.) (DB-NUM-READ '|bats|)) + (STORE (ADB-NUM-DANGERS 1.) (DB-NUM-READ '|pits|))) + (T + (STORE (ADB-NUM-DANGERS 2.) 1.) + (STORE (ADB-NUM-DANGERS 0.) (ASL-PNUM-DANGERS DB-PHASE 0.)) + (STORE (ADB-NUM-DANGERS 1.) (ASL-PNUM-DANGERS DB-PHASE 1.)) + (STORE (ADB-NUM-DANGERS 2.) (ASL-PNUM-DANGERS DB-PHASE 2.)) + (SETQ DB-NUM-CAVES + (COND ((> (ADB-NUM-DANGERS 2.) 1.) 25.) (T 20.))) + (STORE (ADB-WARNING-DIST 0.) 1.) + (STORE (ADB-WARNING-DIST 1.) 1.) + (STORE (ADB-WARNING-DIST 2.) 2.) + (G-RISAY (APPEND (LIST '|In this game,| DB-NAME) + '(|, there will be|) + (EG-NUMBER DB-NUM-CAVES) + (EGT-PLURAL '(|cave|) DB-NUM-CAVES) + '(|all total,|) + (EG-NUMBER (ADB-NUM-DANGERS 1.)) + (EGT-PLURAL '(|pit|) + (ADB-NUM-DANGERS 1.)) + '(|, and|) + (EG-NUMBER (ADB-NUM-DANGERS 0.)) + (EGT-PLURAL '(|cave|) + (ADB-NUM-DANGERS 0.)) + '(|with bats. |))) + (G-TERPRI) + (COND + ((> (ADB-NUM-DANGERS 2.) 1.) + (G-RISAY (APPEND '(|NOTE THAT in this game there will be|) + (EG-NUMBER (ADB-NUM-DANGERS 2.)) + '(|Wumpii. You only need to kill|) + '(|one of them to win the game. |))))) + T)) + (DO ((I 0. (1+ I)) (VAL 0. (+ VAL (1+ (ADB-WARNING-DIST I))))) + ((> I 2.) (SETQ DB-TOTAL-DIST VAL)) + (STORE (ADB-DIST-START I) VAL)) + (COND + ((< DB-NUM-CAVES + (+ (ADB-NUM-DANGERS 0.) + (ADB-NUM-DANGERS 1.) + (ADB-NUM-DANGERS 2.) + 1.)) + (G-RSAY + '(|You lose this game as there were no| + |safe caves for you to start at. |)) + (SETQ DB-NUMLOSSES (1+ DB-NUMLOSSES)) + NIL) + (T T))) + +;;; DB-NUM-READ this functions reads how many "TYPES" that +;;;the player wants. + +(DEFUN DB-NUM-READ (TYPES) + (PROG (RESPONSE) + (G-RSAY (LIST '|How many| + TYPES + '|would you like in this game. |)) + (SETQ RESPONSE (G-READ 1.)) + (COND ((OR (NOT (FIXP RESPONSE)) (< RESPONSE 0.)) + (RETURN (DB-NUM-READ TYPES))) + (T (RETURN RESPONSE))))) + +;;; DB-READ-DIST reads in the warning dist. + +(DEFUN DB-READ-DIST (T-DANGER) + (PROG (RESPONSE) + (G-RSAY (LIST '|How far would you like for| + T-DANGER + '|warnings to propagate? |)) + (COND ((AND (FIXP (SETQ RESPONSE (G-READ 1.))) + (> RESPONSE -1.)) + (RETURN RESPONSE)) + (T (RETURN (DB-READ-DIST T-DANGER)))))) + +;;; DB-RAND-READ reads the initailization for the +;;;random number generator if appropriate. + +(DEFUN DB-RAND-READ NIL + (DECLARE (SPECIAL SL-MODE DB-DEBUG DB-TIME)) + (PROG (RESPONSE) + (COND ((NOT (OR SL-MODE DB-DEBUG)) (RETURN NIL))) + (G-RSAY + '(|Would you like to initialize| + |the random number generator? |)) + (COND ((GP-NUM-TEST (SETQ RESPONSE (G-READ 'NO)) + 300.) + (GO GOT-IT)) + ((NOT (GQ-EVAL RESPONSE)) (RETURN NIL))) + TRY (G-RSAY + '(|Please enter a non-negative integer| + |(not too large). |)) + (COND ((NOT (GP-NUM-TEST (SETQ RESPONSE (G-READ 1.)) + 300.)) + (GO TRY))) + GOT-IT + (SETQ DB-TIME RESPONSE) + (RETURN T))) + +;;; DB-RAND-LOOP is a function to initialize the random +;;;number generator. + +(DEFUN DB-RAND-LOOP (NUMBER) + (RANDOM NIL) + (DO ((COUNTER NUMBER (1- COUNTER))) + ((< COUNTER 0.) T) + (RANDOM 10.))) + +;;;*****************UTILITY FUNCTIONS********************** +;;; GP-MAKN concatenates its two arguments and returns +;;;the resulting string. + +(DEFUN GP-MAKN (FIRST SECOND) + (IMPLODE (APPEND (EXPLODEN FIRST) (EXPLODEN SECOND)))) + +;;; GP-EG expects two floating point args and +;;;returns T if they are approximately equal. + +(DEFUN GP-EQ (X Y) (AND (> (+$ X 1.0E-4) Y) (> (+$ Y 1.0E-4) X))) + +;;; GP-LT expects two floating point args and returns +;;;T if the first is sufficiently less than the second. + +(DEFUN GP-LT (LESS MORE) (< (+$ LESS 1.0E-4) MORE)) + +;;; GP-UNION returns the set-theoretic union of N arguments. + +(DEFUN GP-UNION NARGS + (DO ((I 1. (1+ I)) (VAL)) + ((> I (ARG NIL)) (REVERSE VAL)) + (DO ((LIST (ARG I) (CDR LIST))) + ((NULL LIST)) + (COND ((NOT (MEMBER (CAR LIST) VAL)) + (SETQ VAL (CONS (CAR LIST) VAL))))))) + +;;; GP-INTERSECTION returns the set intersection of the two lists. + +(DEFUN GP-INTERSECTION (LIST1 LIST2) + (COND ((NOT LIST1) NIL) + ((MEMBER (CAR LIST1) LIST2) + (CONS (CAR LIST1) (GP-INTERSECTION (CDR LIST1) LIST2))) + (T (GP-INTERSECTION (CDR LIST1) LIST2)))) + +;;; GP-DELETE does the same thing as a regular delete except +;;;that it doesn't have any bad side effects. + +(DEFUN GP-DELETE (ITEM LIST) + (COND ((NULL LIST) NIL) + ((EQUAL ITEM (CAR LIST)) (GP-DELETE ITEM (CDR LIST))) + (T (CONS (CAR LIST) (GP-DELETE ITEM (CDR LIST)))))) + +;;; GP-REMOVE-LIST returns the set of B minus those members +;;;who are also members of A. + +(DEFUN GP-REMOVE-LIST (B A) + (COND ((NULL B) NIL) + ((NULL A) B) + (T (GP-REMOVE-LIST (GP-DELETE (CAR A) B) (CDR A))))) + +;;; GP-CONS does a CONS after first insuring that ATOM +;;;is not already a member of LIST. + +(DEFUN GP-CONS (ATOM LIST) + (COND ((MEMBER ATOM LIST) LIST) + (ATOM (CONS ATOM LIST)) + (T LIST))) + +;;; GP-EQUIV determines if two lists are eqivalent. + +(DEFUN GP-EQUIV (LIST1 LIST2) + (NOT (OR (GP-REMOVE-LIST LIST1 LIST2) + (GP-REMOVE-LIST LIST1 LIST2)))) + +;;; GP-NUM-TEST tests if NUM is a non-negative integer less than LIMIT. + +(DEFUN GP-NUM-TEST (NUM LIMIT) + (AND (FIXP NUM) (> NUM -1.) (< NUM LIMIT))) + +;;; GP-RANDEL chooses a random element from its input list. + +(DEFUN GP-RANDEL (LIS) + (CAR (WGI-NTHEL LIS (RANDOM (1+ (LENGTH LIS)))))) + +;;; GP-CAVE-CHECK insures that there is a cave to match its arg. +;;;It returns T if there is no such cave. + +(DEFUN GP-CAVE-CHECK (T-CAVE) + (DECLARE (SPECIAL DB-NUM-CAVES)) + (COND ((AND (FIXP T-CAVE) (GP-NUM-TEST T-CAVE DB-NUM-CAVES)) NIL) + (T (G-RSAY (LIST '|There is no cave| + T-CAVE + '|. |)) + T))) + +;;; GP-TEST returns T if its argument is a list, T, or > 1. + +(DEFUN GP-TEST (TEST) + (OR (EQ TEST T) + (AND (NOT (ATOM TEST)) (CDR TEST)) + (AND (FIXP TEST) (> TEST 1.)))) + +;;; GP-DIST-AREA returns all the caves which are within +;;;DIST caves of any cave in CAVE-LIST. + +(DEFUN GP-DIST-AREA (CAVE-LIST DIST) + (COND ((< DIST 1.) CAVE-LIST) + (T (DO ((LIST CAVE-LIST (CDR LIST)) + (T-CAVE (CAR CAVE-LIST) (CAR LIST)) + (RESULT CAVE-LIST + (GP-UNION RESULT (WGR-NEIGHBORS T-CAVE)))) + ((NOT T-CAVE) (GP-DIST-AREA RESULT (1- DIST))))))) + +;;; GP-ORDLST JUST PRODUCES A LIST OF THE FIRST N NUMBERS +;;;IN REVERSE ORDER + +(DEFUN GP-ORDLST (N) + (COND ((< N 1.) NIL) (T (CONS (1- N) (GP-ORDLST (1- N)))))) + +;;; GP-INSERT inserts ITEM into the list (globally). + +(DEFUN GP-INSERT (AFTER ITEM) (RPLACD AFTER (CONS ITEM (CDR AFTER)))) + +;;; ****** General Purpose Routines For Circular Lists. ***** +;;; GCI-CREATE creates a circular list (with header) of +;;;the given length (first argument). If a second argument +;;;is supplied, it is the intial values. +;;; These functions are part of each LISPs initialization. +(DEFUN GCI-CREATE NARGS + (CONS (ARG 1.) + (GCI-WCREATE (ARG 1.) + NIL + (COND ((> (ARG NIL) 1.) (ARG 2.)))))) + +;;; GCI-WCREATE does the actual work of WGI-CREAT. + +(DEFUN GCI-WCREATE (NUM LIST VALS) + (COND ((< NUM 1.) (RPLACD (LAST LIST) LIST)) + (T (GCI-WCREATE (1- NUM) + (CONS (GCI-VAL VALS) LIST) + (CDR VALS))))) + +;;; GCI-VAL returns the appropriate value. + +(DEFUN GCI-VAL (VALS) (COND ((ATOM VALS) NIL) (T (CAR VALS)))) + +;;; GC-PUT inserts a new value into the circular list, +;;;deleting the oldest previous value. + +(DEFUN GC-PUT (CLIST VAL) (RPLACD CLIST (RPLACA (CDDR CLIST) VAL))) + +;;; GC-NEXT returns the next value while advancing the pointer. + +(DEFUN GC-NEXT (CLIST) (RPLACD CLIST (CDDR CLIST)) (CADR CLIST)) + +;;; GC-WNEXT is an internal routine to do GC-NEXT. + +(DEFUN GC-WNEXT (NAME) (SET NAME (CDR (EVAL NAME))) (CAR (EVAL NAME))) + +;;; GC-MEMBER determines if the second argument is a member +;;;of the first argument. The third argument is optional; +;;;it must be an integer (N) and tells the routine to skip +;;;the last N elements. + +(DEFUN GC-MEMBER NARGS + (COND ((AND (> (ARG NIL) 2.) + (= (ARG 3.) 0.)) + NIL) + (T (GC-WMEMBER (CDR (ARG 1.)) + (CDR (ARG 1.)) + (ARG 2.) + (COND ((> (ARG NIL) 2.) + (- (CAR (ARG 1.)) (ARG 3.))) + (T 0.)))))) + +;;; GC-WMEMBER does the actual work of GC-MEMEBR. + +(DEFUN GC-WMEMBER (C-CLIST O-CLIST VALUE SKIP) + (DECLARE (SPECIAL C-CLIST)) + (COND ((NOT (< SKIP 1.)) + (GC-WMEMBER (CDR C-CLIST) O-CLIST VALUE (1- SKIP))) + ((EQUAL (GC-WNEXT 'C-CLIST) VALUE) C-CLIST) + ((EQ C-CLIST O-CLIST) NIL) + (T (GC-WMEMBER C-CLIST O-CLIST VALUE SKIP)))) + +;;; GC-AVERAGE computes the average of the elements of the +;;;first argument. It will skip the last N elements if the +;;;second argument is specified (N). + +(DEFUN GC-AVERAGE NARGS + (GC-WAVERAGE (CDR (ARG 1.)) + (CDR (ARG 1.)) + 0.0 + 0. + (COND ((> (ARG NIL) 1.) + (- (CAR (ARG 1.)) (ARG 2.))) + (T 0.)))) + +;;; GC-WAVERAGE does the actual work of GC-AVERAGE. + +(DEFUN GC-WAVERAGE (C-CLIST O-CLIST TOTAL NUM SKIP) + (DECLARE (SPECIAL C-CLIST)) + (SETQ TOTAL (PLUS TOTAL (GC-WNEXT 'C-CLIST))) + (SETQ NUM (1+ NUM)) + (COND ((NOT (< SKIP 1.)) + (GC-WAVERAGE C-CLIST O-CLIST 0.0 0. (1- SKIP))) + ((EQ C-CLIST O-CLIST) (//$ TOTAL (FLOAT NUM))) + (T (GC-WAVERAGE C-CLIST O-CLIST TOTAL NUM SKIP)))) + +;;;******* General Purpose Mapping Functions. ******** +;;; GM-MAPCAN does a non-destructive MAPCAN. + +(DEFUN GM-MAPCAN (PRED LIST) + (COND ((NULL LIST) NIL) + (T (APPEND (PRED (CAR LIST)) + (GM-MAPCAN PRED (CDR LIST)))))) + +;;;DOES A MAPCAR OF A PREDICATE, RETURNS THE FIRST LIST VALUE +;;;FOR WHICH THE PREDICATE IS TRUE + +(DEFUN GM-FIRST-TRUE (PRED LST) + (COND ((NOT LST) NIL) + ((PRED (CAR LST)) (CAR LST)) + (T (GM-FIRST-TRUE PRED (CDR LST))))) + +;;;GIVES A LIST OF ALL ELEMENTS OF A LIST FOR WHICH +;;;A GIVEN PREDICATE IS TRUE + +(DEFUN GM-ALL-TRUE (PRED LST) + (COND ((NOT LST) NIL) + ((NOT (PRED (CAR LST))) (GM-ALL-TRUE PRED (CDR LST))) + (T (CONS (CAR LST) (GM-ALL-TRUE PRED (CDR LST)))))) + +;;;********* I/O Related General Purpose Functions. ******** +;;; G-AFFIRMATIVE evaluates the response and if it is yes +;;;or an equivalent it returns T. + +(DEFUN G-AFFIRMATIVE (REPLY) + (MEMBER REPLY + '(Y T YES UH-HUH OK YEA OKAY SURE YEAH DEFINITELY + POSITIVELY INDEED PLEASE RIGHT YUP))) + +;;; G-NEGATIVE is a function to check for the various ways of saying no. + +(DEFUN G-NEGATIVE (REPLY) + (MEMBER REPLY '(N NIL NO NOPE UHN-HUH NAH NAW))) + +;;; G-LOWER-CASE converts the character string it is sent into lower case. +;;;If the flag is true, it also capitalizes the first character. + +(DEFUN G-LOWER-CASE (STRING FLAG) + (DO ((CHARS (REVERSE (EXPLODEN STRING)) (CDR CHARS)) + (RESULT NIL)) + ((NULL (CDR CHARS)) + (IMPLODE (COND (FLAG (CONS (BOOLE 1. 95. (CAR CHARS)) + RESULT)) + (T (CONS (BOOLE 7. 32. (CAR CHARS)) + RESULT))))) + (SETQ RESULT (CONS (BOOLE 7. 32. (CAR CHARS)) RESULT)))) + +;;; G-WRITE is a function originally written by Dave MacDonald +;;;that recieves a string of numbers(ASCII) and prints them out. + +(DEFUN G-WRITE (LIST) + (DECLARE (SPECIAL LINEL GV-CURSORPOS G-SILENT G-DOUBLESPACE)) + (PROG (LIST-LENGTH ROOM-ON-LINE STARTING-POINT) + (COND ((NULL LIST) (RETURN T))) + (SSTATUS TERPRI T) + (SETQ LIST-LENGTH (LENGTH LIST)) + (SETQ STARTING-POINT GV-CURSORPOS + ;;; I think that this is one less that actual room. + ROOM-ON-LINE (- LINEL STARTING-POINT)) + (COND + ((OR (= LIST-LENGTH ROOM-ON-LINE) + (< LIST-LENGTH ROOM-ON-LINE)) + ;;; i.e. is the list going to fit + ;;; on this line? + (COND (G-SILENT (SETQ ^W T))) + (G-WRITE-WORK LIST LIST-LENGTH) + (COND (G-SILENT (SETQ ^W NIL)))) + (T + ;;; first find the word break + (PROG (L SAID-SO-FAR LAST-SP THIS-SP) + (SETQ L LIST + SAID-SO-FAR 0. + LAST-SP 0. + THIS-SP 0.) + FIND-WORD + (SETQ LAST-SP THIS-SP) + (SETQ THIS-SP + (DO ((I 1. (1+ I)) (C (CAR L) (CAR L))) + ((OR (NULL L) (= C 32.) (= C 13.)) + (SETQ L (CDR L)) + (COND ((NULL C)) + ((= C 13.) + (SETQ SAID-SO-FAR -1.))) + (+ LAST-SP I)) + (SETQ L (CDR L)) + (SETQ SAID-SO-FAR (1+ SAID-SO-FAR)))) + (COND ((AND (= LAST-SP 0.) + (= STARTING-POINT 0.) + (> SAID-SO-FAR ROOM-ON-LINE)) + (SETQ LAST-SP THIS-SP) + (GO DO-IT)) + ((> SAID-SO-FAR ROOM-ON-LINE) (GO DO-IT)) + (T (SETQ SAID-SO-FAR (1+ SAID-SO-FAR)) + ;;; include the passed space + (GO FIND-WORD))) + DO-IT(COND (G-SILENT (SETQ ^W T))) + (SETQ LIST (G-WRITE-WORK LIST LAST-SP)) + (G-TERPRI) + (COND (G-DOUBLESPACE (G-TERPRI))) + (COND (G-SILENT (SETQ ^W NIL))) + (G-WRITE LIST)))))) + +;;; G-WRITE-WORK does the actual writing for G-WRITE. + +(DEFUN G-WRITE-WORK (LIST LAST-SP) + (DECLARE (SPECIAL GV-CURSORPOS G-LAST G-BLAST G-BBLAST)) + (DO ((I LAST-SP (1- I)) + ;;; C is the character that is being worked on. + (C (CAR LIST) (CAR LIST)) + ;;; N is the next character to be worked on. + (N (CADR LIST) (CADR LIST))) + ((< I 1.)) + (SETQ LIST (CDR LIST)) + (COND ((NOT LIST) (SETQ I 0.)) + ;;;check for spaces preceding commas, periods, + ;;;and question marks. If so, then omit the space. + ((AND (= C 32.) (OR (= N 46.) (= N 44.) (= N 63.))) + (COND ((= I 1.) (SETQ I 2.)))) + ;;; If this is a new sentence, as indicated by + ;;;the punctuation, then insure that the first + ;;;letter is capitalized. + ((AND (= G-LAST 32.) + (= G-BLAST 32.) + (OR (= G-BBLAST 46.) + (= G-BBLAST 63.) + (= G-BBLAST 33.)) + (> C 96.) + (< C 123.)) + (TYO (- C 32.))) + (T (TYO C))) + ;;; G-BBLAST is the character before the character before last. + (SETQ G-BBLAST G-BLAST) + ;;; G-BLAST is the character before last. + (SETQ G-BLAST G-LAST) + ;;; G-LAST is the last character that was worked on. + (SETQ G-LAST C) + (SETQ GV-CURSORPOS (1+ GV-CURSORPOS))) + ;;; Do not output spaces at the start of a new line. + (COND ((AND (FIXP (CAR LIST)) (= (CAR LIST) 32.)) + (G-WRITE-WORK LIST 1.)) + (T LIST))) + +;;; G-TERPRI does a terpri if it appropriate according to G-SILENT. + +(DEFUN G-TERPRI NIL + (DECLARE (SPECIAL GV-CURSORPOS G-SILENT *SS-ACTIVE)) + (SETQ GV-CURSORPOS 0.) + (COND ((AND G-SILENT + (OR *SS-ACTIVE + (NOT (CURSORPOS)) + (= (CDR (CURSORPOS)) 0.))) + (SETQ ^W T) + (TYO 13.) + (SETQ ^W NIL)) + (T (TYO 13.)))) + +;;; G-SAY is a modification of the standard SAY function as it fills +;;;lines before causing a carriage return. + +(DEFUN G-SAY (LIST) + (DECLARE (SPECIAL GV-CURSORPOS)) + (PROG (NEW-LIST) + (SETQ NEW-LIST (EXPLODEN LIST)) + ;;;This statement removes the preceding open + ;;;paren. G-WRITE does not print the last character + ;;;which is a close paren. + (SETQ NEW-LIST (CDR NEW-LIST)) + ;;; Insert a space between sentences. + (COND ((> GV-CURSORPOS 0.) + (SETQ NEW-LIST (CONS 32. NEW-LIST)))) + (G-WRITE NEW-LIST))) + +;;; G-RSAY is a function to do a SAY after doing a carriage RETURN. + +(DEFUN G-RSAY (LIST) + (DECLARE (SPECIAL G-LAST G-BLAST G-BBLAST G-DOUBLESPACE)) + (G-TERPRI) + (COND (G-DOUBLESPACE (G-TERPRI))) + ;;; These two SETQs insure new sentence is capitalized. + (SETQ G-LAST 32.) + (SETQ G-BLAST 32.) + (SETQ G-BBLAST 46.) + (G-SAY LIST)) + +;;; G-TSAY does a say of pedagogical comments. G-SILENT is the +;;;switch to restrict output to the terminal. + +(DEFUN G-TSAY (LIST) + (DECLARE (SPECIAL DB-COMMENT G-SILENT GV-CURSORPOS)) + (COND ((NOT DB-COMMENT) + (SETQ G-SILENT (CURSORPOS)) + (G-TERPRI))) + (G-RSAY LIST) + (COND ((NOT DB-COMMENT) + (CURSORPOS (CAR G-SILENT) (CDR G-SILENT)) + (SETQ GV-CURSORPOS (CDR G-SILENT) G-SILENT NIL)))) + +;;; G-PSAY positions the cursor before doing a SAY. + +(DEFUN G-PSAY (LIST POSITION) + (DECLARE (SPECIAL GV-CURSORPOS)) + (DO ((SPACES (- POSITION GV-CURSORPOS) (1- SPACES))) + ((< SPACES 1.) (SETQ GV-CURSORPOS POSITION)) + (G-WRITE '(32. 32.))) + (G-SAY LIST)) + +;;; G-RESET clears the screen when the player is ready. + +(DEFUN G-RESET NIL + (DECLARE (SPECIAL G-SILENT)) + (G-RSAY '(|Enter any character for more. |)) + (G-READ 'A) + (COND ((NOT G-SILENT) + (CURSORPOS 'C) + (CURSORPOS 0. 0.)))) + +;;; G-RISAY is a function to do a SAY after doing a carriage +;;;return and then indenting six spaces. + +(DEFUN G-RISAY (LIST) + (DECLARE (SPECIAL G-LAST G-BLAST G-DOUBLESPACE)) + (G-TERPRI) + (COND (G-DOUBLESPACE (G-TERPRI))) + (G-WRITE '(32. 32. 32. 32. 32. 32.)) + ;;; This SETQ insures that new sentence is capitalized. + (SETQ G-LAST 32.) + (SETQ G-BLAST 46.) + (G-SAY LIST)) + +;;; G-READ is a function that reads after sending a TERPRI. + +(DEFUN G-READ (REQUEST) + (DECLARE (SPECIAL G-READ-NUM G-WRITE-NUM)) + (PROG (CURSOR) + (COND (G-WRITE-NUM (G-SAY (LIST (GP-MAKN G-READ-NUM + '>))))) + (G-WRITE '(32. 32.)) + ;;; Only do cursorpos if this is not a printing terminal. + (COND ((> TTY 0.) + (SETQ CURSOR (CURSORPOS)) + (G-TERPRI) + (G-TERPRI) + (CURSORPOS (CAR CURSOR) (CDR CURSOR)))) + (SETQ G-READ-NUM (1+ G-READ-NUM)) + (RETURN (G-SREAD REQUEST)))) + +;;; G-SREAD does a read without the linefeeds and such. + +(DEFUN G-SREAD (REQUEST) + (DECLARE (SPECIAL WEV-RECREATE *SS-ACTIVE WE-GAME-HIST + G-WRITE-NUM DB-DEBUG DB-COMMENT GV-CURSORPOS + XX-BEST-MOVES SL-TUTOR DB-GAME-NUM)) + (PROG (RESPONSE) + ;;; Unless this is a syntheitic student, this is a regular read. + (SETQ RESPONSE (*SS-READ REQUEST)) + ;;; If this is a recreation, then don't necessarily read. + (COND ((AND WEV-RECREATE (EQ RESPONSE T)) + (SETQ RESPONSE (CAR WEV-RECREATE)) + (SETQ WEV-RECREATE (CDR WEV-RECREATE)) + (G-RSAY (LIST '|Her input was| + RESPONSE + '|. |))) + (*SS-ACTIVE (G-SAY (LIST RESPONSE))) + (T (SETQ GV-CURSORPOS + (+ 1. + (LENGTH (EXPLODEN RESPONSE)) + GV-CURSORPOS)))) + + (SETQ WE-GAME-HIST (CONS RESPONSE WE-GAME-HIST)) + (COND ((EQ RESPONSE '*?) (WE-*COMMANDS)) + ((EQ RESPONSE '*INDEX) + (WE-WRITE-INDEX XX-BEST-MOVES)) + ((EQ RESPONSE '*EXEC) (WE-EXECUTE)) + ((EQ RESPONSE '*MODEL) (SF-TELL-MODEL)) + ((EQ RESPONSE '*VARIABLE) (SF-TELL-VARS)) + ((EQ RESPONSE '*TUTOR) (SETQ SL-TUTOR T)) + ((EQ RESPONSE '*NOTUTOR) (SETQ SL-TUTOR NIL)) + ((EQ RESPONSE '*SEQUENCE) + (COND ((NOT DB-GAME-NUM) (SETQ DB-GAME-NUM 0.)))) + ((EQ RESPONSE '*PROB) (WE-PROB)) + ((EQ RESPONSE '*RULES) (WE-RULES)) + ((EQ RESPONSE '*EXPL-RULES) (WE-EXPL-RULES)) + ((EQ RESPONSE '*EXPLAIN) (WE-EXPLAIN)) + ((EQUAL RESPONSE '(SAVE)) (SAVE)) + ((EQ RESPONSE '*DEBUG) (SETQ DB-DEBUG T)) + ((EQ RESPONSE '*NODEBUG) + (SETQ DB-DEBUG NIL)) + ((EQ RESPONSE '*COMMENT) + (SETQ DB-COMMENT T)) + ((EQ RESPONSE '*NOCOMMENT) + (SETQ DB-COMMENT NIL)) + ((EQ RESPONSE '*NUMB) (SETQ G-WRITE-NUM T)) + ((EQ RESPONSE '*NONUMB) + (SETQ G-WRITE-NUM NIL)) + ((EQ RESPONSE '*CHEAT) (WE-CHEAT)) + (T (RETURN RESPONSE))) + (G-RSAY + '(|Please answer my original question now. | + |(Enter "**" for a cue to your response.)|)) + (RETURN (G-SREAD REQUEST)))) + +;;; G-READ-RESPONSE reads in a response by the student +;;;terminated with two semicolons. + +(DEFUN G-READ-RESPONSE NIL + (DO ((VAL NIL) (THIS (TYI) (TYI)) (LAST NIL THIS)) + ((AND (= THIS 59.) (= LAST 59.)) + (SETQ VAL (IMPLODE (REVERSE VAL))) + (RETURN VAL)) + (COND ((EQUAL THIS '127.) + (CURSORPOS 'X) + (SETQ VAL (CDR VAL))) + (T (SETQ VAL (CONS THIS VAL)))))) + +;;; G-APPEND-FILE sets up for writing to a file. + +(defun g-append-file (filename) + (cond ((apply 'uprobe filename) + (setq filename (g-*ugreat filename)) + (g-*uwrite filename 'append filename)) + (t (apply 'uwrite (cddr filename))))) + +;;; G-*UGREAT is a variant of a routine of JONL, as is above. + +(defun g-*ugreat (name) + (mergef (mergef name + (cond ((status feature dec10) + '(* . lsp)) + ((status feature its) + '(* . >)))) + nil)) + +;;; G-*UWRITE is also such a variaint. + +(defun g-*uwrite (name mode newdefault) + (DECLARE (SPECIAL UWRITE OUTFILES)) + (cond (uwrite + (setq outfiles (delq uwrite outfiles)) + (close uwrite) + (setq uwrite nil))) + ((lambda (file) + (setq outfiles + (cons (setq uwrite file) + outfiles)) + (car (defaultf newdefault))) + (open name mode))) + +;;; GQ-GO-AHEAD asks the player if he would like to go +;;;ahead with MOVE. + +(DEFUN GQ-GO-AHEAD (MOVE) + (G-RSAY (LIST '|Would you like to go to cave| + MOVE + '|anyway? |)) + (COND ((GQ-EVAL (G-READ 'DECIDE-YES)) NIL) (T))) + +;;; GQ-SHOOT-ANYWAY asks the player if he would like to +;;;shoot into CAVE anyway. + +(DEFUN GQ-SHOOT-ANYWAY (CAVE) + (G-RSAY (LIST '|Would you like to shoot into cave| + CAVE + '|anyway? |)) + (COND ((GQ-EVAL (G-READ 'DECIDE-YES)) NIL) (T))) + +;;; GQ-EVAL expects a response that is either yes or no and +;;;converts it to T or NIL. If the response is not correct it +;;;asks for a yes or no response. + +(DEFUN GQ-EVAL (RESPONSE) + (COND ((G-AFFIRMATIVE RESPONSE) T) + ((G-NEGATIVE RESPONSE) NIL) + (T (GQ-YES-OR-NO)))) + +;;; GQ-YES-OR-NO is a function that asks the player to answer +;;;yes or no, reads his response, and returns his response. + +(DEFUN GQ-YES-OR-NO NIL + (G-RSAY '(|Please answer yes or no. |)) + (GQ-EVAL (G-READ 'NO))) + +;;; ********* Synthetic Student Student Non-Functions. ********** + +(DEFUN *SXD-MARK-DANGER (CAVE DANGER) CAVE DANGER) + +(DEFUN *SXD-MARK-NOWARNING (CAVE DANGER) CAVE DANGER) + +(DEFUN *SXD-MARK-VISITED (CAVE DANGERS) CAVE DANGERS) + +(DEFUN *SXD-MARK-WARNING (CAVE DANGER) CAVE DANGER) + +(DEFUN *SXD-MARK-SHOT (CAVE) CAVE) + +(DEFUN *SS-READ (REQUEST) REQUEST (READ)) + +(DEFUN *SSK-TOLD-RULE (RULE DANGER) RULE DANGER) + +(DEFUN *SS-TOLD-MOVE (G-MOVE B-MOVE C-RULE) G-MOVE B-MOVE C-RULE) + +(DEFUN *SS-INITIALIZE NIL NIL) + +(DEFUN *SDB-INIT-NEW-GAME NIL NIL) + +(DEFUN *SS-IMPLIED-RULES (REASONS DANGER) REASONS DANGER) diff --git a/src/games/wa.plyrs8 b/src/games/wa.plyrs8 new file mode 100644 index 00000000..cb220108 --- /dev/null +++ b/src/games/wa.plyrs8 @@ -0,0 +1,703 @@ +(((((0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.84 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0)) (0.0 0.0 0.0 0.0 0.0 0.0 0.0)) (DARTH VADER) +|Darth| 138 0 0 0 NIL NIL 1.13680507 7.81603 6.0 0.136805072 +1.63680507 NIL 4 0 (NIL NIL NIL) T NIL NIL) ((((0.0 0 0.0 0) +(3.56623667 5 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (3.56623667 5 0.0 0) (0.0 0 +0.0 0) (1.0 0 3.0 5) (0.0 0 0.0 0) (1.0 0 3.0 5) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 3 0.0 0) (0.0 0 0.0 0)) ((0.0 0 +0.0 0) (3.56623667 5 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 7) (0.0 0 +0.0 0) (1.0 0 1.0 7) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 1 0.0 0) (1.0 0 1.0 7)) (1.0 0.0 0.0 0.0 0.0 0.0 0.0)) (ERIC SWENSON) +|Eric| 127 0 1 10 NIL NIL 1.06623666 8.3333305 6.0 0.06623666 +4.5662367 NIL 8 5 (A 5 7) T NIL (0)) ((((0.0 0 0.0 0) (27.5895429 5 +0.0 0) (0.0 0 0.0 0) (5.58954275 5 1.0 15) (1.0 0 0.0 0) (5.58954275 5 +1.0 15) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (1.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 1 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (15.5895427 5 0.0 0) (0.0 0 0.0 0) +(5.58954275 6 0.0 0) (1.0 0 0.0 0) (5.58954275 6 0.0 0) (0.0 0 +0.0 0) (1.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(1.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (14.5895427 5 0.0 0) (0.0 0 0.0 0) (1.58954272 8 +0.0 0) (1.0 0 1.0 10) (1.58954272 8 0.0 0) (0.0 0 0.0 0) (1.0 0 +1.0 10) (1.0 0 1.0 10) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.58954272 8 0.0 0)) (4.0 +1.0 1.0 0.0 1.0 1.0 0.0)) (HOWARD CANNON) |Howard| 59 1 2 34 NIL NIL +1.08954272 8.155075 4.0 0.089542717 10.5895427 NIL 25 8 (15 21 10) T NIL (0 0 +1)) ((((0.0 0 0.0 0) (11.0 0 11.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (11.0 0 11.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (11.0 0 11.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0)) (2.0 0.0 0.0 0.0 0.0 0.0 0.0)) (JOHN FIX) |John| +315 0 0 0 NIL NIL 1.08507021 8.1886891 6.0 0.085070208 1.58507021 NIL 4 0 +(NIL NIL NIL) T NIL NIL) ((((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) (0.0 0.0 0.0 +0.0 0.0 0.0 0.0)) (ROGER SLYK) |Roger| 300 0 0 0 NIL T 1.08954272 +8.155075 6.0 0.089542717 0.58954272 NIL 4 0 (NIL NIL NIL) T NIL NIL) +((((1.0 0 1.0 0) (34.0 0 34.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) ((1.0 0 1.0 0) (34.0 0 34.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (2.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) +(1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (34.0 0 34.0 0) (0.0 0 0.0 0) (5.0 0 5.0 0) (4.0 0 +4.0 0) (5.0 0 5.0 0) (0.0 0 0.0 0) (4.0 0 4.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 2 0.0 0) (3.0 0 3.0 0)) (2.0 1.0 1.0 0.0 0.0 4.0 0.0)) (FOO BAR) |Foo| +275 0 3 0 NIL NIL 1.01096886 8.7888983 6.0 0.010968864 1.51096886 NIL 8 0 +(NIL NIL NIL) T NIL (0 0 0)) ((((0.0 0 0.0 0) (12.0 0 11.0 0) +(0.0 0 0.0 0) (1.0 0 2.0 0) (0.0 0 0.0 0) (1.0 0 2.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (12.0 0 11.0 0) (0.0 0 0.0 0) (0.65710546 10 2.0 0) +(0.0 0 0.0 0) (0.65710546 10 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (12.0 0 +11.0 0) (0.0 0 0.0 0) (1.0 0 2.0 0) (0.0 0 0.0 0) (1.0 0 2.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(1.0 0 1.0 6) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (1.0 0 +2.0 0)) (3.0 0.0 0.0 0.0 1.0 0.0 0.0)) (DAVID P) |David| 227 0 1 8 NIL NIL +1.15710546 7.67890465 9.0 0.15710546 2.65710548 NIL 14 5 (B 10 B) T NIL (0)) +((((1.0 0 1.0 0) (35.0 0 34.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) ((1.0 0 1.0 0) (35.0 0 34.0 0) +(0.0 0 0.0 0) (1.0 0 3.0 0) (2.0 0 2.0 0) (1.0 0 3.0 0) (0.0 0 +0.0 0) (2.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) +(1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 3 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (35.0 0 34.0 0) (0.0 0 0.0 0) (6.0 0 5.0 0) (5.0 0 +4.0 0) (6.0 0 5.0 0) (0.0 0 0.0 0) (5.0 0 4.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 2 0.0 0) (3.0 0 3.0 0)) (2.0 1.0 1.0 0.0 0.0 5.0 0.0)) (ROBERT KERNS) +|Robert| 185 0 1 7 NIL NIL 1.02740864 8.6482654 8.0 0.0274086446 +2.52740866 NIL 10 0 (NIL B NIL) T NIL (0)) ((((2.0 59 1.0 0) +(169.0 0 34.0 0) (0.0 0 0.0 0) (3.0 22 2.0 0) (2.0 0 2.0 0) +(5.0 22 2.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (2.0 0 2.0 0) (1.0 55 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 +0.0 0) (0.0 0 0.0 0)) ((1.0 59 1.0 0) (153.0 0 34.0 0) (0.0 0 +0.0 0) (0.53058654 103 3.0 0) (0.36058645 102 3.0 0) (0.53058654 103 +3.0 0) (0.0 0 0.0 0) (1.0 0 3.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(1.0 0 2.0 0) (1.0 101 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (155.0 0 34.0 0) (0.0 0 0.0 0) +(1.0 0 6.0 0) (8.0 0 4.0 0) (1.0 0 6.0 0) (0.0 0 0.0 0) (8.0 0 +10.0 0) (3.0 30 6.0 9) (0.0 0 0.0 0) (2.0 30 2.0 26) (2.0 81 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 81 0.0 0) +(0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 0.0 0) (0.0 101 4.0 0)) (9.0 +3.0 3.0 1.0 0.0 6.0 0.0)) (BOB KERNS) |Bob| 173 5 17 204 T T +0.69058645 7.8594385 15.0 -0.30941355 41.530587 NIL 119 81 (22 60 30) T NIL +(0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1)) ((((2.5623142 40 +1.0 0) (163.0 0 34.0 0) (0.0 0 0.0 0) (21.5623143 19 1.0 0) +(20.0 0 2.0 0) (21.5623143 19 1.0 0) (0.0 0 0.0 0) (18.0 0 2.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (15.5623143 29 1.0 0) +(4.5623142 71 0.0 0) (7.5623142 35 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) +((2.5623142 40 1.0 0) (134.0 0 34.0 0) (0.0 0 0.0 0) (10.5623143 20 +1.0 0) (4.0 0 2.0 0) (10.5623143 20 1.0 0) (0.0 0 0.0 0) (20.0 0 +2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (17.5623143 29 +1.0 0) (1.5623142 71 0.0 0) (2.5623142 35 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (141.0 0 34.0 0) (0.0 0 0.0 0) (21.0 0 +6.0 0) (17.0 0 4.0 0) (21.0 0 6.0 0) (0.0 0 0.0 0) (17.0 0 5.0 0) +(11.0 13 1.0 9) (0.0 0 0.0 0) (1.0 0 0.0 0) (8.0 17 0.0 0) (0.0 0 +0.0 0) (2.0 87 0.0 0) (0.0 0 0.0 0) (10.0 17 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0) (0.0 3 0.0 0) (8.0 0 4.0 0)) (15.0 17.0 11.0 1.0 +0.0 7.0 0.0)) (MARK STILES) |Mark| 156 10 6 199 NIL T 1.0623142 +8.3641003 5.0 0.062314197 55.5623145 NIL 121 87 (13 A A) NIL NIL (1 0 1 1 1 0 +1 1 1 0 0 1 0 0 1 1)) ((((0.0 0 0.0 0) (22.0 0 11.0 0) (0.0 0 +0.0 0) (1.55659358 7 1.0 0) (0.0 0 0.0 0) (1.55659358 7 1.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (22.0 0 11.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (22.0 0 11.0 0) +(0.0 0 0.0 0) (1.55659358 11 1.0 0) (0.0 0 0.0 0) (1.55659358 11 +1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(1.0 0 1.0 0)) (4.0 0.0 0.0 0.0 1.0 0.0 0.0)) (DAVE ANDERSON) |Dave| 155 1 0 +25 NIL T 1.05659358 8.4093853 5.0 0.056593582 4.5565936 NIL 18 11 (A NIL A) +T NIL (1)) ((((7.5338274 41 0.0 0) (107.0 0 11.0 0) (0.0 0 0.0 0) +(31.5338275 5 1.0 0) (12.5338274 37 0.0 0) (31.5338275 5 1.0 0) +(0.0 0 0.0 0) (10.5338274 37 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(5.5338274 66 0.0 0) (6.5338274 37 0.0 0) (0.0 0 0.0 0) (1.53382736 78 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0)) ((2.53382736 41 0.0 0) (86.0 0 11.0 0) +(0.0 0 0.0 0) (12.5338274 12 1.0 0) (3.53382736 37 0.0 0) (12.5338274 12 +1.0 0) (0.0 0 0.0 0) (12.5338274 37 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (6.5338274 66 0.0 0) (7.5338274 37 0.0 0) (0.0 0 0.0 0) +(1.53382736 78 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) +(0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (83.0 0 +11.0 0) (0.0 0 0.0 0) (4.5338274 12 1.0 0) (1.0 0 1.0 50) (4.5338274 12 +1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 50) (1.0 0 1.0 50) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(2.53382736 31 1.0 0)) (25.0 6.0 11.0 0.0 0.0 1.0 0.0)) (LARRY ALLEN) |Larry| +153 10 6 161 NIL T 1.03382736 8.5945709 6.0 0.033827364 40.533828 NIL 108 78 +(A A 50) T NIL (1 0 1 0 0 1 0 1 0 1 1 0 1 1 1 1)) ((((0.0 0 0.0 0) +(3.5702502 7 0.0 0) (0.0 0 0.0 0) (1.0 0 2.0 7) (0.0 0 0.0 0) +(1.0 0 2.0 7) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 2 +0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (3.5702502 7 0.0 0) (0.0 0 +0.0 0) (1.0 0 1.0 15) (0.0 0 0.0 0) (1.0 0 1.0 15) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0)) ((0.0 0 +0.0 0) (3.5702502 7 0.0 0) (0.0 0 0.0 0) (1.0 0 2.0 9) (0.0 0 +0.0 0) (1.0 0 2.0 9) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (1.0 0 2.0 9)) (1.0 0.0 0.0 0.0 0.0 0.0 0.0)) (DAN TAPPAN) +|Dan| 170 1 2 15 NIL NIL 1.07025018 8.30208 5.0 0.070250183 4.5702502 NIL 20 +7 (7 15 9) T NIL (1 0 0)) ((((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) (0.0 0.0 0.0 +0.0 0.0 0.0 0.0)) (RICK MILLER) |Rick| 164 0 0 0 NIL NIL 1.0850702 +8.188689 6.0 0.085070205 0.58507021 NIL 4 0 (NIL NIL NIL) T NIL NIL) +((((0.0 0 0.0 0) (3.5807073 5 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (3.5807073 5 +0.0 0) (0.0 0 0.0 0) (1.58070727 5 0.0 0) (0.0 0 0.0 0) (1.58070727 5 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (3.5807073 5 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) (1.0 0.0 0.0 +0.0 0.0 0.0 0.0)) (ROB FRYE) |Rob| 158 1 1 14 NIL T 1.08070727 +8.2217478 6.0 0.080707266 3.5807073 NIL 16 5 (A A A) T NIL (0 1)) +((((1.0 0 1.0 0) (108.0 0 34.0 0) (0.0 0 0.0 0) (6.5305865 7 +1.0 0) (5.0 0 2.0 0) (6.5305865 7 1.0 0) (0.0 0 0.0 0) (4.0 0 +2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (2.5305865 9 +1.0 0) (0.0 0 0.0 0) (1.53058647 34 1.0 18) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) +((1.0 0 1.0 0) (72.0 0 34.0 0) (0.0 0 0.0 0) (3.5305865 7 1.0 0) +(3.0 0 2.0 0) (3.5305865 7 1.0 0) (0.0 0 0.0 0) (5.0 0 2.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (3.5305865 9 1.0 0) +(0.0 0 0.0 0) (1.53058647 34 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) ((0.0 0 +0.0 0) (75.0 0 34.0 0) (3.0 24 1.0 24) (10.0 0 5.0 0) (8.0 0 +4.0 0) (10.0 0 5.0 0) (0.0 0 0.0 0) (8.0 0 6.0 0) (5.0 12 2.0 8) +(0.0 0 0.0 0) (2.0 32 1.0 24) (4.0 25 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (4.0 25 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 2 0.0 0) (4.0 0 3.0 0)) (7.0 3.0 2.0 0.0 0.0 4.0 0.0)) (DAVE RED) |Dave| +156 4 0 71 NIL NIL 1.03058647 8.6215984 6.0 0.030586466 18.5305865 NIL 43 34 +(18 A 12) T NIL (1 1 1 1)) ((((0.0 0 0.0 0) (11.0 0 11.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (11.0 0 11.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (11.0 0 11.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0)) +(2.0 0.0 0.0 0.0 0.0 0.0 0.0)) (AL WEGER) A/l 310 0 0 0 NIL NIL +1.28187819 6.9314718 6.0 0.28187819 1.78187819 NIL 4 0 (NIL NIL NIL) T NIL +NIL) ((((1.0 0 1.0 0) (35.0 0 34.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) ((1.0 0 1.0 0) (35.0 0 34.0 0) +(0.0 0 0.0 0) (1.0 0 3.0 0) (2.0 0 2.0 0) (1.0 0 3.0 0) (0.0 0 +0.0 0) (2.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) +(1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 3 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (35.0 0 34.0 0) (0.0 0 0.0 0) (4.0 0 6.0 0) (4.0 0 +4.0 0) (4.0 0 6.0 0) (0.0 0 0.0 0) (4.0 0 4.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 3 0.0 0) (2.0 0 4.0 0)) (2.0 1.0 1.0 0.0 0.0 4.0 0.0)) (STEPHEN WRIGHT) +|Stephen| 299 1 0 8 NIL NIL 1.11373001 7.97796816 6.0 0.113730013 +2.61373 NIL 9 0 (NIL B B) T NIL (1)) ((((0.0 0 0.0 0) (41.0 0 +11.0 0) (0.0 0 0.0 0) (1.11711437 6 4.0 0) (1.84 0 0.0 0) (0.84 6 +4.0 0) (0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (38.0 0 11.0 0) (0.0 0 0.0 0) +(3.0 0 1.0 0) (2.84 0 0.0 0) (3.0 0 1.0 0) (0.0 0 0.0 0) (2.84 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.84 0 0.0 0) (0.84 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) +(36.0 0 11.0 0) (0.0 0 0.0 0) (2.0 0 1.0 0) (0.84 0 0.0 0) (2.0 0 +1.0 0) (0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(1.0 0 1.0 0)) (5.0 1.0 0.0 1.0 0.0 1.0 0.0)) (SAM LEWIS) |Sam| 241 1 0 13 +NIL NIL 1.61711437 5.4945418 7.0 0.617114365 4.11711437 NIL 12 0 (B NIL NIL) +T NIL (1)) ((((0.0 0 0.0 0) (13.0 0 11.0 0) (0.0 0 0.0 0) (1.0 0 +1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (13.0 0 +11.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (13.0 0 11.0 0) (1.0 0 1.0 9) (1.0 0 1.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 9) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0)) (2.0 0.0 0.0 0.0 1.0 0.0 +0.0)) (ROBERT ABRAMSON) |Robert| 227 1 0 7 NIL NIL 1.15710546 +7.67890465 6.0 0.15710546 3.65710548 NIL 11 0 (NIL NIL B) T NIL (1)) +((((0.0 0 0.0 0) (2.4922531 7 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (2.4922531 7 +0.0 0) (0.0 0 0.0 0) (1.4922531 7 0.0 0) (0.0 0 0.0 0) (1.4922531 7 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (2.4922531 7 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) (1.0 0.0 0.0 +0.0 0.0 0.0 0.0)) (DAVID SPEAR) |David| 176 1 0 7 NIL T 0.99225309 +8.9546736 6.0 -7.74691254E-3 1.4922531 NIL 10 7 (A A A) T NIL (1)) +((((6.0 709 0.0 0) (922.88124 6 0.0 0) (0.0 0 0.0 0) (89.88124 6 +1.0 720) (37.63674 290 0.0 0) (89.88124 6 1.0 720) (0.0 0 0.0 0) +(19.636739 290 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.91229226 795 +1.0 795) (31.6367395 290 1.0 660) (1.0 0 0.0 0) (18.6367393 364 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(0.0 3 0.0 0) (0.0 0 0.0 0)) ((1.0 720 0.0 0) (495.88123 6 0.0 0) +(0.0 0 0.0 0) (88.30895 119 0.0 -1) (37.549032 337 0.0 0) (88.30895 119 +0.0 -1) (0.0 0 0.0 0) (37.549032 337 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (1.91229226 720 0.0 0) (32.549032 337 0.0 0) (0.0 0 0.0 0) +(7.6367392 364 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) +(0.0 2 0.0 0) (0.0 3 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (553.88123 6 +0.0 0) (17.308948 247 0.0 0) (110.30894 69 3.3089479 623) (106.30894 75 +0.0 0) (110.30894 69 3.3089479 623) (8.308948 254 0.0 0) (106.30894 75 +0.0 0) (68.30895 112 0.0 0) (0.0 -1 0.0 0) (3.0 753 0.0 0) (53.3089485 88 +0.0 0) (0.0 0 0.0 0) (10.308948 254 0.0 0) (0.0 0 0.0 0) (70.30895 88 +1.0 796) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 0.0 0) (29.308948 225 +4.3089479 23)) (84.30895 35.63674 13.308948 1.11411278 0.0 32.3089485 +0.114112772)) (BRADFORD MILLER) |Bradford| 164 85 48 1179 NIL T +1.41229226 6.3116903 -4.0 0.41229226 278.0 NIL 841 753 (408 119 443) T 12 (1 +1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0)) ((((0.0 0 0.0 0) +(437.78307 5 0.0 0) (0.0 0 0.0 0) (27.7830713 30 0.0 0) (1.0 0 +1.0 0) (27.7830713 30 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (235.78307 5 +0.0 0) (0.0 0 0.0 0) (33.7830715 5 0.0 0) (1.0 0 0.0 0) (33.7830715 5 +0.0 0) (0.0 0 0.0 0) (1.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (1.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (235.78307 5 0.0 0) (0.0 0 0.0 0) +(8.7830713 9 0.0 0) (3.78307113 174 0.0 0) (8.7830713 9 0.0 0) +(0.0 0 0.0 0) (3.78307113 174 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(2.78307113 133 0.0 0)) (26.0 1.0 3.0 0.0 0.0 2.0 0.0)) (SYNDI 2PHASE) +|Syndi| 0 4 17 412 NIL T 2.28307113 3.8918203 14.0 1.28307113 +55.0 NIL 207 174 (A A 176) T NIL (0)) ((((2.78307113 77 0.0 0) +(130.78307 5 0.0 0) (0.0 0 0.0 0) (21.7830713 14 0.0 0) (8.7830713 70 +0.0 0) (21.7830713 14 0.0 0) (0.0 0 0.0 0) (3.78307113 70 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (3.78307113 77 0.0 0) (6.7830712 70 +0.0 0) (1.0 0 0.0 0) (4.7830712 97 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +((2.78307113 77 0.0 0) (92.78307 5 0.0 0) (0.0 0 0.0 0) (24.7830713 5 +0.0 0) (8.7830713 70 0.0 0) (24.7830713 5 0.0 0) (0.0 0 0.0 0) +(8.7830713 70 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (3.78307113 77 +0.0 0) (6.7830712 70 0.0 0) (1.0 0 1.0 0) (4.7830712 97 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (95.78307 5 0.0 0) (4.7830712 106 +0.0 0) (21.7830713 10 0.0 0) (15.7830713 38 0.0 0) (21.7830713 10 +0.0 0) (4.7830712 106 0.0 0) (15.7830713 38 0.0 0) (8.7830713 45 +0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (8.7830713 45 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (8.7830713 45 0.0 0) (0.0 2 +0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (8.7830713 35 0.0 0)) (17.0 +5.0 3.0 0.0 0.0 7.0 0.0)) (SYNDI 3PHASE) |Syndi| 0 17 9 177 NIL T +2.28307113 3.8918203 13.0 1.28307113 37.0 NIL 153 138 (82 149 A) T NIL (0)) +((((0.0 0 0.0 0) (79.0 0 79.0 0) (0.0 0 0.0 0) (7.0 0 7.0 0) +(3.0 0 3.0 0) (7.0 0 7.0 0) (0.0 0 0.0 0) (3.0 0 3.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (3.0 0 3.0 0) (1.0 0 1.0 0) +(1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) ((1.0 0 1.0 0) (79.0 0 79.0 0) +(0.0 0 0.0 0) (7.0 0 7.0 0) (3.0 0 3.0 0) (7.0 0 7.0 0) (0.0 0 +0.0 0) (3.0 0 3.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(3.0 0 3.0 0) (1.0 0 1.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (79.0 0 79.0 0) (0.0 0 0.0 0) (10.0 0 10.0 0) +(8.0 0 8.0 0) (10.0 0 10.0 0) (0.0 0 0.0 0) (8.0 0 8.0 0) (2.0 0 +2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (3.0 0 3.0 0)) (11.0 3.0 1.0 0.0 1.0 6.0 +1.0)) EXPERT NIL 0 0 0 0 NIL NIL 0.34 5000.0 4.0 0.0 1.0 T 1 1 (NIL NIL +NIL)) ((((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0)) (0.0 0.0 0.0 0.0 0.0 0.0 0.0)) SUPER NIL 0 0 0 0 +NIL NIL 0.34 5000.0 2.0 0.0 1.0 T 1 1 (NIL NIL NIL)) ((((5.7830713 0 +0.0 0) (352.78307 0 0.0 0) (0.0 0 0.0 0) (57.7830715 0 5.0 233) +(3.7830713 0 0.0 0) (57.7830715 0 5.0 233) (0.0 0 0.0 0) (1.78307128 427 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.7830712 427 1.0 0) (5.7830713 0 +8.0 265) (1.61307114 424 1.0 0) (1.78307113 423 5.0 229) (1.61307114 423 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 0.0 0) +(0.0 0 0.0 0)) ((2.78307113 0 0.0 0) (350.78307 0 0.0 0) (0.0 0 +0.0 0) (70.78307 0 0.0 0) (23.7830713 0 0.0 0) (70.78307 0 0.0 0) +(0.0 0 0.0 0) (23.7830713 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(2.7830712 264 0.0 0) (24.7830713 0 0.0 0) (2.78307113 0 0.0 0) +(2.78307113 0 0.0 0) (2.78307113 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) +(361.78307 0 0.0 0) (0.0 0 0.0 0) (51.7830715 0 0.0 0) (30.7830715 0 +0.0 0) (51.7830715 0 0.0 0) (7.7830712 0 0.0 0) (30.7830715 0 +0.0 0) (3.78307113 378 0.0 0) (0.0 0 0.0 0) (1.78307113 184 0.0 0) +(1.7830713 431 0.0 0) (1.0 0 0.0 0) (6.7830712 0 0.0 0) (0.0 0 +0.0 0) (6.7830713 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (30.7830715 0 0.0 0)) (65.0 28.0 11.0 1.0 0.0 21.0 0.0)) (SYNDI +BACK1) |Syndi| 0 24 22 723 NIL T 2.11307114 2.8973233 8.0 1.11307114 +154.0 NIL 435 398 (257 NIL 359)) ((((17.0 149 1.0 109) (829.0 3 +1.0 3) (0.0 0 0.0 0) (212.0 12 0.0 0) (90.0 73 1.0 59) (212.0 12 +0.0 0) (0.0 0 0.0 0) (58.0 73 2.0 59) (0.0 0 0.0 0) (0.0 0 0.0 0) +(23.0 163 1.0 109) (67.0 73 1.0 59) (1.0 0 0.0 0) (17.0 150 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 1 +0.0 0) (0.0 0 0.0 0)) ((7.0 149 0.0 0) (708.0 3 1.0 3) (0.0 0 +0.0 0) (214.0 12 1.0 9) (91.0 73 0.0 0) (214.0 12 1.0 9) (0.0 0 +0.0 0) (91.0 73 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (23.0 163 +0.0 0) (68.0 73 0.0 0) (0.0 0 0.0 0) (7.0 150 1.0 136) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (762.0 3 1.0 3) (13.0 134 1.0 134) +(149.0 15 2.0 4) (118.0 91 1.0 36) (149.0 15 2.0 4) (7.0 319 +0.0 0) (118.0 91 6.0 36) (86.0 99 6.0 36) (0.0 0 0.0 0) (13.0 227 +3.0 215) (76.0 110 4.0 295) (0.0 0 0.0 0) (5.0 290 0.0 0) (0.0 0 +0.0 0) (81.0 110 1.0 686) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 1 +0.0 0) (42.0 33 2.0 4)) (168.0 49.0 52.0 5.0 0.0 33.0 1.0)) (SYNDI LEARN) +|Syndi| 0 91 42 1557 NIL T 1.17 5.0 -16.0 0.17 343.84 0.0 1083 319 (3 3 3) T +NIL (1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 +1 0 0 0 1 1 1 0 0 0 1 1 1 1 0 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0 +1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 1 0 0 +1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0)) ((((1.0 0 1.0 0) (34.0 0 +34.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (2.0 0 2.0 0) (1.0 0 1.0 0) +(0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 +2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0)) ((1.0 0 1.0 0) (34.0 0 34.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (34.0 0 34.0 0) +(0.0 0 0.0 0) (5.0 0 5.0 0) (4.0 0 4.0 0) (5.0 0 5.0 0) (0.0 0 +0.0 0) (4.0 0 4.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (3.0 0 3.0 0)) +(2.0 1.0 1.0 0.0 0.0 4.0 0.0)) ADVANCED NIL 0 0 0 0 NIL NIL 0.34 +5000.0 4.0 0.0 1.0 T 1 1 (NIL NIL NIL)) ((((0.0 0 0.0 0) (35.0 0 +11.0 0) (0.0 0 0.0 0) (1.84 0 2.0 0) (1.84 0 0.0 0) (1.84 0 2.0 0) +(0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (33.0 0 11.0 0) (0.0 0 0.0 0) (3.0 0 1.0 0) +(2.84 0 0.0 0) (3.0 0 1.0 0) (0.0 0 0.0 0) (2.84 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (1.84 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (31.0 0 11.0 0) +(0.0 0 0.0 0) (2.0 0 1.0 0) (0.84 0 0.0 0) (2.0 0 1.0 0) (0.0 0 +0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0)) +(4.0 1.0 0.0 1.0 0.0 1.0 0.0)) MODERATE NIL 0 0 0 0 NIL NIL 0.34 +5000.0 4.0 0.0 1.0 T 1 1 (NIL NIL NIL)) ((((0.0 0 0.0 0) (11.0 0 +11.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (11.0 0 11.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (11.0 0 11.0 0) +(0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0)) +(2.0 0.0 0.0 0.0 0.0 0.0 0.0)) AMATEUR NIL 0 0 0 0 NIL NIL 0.34 +5000.0 4.0 0.0 1.0 T 1 1 (NIL NIL NIL)) ((((0.0 0 0.0 0) (0.84 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.84 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +(0.0 0.0 0.0 0.0 0.0 0.0 0.0)) NOVICE NIL 0 0 0 0 NIL NIL 0.34 +5000.0 4.0 0.0 0.0 NIL 0 0 (NIL NIL NIL)) ((((0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +(0.0 0.0 0.0 0.0 0.0 0.0 0.0)) BEGINNER NIL 0 0 0 0 NIL NIL 0.34 +5000.0 4.0 0.0 0.0 NIL 1 1 (NIL NIL NIL)) ((((6.7830712 137 0.0 0) +(386.78307 5 0.0 0) (0.0 0 0.0 0) (79.78307 10 0.0 0) (27.7830713 88 +0.0 0) (79.78307 10 0.0 0) (0.0 0 0.0 0) (22.7830713 88 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (8.7830713 190 0.0 0) (18.7830713 88 +0.0 0) (3.78307113 93 0.0 0) (5.7830712 88 0.0 0) (2.78307113 290 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0)) ((2.78307113 137 0.0 0) (278.78307 5 0.0 0) (0.0 0 +0.0 0) (80.78307 5 0.0 0) (27.7830713 88 0.0 0) (80.78307 5 0.0 0) +(0.0 0 0.0 0) (27.7830713 88 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(8.7830713 190 0.0 0) (18.7830713 88 0.0 0) (2.78307113 93 0.0 0) +(3.78307113 88 0.0 0) (2.78307113 290 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) +(305.78307 5 0.0 0) (4.7830712 178 0.0 0) (100.78307 8 0.0 0) +(62.7830715 21 0.0 0) (100.78307 8 0.0 0) (9.7830712 22 0.0 0) +(62.7830715 21 0.0 0) (31.7830713 31 0.0 0) (0.0 0 0.0 0) (4.7830712 31 +0.0 0) (24.7830713 22 0.0 0) (0.0 0 0.0 0) (7.7830712 172 0.0 0) +(0.0 0 0.0 0) (25.7830713 22 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0) (29.7830713 11 0.0 0)) (84.0 22.0 12.0 0.0 0.0 +30.0 0.0)) (SYNDI SUPER2) |Syndi| 0 26 12 587 NIL T 2.28307113 +3.8918203 6.0 1.28307113 144.0 NIL 372 324 (A A A) T NIL (0)) +((((8.7830713 137 0.0 0) (437.78307 5 0.0 0) (0.0 0 0.0 0) (93.78307 10 +1.0 67) (27.7830713 88 0.0 0) (93.78307 10 1.0 67) (0.0 0 0.0 0) +(22.7830713 88 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (8.7830713 190 +0.0 0) (18.7830713 88 0.0 0) (2.78307113 93 0.0 0) (6.7830712 88 +0.0 0) (1.34 72 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(0.0 1 0.0 0) (0.0 0 0.0 0)) ((2.78307113 137 0.0 0) (328.78307 5 +0.0 0) (0.0 0 0.0 0) (95.78307 5 0.0 0) (28.7830713 88 0.0 0) +(95.78307 5 0.0 0) (0.0 0 0.0 0) (28.7830713 88 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (7.7830713 190 0.0 0) (20.7830713 88 0.0 0) +(2.78307113 93 0.0 0) (3.78307113 88 0.0 0) (2.78307113 290 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (359.78307 5 0.0 0) (4.7830712 178 0.0 0) +(112.78307 8 0.0 0) (65.78307 21 0.0 0) (112.78307 8 0.0 0) +(9.7830712 22 0.0 0) (65.78307 21 0.0 0) (34.7830715 31 0.0 0) +(0.0 0 0.0 0) (4.7830712 31 0.0 0) (24.7830713 22 0.0 0) (0.0 0 +0.0 0) (9.7830713 172 1.0 72) (0.0 0 0.0 0) (26.7830713 22 0.0 0) +(0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (34.7830715 11 0.0 0)) +(98.0 24.0 16.0 0.0 0.0 30.0 0.0)) (SYNDI BACK3) |Syndi| 0 6 1 121 NIL T +1.84 5.0 0.0 0.84 40.34 0.0 75 0 (B NIL B) T NIL (0 1 1 1 1 1 1)) +((((3.0 15 1.0 0) (136.0 0 34.0 0) (0.0 0 0.0 0) (19.663026 8 +2.0 0) (5.0 0 3.0 0) (23.663026 8 2.0 0) (0.0 0 0.0 0) (3.0 113 +3.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 3.0 0) (4.0 113 1.0 0) +(0.0 0 0.0 0) (1.0 130 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 2 0.0 0) (0.0 3 0.0 0) (0.0 0 0.0 0)) ((2.0 15 1.0 0) +(132.0 0 34.0 0) (0.0 0 0.0 0) (14.0 7 2.0 0) (5.0 0 2.0 0) +(14.0 7 2.0 0) (0.0 0 0.0 0) (8.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (3.0 0 3.0 0) (6.0 13 1.0 0) (0.0 0 0.0 0) (1.0 130 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 +0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (136.0 0 34.0 0) (2.0 116 +0.0 0) (13.0 0 6.0 0) (11.0 0 4.0 0) (13.0 0 6.0 0) (1.0 113 +0.0 0) (11.0 0 6.0 0) (8.0 24 2.0 10) (0.0 0 0.0 0) (1.0 113 +0.0 0) (7.0 24 1.0 19) (0.0 0 0.0 0) (1.0 113 1.0 0) (0.0 0 0.0 0) +(8.0 42 3.0 48) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (4.0 113 +4.0 0)) (24.0 6.0 6.0 0.0 1.0 4.0 1.0)) (THADDEUS BEIER) |Thaddeus| 172 12 11 +234 NIL T 0.9930258 7.6398154 -6.0 -6.9742054E-3 56.663026 NIL 160 130 (37 7 +24) T NIL (0 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 1)) +((((0.84 0 0.0 0) (120.0 0 79.0 0) (0.0 0 0.0 0) (3.0 0 11.0 0) +(3.0 0 3.0 0) (3.0 0 11.0 0) (0.0 0 0.0 0) (3.0 0 3.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 0) (3.0 0 3.0 0) (1.0 0 1.0 0) +(1.0 0 1.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 +0.0 0) (0.0 3 0.0 0) (0.0 0 0.0 0)) ((1.0 0 1.0 0) (112.0 0 79.0 0) +(0.0 0 0.0 0) (0.34 128 16.0 0) (2.0 0 3.0 0) (0.0 128 16.0 0) +(0.0 0 0.0 0) (2.0 0 3.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 +1.0 0) (2.0 0 3.0 0) (1.0 0 1.0 0) (0.0 67 1.0 0) (0.34 67 1.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 3 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (113.0 0 79.0 0) (0.0 0 0.0 0) (0.34 13 +24.0 0) (3.0 0 3.0 0) (0.34 13 24.0 0) (0.0 0 0.0 0) (3.0 0 3.0 0) +(2.0 0 2.0 0) (1.0 0 0.0 0) (0.0 0 0.0 0) (0.0 80 2.0 0) (0.0 80 +1.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 80 2.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 13 17.0 0)) (11.0 3.0 2.0 0.0 +1.0 6.0 1.0)) (SYNDI BACK2) |Syndi| 0 16 15 104 NIL T 0.84 5.0 +-4.5 0.0 1.34 5.5 178 168 (B B B) T NIL (0)) ((((2.0 67 1.0 0) +(131.0 0 34.0 0) (0.0 0 0.0 0) (17.5850704 9 2.0 0) (6.0 0 2.0 0) +(17.5850704 9 2.0 0) (0.0 0 0.0 0) (5.0 0 2.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (2.0 0 2.0 0) (4.0 64 1.0 0) (1.0 0 0.0 0) (1.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(0.0 3 0.0 0) (0.0 0 0.0 0)) ((5.0 67 1.0 0) (98.0 0 34.0 0) +(0.0 0 0.0 0) (11.5850703 13 1.0 0) (3.0 0 2.0 0) (11.5850703 13 +1.0 0) (0.0 0 0.0 0) (6.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(2.0 0 2.0 0) (5.0 64 1.0 0) (1.0 0 1.0 107) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(0.0 0 0.0 0)) ((0.0 0 0.0 0) (107.0 0 34.0 0) (2.5850702 18 +0.0 0) (15.0 0 5.0 0) (15.0 0 4.0 0) (15.0 0 5.0 0) (0.0 0 0.0 0) +(15.0 0 4.0 0) (10.5850703 17 0.0 0) (0.0 0 0.0 0) (1.0 0 0.0 0) +(8.5850703 17 0.0 0) (0.0 0 0.0 0) (2.0 120 0.0 0) (0.0 0 0.0 0) +(10.5850703 17 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) +(7.0 0 3.0 0)) (21.0 4.0 3.0 0.0 0.0 5.0 1.0)) (DAN DOAN) |Dan| 150 10 10 177 +NIL T 1.0850702 8.188689 3.0 0.085070204 41.585071 NIL 128 120 (25 107 25) T +NIL (0 1 1 0 0 1 1 0 1 0 1)) ((((1.62004 22 1.0 0) (65.0 0 34.0 0) +(0.0 0 0.0 0) (7.62004 11 2.0 0) (2.0 0 2.0 0) (7.62004 11 2.0 0) +(0.0 0 0.0 0) (2.0 0 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 +2.0 0) (1.0 0 1.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 3 0.0 0) (0.0 0 +0.0 0)) ((2.62004 22 1.0 0) (61.0 0 34.0 0) (0.0 0 0.0 0) (5.62004 13 +1.0 0) (2.0 0 2.0 0) (5.62004 13 1.0 0) (0.0 0 0.0 0) (2.0 0 +2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (2.0 0 2.0 0) (1.0 0 1.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 +0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) +(66.0 0 34.0 0) (1.0 0 1.0 72) (15.0 0 6.0 0) (10.0 0 4.0 0) +(15.0 0 6.0 0) (1.62004 33 0.0 0) (10.0 0 5.0 0) (6.0 16 1.0 11) +(0.0 0 0.0 0) (1.62004 33 0.0 0) (3.62004 33 0.0 0) (0.0 0 0.0 0) +(1.0 0 0.0 0) (0.0 0 0.0 0) (4.62004 33 0.0 0) (0.0 2 0.0 0) +(0.0 1 0.0 0) (0.0 3 0.0 0) (9.0 0 4.0 0)) (11.0 2.0 4.0 1.0 +0.0 5.0 0.0)) (MIKE PATTON) |Mike| 152 5 4 86 NIL T 1.12004 7.9330224 +5.0 0.120040014 16.62004 NIL 74 33 (37 A 16) T NIL (1 1 0 1 0 1 0 0 1)) +((((0.0 0 0.0 0) (124.0 0 11.0 0) (0.0 0 0.0 0) (19.5850704 16 +2.0 0) (1.5850702 72 1.0 21) (19.5850704 16 2.0 0) (0.0 0 0.0 0) +(1.5850702 72 1.0 21) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(1.5850702 72 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (70.0 0 11.0 0) (0.0 0 0.0 0) (10.5850703 7 +1.0 0) (1.5850702 72 0.0 0) (10.5850703 7 1.0 0) (0.0 0 0.0 0) +(1.5850702 72 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(1.5850702 72 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (69.0 0 11.0 0) (0.0 0 0.0 0) (3.0 56 +2.0 0) (0.0 0 0.0 0) (3.0 56 2.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) +(0.0 1 0.0 0) (0.0 0 0.0 0) (1.0 0 2.0 0)) (21.0 1.0 1.0 0.0 +0.0 0.0 0.0)) (CHRIS HIBBERT) |Chris| 314 7 2 138 NIL T 1.0850702 +8.188689 6.0 0.085070204 31.5850704 NIL 91 72 (B A 21) T NIL (1 1 1 1 1 0 1 0 +1)) ((((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +((0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0)) (0.0 0.0 0.0 0.0 0.0 0.0 0.0)) (RON SPAINHOUR) +|Ron| 328 0 0 0 NIL NIL 1.14516084 7.75899965 6.0 0.145160839 +0.0 NIL 4 0 (NIL NIL NIL) T NIL NIL) ((((0.0 0 0.0 0) (0.84 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (0.84 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (0.84 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0)) +(0.0 0.0 0.0 0.0 0.0 0.0 0.0)) (KENT PITMAN) |Kent| 115 0 0 0 NIL NIL +1.06623666 8.3333305 6.0 0.06623666 1.56623666 NIL 4 0 (NIL NIL NIL) T NIL +NIL) ((((0.0 0 0.0 0) (8.6299207 5 0.0 0) (0.0 0 0.0 0) (1.0 0 +1.0 16) (0.0 0 0.0 0) (1.0 0 1.0 16) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 2 0.0 0) +(0.0 2 0.0 0) (0.0 1 0.0 0) (0.0 0 0.0 0)) ((0.0 0 0.0 0) (8.6299207 5 +0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 12) (0.0 0 0.0 0) (1.0 0 1.0 12) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 2 0.0 0) (0.0 0 0.0 0) (0.0 1 0.0 0) (0.0 0 +0.0 0)) ((0.0 0 0.0 0) (8.6299207 5 0.0 0) (0.0 0 0.0 0) (1.0 0 +2.0 18) (0.0 0 0.0 0) (1.0 0 2.0 18) (0.0 0 0.0 0) (0.0 0 0.0 0) +(0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (0.0 0 +0.0 0) (0.0 0 0.0 0) (0.0 0 0.0 0) (1.0 0 1.0 18) (0.0 2 0.0 0) +(0.0 0 0.0 0) (0.0 1 0.0 0) (1.0 0 2.0 18)) (1.0 0.0 0.0 0.0 +1.0 0.0 0.0)) (JOHN HENGEVELD) |John| 129 3 1 27 NIL T 1.12992072 +7.8636513 6.0 0.129920721 8.6299207 NIL 31 5 (16 12 18) T NIL (1 1 0 1))) \ No newline at end of file diff --git a/src/games/word.3 b/src/games/word.3 new file mode 100644 index 00000000..c279e466 --- /dev/null +++ b/src/games/word.3 @@ -0,0 +1,151 @@ +;;; -*- LISP -*- +;;; +;;; Library WRDLIB +;;; +;;; This file contains useful functions for manipulating atoms +;;; conceptually as text ('letters' and 'words') in MacLISP. +;;; +;;; Functions defined are: +;;; +;;; Ascii/Numeric Conversions +;;; +;;; CVTN - Convert to Numeric +;;; CVTA - Convert to Ascii +;;; +;;; Upper/Lower Case Conversions +;;; +;;; Name Input Output +;;; ---- ----- ------ +;;; CAPS Generic Same as input, Capitalized +;;; SMALLS Generic Same as input, Lowercasified +;;; CAPS-A2A Ascii Capitalized Ascii +;;; SMALLS-A2A Ascii Lowercasified Ascii +;;; CAPS-A2N Ascii Capitalized Numeric +;;; SMALLS-A2N Ascii Lowercasified Numeric +;;; CAPS-N2A Numeric Capitalized Ascii +;;; SMALLS-N2A Numeric Lowercasified Ascii +;;; CAPS-N2N Numeric Capitalized Numeric +;;; SMALLS-N2N Numeric Lowercasified Numeric +;;; +;;; Typing Predicates +;;; +;;; CONTROL? - Returns T if arg is control char +;;; ALPHABETIC? - Returns T if arg is an alphabetic char +;;; DIGIT? - Returns T if arg is a digital char +;;; +;;; Word Operations +;;; +;;; UPPERCASIFY - Convert a word to all upper case +;;; LOWERCASIFY - Convert a word to all lower case +;;; CAPITALIZE - Convert a word to all lower case except first char +;;; +;;; BUILD - Merge several atoms into a single atom +;;; + +;;;;;;;;;;;;;;;;;;;;;;;;; Numeric/Ascii Conversion ;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; CVTN: Convert to Numeric (from Ascii) + +(DEFUN CVTN (X) (GETCHARN X 1.)) + +;;; CVTA: Convert to Ascii (from Numeric) + +(DEFUN CVTA (X) (ASCII X)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Case Conversion ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Generic Functions + +(DEFUN SMALLS (X) + (COND ((NUMBERP X) (SMALLS-N2N X)) + (T (SMALLS-A2A X)))) + +(DEFUN CAPS (X) + (COND ((NUMBERP X) (CAPS-N2N X)) + (T (CAPS-A2A X)))) + +;;; Specialized Functions + +(DEFUN CAPS-A2A (X) (CVTA (CAPS-N2N (CVTN X)))) + +(DEFUN SMALLS-A2A (X) (CVTA (SMALLS-N2N (CVTN X)))) + +(DEFUN CAPS-A2N (X) (CAPS-N2N (CVTN X))) + +(DEFUN SMALLS-A2N (X) (SMALLS-N2N (CVTN X))) + +(DEFUN CAPS-N2A (X) (CVTA (CAPS-N2N X))) + +(DEFUN SMALLS-N2A (X) (CVTA (SMALLS-N2N X))) + +(DEFUN CAPS-N2N (X) + (COND ((AND (> X 96.) (< X 123.)) (- X 32.)) + (T X))) + +(DEFUN SMALLS-N2N (X) + (COND ((AND (> X 64.) (< X 91.)) (+ X 32.)) + (T X))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Character Type ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; CONTROL? +;;; Predicate returns T if arg represents a control-character. Accepts +;;; string or numeric arg. Control-chars are defined here as any char +;;; with an ascii value lower than a SPACE. + +(DEFUN CONTROL? (C) + (COND ((NUMBERP C) (< C 32.)) + (T (CONTROL? (GETCHARN C 1.))))) + +;;; ALPHABETIC? +;;; Predicate returns T if arg represents an alpha character. Accepts +;;; string or numeric arg. + +(DEFUN ALPHABETIC? (C) + (COND ((NUMBERP C) + (OR + (AND (> C 64.) (< C 91.)) ; A <= C <= Z + (AND (> C 96.) (< C 123.)))) + (T (ALPHABETIC? (GETCHARN C 1.))))) + +;;; DIGIT? +;;; Predicate returns T if arg represents a digital character. Accepts +;;; string or numeric arg. + +(DEFUN DIGIT? (N) + (COND ((NUMBERP N) (AND (> N 47.) (< N 58.))) ; 0 <= N <= 9 + (T (DIGIT? (GETCHARN N 1.))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Commands ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; UPPERCASIFY +;;; Uppercasify a word. (put all letters in upper case) + +(DEFUN UPPERCASIFY (X) (IMPLODE (MAPCAR 'CAPS (EXPLODEC X)))) + +;;; LOWERCASIFY +;;; Lowercasify a word. (put all letters in lower case) + +(DEFUN LOWERCASIFY (X) (IMPLODE (MAPCAR 'SMALLS (EXPLODEC X)))) + +;;; CAPITALIZE +;;; Capitalize a word. (put first char in upper case, all others +;;; in lower case) + +(DEFUN CAPITALIZE (X) + ((LAMBDA (CHARS) + (IMPLODE (CONS (CAPS (CAR CHARS)) + (MAPCAR 'SMALLS (CDR CHARS))))) + (EXPLODEC X))) + +;;; BUILD +;;; Takes an arbitrary number of arguments. Returns an atom that has +;;; the same printname as all of the args pushed together. + +(DEFUN BUILD N (IMPLODE (APPLY 'APPEND (MAPCAR 'EXPLODEN (LISTIFY N))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Tag the library as having been loaded once successfully + +(PUTPROP 'WRDLIB T 'LOADED) diff --git a/src/games/words.50 b/src/games/words.50 new file mode 100644 index 00000000..f2635b9a --- /dev/null +++ b/src/games/words.50 @@ -0,0 +1,1463 @@ +;;; -*- LISP -*- +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;; ;;;;; +;;;;; THIS FILE CONTAINS A DICTIONARY OF WORDS ;;;;; +;;;;; FOR USE IN KMP'S NATURAL LANGUAGE HACKS. ;;;;; +;;;;; ;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(ALLOC '(LIST 130000.)) +(ALLOC '(SYMBOL 40000.)) + +;;; The following functions can be used to access the data +;;; defined in this file. Note that in most cases the same +;;; function names without a "?" on the end are used for +;;; defining the response that the ?'d verb should return +;;; in most cases. + +(DEFUN EXPLODED (X) + (OR (GET X 'EXPLODED) (PUTPROP X (EXPLODEC X) 'EXPLODED))) + +(DEFUN VERB-PLURAL? (X) + (OR (CAR (GET X 'VERB-FORMS)) X)) + +(DEFUN VERB-SING? (X) + (OR (CADR (GET X 'VERB-FORMS)) + (VERB-SING NIL X))) + +(DEFUN VERB-PAST? (X) + (OR (CADDR (GET X 'VERB-FORMS)) + (VERB-PAST NIL X))) + +(DEFUN VERB-PP? (X) + (OR (CADDDR (GET X 'VERB-FORMS)) + (VERB-PP NIL X))) + +(DEFUN VERB-PROG? (X) + (OR (CAR (CDDDDR (GET X 'VERB-FORMS))) + (VERB-PROG NIL X))) + +;;; These two functions are nice for drawing inferences about nouns +;;; since singular nouns have roughly the same formation rules as +;;; plural verbs and vice versa. + +(DEFUN NOUN-PLURAL? (X) (VERB-SING? X)) + +(DEFUN NOUN-SING? (X) (VERB-PLURAL? X)) + + +(DEFUN IS-A? (TYPE WORD) (AND (MEMQ TYPE (GET WORD 'PART-OF-SPEECH)) T)) + +(DEFUN PART-OF-SPEECH (WORD TYPE) + (COND ((NOT (IS-A? WORD TYPE)) + (PUTPROP WORD + (CONS TYPE (GET WORD 'PART-OF-SPEECH)) + 'PART-OF-SPEECH))) + TYPE) + +(DEFUN PART-OF-SPEECH? (X) (OR (GET X 'PART-OF-SPEECH) '*NOUN*)) + +;;; Letters + +(DEFUN VOWEL? (X) (MEMQ X '(A E I O U))) +(DEFUN CONSONANT? (X) (NOT (VOWEL? X))) + +;;; Names + +(DEFUN FEMALE-NAME? (X) (IS-A? 'FEMALE-NAME X)) +(DEFUN MALE-NAME? (X) (IS-A? 'MALE-NAME X)) +(DEFUN PERSON-NAME? (X) (OR (MALE-NAME? X) + (FEMALE-NAME? X) + (IS-A? 'PERSON-NAME X))) + +;;; Note: for compatibility, +;;; these should get updated for dictionary lookup + +(DEFUN FEMALE-PRONOUN? (X) (MEMQ X '(SHE HER))) +(DEFUN MALE-PRONOUN? (X) (MEMQ X '(HE HIM))) +(DEFUN PLURAL-PRONOUN? (X) (MEMQ X '(THEY THEM))) +(DEFUN 1ST-PERSON-PLURAL-PRONOUN? (X) (MEMQ X '(WE US))) +(DEFUN 3RD-PERSON-PLURAL-PRONOUN? (X) (MEMQ X '(THEY THEM))) + +;;; +;;; Software for inferring what 'he', 'she', etc. mean +;;; + +(DEFUN CLEAR-DEFAULT-NAMES () (SETPLIST 'DEFAULT-NAMES NIL)) + +(CLEAR-DEFAULT-NAMES) + +(DEFUN DEFAULT-NAME (TYPE) (GET 'DEFAULT-NAMES TYPE)) + +(DEFUN SET-DEFAULT-NAME (NAME TYPE) + (COND ((EQ TYPE 'PLURAL) + (PUTPROP 'DEFAULT-NAMES + ((LAMBDA (DEFAULT) + (COND ((MEMQ NAME DEFAULT) DEFAULT) + (T (APPEND DEFAULT (LIST NAME))))) + (GET 'DEFAULT-NAMES 'PLURAL)) + 'PLURAL)) + (T + (PUTPROP 'DEFAULT-NAMES NAME TYPE) + (SET-DEFAULT-NAME NAME 'PLURAL))) + NAME) + + + +(DEFUN DETERMINER? (WORD) (IS-A? 'DETERMINER WORD)) +(DEFUN ADJECTIVE? (WORD) + (OR (IS-A? 'ADJECTIVE WORD) + (POSSESSIVE? WORD))) +(DEFUN COMPARATIVE-ADJECTIVE? (WORD) (IS-A? 'COMPARATIVE-ADJECTIVE WORD)) +(DEFUN MODAL? (WORD) (IS-A? 'MODAL WORD)) +(DEFUN HELPING-VERB? (WORD) (IS-A? 'HELPING-VERB WORD)) +(DEFUN AUXILIARY-VERB? (WORD) (HELPING-VERB? WORD)) +(DEFUN VERB? (WORD) + (OR (IS-A? 'MODAL WORD) + (IS-A? 'HELPING-VERB WORD) + (IS-A? 'ACTION-VERB WORD))) +(DEFUN COMMON-NOUN? (WORD) (IS-A? 'COMMON-NOUN WORD)) +(DEFUN PREPOSITION? (WORD) (IS-A? 'PREPOSITION WORD)) +(DEFUN PRONOUN? (WORD) (IS-A? 'PRONOUN WORD)) +(DEFUN CONJUNCTION? (WORD) (IS-A? 'CONJUNCTION WORD)) +(DEFUN INTERJECTION? (WORD) (IS-A? 'INTERJECTION WORD)) +(DEFUN ADVERB? (WORD) (IS-A? 'ADVERB WORD)) +(DEFUN COMPARATOR? (WORD) (IS-A? 'COMPARATOR WORD)) +(DEFUN MODIFIER? (WORD) + (OR (ADVERB? WORD) (ADJECTIVE? WORD) (DETERMINER? WORD))) +(DEFUN MATCH? (WORD) (IS-A? 'MATCH WORD)) +(DEFUN NOUN? (WORD) + (OR (COMMON-NOUN? WORD) + (PRONOUN? WORD) + (PERSON-NAME? WORD) + (NULL (GET WORD 'PART-OF-SPEECH)))) + +;;; MATCHFIX? +;;; If the arg has a MATCHFIX property, returns it, else returns NIL. + +(DEFUN MATCHFIX? (X) (GET X 'MATCHFIX)) + +;;; MATCHDECLARE +;;; Assigns a set of possible matches to a matchfix operators. + +(DEFUN MATCHDECLARE (LEFT MATCHES) + (PUTPROP LEFT MATCHES 'MATCHFIX) + (DEFINE 'MATCH (NCONS LEFT)) + (DEFINE 'MATCH MATCHES)) + + +;;; DEFINE +;;; Defines a list of words to be a particular part of speech +;;; by pushing the type onto the front of its PART-OF-SPEECH +;;; property. + +(DEFUN DEFINE (PART WORD-LIST) + (MAPC + (FUNCTION (LAMBDA (WORD) (PART-OF-SPEECH WORD PART))) + WORD-LIST) + PART) + +;;; VERB-DEFINE +;;; Takes an arg of a single verb and its variations. If the +;;; variations are regular, they may be omitted. Certain common +;;; exception rules are also known. Puts a verb definition on +;;; a verb and its forms and properties pointing back to the main +;;; verb form. +;;; +;;; Syntax: (VERB-DEFINE ) +;;; +;;; :: ( +;;; +;;; +;;; +;;; ) +;;; +;;; Example: +;;; (VERB-DEFINE '(EAT EATS ATE EATEN EATING)) +;;; + +(DEFUN VERB-DEFINE (X) + (PROG () + (COND ((ATOM X) (BREAK BAD-ARG-TO-"VERB-DEFINE"))) + (COND ((GET (CAR X) 'VERB-FORMS) (RETURN T))) + (SETQ X + (DO ((V (CDR X) (CDR V)) + (V$ (CAR X)) + (I 1 (1+ I)) + (L (NCONS (CAR X))) + (A NIL NIL)) + ((> I 4.) (NREVERSE L)) + (SETQ A (CAR V)) + (COND ((= I 1.) (SETQ L (CONS (VERB-SING A V$) L))) + ((= I 2.) (SETQ L (CONS (VERB-PAST A V$) L))) + ((= I 3.) (SETQ L (CONS (VERB-PP A V$) L))) + ((= I 4.) (SETQ L (CONS (VERB-PROG A V$) L)))))) + (MAPCAR (FUNCTION (LAMBDA (A) + (PART-OF-SPEECH A 'ACTION-VERB) + (PUTPROP A X 'VERB-FORMS))) + X) + (RETURN (CAR X)))) + +;;; VERB-FORM +;;; For more convenience of syntax in defining large numbers of verb +;;; forms simultaneouly without quoting them. + +(DEFUN VERB-FORM FEXPR (VERBS) + (MAPC 'VERB-DEFINE VERBS) + '-*-VERB-FORMS-*-) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;; DICTIONARY/INFERENCING ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; VERB-SING +;;; Define the singular form of an infinitive verb X. If the first arg +;;; is non-null, it will be used. If the first arg is null, this routine +;;; will infer a probable singular form. +;;; +;;; The following rules are used: +;;; +;;; [1] If the word ends in +Y then change the Y +;;; to I and add ES. +;;; [2] If the word ends in <[C,S,T]>+H or X then add ES. +;;; [3] Else add an S. + +(DEFUN VERB-SING (A X) + (PROG (TEMP) + (COND (A (RETURN A))) + (SETQ TEMP (NREVERSE (EXPLODEC X))) + (COND ((AND (EQ (CAR TEMP) 'Y) + (NOT (VOWEL? (CADR TEMP)))) + (RETURN + (IMPLODE + (NREVERSE (CONS 'S (CONS 'E (CONS 'I (CDR TEMP)))))))) + ((OR (AND (EQ (CAR TEMP) 'H) (MEMQ (CADR TEMP) '(T S C))) + (EQ (CAR TEMP) 'X)) + (RETURN (IMPLODE (NREVERSE (CONS 'S (CONS 'E TEMP)))))) + (T (RETURN (IMPLODE (NREVERSE (CONS 'S TEMP)))))))) + +;;; VERB-PAST +;;; Return the past tense form of an infinitive verb X. If the first arg +;;; is non-null, it will be used. If the first arg is null, this routine +;;; will infer a probable past tense form. +;;; +;;; The following rules are used: +;;; +;;; [1] If the word ends in E, add a D. +;;; [2] If the word ends in +Y, change Y to I and add ED. +;;; [3] If the word ends in [W,X,Y], add ED. +;;; [4] If the word ends in some other consonant preceded by +;;; a single vowel, double final consonant and add ED. +;;; [4] Else add ED. + +(DEFUN VERB-PAST (A X) + (PROG (TEMP) + (COND (A (RETURN A))) + (SETQ TEMP (NREVERSE (EXPLODEC X))) + (COND ((EQ (CAR TEMP) 'E) + (RETURN + (IMPLODE + (NREVERSE (CONS 'D TEMP))))) + ((AND (EQ (CAR TEMP) 'Y) + (NOT (VOWEL? (CADR TEMP)))) + (RETURN + (IMPLODE + (NREVERSE (CONS 'D (CONS 'E (CONS 'I (CDR TEMP)))))))) + ((MEMQ (CAR TEMP) '(X Y W)) + (RETURN + (IMPLODE + (NREVERSE (CONS 'D (CONS 'E TEMP)))))) + ((AND (CONSONANT? (CAR TEMP)) + (VOWEL? (CADR TEMP)) + (CONSONANT? (CADDR TEMP))) + (RETURN + (IMPLODE + (NREVERSE (CONS 'D (CONS 'E (CONS (CAR TEMP) TEMP))))))) + (T (RETURN + (IMPLODE + (NREVERSE (CONS 'D (CONS 'E TEMP))))))))) + +;;; VERB-PP +;;; This function returns the past-participle for a verb. Currently it uses +;;; the same rules as the past tense inferencing function above. + +(DEFUN VERB-PP (A X) (VERB-PAST A X)) + + +;;; VERB-PROG +;;; Return the present progressive form of an infinitive verb X. +;;; If the first arg is non-null, it will be used. If the first +;;; arg is null, this routine will infer a probable past tense form. +;;; +;;; The following rules are used: +;;; +;;; [1] If the last letter is an E, drop it and add ING. +;;; [2] If the last letter is [W,X,Y] add an ING. +;;; [3] If the word ends in a consonant preceded by +;;; a single vowel, double the final consonant and +;;; add ING. +;;; [4] Else add ING. + +(DEFUN VERB-PROG (A X) + (PROG (TEMP) + (COND (A (RETURN A))) + (SETQ TEMP (NREVERSE (EXPLODEC X))) + (COND ((EQ (CAR TEMP) 'E) + (RETURN + (IMPLODE + (NREVERSE (CONS 'G (CONS 'N (CONS 'I (CDR TEMP)))))))) + ((MEMQ (CAR TEMP) '(W X Y)) + (RETURN + (IMPLODE + (NREVERSE + (CONS 'G (CONS 'N (CONS 'I TEMP))))))) + ((AND (CONSONANT? (CAR TEMP)) + (VOWEL? (CADR TEMP)) + (CONSONANT? (CADDR TEMP))) + (RETURN + (IMPLODE + (NREVERSE + (CONS 'G (CONS 'N (CONS 'I (CONS (CAR TEMP) TEMP)))))))) + (T (RETURN + (IMPLODE + (NREVERSE (CONS 'G (CONS 'N (CONS 'I TEMP)))))))))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Adjectives ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(DEFINE 'ADJECTIVE '(ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN + TWENTY THIRTY FORTY FIFTY HUNDRED THOUSAND MILLION + EACH EVERY ALL SOME + BIG SMALL TINY HUGE ENORMOUS LARGE + HEAVY DARK LIGHT COLORED SHINY DULL + RED ORANGE YELLOW GREEN BLUE INDIGO VIOLET PURPLE + BLACK BROWN GOLD SILVER WHITE GREY GRAY + STRIPED SPOTTED HORNED WINGED + SMOOTH ROUGH HARD SOFT + WET DRY OILY + LOUD QUIET STRONG WEAK + LINKED RELATED SIMILAR SIMILAR ASSOCIATED + GOOD TAME DOCILE DOMESTIC + ANGRY MAD SAD HAPPY PARANOID DEPRESSED + UPSET GLAD UNFORTUNATE FORTUNATE + HUNGRY + SMART STUPID DUMB + CRAZY STRANGE + FAST SLOW + OLD NEW + BAD EVIL MEAN CRUEL DANGEROUS + UGLY PRETTY BEAUTIFUL + REAL LIVE DEAD)) + +(DEFINE 'COMPARATIVE-ADJECTIVE + '(BETTER + BIGGER SMALLER TINIER LARGER + HEAVIER DARKER LIGHTER SHINIER DULLER + SMOOTHER ROUGHER HARDER SOFTER + WETTER DRIER OILIER + LOUDER QUIETER STRONGER WEAKER + TAMER ANGRIER MADDER SADDER HAPPIER + HUNGRIER SMARTER CRAZIER STRANGER + FASTER SLOWER OLDER NEWER + WORSE UGLIER PRETTIER)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Adverbs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(DEFINE 'ADVERB + '(NEVER HARDLY NOT + SLOWLY QUICKLY + SOMETIMES OFTEN SEVERAL + VERY NEARLY PRACTICALLY ALMOST ABOUT APPROXIMATELY + ALWAYS PRECISELY REALLY EXACTLY IDENTICALLY + MUCH GREATLY MORE MOST + LESS LEAST + ADDITIONALLY ALSO TOO)) + + +;;; Common Nouns +;;; Note: NOUNs are inferred by this scheme usually by the fact that they +;;; do not fall into another category. This list is provided for +;;; any exceptions to the rule that may be nouns or another part of +;;; speech simultaneously. + +(DEFINE 'COMMON-NOUN + '(ADDRESS ADVOCATE AID AIM ANSWER APPEAL + BALANCE BOX BREAK LOVE + CALL CAMPAIGN CHAIN CROWD + DELEGATE + ENGINEER + FAKE FIGURE FIRE FOIL FOOL FORCE FORM + GRADE GRANT + HELP + INTERVIEW + JAIL + LOCK + MATCH + NAME NET + OFFER + PACE PHOTOGRAPH PLAN PRESENT PROGRAM PROJECT PROTEST + QUERY QUESTION + REPORT REQUEST RULE + SCHEDULE SIP SLUMP SKATE STORE SURVEY SWARM + TEST TIE TRACE TRICK TURN)) + +;;; Names +;;; Used among other things for finding pronoun antecedents + +(DEFINE 'MALE-NAME + '(ADAM AL ALAN ALLAN ALDEN ALEX ALEXANDER + ALF ALFRED ALLEN ALVIN ANDREW + ANDY ANTHONY ARNOLD ARTHUR + BARRY BART BILL BOB BUD BOBBY BRAD + CARROLL CARL CHARLES CHARLIE CHONG CHRIS CHRISTOPHER CHUCK + CLARK CLEM CLEMENT CLINT CLINTON CRAIG CURT + DAN DANIEL DARRELL DARRYL DAVE DAVID + DENNIS DERYL DEVON + DICK + DONALD DON DONNY DOUG DOUGLAS + DUGALD + EDGAR ELIOT ELLIOT EMERY ERIC ERIK + FRANCIS FRANK FREDRICK FRED + GARY GEOFF GEOFFREY GEORGE GERALD GERARD GERROLD GREG GREGORY + GERHARD + HAROLD HARRY HAL HARVEY HANK HOWARD HOWIE + IRVING ISAAC IVAN + JACK JACOB JAMES + JEREMIAH JERRY JEFF JEFFREY JEFFRY + JIM JIMMY + JOE JOHN JOHNNY JON JONATHAN JOSE JOSEPH + JUAN JULIAN + KARIM KEN KENNY KENNEY KENNETH KENT KURT + LARRY LAUREN LAURENCE LAWRENCE + LEO LEON LEONARD LEONARDO LESLIE + MAN MANNY MANUEL MARC MARK MARTIN MARTY MARVIN MATT MATTHEW MAURICE + MICHAEL MIKE MORRIS MYRON + NED NORMAN NORM + ODED OSCAR + PATRICK PAUL PETER PETE PHILLIP PHILIP + RALPH RICHARD ROB ROBERT ROGER RON RONALD RUSS RUSSEL RUSSELL + SCOT SCOTT SETH STEPHEN STEVE STEWART STUART + TED TERRENCE TERRY THEO THEODORE THOMAS TOM TOMMY + WENG WILLIAM +;unames: + JPG LPH MRG STEVER KMP DUFFEY RWK HIC)) + +(DEFINE 'FEMALE-NAME + '(ALICE AMY ANNE ANNETTE ANN ARLENE + BARB BARBARA BARBRA BARBI BARBIE BETTY BERNICE + CANDACE CANDY CAROL CAROLA CAROLE CATHERINE CATHI CATHY + CHERYL CINDY CINDI CYNTHIA + DEBBIE DEBBY DENISE + DIANA DIANNA DIANE DIANNE DORIS DOLORES DONNA DOROTHY + ELAINE ELENA ELLEN EMELIA EUNICE EVA EVE EVELYN + FARRAH FRANCES FRANCESCA + GAIL GINGER GRACE + JANE JANICE JO JOAN JOSIE JOSEPHINE JUANA JUANITA JULIA + KAREN KARIN KARI KATY KATHERINA KATHERINE KATHI KATHY KATRINA KERI + LAUREN LAUREEN LESLIE LISA LORRAINE LYNN LYNNE + MARGARET MARILYN MARILYNN MARLENA MARLENE MARY MARSHA + MEG MELISSA MICHELLE + NANCY NORA + PATRICIA PATTY PATTI PAULA PAULETTE PAULINE + PEG PEGGY POLLY + ROSE ROSILYN + SALLY SANDRA SANDY SOPHIE STACEY STELLA SUE SUSAN + TERESA TERRY TINA + VICCI VICKY VICKI VICTORIA VIRGINIA +;unames: + BKERNS VP)) + + + +;;; Define Matches + +(MATCHDECLARE 'IF '(THEN)) +(MATCHDECLARE 'IFF '(THEN)) +(MATCHDECLARE 'NOT-ONLY '(BUT BUT-ALSO)) +(MATCHDECLARE 'EITHER '(OR)) +(MATCHDECLARE 'NEITHER '(NOR)) + +;;; Comparators are pseudo-parst of speech used +;;; in conjunction with comparative adjectives. + +(DEFINE 'COMPARATOR '(AS THAN)) + +;;; Conjunctions + +(DEFINE 'CONJUNCTION '(AND OR BUT BECAUSE HOWEVER ALTHOUGH)) + +;;; Determiners + +(DEFINE 'DETERMINER '(THE A AN EVERY SOME ANY MANY ALL ONE)) + +;;; Interjections + +(DEFINE 'INTERJECTION '(OK FINE SURE GREAT GOOD NO YES OKAY SIGH FOO + HI HELLO GREETINGS WOW OH AH AHH AHHH AHHHH + HUHUH UHHUH HMMM GEE HMM HMMMM FOOBAR FROWN SI + TOO ALSO ADDITIONALLY WELL)) + +;;; Modals [special class of verbs] + +(DEFINE 'MODAL '(CAN COULD MAY MIGHT MUST SHALL SHOULD WILL WOULD)) + +;;; Prepositions + +(DEFINE 'PREPOSITION + '(OF IN ON WITH FROM FOR TO AT SAME AS LIKE ABOUT + BY BESIDE AROUND UNDER ABOVE THROUGH BENEATH AMIDST + ONTO VIA INSIDE OUTSIDE BEHIND OVER)) + +;;; Special classes of verbs + +(DEFINE 'BEING-VERB '(BE AM IS ARE WAS WERE)) + +(DEFINE 'HELPING-VERB '(AM IS ARE WAS WERE HAVE HAS HAD DO DOES DID)) + + +(DEFINE 'PRONOUN '(I ME YOU HE HIM SHE HER IT + WE US THEY THEM + THAT THOSE THIS THESE + THING THINGS ANYTHING SOMETHING EVERYTHING + ;Possessives + MINE YOURS HIS HERS ITS OURS THEIRS + ;Reflexives + MYSELF YOURSELF HIMSELF HERSELF ITSELF)) + +(DEFINE 'ADJECTIVE '(MY YOUR HIS HER ITS OUR THEIR)) + +(DEFUN ROOT-PRONOUN (X) (EQ (GET X 'PRONOUN-TYPE) 'SUBJECT)) + +(DEFUN PRONOUN-VARIATIONS-DECLARE (PRONOUN VARIATIONS) + (PUTPROP PRONOUN 'SUBJECT 'PRONOUN-TYPE) + (COND (VARIATIONS + (MAPC (FUNCTION + (LAMBDA (X) (PUTPROP X PRONOUN 'ROOT-PRONOUN))) + VARIATIONS) + (PUTPROP (CAR VARIATIONS) 'OBJECT 'PRONOUN-TYPE) + (PUTPROP (CADR VARIATIONS) 'ADJECTIVE 'PRONOUN-TYPE) + (PUTPROP (CADDR VARIATIONS) 'POSSESSIVE 'PRONOUN-TYPE) + (PUTPROP (CADDDR VARIATIONS) 'REFLEXIVE 'PRONOUN-TYPE)))) + +(DEFUN PRONOUN-DEFINE FEXPR (X) + (MAPC (FUNCTION + (LAMBDA (X) + (PUTPROP (CAR X) (CADR X) 'PERSON) + (PUTPROP (CAR X) (CADDR X) 'GENDER) + (PUTPROP (CAR X) (CADDDR X) 'NUMBER) + (PRONOUN-VARIATIONS-DECLARE (CAR X) + (CAR (CDDDDR X))))) + X)) + +;;; + +(PRONOUN-DEFINE (I FIRST () (SINGULAR) (ME MY MINE MYSELF)) + (YOU SECOND () (SINGULAR PLURAL) (YOU YOUR YOURS + YOURSELF)) + (HE THIRD (MALE) (SINGULAR) (HIM HIS HIS HIMSELF)) + (SHE THIRD (FEMALE) (SINGULAR) (HER HER HERS HERSELF)) + (IT THIRD (NONE) (SINGULAR) (IT ITS ITS ITSELF)) + (THAT THIRD (NONE) (SINGULAR) ()) + (THIS THIRD (NONE) (SINGULAR) ()) + (WE FIRST () (PLURAL) (US OUR OURS + OURSELVES)) + (THEY THIRD () (PLURAL) (THEM THEIR THEIRS + THEMSELVES)) + (THESE THIRD () (PLURAL) ()) + (THOSE THIRD () (PLURAL) ())) + +(DEFUN POSSESSIVE-PRONOUN? (X) + (EQ (GET X 'PRONOUN-TYPE) 'POSSESSIVE)) + +(DEFUN POSSESSIVE? (X) + (COND ((POSSESSIVE-PRONOUN? X) (ROOT-PRONOUN X)) + ((EQUAL (MEMQ '/' (SETQ X (EXPLODED X))) '(/' S)) + (IMPLODE (NREVERSE (CDDR (REVERSE X))))) + (T NIL))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Verbs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(VERB-FORM + (ABANDON ABANDONS ABANDONED ABANDONED ABANDONING) + (ACCOMODATE) + (ACCOUNT) + (ACCUSE) + (ACQUIRE) + (ACT) + (ACTUATE) + (ADD) + (ADDRESS) + (ADVERTISE) + (ADVOCATE) + (AGREE AGREES AGREED AGREED AGREEING) + (AID) + (AIM) + (ALLEVIATE) + (ALLOW) + (ALTER) + (ANNOUNCE) + (ANNOY) + (ANSWER ANSWERS ANSWERED ANSWERED ANSWERING) + (APOLOGIZE) + (APPEAL) + (APPEAR) + (APPEND) + (APPLY) + (APPOINT) + (APPRAISE) + (APPRECIATE) + (APPROACH) + (APPROVE) + (ARISE ARISES AROSE ARISEN) + (ARREST) + (ARRIVE) + (ASK) + (ASSIGN) + (ASSOCIATE) + (ASSUME) + (ATTACK) + (ATTEMPT) + (ATTRACT) + (AWAKEN) + (BALANCE) + (BAN) + (BAKE) + (BARK) + (BEAT) + (BECOME BECOMES BECAME BECOME) + (BEGIN BEGINS BEGAN BEGUN) + (BELIEVE) + (BET BETS BET BET) + (BETRAY) + (BID BIDS BID BID BIDDING) + (BITE BITES BIT BITTEN) + (BLAST) + (BLEEP) + (BLOCK) + (BLOW BLOWS BLEW BLOWN BLOWING) + (BORROW) + (BOTHER BOTHERS BOTHERED BOTHERED BOTHERING) + (BOX) + (BREAK BREAKS BROKE BROKEN) + (BRING BRINGS BROUGHT BROUGHT) + (BUILD BUILDS BUILT BUILT BUILDING) + (BUMP) + (BURN) + (BURP) + (BUS BUSES BUSED BUSED BUSING) + (BUY BUYS BOUGHT BOUGHT) + (CALCULATE) + (CALL) + (CAMPAIGN) + (CANCEL) + (CAPTURE) + (CARE) + (CARRY) + (CAST CASTS CAST CAST CASTING) + (CATCH CATCHES CAUGHT CAUGHT) + (CAUSE) + (CHAIN) + (CHALLENGE) + (CHANGE) + (CHARGE) + (CHASE) + (CHECK) + (CHOOSE CHOOSES CHOSE CHOSEN) + (CHUCKLE) + (CIRCULATE) + (CLARIFY) + (CLOBBER) + (COLLECT) + (COME COMES CAME COME) + (COMPETE) + (COMPLAIN) + (COMPLETE) + (COMPLICATE) + (COMPROMISE) + (CONCLUDE) + (CONDUCT) + (CONFIDE) + (CONFIRM) + (CONFUSE) + (CONSENT) + (CONSIDER CONSIDERS CONSIDERED CONSIDERED CONSIDERING) + (CONSTRAIN) + (CONTINUE) + (CONTROL) + (CONVICT) + (COOK) + (COPY) + (CORRECT) + (COUNT) + (COVER) + (CREATE) + (CRITICIZE) + (CROWD) + (CRUSH CRUSHES CRUSHED CRUSHED) + (CRY) + (CUT) + (DANCE) + (DEBATE) + (DECLARE) + (DECREASE) + (DEDICATE) + (DEFEND) + (DEFINE) + (DELAY) + (DELEGATE) + (DELETE) + (DENY) + (DEREGULATE) + (DESIRE) + (DESTROY) + (DETECT) + (DIE) + (DISAGREE) + (DISAPPROVE) + (DISBAND) + (DISCARD) + (DISCIPLINE) + (DISCUSS) + (DISLIKE) + (DISMISS) + (DISPLAY) + (DIVEST) + (DO DOES DID DONE DOING) + (DRAMATIZE) + (DRAW) + (DRINK DRINKS DRANK DRUNK) + (DRIVE DRIVES DROVE DRIVEN) + (EASE) + (EAT EATS ATE EATEN EATING) + (EDIT) + (ELECT) + (ELIMINATE) + (ENFORCE) + (ENGINEER) + (ENTER) + (ESTABLISH) + (EXCEL) + (EXHIBIT) + (EXIT) + (EXPECT) + (EXPERIENCE) + (EXPERIMENT) + (EXPLAIN) + (EXPORT) + (EXTEND) + (FAIL) + (FAKE) + (FALL FALLS FELL FALLEN FALLING) + (FEAR) + (FEEL FEELS FELT FELT FEELING) + (FIGHT FIGHTS FOUGHT FOUGHT) + (FIGURE) + (FILE) + (FILL) + (FIND FINDS FOUND FOUND) + (FIRE) + (FIX) + (FLY) + (FOCUS) + (FOIL) + (FOLLOW) + (FOOL) + (FORCE) + (FORESHADOW FORESHADOWS FORESHADOWED FORESHADOWED FORESHADOWING) + (FORM) + (FULFILL) + (GARGLE) + + (GET GETS GOT GOTTEN) + (GIGGLE) + (GLOW) + (GO GOES WENT GONE GOING) + (GRADE) + (GRANT) + (GROW) + (GUIDE) + (HAVE HAS HAD HAD HAVING) + (HANG HANGS HUNG HUNG) + (HAPPEN HAPPENS HAPPENED HAPPENED HAPPENING) + (HATE) + (HEAR) + (HEIGHTEN HEIGHTENS HEIGHTENED HEIGHTENED HEIGHTENING) + (HELP) + (HESITATE) + (HIDE HIDES HID HIDDEN) + (HIRE) + (HIT HITS HIT HIT) + (HOLD HOLDS HELD HELD) + (HOPE) + (HOVER HOVERS HOVERED HOVERED HOVERING) + (HUNT) + (HURT HURTS HURT HURT) + (ILLUMINATE) + (IMPEACH) + (IMPLEMENT) + (IMPLY) + (IMPRESS) + (IMPROVE) + (INCREASE) + (INDICT) + (INFORM) + (INITIALIZE) + (INJUR) + (INSTALL) + (INSURE) + (INTERVIEW) + (INTIMIDATE) + (INTRODUCE) + (INVADE) + (INVESTIGATE) + (INVOLVE) + (IRRITATE) + (JAIL) + (JERK) + (JOIN) + (JUDGE) + (JUMP) + (KILL) + (KISS) + (KNOW) + (LACK) + (LAY) + (LAUGH) + (LEAD) + (LEARN) + (LEAVE) + (LECTURE) + (LEGISLATE) + (LEVEL) + (LIE) + (LIKE) + (LIMIT) + (LINK) + (LIST) + (LISTEN LISTENS LISTENED LISTENED LISTENING) + (LIVE) + (LOAD) + (LOCK) + (LOOK) + (LOOSEN) + (LOSE) + (LOVE) + (LOWER) + (MAKE MAKES MADE MADE) + (MARCH) + (MARK) + (MATCH) + (MATERIALIZE) + (MEAN MEANS MEANT MEANT) + (MEET) + (MISLAY) + (MOVE) + (MUNCH) + (MUNG) + (MURDER) + (NAME) + (NEED) + (NET) + (NIX) + (NOMINATE) + (OBJECT) + (OBSERVE) + (OFFER) + (OPEN OPENS OPENED OPENED OPENING) + (ORGANIZE) + (OUGHT OUGHT OUGHT OUGHT OUGHT) + (OVERSHADOW OVERSHADOWS OVERSHADOWED OVERSHADOWED OVERSHADOWING) + (PACE) + (PACK) + (PARK) + (PASS) + (PASTE) + (PAUSE) + (PAVE) + (PAY) + + (PERFORM) + (PERPETRATE) + (PHOTOGRAPH) + (PICK) + (PLAGIARIZE) + (PLAN) + (PLANT) + (PLAY) + (PLEDGE) + (POP) + (PREDICT) + (PREFER) + (PREPARE) + (PRESENT) + (PRESSURE) + (PRESUME) + (PREY) + (PRAY) + (PROCLAIM) + (PRODUCE) + (PROFIT) + (PROGRAM) + (PROJECT) + (PROMISE) + (PROPOSE) + (PROTECT) + (PROTEST) + (PROVE) + (PROVIDE) + (PRY) + (PUBLISH) + (PUSH) + (PUT PUTS PUT PUT) + (QUERY) + (QUESTION) + (QUIET) + (QUIT QUITS QUIT QUIT) + (RAISE) + (RAP) + (RAPE) + (REALIZE) + (RECALL) + (RECAP) + (RECOMMEND) + (RECOUNT) + (RECOVER) + (RECYCLE) + (REFER) + (REFEREE) + (REFUND) + (REFUTE) + (REGULATE) + (REHEARSE) + (REITERATE) + (REJECT) + (RELATE) + (RELAY) + (REMIND) + (REMOVE) + (RENEW) + (RENOUNCE) + (RENOVATE) + (RENT) + (REPLACE) + (REPLAY) + (REPORT) + (REPRESENT) + (REQUEST) + (RESEARCH) + (RESIGN) + (RESOLVE) + (REST) + (RESTORE) + (RETAIN) + (RETURN) + (REVEAL) + (REVIEW) + (REVISE) + (REVISIT) + (REVITALIZE) + (REVIVE) + (RESSURECT) + (REWARD) + (RIDE RIDES RODE RIDDEN) + (RISE RISES ROSE RISEN) + (ROLE) + (RUIN) + (RULE) + (RUN RUNS RAN RUN) + (RUSH) + (SACRIFICE) + (SAVE) + (SAY SAYS SAID SAID) + (SCHEDULE) + (SEARCH) + (SEE SEES SAW SEEN SEEING) + (SEEK SEEKS SOUGHT SOUGHT) + (SEEM) + (SEIZE) + (SELECT) + (SELL SELLS SOLD SOLD) + (SEND) + (SERVE) + (SET SETS SET SET SETTING) + (SEW SEWS SEWED SEWED SEWING) + (SHIFT) + (SHOOT) + (SHOUT) + (SHOW SHOWS SHOWED SHOWED SHOWING) + (SHRUG) + (SHUN) + (SHUT) + (SIGNAL) + (SING SINGS SANG SUNG) + (SINK SINKS SANK SUNK) + (SIP) + (SIT SITS SAT SAT) + (SKATE) + (SKI SKIS SKIED SKIED SKIING) + (SLANDER) + (SLASH) + (SLAY SLAYS SLEW SLAIN) + (SLEEP SLEEPS SLEPT SLEPT) + (SLIDE SLIDES SLID SLID) + (SLIP) + (SLOW) + (SLUMP) + (SLUR) + (SOAR) + (SOLVE) + (SOW SOWS SOWED SOWED SOWING) + (SPAN) + (SPIN) + (SPLIT) + (SPIKE) + (SPEAK) + (SPONSOR) + (SQUEEZE) + (SQUINT) + (SQUIRT) + (STALL) + (STAND STANDS STOOD STOOD) + (STARE) + (START) + (STARVE) + (STATE) + (STAY) + (STEAL) + (STEER STEERS STEERED STEERED STEERING) + (STIR) + (STOP) + (STORE) + (STRAIGHTEN) + (STRIP) + (STUDY) + (SUBMERGE) + (SUBMIT) + (SUCCEED) + (SUGGEST) + (SUPPOSE) + (SURPRISE) + (SURVEY) + (SWARM) + (SWIM SWIMS SWAM SWUM) + (SYNTHESIZE) + (TAKE TAKES TOOK TAKEN) + (TALK) + (TEACH) + (TERMINATE) + (TESTIFY) + (THANK) + + (THINK THINKS THOUGHT THOUGHT) + (THROW THROWS THREW THROWN THROWING) + (TIE) + (TIGHTEN TIGHTENS TIGHTENED TIGHTENED TIGHTENING) + (TICK) + (TIP) + (TOP) + (TRACE) + (TRACK) + (TRANSFER TRANSFERS TRANSFERED TRANSFERED TRANSFERING) + (TRESPASS) + (TRICK) + (TURN) + (UNDERSTAND UNDERSTANDS UNDERSTOOD UNDERSTOOD) + (UNDO UNDOES UNDID UNDONE UNDOING) + (UNLOCK) + (UPHOLD UPHOLDS UPHELD UPHELD) + (URGE) + (USE USES USED USED USING) + (VACATE) + (VALUE) + (VETO) + (VIEW) + (VIOLATE) + (VISIT VISITS VISITED VISITED VISITING) + (VOTE) + (WAKE) + (WALK) + (WANT) + (WATCH) + (WEAR WEARS WORE WORN WEARING) + (WILL WILLS WILLED WILLED WILLING) + (WIN WINS WON WON) + (WINK) + (WISH) + (WONDER WONDERS WONDERED WONDERED WONDERING) + (WORRY) + (WORK) + (WRITE WRITES WROTE WRITTEN) + (YANK) + (YELL) +) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Contractions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(DEFUN CONTRACTION (X) + (COND ((NUMBERP (CADR X)) + (PUTPROP (CAR X) + (CDR + (ASSOC (CADR X) + '((1. . (FORGOT USE AN APOSTROPHE)) + (2. . (FORGOT TO CAPITALIZE YOUR APOSTROPHE)) + (3. . (MIS-SPELLED SOMETHING)) + (4. . (FORGOT TO TYPE A SPACE)) + (5. . (TYPED |"0"| INSTEAD OF |"O"|)) + (6. . (GOT THE |"I"| AND |"E"| BACKWARDS))))) + 'TYPO) + (PUTPROP (CAR X) (CDDR X) 'CONTRACTION)) + (T + (PUTPROP (CAR X) (CDR X) 'CONTRACTION)))) + +(DEFUN TYPO? (X) (GET X 'TYPO)) + +(DEFUN STRING-PRINC (X) + (COND ((ATOM X) + (PRINC '/" TYO) + (PRINC X TYO) + (PRINC '/" TYO)) + (T + (PRINC '/" TYO) + (PRINC (CAR X) TYO) + (MAPC (FUNCTION (LAMBDA (X) (PRINC '| | TYO) (PRINC X TYO))) + (CDR X)) + (PRINC '/" TYO)))) + +(COND ((NOT (BOUNDP 'VERBOSE-TYPO-CORRECTION-FLAG)) + (SETQ VERBOSE-TYPO-CORRECTION-FLAG T))) + +(DEFUN CONTRACTION? (X) + (DECLARE (SPECIAL VERBOSE-TYPO-CORRECTION-FLAG)) + (COND ((AND (GET X 'TYPO) VERBOSE-TYPO-CORRECTION-FLAG) + (CURSORPOS 'A TYO) + (PRINC '|Using | TYO) + (STRING-PRINC (GET X 'CONTRACTION)) + (PRINC '| for | TYO) + (STRING-PRINC X) + (PRINC '/. TYO) + (TERPRI TYO))) + (OR (GET X 'CONTRACTION) + (NCONS X))) + +(DEFUN EXPAND-CONTRACTIONS (X) + (APPLY 'APPEND (MAPCAR 'CONTRACTION? X))) + +(MAPC 'CONTRACTION + '(( |AIN'T| . ( IS NOT)) + ( |AINT| . (1. IS NOT)) + ( |AIN7T| . (2. IS NOT)) + + ( DUNNO . (DO NOT KNOW)) + + ( GONNA . (GOING TO)) + + ( GOTTA . (HAVE TO)) + + ( MUSTA . (MUST HAVE)) + + ( OUGHTA . (OUGHT TO)) + + ( CUDA . (COULD HAVE)) + ( COULDA . (COULD HAVE)) + ( CUDNA . (COULD NOT HAVE)) + ( COULDNA . (COULD NOT HAVE)) + + ( SHUDA . (SHOULD HAVE)) + ( SHOULDA . (SHOULD HAVE)) + ( SHUDNA . (SHOULD NOT HAVE)) + ( SHOULDNA. (SHOULD NOT HAVE)) + + ( WUDA . (WOULD HAVE)) + ( WOULDA . (WOULD HAVE)) + ( WUDNA . (WOULD NOT HAVE)) + ( WOULDNA . (WOULD NOT HAVE)) + + ( MIGHTA . (MIGHT HAVE)) + + ( WANNA . (WANT TO)) + ( WANTA . (WANT TO)) + + ( WUDA . (WOULD HAVE)) + ( WUDNA . (WOULD NOT HAVE)) + + ( |DIDN'T| . ( DID NOT)) + ( |DIDNT| . (1. DID NOT)) + ( |DIDN7T| . (2. DID NOT)) + ( |DIN'T| . (3. DID NOT)) + + ( |AREN'T| . (ARE NOT)) + + ( |CAN'T| . ( CAN NOT)) + ( |CANT| . (1. CAN NOT)) + ( |CAN7T| . (2. CAN NOT)) + + ( |COULDN'T| . ( COULD NOT)) + ( |COULDNT| . (1. COULD NOT)) + ( |COULDN7T| . (2. COULD NOT)) + + ( |DOESN'T| . ( DOES NOT)) + ( |DOESNT| . (1. DOES NOT)) + ( |DOESN7T| . (2. DOES NOT)) + + ( |DON'T| . ( DO NOT)) + ( |DONT| . (1. DO NOT)) + ( |DON7T| . (2. DO NOT)) + + ( |HASN'T| . ( HAS NOT)) + ( |HASNT| . (1. HAS NOT)) + ( |HASN7T| . (2. HAS NOT)) + + ( |HAVEN'T| . ( HAVE NOT)) + ( |HAVENT| . (1. HAVE NOT)) + ( |HAVEN7T| . (2. HAVE NOT)) + + ( |HE'D| . ( HE WOULD)) + ( |HED| . (1. HE WOULD)) + ( |HE7D| . (2. HE WOULD)) + + ( |HE'S| . ( HE IS)) + ( |HES| . (1. HE IS)) + ( |HE7S| . (2. HE IS)) + + ( |HERE'S| . ( HERE IS)) + ( |HERES| . (1. HERE IS)) + ( |HERE7S| . (2. HERE IS)) + + ( |I'D| . ( I WOULD)) + ( |I7D| . (2. I WOULD)) + + ( |I'LL| . ( I SHALL)) + ( |I7LL| . (2. I SHALL)) + + ( |I'M| . ( I AM)) + ( |IM| . (1. I AM)) + ( |I7M| . (2. I AM)) + + ( |I'VE| . ( I HAVE)) + ( |IVE| . (1. I HAVE)) + ( |I7VE| . (2. I HAVE)) + + ( |ISN'T| . ( IS NOT)) + ( |ISNT| . (1. IS NOT)) + ( |ISN7T| . (2. IS NOT)) + + ( |IT'D| . ( IT WOULD)) + ( |ITD| . (1. IT WOULD)) + ( |IT7D| . (2. IT WOULD)) + + ( |IT'S| . ( IT IS)) + ( |IT7S| . (2. IT IS)) + + ( |MUST'VE| . ( MUST HAVE)) + ( |MUSTVE| . (1. MUST HAVE)) + ( |MUST7VE| . (2. MUST HAVE)) + + ( |SHE'D| . ( SHE WOULD)) + ( |SHE7D| . (2. SHE WOULD)) + + ( |SHE'S| . ( SHE IS)) + ( |SHES| . (1. SHE IS)) + ( |SHE7S| . (2. SHE IS)) + + ( |SHOULD'VE| . ( SHOULD HAVE)) + ( |SHOULDVE| . (1. SHOULD HAVE)) + ( |SHOULD7VE| . (2. SHOULD HAVE)) + + ( |SHOULDN'T| . ( SHOULD NOT)) + ( |SHOULDNT| . (1. SHOULD NOT)) + ( |SHOULDN7T| . (2. SHOULD NOT)) + + ( |THAT'S| . ( THAT IS)) + ( |THATS| . (1. THAT IS)) + ( |THAT7S| . (2. THAT IS)) + + ( |THERE'D| . ( THERE WOULD)) + ( |THERED| . (1. THERE WOULD)) + ( |THERE7D| . (2. THERE WOULD)) + + ( |THERE'S| . ( THERE IS)) + ( |THERES| . (1. THERE IS)) + ( |THERE7S| . (2. THERE IS)) + + ( |WHAT'S| . ( WHAT IS)) + ( |WHATS| . (1. WHAT IS)) + ( |WHAT7S| . (2. WHAT IS)) + + ( |WHEN'S| . ( WHEN IS)) + ( |WHENS| . (1. WHEN IS)) + ( |WHEN7S| . (2. WHEN IS)) + + ( |WHERE'S| . ( WHERE IS)) + ( |WHERES| . (1. WHERE IS)) + ( |WHERE7S| . (2. WHERE IS)) + + ( |WHO'S| . ( WHO IS)) + ( |WHOS| . (1. WHO IS)) + ( |WHO7S| . (2. WHO IS)) + + ( |WON'T| . ( WILL NOT)) + ( |WONT| . (1. WILL NOT)) + ( |WON7T| . (2. WILL NOT)) + + ( |WOULDN'T| . ( WOULD NOT)) + ( |WOULDNT| . (1. WOULD NOT)) + ( |WOULDN7T| . (2. WOULD NOT)) + + ( |WOULD'VE| . ( WOULD HAVE)) + ( |WOULDVE| . (1. WOULD HAVE)) + ( |WOULD7VE| . (2. WOULD HAVE)) + + ( |YOU'D| . ( YOU WOULD)) + ( |YOUD| . (1. YOU WOULD)) + ( |YOU7D| . (2. YOU WOULD)) + + ( |YOU'LL| . ( YOU WILL)) + ( |YOULL| . (1. YOU WILL)) + ( |YOU7LL| . (2. YOU WILL)) + + ( |YOU'RE| . ( YOU ARE)) + ( |YOURE| . (1. YOU ARE)) + ( |YOU7RE| . (2. YOU ARE)) + + ( |YOU'VE| . ( YOU HAVE)) + ( |YOUVE| . (1. YOU HAVE)) + ( |YOU7VE| . (2. YOU HAVE)) + + ( |W//| . (WITH)) + ( |W//O| . (WITHOUT)) + + ( CU . (BYE)) + ( CUL . (BYE)) + ( BCNU . (BYE)) + ( S'LONG . (BYE)) + + ( B4 . (BEFORE)) + + ( FO . (3. OF)) + + ( FRO . (3. FOR)) + + ( CNA . (3. CAN)) + ( CNA'T . (3. CAN NOT)) + + ( BECUZ . (BECAUSE)) + + ( FREIND . (6. FRIEND)) + ( THIER . (6. THEIR)) + ( THEIF . (6. THIEF)) + + ( YYES . (3. YES)) + ( YSE . (3. YES)) + ( YEES . (3. YES)) + ( YESS . (3. YES)) + ( YEAH . (3. YES)) + ( YEA . (3. YES)) + + ( NOO . (3. NO)) + ( NNO . (3. NO)) + + ( THRU . (THROUGH)) + + ( TE . (3. THE)) + ( TH . (3. THE)) + ( EHT . (3. THE)) + ( ETH . (3. THE)) + ( TEH . (3. THE)) + ( HET . (3. THE)) + ( HTE . (3. THE)) + + ( ADN . (3. AND)) + ( NAD . (3. AND)) + ( NDA . (3. AND)) + + ( HTAT . (3. THAT)) + ( TAHT . (3. THAT)) + ( THTA . (3. THAT)) + + ( HTIS . (3. THIS)) + ( HTSI . (3. THIS)) + ( THSI . (3. THIS)) + + ( OEN . (3. ONE)) + + ( HWEN . (3. WHEN)) + ( WEHN . (3. WHEN)) + + ( HWERE . (3. WHERE)) + ( WEHRE . (3. WHERE)) + + ( TEHN . (3. THEN)) + + ( ISA . (4. IS A)) + ( HASA . (4. HAS A)) + + ( N0 . (5. NO)) + ( N0T . (5. NOT)) + + )) + +(DEFUN EQS (XX YY) + (DO ((X XX (CDR X)) + (Y YY (CDR Y))) + ((NULL X) (CONS XX Y)) + (COND ((NOT (EQ (CAR X) (CAR Y))) + (RETURN NIL))))) + +(DEFUN EXPAND-ABBREVS (X) + (DO ((L X) + (R NIL)) + ((NULL L) (NREVERSE R)) + ((LAMBDA (EXPANSION) + (SETQ R (APPEND (CAR EXPANSION) R)) + (SETQ L (CDR EXPANSION))) + (GET-ABBREV-EXPANSION L)))) + +(DEFUN GET-ABBREV-EXPANSION (WORDS) + (DO ((PA (POTENTIAL-ABBREVS (CAR WORDS)) (CDR PA)) + (TEMP)) + ((NULL PA) (CONS (NCONS (CAR WORDS)) (CDR WORDS))) + (COND ((SETQ TEMP (EQS (CAAR PA) WORDS)) + (RETURN (CONS (CDAR PA) (CDR TEMP))))))) + +(DEFUN POTENTIAL-ABBREVS (X) + (GET X 'POTENTIAL-ABBREVS)) + +(DEFUN DEFINE-ABBREV (X) + (PUTPROP (CAAR X) + (SORT (CONS X (GET (CAAR X) 'POTENTIAL-ABBREVS)) 'LONGERCARP) + 'POTENTIAL-ABBREVS)) + +(DEFUN LONGERCARP (X Y) (> (LENGTH (CAR X)) (LENGTH (CAR Y)))) + +(MAPC 'DEFINE-ABBREV + '(((MR |.|) MR) + ((MISTER) MR) + ((MRS |.|) MRS) + + ((DR |.|) DOCTOR) + + ((U |.| S |.| A |.|) UNITED-STATES) + ((U |.| S |.|) UNITED-STATES) + ((UNITED STATES) UNITED-STATES) + + ((NOT ONLY) NOT-ONLY) + ((BUT ALSO) BUT-ALSO) + + ((IF AND ONLY IF) IFF) + + ((ATOMIC NUMBER) ATOMIC-NUMBER) + ((ATOMIC WEIGHT) ATOMIC-WEIGHT) + ((ATOMIC MASS) ATOMIC-MASS) + + ((GAMMA RAY) GAMMA-RAY) + ((GAMMA RAYS) GAMMA-RAYS) + ((ALPHA PARTICLE) ALPHA-PARTICLE) + ((ALPHA PARTICLES) ALPHA-PARTICLES) + ((BETA PARTICLE) BETA-PARTICLE) + ((BETA PARTICLES) BETA-PARTICLES) + + )) \ No newline at end of file diff --git a/src/games/yahtze.(init) b/src/games/yahtze.(init) new file mode 100644 index 00000000..ccbc7c4f --- /dev/null +++ b/src/games/yahtze.(init) @@ -0,0 +1,11 @@ +(comment) +(progn + (setq ^W t) + (load '((dsk games) yahtze fasl)) + (setq errlist '((gc) + (yahtze))) + (setsyntax '/ +'/ '/ ) + (setq ^W nil) + (cursorpos 'c) + (yahtze)) diff --git a/src/games/yahtze.27 b/src/games/yahtze.27 new file mode 100644 index 00000000..f71c4b82 --- /dev/null +++ b/src/games/yahtze.27 @@ -0,0 +1,241 @@ +;-*-lisp-*- + +(declare (eval (read))) +(load '((sca) mode)) + +(scachar) + +(declare (mapex t) + (special *nbonus*) + (fixnum i j k *nbonus* top-half bottom-half nroll)) + +(defun yahtze () + (bind ((^w <- t)) + (sort (list 1) (function <))) ;to load SORT package early + (terpri) + (terpri) + (princ '|Rules? |) + (cond ((memq (read) '(y yes sure ok)) + (cursorpos 'c) + (princ '|/ +This is the game of Yahtze./ +/ +It is a game played with 5 dice. You get thirteen turns. Each turn you roll/ +all 5 dice, then pick up and roll any or all of them again, and then pick up/ +and roll any or all of them a third time. You then score your roll in one of/ +the thirteen scoring slots - one slot for each turn. Slots may be used only/ +once per game. The slots are:/ +/ + 1 - Aces (Ones)/ + 2 - Twos/ + 3 - Threes/ + 4 - Fours/ + 5 - Fives/ + 6 - Sixes/ +/ + T - Three of a Kind/ + F - Four of a Kind/ + H - Full House [Three of one kind, and two of another]/ + S - Small Straight [Four numbers in a row]/ + L - Large Straight [Five numbers in a row]/ + Y - Yahtze [Five of a Kind]/ + C - Chance/ +/ +The first 6 slots form the top half, and the last 7 make up the bottom half./ +In the top half, a score is the sum of the dice of the appropriate number./ +Thus (2 3 4 4 4) would score 2 if scored in the 2 slot, 3 if scored in the 3/ +slot, 12 if scored in the 4 slot, and 0 if scored in any of the 1, 5, or 6/ +slots. Also, if at the end of the game you have at least 63 points in the top/ +half [for example, 3 of everything gives you exactly 63], you get a 35 point/ +bonus. Scoring in T is the total of all the dice, provided there is a three/ +of a kind [the score is 0 otherwise]. Scoring in F is similar. H scores 25,/ +S 30, L 40, and Y 50, provided of course that your roll meets the appropriate/ +prerequisite. If you have 50 in Y already, you get 100 bonus points for each/ +additional yahtze rolled. Any yahtze may be used as a "joker" and scored/ +anywhere in the lower half. C scores the total of all the dice, for any roll./ +/ +Note: when a roll is printed out, enter the numbers of the dice you wish to/ +KEEP, followed by a space. [If you wish to roll them all again, type 0.]/ +When "Score?" is printed, type the character corresponding to the slot you/ +wish to score the roll in, followed by a space./ +/ +P.S.: If you are on a display console and this output gets lost [in which/ +case you probably won't have time to read this], try :print drb;yahtze >, at/ +least for the first page or two./ +|) + (sleep 10.0))) + + (do ((scorecard (array nil t 13) (array nil t 13)) (roll) (*nbonus* 0 0) + (top-half) (bottom-half) (base 10.) (ibase 10.) (*nopoint t) (ans)) + (nil) + (sstatus random (fix (time))) + (terpri) + (terpri) + (repeat i 13 + (cursorpos 'c) + (princ '|Scorecard:|) + (print-scorecard scorecard) + (setq roll (fill-roll nil)) + (repeat i 2 + loop (print roll) + (princ '| |) + (setq ans (list-nums (read))) + (if (subset? ans roll) + (setq roll (fill-roll ans)) + (go loop))) + (print roll) + (score roll scorecard) + (terpri)) + (terpri) + (terpri) + (princ '|Final Scorecard:|) + (print-scorecard scorecard) + (setq top-half (sum-array scorecard 0 5)) + (terpri) + (princ '|Top Half: |) + (princ top-half) + (cond ((> top-half 62) + (terpri) + (princ '|Plus a Bonus of 35|) + (setq top-half (+ top-half 35)))) + (setq bottom-half (sum-array scorecard 6 12)) + (terpri) + (princ '|Bottom Half: |) + (princ bottom-half) + (cond ((= *nbonus* 1) + (terpri) + (princ '|Plus 1 Bonus Yahtze, for 100 Points|)) + ((> *nbonus* 1) + (terpri) + (princ '|Plus |) + (princ *nbonus*) + (princ '| Bonus Yahtzes, for |) + (princ (* *nbonus* 100)) + (princ '| Points|))) + (terpri) + (princ '|Total Score: |) + (princ (+ top-half bottom-half (* 100 *nbonus*))) + (terpri) + (terpri) + (princ '|Again? |) + (cond ((not (memq (read) '(y yes sure ok))) + (terpri) + (quit))))) + +(defun score (roll scorecard) + (prog (ans nroll) + (setq nroll (num-kind roll)) + (cond ((and (= nroll 5) (equal (arraycall t scorecard 11) 50)) + (setq *nbonus* (1+ *nbonus*)) + (terpri) + (princ '|A|) + (if (> *nbonus* 1) (princ '|nother|)) + (princ '| Bonus Yahtze !!!|))) + loop (terpri) + (princ '|Score? |) + (setq ans (read)) + (cond ((numberp ans) + (if (or (not (fixp ans)) (< ans 1) (> ans 6) + (arraycall t scorecard (1- ans))) + (go loop) + (store (arraycall t scorecard (1- ans)) + (sum-num ans roll)))) + ((eq ans 't) + (if (arraycall t scorecard 6) (go loop) + (store (arraycall t scorecard 6) + (if (> nroll 2) (sum-roll roll) 0)))) + ((eq ans 'f) + (if (arraycall t scorecard 7) (go loop) + (store (arraycall t scorecard 7) + (if (> nroll 3) (sum-roll roll) 0)))) + ((eq ans 'h) + (if (arraycall t scorecard 8) (go loop) + (store (arraycall t scorecard 8) + (if (full-house? roll) 25 0)))) + ((eq ans 's) + (if (arraycall t scorecard 9) (go loop) + (store (arraycall t scorecard 9) + (if (or (= nroll 5) (> (nrow roll) 3)) 30 0)))) + ((eq ans 'l) + (if (arraycall t scorecard 10) (go loop) + (store (arraycall t scorecard 10) + (if (or (= nroll 5) (> (nrow roll) 4)) 40 0)))) + ((eq ans 'y) + (if (arraycall t scorecard 11) (go loop) + (store (arraycall t scorecard 11) + (if (= nroll 5) 50 0)))) + ((eq ans 'c) + (if (arraycall t scorecard 12) (go loop) + (store (arraycall t scorecard 12) + (sum-roll roll)))) + (t (go loop))))) + +(defun fill-roll (roll) + (do ((roll roll (cons (1+ (random 6)) roll))) + ((= (length roll) 5) roll))) + +(defun list-nums (x) + (if (not (eq (typep x) 'fixnum)) (list 0) + (do ((out nil (cons (\ i 10) out)) + (i x (// (- i (\ i 10)) 10))) + ((= i 0) out)))) + +(defun subset? (s1 s2) + (setq s1 (sort (lcopy1 s1) (function <)) + s2 (sort (lcopy1 s2) (function <))) + (do () + (nil) + (cond ((null s1) (return t)) + ((null s2) (return nil)) + ((= (car s1) (car s2)) (setq s1 (cdr s1)))) + (setq s2 (cdr s2)))) + +(defun sum-array (arr i j) + (do ((k 0 (+ k (arraycall t arr i))) + (i i (1+ i))) + ((> i j) k))) + +(defun print-scorecard (scorecard) + (terpri) + (terpri) + (princ '| 1 2 3 4 5 6 T F H S L Y C|) + (terpri) + (repeat i 6 (princ-/. (arraycall t scorecard i))) + (princ '| |) + (do i 6 (1+ i) (= i 13) (princ-/. (arraycall t scorecard i))) + (terpri)) + +(defun princ-/. (frob) + (cond ((null frob) (princ '| .|)) + ((< frob 10) (princ '| |) (princ frob)) + (t (princ '| |) (princ frob)))) + +(defun sum-num (i roll) (* i (number-of i roll))) + +(defun num-kind (roll) + (do ((i 1 (1+ i)) + (j 0 (max (number-of i roll) j))) + ((> i 6) j))) + +(defun number-of (i roll) + (bind ((j <- 0)) + (mapc (fn (k) (if (= i k) (setq j (1+ j)))) roll) + j)) + +(defun nrow (roll) + (prog (i j k) + (setq i 1 j 0 k 0) + loop (setq j (if (= (number-of i roll) 0) 0 (1+ j))) + (setq k (max j k)) + (setq i (1+ i)) + (if (> i 6) (return k) (go loop)))) + +(defun sum-roll (roll) (apply (function +) roll)) + +(defun full-house? (roll) ;returns T for a YAHTZE. + (prog (i j) + (setq i 1 j 0) + loop (if (= (number-of i roll) 1) (return nil)) + (if (> (number-of i roll) 0) (setq j (1+ j))) + (setq i (1+ i)) + (if (> i 6) (return (< j 3)) (go loop))))