|
|
1.1 ! root 1: ;; Psychological help for frustrated users. ! 2: ;; Copyright (C) 1985 Sidney Markowitz and Richard M. Stallman ! 3: ! 4: ;; This file is part of GNU Emacs. ! 5: ! 6: ;; GNU Emacs is distributed in the hope that it will be useful, ! 7: ;; but WITHOUT ANY WARRANTY. No author or distributor ! 8: ;; accepts responsibility to anyone for the consequences of using it ! 9: ;; or for whether it serves any particular purpose or works at all, ! 10: ;; unless he says so in writing. Refer to the GNU Emacs General Public ! 11: ;; License for full details. ! 12: ! 13: ;; Everyone is granted permission to copy, modify and redistribute ! 14: ;; GNU Emacs, but only under the conditions described in the ! 15: ;; GNU Emacs General Public License. A copy of this license is ! 16: ;; supposed to have been given to you along with GNU Emacs so you ! 17: ;; can know your rights and responsibilities. It should be in a ! 18: ;; file named COPYING. Among other things, the copyright notice ! 19: ;; and this notice must be preserved on all copies. ! 20: ! 21: ! 22: (defun cadr (x) (car (cdr x))) ! 23: (defun caddr (x) (car (cdr (cdr x)))) ! 24: (defun cddr (x) (cdr (cdr x))) ! 25: ! 26: (defun member (x y) ! 27: "Like memq, but uses equal for comparison" ! 28: (while (and y (not (equal x (car y)))) ! 29: (setq y (cdr y))) ! 30: y) ! 31: ! 32: (defun random-range (top) ! 33: "Return a random nonnegative integer less than TOP." ! 34: (% (logand (random) 0777777) top)) ! 35: ! 36: (defun // (x) x) ! 37: ! 38: (defmacro $ (what) ! 39: "quoted arg form of doctor-$" ! 40: (list 'doctor-$ (list 'quote what))) ! 41: ! 42: (defun doctor-$ (what) ! 43: "Return the car of a list, rotating the list each time" ! 44: (let* ((vv (symbol-value what)) ! 45: (first (car vv)) ! 46: (ww (append (cdr vv) (list first)))) ! 47: (set what ww) ! 48: first)) ! 49: ! 50: (defvar doctor-mode-map nil) ! 51: (if doctor-mode-map ! 52: nil ! 53: (setq doctor-mode-map (make-sparse-keymap)) ! 54: (define-key doctor-mode-map "\n" 'doctor-read-print) ! 55: (define-key doctor-mode-map "\r" 'doctor-ret-or-read)) ! 56: ! 57: (defun doctor-mode () ! 58: "Major mode for running the Doctor (Eliza) program. ! 59: Like Text mode with Auto Fill mode ! 60: except that RET when point is after a newline, or LFD at any time, ! 61: reads the sentence before point, and prints the Doctor's answer." ! 62: (interactive) ! 63: (text-mode) ! 64: (make-doctor-variables) ! 65: (use-local-map doctor-mode-map) ! 66: (setq major-mode 'doctor-mode) ! 67: (setq mode-name "Doctor") ! 68: (turn-on-auto-fill) ! 69: (doctor-type '(i am the psychotherapist \. ! 70: ($ please) ($ describe) your ($ problems) \. ! 71: each time you are finished talking, type \R\E\T twice \.)) ! 72: (insert "\n")) ! 73: ! 74: (defun make-doctor-variables () ! 75: (make-local-variable 'monosyllables) ! 76: (setq monosyllables ! 77: " ! 78: Your attitude at the end of the session was wholly unacceptable. ! 79: Please try to come back next time with a willingness to speak more ! 80: freely. If you continue to refuse to talk openly, there is little ! 81: I can do to help! ! 82: ") ! 83: (make-local-variable 'typos) ! 84: (setq typos ! 85: (mapcar (function (lambda (x) ! 86: (put (car x) 'doctor-correction (cadr x)) ! 87: (put (cadr x) 'doctor-expansion (caddr x)) ! 88: (car x))) ! 89: '((theyll they\'ll (they will)) ! 90: (theyre they\'re (they are)) ! 91: (hes he\'s (he is)) ! 92: (he7s he\'s (he is)) ! 93: (im i\'m (you are)) ! 94: (i7m i\'m (you are)) ! 95: (isa is\ a (is a)) ! 96: (thier their (their)) ! 97: (dont don\'t (do not)) ! 98: (don7t don\'t (do not)) ! 99: (you7re you\'re (i am)) ! 100: (you7ve you\'ve (i have)) ! 101: (you7ll you\'ll (i will))))) ! 102: (make-local-variable 'found) ! 103: (setq found nil) ! 104: (make-local-variable 'owner) ! 105: (setq owner nil) ! 106: (make-local-variable 'history) ! 107: (setq history nil) ! 108: (make-local-variable '*debug*) ! 109: (setq *debug* nil) ! 110: (make-local-variable 'inter) ! 111: (setq inter ! 112: '((well\,) ! 113: (hmmm \.\.\.\ so\,) ! 114: (so) ! 115: (\.\.\.and) ! 116: (then))) ! 117: (make-local-variable 'continue) ! 118: (setq continue ! 119: '((continue) ! 120: (proceed) ! 121: (go on) ! 122: (keep going) )) ! 123: (make-local-variable 'relation) ! 124: (setq relation ! 125: '((your relationship with) ! 126: (something you remember about) ! 127: (your feelings toward) ! 128: (some experiences you have had with) ! 129: (how you feel about))) ! 130: (make-local-variable 'fears) ! 131: (setq fears '( (($ whysay) you are ($ afraidof) (// feared) \?) ! 132: (you seem terrified by (// feared) \.) ! 133: (when did you first feel ($ afraidof) (// feared) \?) )) ! 134: (make-local-variable 'sure) ! 135: (setq sure '((sure)(positive)(certain)(absolutely sure))) ! 136: (make-local-variable 'afraidof) ! 137: (setq afraidof '( (afraid of) (frightened by) (scared of) )) ! 138: (make-local-variable 'areyou) ! 139: (setq areyou '( (are you)(have you been)(have you been) )) ! 140: (make-local-variable 'isrelated) ! 141: (setq isrelated '( (has something to do with)(is related to) ! 142: (could be the reason for) (is caused by)(is because of))) ! 143: (make-local-variable 'arerelated) ! 144: (setq arerelated '((have something to do with)(are related to) ! 145: (could have caused)(could be the reason for) (are caused by) ! 146: (are because of))) ! 147: (make-local-variable 'moods) ! 148: (setq moods '( (($ areyou)(// found) often \?) ! 149: (what causes you to be (// found) \?) ! 150: (($ whysay) you are (// found) \?) )) ! 151: (make-local-variable 'maybe) ! 152: (setq maybe ! 153: '((maybe) ! 154: (perhaps) ! 155: (possibly))) ! 156: (make-local-variable 'whatwhen) ! 157: (setq whatwhen ! 158: '((what happened when) ! 159: (what would happen if))) ! 160: (make-local-variable 'hello) ! 161: (setq hello ! 162: '((how do you do \?) (hello \.) (howdy!) (hello \.) (hi \.) (hi there \.))) ! 163: (make-local-variable 'drnk) ! 164: (setq drnk ! 165: '((do you drink a lot of (// found) \?) ! 166: (do you get drunk often \?) ! 167: (($ describe) your drinking habits \.) )) ! 168: (make-local-variable 'drugs) ! 169: (setq drugs '( (do you use (// found) often \?)(($ areyou) ! 170: addicted to (// found) \?)(do you realize that drugs can ! 171: be very harmful \?)(($ maybe) you should try to quit using (// found) ! 172: \.))) ! 173: (make-local-variable 'whywant) ! 174: (setq whywant '( (($ whysay) (// subj) might ($ want) (// obj) \?) ! 175: (how does it feel to want \?) ! 176: (why should (// subj) get (// obj) \?) ! 177: (when did (// subj) first ($ want) (// obj) \?) ! 178: (($ areyou) obsessed with (// obj) \?) ! 179: (why should i give (// obj) to (// subj) \?) ! 180: (have you ever gotten (// obj) \?) )) ! 181: (make-local-variable 'canyou) ! 182: (setq canyou '((of course i can \.) ! 183: (why should i \?) ! 184: (what makes you think i would even want to \?) ! 185: (i am the doctor\, i can do anything i damn please \.) ! 186: (not really\, it\'s not up to me \.) ! 187: (depends\, how important is it \?) ! 188: (i could\, but i don\'t think it would be a wise thing to do \.) ! 189: (can you \?) ! 190: (maybe i can\, maybe i can\'t \.\.\.) ! 191: (i don\'t think i should do that \.))) ! 192: (make-local-variable 'want) ! 193: (setq want '( (want) (desire) (wish) (want) (hope) )) ! 194: (make-local-variable 'shortlst) ! 195: (setq shortlst ! 196: '((can you elaborate on that \?) ! 197: (($ please) continue \.) ! 198: (go on\, don\'t be afraid \.) ! 199: (i need a little more detail please \.) ! 200: (you\'re being a bit brief\, ($ please) go into detail \.) ! 201: (can you be more explicit \?) ! 202: (and \?) ! 203: (($ please) go into more detail \?) ! 204: (you aren\'t being very talkative today\!) ! 205: (is that all there is to it \?) ! 206: (why must you respond so briefly \?))) ! 207: ! 208: (make-local-variable 'famlst) ! 209: (setq famlst ! 210: '((tell me ($ something) about (// owner) family \.) ! 211: (you seem to dwell on (// owner) family \.) ! 212: (($ areyou) hung up on (// owner) family \?))) ! 213: (make-local-variable 'huhlst) ! 214: (setq huhlst ! 215: '((($ whysay)(// sent) \?) ! 216: (is it because of ($ things) that you say (// sent) \?) )) ! 217: (make-local-variable 'longhuhlst) ! 218: (setq longhuhlst ! 219: '((($ whysay) that \?) ! 220: (i don\'t understand \.) ! 221: (($ thlst)) ! 222: (($ areyou) ($ afraidof) that \?))) ! 223: (make-local-variable 'feelings) ! 224: (setq feelings-about ! 225: '((feelings about) ! 226: (aprehensions toward) ! 227: (thoughts on) ! 228: (emotions toward))) ! 229: (make-local-variable 'random) ! 230: (setq random-adjective ! 231: '((vivid) ! 232: (emotionally stimulating) ! 233: (exciting) ! 234: (boring) ! 235: (interesting) ! 236: (recent) ! 237: (random) ;How can we omit this? ! 238: (unusual) ! 239: (shocking) ! 240: (embarrassing))) ! 241: (make-local-variable 'whysay) ! 242: (setq whysay ! 243: '((why do you say) ! 244: (what makes you believe) ! 245: (are you sure that) ! 246: (do you really think) ! 247: (what makes you think) )) ! 248: (make-local-variable 'isee) ! 249: (setq isee ! 250: '((i see \.\.\.) ! 251: (yes\,) ! 252: (i understand \.) ! 253: (oh \.) )) ! 254: (make-local-variable 'please) ! 255: (setq please ! 256: '((please\,) ! 257: (i would appreciate it if you would) ! 258: (perhaps you could) ! 259: (please\,) ! 260: (would you please) ! 261: (why don\'t you) ! 262: (could you))) ! 263: (make-local-variable 'bye) ! 264: (setq bye ! 265: '((my secretary will send you a bill \.) ! 266: (bye bye \.) ! 267: (see ya \.) ! 268: (ok\, talk to you some other time \.) ! 269: (talk to you later \.) ! 270: (ok\, have fun \.) ! 271: (ciao \.))) ! 272: (make-local-variable 'something) ! 273: (setq something ! 274: '((something) ! 275: (more) ! 276: (how you feel))) ! 277: (make-local-variable 'things) ! 278: (setq things ! 279: '(;(your interests in computers) ;; let's make this less computer oriented ! 280: ;(the machines you use) ! 281: (your plans) ! 282: ;(your use of computers) ! 283: (your life) ! 284: ;(other machines you use) ! 285: (the people you hang around with) ! 286: ;(computers you like) ! 287: (problems at school) ! 288: (any hobbies you have) ! 289: ;(other computers you use) ! 290: (your sex life) ! 291: (hangups you have) ! 292: (your inhibitions) ! 293: (some problems in your childhood) ! 294: ;(knowledge of computers) ! 295: (some problems at home))) ! 296: (make-local-variable 'describe) ! 297: (setq describe ! 298: '((describe) ! 299: (tell me about) ! 300: (talk about) ! 301: (discuss) ! 302: (tell me more about) ! 303: (elaborate on))) ! 304: (make-local-variable 'ibelieve) ! 305: (setq ibelieve ! 306: '((i believe) (i think) (i have a feeling) (it seems to me that) ! 307: (it looks like))) ! 308: (make-local-variable 'problems) ! 309: (setq problems '( (problems) ! 310: (inhibitions) ! 311: (hangups) ! 312: (difficulties) ! 313: (anxieties) ! 314: (frustrations) )) ! 315: (make-local-variable 'bother) ! 316: (setq bother ! 317: '((does it bother you that) ! 318: (are you annoyed that) ! 319: (did you ever regret) ! 320: (are you sorry) ! 321: (are you satisfied with the fact that))) ! 322: (make-local-variable 'machlst) ! 323: (setq machlst ! 324: '((you have your mind on (// found) \, it seems \.) ! 325: (you think too much about (// found) \.) ! 326: (you should try taking your mind off of (// found)\.) ! 327: (are you a computer hacker \?))) ! 328: (make-local-variable 'qlist) ! 329: (setq qlist ! 330: '((what do you think \?) ! 331: (i\'ll ask the questions\, if you don\'t mind!) ! 332: (i could ask the same thing myself \.) ! 333: (($ please) allow me to do the questioning \.) ! 334: (i have asked myself that question many times \.) ! 335: (($ please) try to answer that question yourself \.))) ! 336: (make-local-variable 'elist) ! 337: (setq elist ! 338: '((($ please) try to calm yourself \.) ! 339: (you seem very excited \. relax \. ($ please) ($ describe) ($ things) ! 340: \.) ! 341: (you\'re being very emotional \. calm down \.))) ! 342: (make-local-variable 'foullst) ! 343: (setq foullst ! 344: '((($ please) watch your tongue!) ! 345: (($ please) avoid such unwholesome thoughts \.) ! 346: (($ please) get your mind out of the gutter \.) ! 347: (such lewdness is not appreciated \.))) ! 348: (make-local-variable 'deathlst) ! 349: (setq deathlst ! 350: '((this is not a healthy way of thinking \.) ! 351: (($ bother) you\, too\, may die someday \?) ! 352: (i am worried by your obssession with this topic!) ! 353: (did you watch a lot of crime and violence on television as a child \?)) ! 354: ) ! 355: (make-local-variable 'sexlst) ! 356: (setq sexlst ! 357: '((($ areyou) ($ afraidof) sex \?) ! 358: (($ describe)($ something) about your sexual history \.) ! 359: (($ please)($ describe) your sex life \.\.\.) ! 360: (($ describe) your ($ feelings-about) your sexual partner \.) ! 361: (($ describe) your most ($ random-adjective) sexual experience \.) ! 362: (($ areyou) satisfied with (// lover) \.\.\. \?))) ! 363: (make-local-variable 'neglst) ! 364: (setq neglst ! 365: '((why not \?) ! 366: (($ bother) i ask that \?) ! 367: (why not \?) ! 368: (why not \?) ! 369: (how come \?) ! 370: (($ bother) i ask that \?))) ! 371: (make-local-variable 'beclst) ! 372: (setq beclst '( ! 373: (is it because (// sent) that you came to me \?) ! 374: (($ bother)(// sent) \?) ! 375: (when did you first know that (// sent) \?) ! 376: (is the fact that (// sent) the real reason \?) ! 377: (does the fact that (// sent) explain anything else \?) ! 378: (($ areyou)($ sure)(// sent) \? ) )) ! 379: (make-local-variable 'shortbeclst) ! 380: (setq shortbeclst '( ! 381: (($ bother) i ask you that \?) ! 382: (that\'s not much of an answer!) ! 383: (($ inter) why won\'t you talk about it \?) ! 384: (speak up!) ! 385: (($ areyou) ($ afraidof) talking about it \?) ! 386: (don\'t be ($ afraidof) elaborating \.) ! 387: (($ please) go into more detail \.))) ! 388: (make-local-variable 'thlst) ! 389: (setq thlst '( ! 390: (($ maybe)($ things)($ arerelated) this \.) ! 391: (is it because of ($ things) that you are going through all this \?) ! 392: (how do you reconcile ($ things) \? ) ! 393: (($ maybe) this ($ isrelated)($ things) \?) )) ! 394: (make-local-variable 'remlst) ! 395: (setq remlst '( (earlier you said ($ history) \?) ! 396: (you mentioned that ($ history) \?) ! 397: (($ whysay)($ history) \? ) )) ! 398: (make-local-variable 'toklst) ! 399: (setq toklst ! 400: '((is this how you relax \?) ! 401: (how long have you been smoking grass \?) ! 402: (($ areyou) ($ afraidof) of being drawn to using harder stuff \?))) ! 403: (make-local-variable 'states) ! 404: (setq states ! 405: '((do you get (// found) often \?) ! 406: (do you enjoy being (// found) \?) ! 407: (what makes you (// found) \?) ! 408: (how often ($ areyou)(// found) \?) ! 409: (when were you last (// found) \?))) ! 410: (make-local-variable 'replist) ! 411: (setq replist ! 412: '((i . (you)) ! 413: (my . (your)) ! 414: (me . (you)) ! 415: (you . (me)) ! 416: (your . (my)) ! 417: (mine . (yours)) ! 418: (yours . (mine)) ! 419: (our . (your)) ! 420: (ours . (yours)) ! 421: (we . (you)) ! 422: (dunno . (do not know)) ! 423: ;; (yes . ()) ! 424: (no\, . ()) ! 425: (yes\, . ()) ! 426: (ya . (i)) ! 427: (aint . (am not)) ! 428: (wanna . (want to)) ! 429: (gimme . (give me)) ! 430: (gotta . (have to)) ! 431: (gonna . (going to)) ! 432: (never . (not ever)) ! 433: (doesn\'t . (does not)) ! 434: (don\'t . (do not)) ! 435: (aren\'t . (are not)) ! 436: (isn\'t . (is not)) ! 437: (won\'t . (will not)) ! 438: (can\'t . (cannot)) ! 439: (haven\'t . (have not)) ! 440: (i\'m . (you are)) ! 441: (ourselves . (yourselves)) ! 442: (myself . (yourself)) ! 443: (yourself . (myself)) ! 444: (you\'re . (i am)) ! 445: (you\'ve . (i have)) ! 446: (i\'ve . (you have)) ! 447: (i\'ll . (you will)) ! 448: (you\'ll . (i shall)) ! 449: (i\'d . (you would)) ! 450: (you\'d . (i would)) ! 451: (here . (there)) ! 452: (please . ()) ! 453: (eh\, . ()) ! 454: (eh . ()) ! 455: (oh\, . ()) ! 456: (oh . ()) ! 457: (shouldn\'t . (should not)) ! 458: (wouldn\'t . (would not)) ! 459: (won\'t . (will not)) ! 460: (hasn\'t . (has not)))) ! 461: (make-local-variable 'stallmanlst) ! 462: (setq stallmanlst '( ! 463: (($ describe) your ($ feelings-about) him \.) ! 464: (($ areyou) a friend of Stallman \?) ! 465: (($ bother) Stallman is ($ random-adjective) \?) ! 466: (($ ibelieve) you are ($ afraidof) him \.))) ! 467: (make-local-variable 'schoollst) ! 468: (setq schoollst '( ! 469: (($ describe) your (// found) \.) ! 470: (($ bother) your grades could ($ improve) \?) ! 471: (($ areyou) ($ afraidof) (// found) \?) ! 472: (($ maybe) this ($ isrelated) to your attitude \.) ! 473: (($ areyou) absent often \?) ! 474: (($ maybe) you should study ($ something) \.))) ! 475: (make-local-variable 'improve) ! 476: (setq improve '((improve) (be better) (be improved) (be higher))) ! 477: (make-local-variable 'elizalst) ! 478: (setq elizalst '( ! 479: (($ areyou) ($ sure) \?) ! 480: (($ ibelieve) you have ($ problems) with (// found) \.) ! 481: (($ whysay) (// sent) \?))) ! 482: (make-local-variable 'sportslst) ! 483: (setq sportslst '( ! 484: (tell me ($ something) about (// found) \.) ! 485: (($ describe) ($ relation) (// found) \.) ! 486: (do you find (// found) ($ random-adjective) \?))) ! 487: (make-local-variable 'mathlst) ! 488: (setq mathlst '( ! 489: (($ describe) ($ something) about math \.) ! 490: (($ maybe) your ($ problems) ($ arerelated) (// found) \.) ! 491: (i do\'nt know much (// found) \, but ($ continue) ! 492: anyway \.))) ! 493: (make-local-variable 'zippylst) ! 494: (setq zippylst '( ! 495: (($ areyou) Zippy \?) ! 496: (($ ibelieve) you have some serious ($ problems) \.) ! 497: (($ bother) you are a pinhead \?))) ! 498: (make-local-variable 'chatlst) ! 499: (setq chatlst '( ! 500: (($ maybe) we could chat \.) ! 501: (($ please) ($ describe) ($ something) about chat mode \.) ! 502: (($ bother) our discussion is so ($ random-adjective) \?))) ! 503: (make-local-variable 'abuselst) ! 504: (setq abuselst '( ! 505: (($ please) try to be less abusive \.) ! 506: (($ describe) why you call me (// found) \.) ! 507: (i\'ve had enough of you!))) ! 508: (make-local-variable 'abusewords) ! 509: (setq abusewords '(boring bozo clown clumsy cretin dumb dummy ! 510: fool foolish gnerd gnurd idiot jerk ! 511: lose loser louse lousy luse luser ! 512: moron nerd nurd oaf oafish reek ! 513: stink stupid tool toolish twit)) ! 514: (make-local-variable 'howareyoulst) ! 515: (setq howareyoulst '((how are you) (hows it going) (hows it going eh) ! 516: (how\'s it going) (how\'s it going eh) (how goes it) ! 517: (whats up) (whats new) (what\'s up) (what\'s new) ! 518: (howre you) (how\'re you) (how\'s everything) ! 519: (how is everything) (how do you do) ! 520: (how\'s it hanging) (que pasa) ! 521: (how are you doing) (what do you say))) ! 522: (make-local-variable 'whereoutp) ! 523: (setq whereoutp '( huh remem rthing ) ) ! 524: (make-local-variable 'subj) ! 525: (setq subj nil) ! 526: (make-local-variable 'verb) ! 527: (setq verb nil) ! 528: (make-local-variable 'obj) ! 529: (setq obj nil) ! 530: (make-local-variable 'feared) ! 531: (setq feared nil) ! 532: (make-local-variable 'observation-list) ! 533: (setq observation-list nil) ! 534: (make-local-variable 'repetitive-shortness) ! 535: (setq repetitive-shortness '(0 . 0)) ! 536: (make-local-variable '**mad**) ! 537: (setq **mad** nil) ! 538: (make-local-variable 'rms-flag) ! 539: (setq rms-flag nil) ! 540: (make-local-variable 'eliza-flag) ! 541: (setq eliza-flag nil) ! 542: (make-local-variable 'zippy-flag) ! 543: (setq zippy-flag nil) ! 544: (make-local-variable 'lover) ! 545: (setq lover '(your partner)) ! 546: (make-local-variable 'bak) ! 547: (setq bak nil) ! 548: (make-local-variable 'lincount) ! 549: (setq lincount 0) ! 550: (make-local-variable '*print-upcase*) ! 551: (setq *print-upcase* nil) ! 552: (make-local-variable '*print-space*) ! 553: (setq *print-space* nil) ! 554: (make-local-variable 'howdyflag) ! 555: (setq howdyflag nil) ! 556: (make-local-variable 'object) ! 557: (setq object nil)) ! 558: ! 559: ;; Define equivalence classes of words that get treated alike. ! 560: ! 561: (defun doctor-meaning (x) (get x 'doctor-meaning)) ! 562: ! 563: (defmacro doctor-put-meaning (symb val) ! 564: "Store the base meaning of a word on the property list" ! 565: (list 'put (list 'quote symb) ''doctor-meaning val)) ! 566: ! 567: (doctor-put-meaning howdy 'howdy) ! 568: (doctor-put-meaning hi 'howdy) ! 569: (doctor-put-meaning greetings 'howdy) ! 570: (doctor-put-meaning hello 'howdy) ! 571: (doctor-put-meaning tops20 'mach) ! 572: (doctor-put-meaning tops-20 'mach) ! 573: (doctor-put-meaning tops 'mach) ! 574: (doctor-put-meaning pdp11 'mach) ! 575: (doctor-put-meaning computer 'mach) ! 576: (doctor-put-meaning unix 'mach) ! 577: (doctor-put-meaning machine 'mach) ! 578: (doctor-put-meaning computers 'mach) ! 579: (doctor-put-meaning machines 'mach) ! 580: (doctor-put-meaning pdp11s 'mach) ! 581: (doctor-put-meaning foo 'mach) ! 582: (doctor-put-meaning foobar 'mach) ! 583: (doctor-put-meaning multics 'mach) ! 584: (doctor-put-meaning macsyma 'mach) ! 585: (doctor-put-meaning teletype 'mach) ! 586: (doctor-put-meaning la36 'mach) ! 587: (doctor-put-meaning vt52 'mach) ! 588: (doctor-put-meaning zork 'mach) ! 589: (doctor-put-meaning trek 'mach) ! 590: (doctor-put-meaning startrek 'mach) ! 591: (doctor-put-meaning advent 'mach) ! 592: (doctor-put-meaning pdp 'mach) ! 593: (doctor-put-meaning dec 'mach) ! 594: (doctor-put-meaning commodore 'mach) ! 595: (doctor-put-meaning vic 'mach) ! 596: (doctor-put-meaning bbs 'mach) ! 597: (doctor-put-meaning modem 'mach) ! 598: (doctor-put-meaning baud 'mach) ! 599: (doctor-put-meaning macintosh 'mach) ! 600: (doctor-put-meaning vax 'mach) ! 601: (doctor-put-meaning vms 'mach) ! 602: (doctor-put-meaning ibm 'mach) ! 603: (doctor-put-meaning pc 'mach) ! 604: (doctor-put-meaning bitching 'foul) ! 605: (doctor-put-meaning shit 'foul) ! 606: (doctor-put-meaning bastard 'foul) ! 607: (doctor-put-meaning damn 'foul) ! 608: (doctor-put-meaning damned 'foul) ! 609: (doctor-put-meaning hell 'foul) ! 610: (doctor-put-meaning suck 'foul) ! 611: (doctor-put-meaning sucking 'foul) ! 612: (doctor-put-meaning sux 'foul) ! 613: (doctor-put-meaning ass 'foul) ! 614: (doctor-put-meaning whore 'foul) ! 615: (doctor-put-meaning bitch 'foul) ! 616: (doctor-put-meaning asshole 'foul) ! 617: (doctor-put-meaning shrink 'foul) ! 618: (doctor-put-meaning pot 'toke) ! 619: (doctor-put-meaning grass 'toke) ! 620: (doctor-put-meaning weed 'toke) ! 621: (doctor-put-meaning marijuana 'toke) ! 622: (doctor-put-meaning acapulco 'toke) ! 623: (doctor-put-meaning columbian 'toke) ! 624: (doctor-put-meaning tokin 'toke) ! 625: (doctor-put-meaning joint 'toke) ! 626: (doctor-put-meaning toke 'toke) ! 627: (doctor-put-meaning toking 'toke) ! 628: (doctor-put-meaning tokin\' 'toke) ! 629: (doctor-put-meaning toked 'toke) ! 630: (doctor-put-meaning roach 'toke) ! 631: (doctor-put-meaning pills 'drug) ! 632: (doctor-put-meaning dope 'drug) ! 633: (doctor-put-meaning acid 'drug) ! 634: (doctor-put-meaning lsd 'drug) ! 635: (doctor-put-meaning speed 'drug) ! 636: (doctor-put-meaning heroine 'drug) ! 637: (doctor-put-meaning hash 'drug) ! 638: (doctor-put-meaning cocaine 'drug) ! 639: (doctor-put-meaning uppers 'drug) ! 640: (doctor-put-meaning downers 'drug) ! 641: (doctor-put-meaning loves 'loves) ! 642: (doctor-put-meaning love 'love) ! 643: (doctor-put-meaning loved 'love) ! 644: (doctor-put-meaning hates 'hates) ! 645: (doctor-put-meaning dislikes 'hates) ! 646: (doctor-put-meaning hate 'hate) ! 647: (doctor-put-meaning hated 'hate) ! 648: (doctor-put-meaning dislike 'hate) ! 649: (doctor-put-meaning stoned 'state) ! 650: (doctor-put-meaning drunk 'state) ! 651: (doctor-put-meaning drunken 'state) ! 652: (doctor-put-meaning high 'state) ! 653: (doctor-put-meaning horny 'state) ! 654: (doctor-put-meaning blasted 'state) ! 655: (doctor-put-meaning happy 'state) ! 656: (doctor-put-meaning paranoid 'state) ! 657: (doctor-put-meaning wish 'desire) ! 658: (doctor-put-meaning wishes 'desire) ! 659: (doctor-put-meaning want 'desire) ! 660: (doctor-put-meaning desire 'desire) ! 661: (doctor-put-meaning like 'desire) ! 662: (doctor-put-meaning hope 'desire) ! 663: (doctor-put-meaning hopes 'desire) ! 664: (doctor-put-meaning desires 'desire) ! 665: (doctor-put-meaning wants 'desire) ! 666: (doctor-put-meaning desires 'desire) ! 667: (doctor-put-meaning likes 'desire) ! 668: (doctor-put-meaning needs 'desire) ! 669: (doctor-put-meaning need 'desire) ! 670: (doctor-put-meaning frustrated 'mood) ! 671: (doctor-put-meaning depressed 'mood) ! 672: (doctor-put-meaning annoyed 'mood) ! 673: (doctor-put-meaning upset 'mood) ! 674: (doctor-put-meaning unhappy 'mood) ! 675: (doctor-put-meaning excited 'mood) ! 676: (doctor-put-meaning worried 'mood) ! 677: (doctor-put-meaning lonely 'mood) ! 678: (doctor-put-meaning angry 'mood) ! 679: (doctor-put-meaning mad 'mood) ! 680: (doctor-put-meaning pissed 'mood) ! 681: (doctor-put-meaning jealous 'mood) ! 682: (doctor-put-meaning afraid 'fear) ! 683: (doctor-put-meaning terrified 'fear) ! 684: (doctor-put-meaning fear 'fear) ! 685: (doctor-put-meaning scared 'fear) ! 686: (doctor-put-meaning frightened 'fear) ! 687: (doctor-put-meaning virginity 'sexnoun) ! 688: (doctor-put-meaning virgins 'sexnoun) ! 689: (doctor-put-meaning virgin 'sexnoun) ! 690: (doctor-put-meaning cock 'sexnoun) ! 691: (doctor-put-meaning cocks 'sexnoun) ! 692: (doctor-put-meaning dick 'sexnoun) ! 693: (doctor-put-meaning dicks 'sexnoun) ! 694: (doctor-put-meaning cunt 'sexnoun) ! 695: (doctor-put-meaning cunts 'sexnoun) ! 696: (doctor-put-meaning prostitute 'sexnoun) ! 697: (doctor-put-meaning condom 'sexnoun) ! 698: (doctor-put-meaning sex 'sexnoun) ! 699: (doctor-put-meaning rapes 'sexnoun) ! 700: (doctor-put-meaning wife 'family) ! 701: (doctor-put-meaning family 'family) ! 702: (doctor-put-meaning brothers 'family) ! 703: (doctor-put-meaning sisters 'family) ! 704: (doctor-put-meaning parent 'family) ! 705: (doctor-put-meaning parents 'family) ! 706: (doctor-put-meaning brother 'family) ! 707: (doctor-put-meaning sister 'family) ! 708: (doctor-put-meaning father 'family) ! 709: (doctor-put-meaning mother 'family) ! 710: (doctor-put-meaning husband 'family) ! 711: (doctor-put-meaning siblings 'family) ! 712: (doctor-put-meaning grandmother 'family) ! 713: (doctor-put-meaning grandfather 'family) ! 714: (doctor-put-meaning maternal 'family) ! 715: (doctor-put-meaning paternal 'family) ! 716: (doctor-put-meaning stab 'death) ! 717: (doctor-put-meaning murder 'death) ! 718: (doctor-put-meaning murders 'death) ! 719: (doctor-put-meaning suicide 'death) ! 720: (doctor-put-meaning suicides 'death) ! 721: (doctor-put-meaning kill 'death) ! 722: (doctor-put-meaning kills 'death) ! 723: (doctor-put-meaning die 'death) ! 724: (doctor-put-meaning dies 'death) ! 725: (doctor-put-meaning died 'death) ! 726: (doctor-put-meaning dead 'death) ! 727: (doctor-put-meaning death 'death) ! 728: (doctor-put-meaning deaths 'death) ! 729: (doctor-put-meaning pain 'symptoms) ! 730: (doctor-put-meaning ache 'symptoms) ! 731: (doctor-put-meaning fever 'symptoms) ! 732: (doctor-put-meaning sore 'symptoms) ! 733: (doctor-put-meaning aching 'symptoms) ! 734: (doctor-put-meaning stomachache 'symptoms) ! 735: (doctor-put-meaning headache 'symptoms) ! 736: (doctor-put-meaning hurts 'symptoms) ! 737: (doctor-put-meaning disease 'symptoms) ! 738: (doctor-put-meaning virus 'symptoms) ! 739: (doctor-put-meaning vomit 'symptoms) ! 740: (doctor-put-meaning vomiting 'symptoms) ! 741: (doctor-put-meaning barf 'symptoms) ! 742: (doctor-put-meaning toothache 'symptoms) ! 743: (doctor-put-meaning hurt 'symptoms) ! 744: (doctor-put-meaning rum 'alcohol) ! 745: (doctor-put-meaning gin 'alcohol) ! 746: (doctor-put-meaning vodka 'alcohol) ! 747: (doctor-put-meaning alcohol 'alcohol) ! 748: (doctor-put-meaning bourbon 'alcohol) ! 749: (doctor-put-meaning beer 'alcohol) ! 750: (doctor-put-meaning wine 'alcohol) ! 751: (doctor-put-meaning whiskey 'alcohol) ! 752: (doctor-put-meaning scotch 'alcohol) ! 753: (doctor-put-meaning fuck 'sexverb) ! 754: (doctor-put-meaning fucked 'sexverb) ! 755: (doctor-put-meaning screw 'sexverb) ! 756: (doctor-put-meaning screwing 'sexverb) ! 757: (doctor-put-meaning fucking 'sexverb) ! 758: (doctor-put-meaning rape 'sexverb)4 ! 759: (doctor-put-meaning raped 'sexverb) ! 760: (doctor-put-meaning kiss 'sexverb) ! 761: (doctor-put-meaning kissing 'sexverb) ! 762: (doctor-put-meaning kisses 'sexverb) ! 763: (doctor-put-meaning screws 'sexverb) ! 764: (doctor-put-meaning fucks 'sexverb) ! 765: (doctor-put-meaning because 'conj) ! 766: (doctor-put-meaning but 'conj) ! 767: (doctor-put-meaning however 'conj) ! 768: (doctor-put-meaning besides 'conj) ! 769: (doctor-put-meaning anyway 'conj) ! 770: (doctor-put-meaning that 'conj) ! 771: (doctor-put-meaning except 'conj) ! 772: (doctor-put-meaning why 'conj) ! 773: (doctor-put-meaning how 'conj) ! 774: (doctor-put-meaning until 'when) ! 775: (doctor-put-meaning when 'when) ! 776: (doctor-put-meaning whenever 'when) ! 777: (doctor-put-meaning while 'when) ! 778: (doctor-put-meaning since 'when) ! 779: (doctor-put-meaning rms 'rms) ! 780: (doctor-put-meaning stallman 'rms) ! 781: (doctor-put-meaning school 'school) ! 782: (doctor-put-meaning schools 'school) ! 783: (doctor-put-meaning skool 'school) ! 784: (doctor-put-meaning grade 'school) ! 785: (doctor-put-meaning grades 'school) ! 786: (doctor-put-meaning teacher 'school) ! 787: (doctor-put-meaning teachers 'school) ! 788: (doctor-put-meaning classes 'school) ! 789: (doctor-put-meaning professor 'school) ! 790: (doctor-put-meaning prof 'school) ! 791: (doctor-put-meaning profs 'school) ! 792: (doctor-put-meaning professors 'school) ! 793: (doctor-put-meaning mit 'school) ! 794: (doctor-put-meaning emacs 'eliza) ! 795: (doctor-put-meaning eliza 'eliza) ! 796: (doctor-put-meaning liza 'eliza) ! 797: (doctor-put-meaning elisa 'eliza) ! 798: (doctor-put-meaning weizenbaum 'eliza) ! 799: (doctor-put-meaning doktor 'eliza) ! 800: (doctor-put-meaning atheletics 'sports) ! 801: (doctor-put-meaning baseball 'sports) ! 802: (doctor-put-meaning basketball 'sports) ! 803: (doctor-put-meaning football 'sports) ! 804: (doctor-put-meaning frisbee 'sports) ! 805: (doctor-put-meaning gym 'sports) ! 806: (doctor-put-meaning gymnastics 'sports) ! 807: (doctor-put-meaning hockey 'sports) ! 808: (doctor-put-meaning lacrosse 'sports) ! 809: (doctor-put-meaning soccer 'sports) ! 810: (doctor-put-meaning softball 'sports) ! 811: (doctor-put-meaning sports 'sports) ! 812: (doctor-put-meaning swimming 'sports) ! 813: (doctor-put-meaning swim 'sports) ! 814: (doctor-put-meaning tennis 'sports) ! 815: (doctor-put-meaning volleyball 'sports) ! 816: (doctor-put-meaning math 'math) ! 817: (doctor-put-meaning mathematics 'math) ! 818: (doctor-put-meaning mathematical 'math) ! 819: (doctor-put-meaning theorem 'math) ! 820: (doctor-put-meaning axiom 'math) ! 821: (doctor-put-meaning lemma 'math) ! 822: (doctor-put-meaning algebra 'math) ! 823: (doctor-put-meaning algebraic 'math) ! 824: (doctor-put-meaning trig 'math) ! 825: (doctor-put-meaning trigonometry 'math) ! 826: (doctor-put-meaning trigonometric 'math) ! 827: (doctor-put-meaning geometry 'math) ! 828: (doctor-put-meaning geometric 'math) ! 829: (doctor-put-meaning calculus 'math) ! 830: (doctor-put-meaning arithmetic 'math) ! 831: (doctor-put-meaning zippy 'zippy) ! 832: (doctor-put-meaning zippy 'zippy) ! 833: (doctor-put-meaning pinhead 'zippy) ! 834: (doctor-put-meaning chat 'chat) ! 835: ! 836: (defun doctor () ! 837: "Switch to *doctor* buffer and start giving psychotherapy." ! 838: (interactive) ! 839: (switch-to-buffer "*doctor*") ! 840: (doctor-mode)) ! 841: ! 842: (defun doctor-ret-or-read (arg) ! 843: "Insert a newline if preceding character is not a newline, ! 844: Otherwise call the Doctor to parse preceding sentence" ! 845: (interactive "*p") ! 846: (if (= (preceding-char) ?\n) ! 847: (doctor-read-print) ! 848: (newline arg))) ! 849: ! 850: (defun doctor-read-print nil ! 851: "top level loop" ! 852: (interactive) ! 853: (let ((sent (doctor-readin))) ! 854: (insert "\n") ! 855: (setq lincount (1+ lincount)) ! 856: (doctor-doc sent) ! 857: (insert "\n") ! 858: (setq bak sent))) ! 859: ! 860: (defun doctor-readin nil ! 861: "Read a sentence. Return it as a list of words" ! 862: (let (sentence) ! 863: (backward-sentence 1) ! 864: (while (not (eobp)) ! 865: (setq sentence (append sentence (list (doctor-read-token))))) ! 866: sentence)) ! 867: ! 868: (defun doctor-read-token () ! 869: "read one word from buffer" ! 870: (prog1 (intern (downcase (buffer-substring (dot) ! 871: (progn ! 872: (forward-word 1) ! 873: (dot))))) ! 874: (re-search-forward "\\Sw*"))) ! 875: ! 876: ;; Main processing function for sentences that have been read. ! 877: ! 878: (defun doctor-doc (sent) ! 879: (cond ! 880: ((equal sent '(foo)) ! 881: (doctor-type '(bar! ($ please)($ continue)))) ! 882: ((member sent howareyoulst) ! 883: (doctor-type '(i\'m ok \. ($ describe) yourself \.))) ! 884: ((or (member sent '((good bye) (see you later) (i quit) (so long) ! 885: (go away) (get lost))) ! 886: (memq (car sent) ! 887: '(bye halt break quit done exit goodbye ! 888: bye\, stop pause goodbye\, stop pause))) ! 889: (doctor-type ($ bye))) ! 890: ((and (eq (car sent) 'you) ! 891: (memq (cadr sent) abusewords)) ! 892: (setq found (cadr sent)) ! 893: (doctor-type ($ abuselst))) ! 894: ((eq (car sent) 'whatmeans) ! 895: (doctor-def (cadr sent))) ! 896: ((equal sent '(parse)) ! 897: (doctor-type (list 'subj '= subj ", " ! 898: 'verb '= verb "\n" ! 899: 'object 'phrase '= obj "," ! 900: 'noun 'form '= object "\n" ! 901: 'current 'keyword 'is found ! 902: ", " ! 903: 'most 'recent 'possessive ! 904: 'is owner "\n" ! 905: 'sentence 'used 'was ! 906: "..." ! 907: '(// bak)))) ! 908: ;; ((eq (car sent) 'forget) ! 909: ;; (set (cadr sent) nil) ! 910: ;; (doctor-type '(($ isee)($ please) ! 911: ;; ($ continue)\.))) ! 912: (t ! 913: (if (doctor-defq sent) (doctor-define sent found)) ! 914: (if (> (length sent) 12)(doctor-shorten sent)) ! 915: (setq sent (doctor-correct-spelling (doctor-replace sent replist))) ! 916: (cond ((and (not (memq 'me sent))(not (memq 'i sent)) ! 917: (memq 'am sent)) ! 918: (setq sent (doctor-replace sent '((am . (are))))))) ! 919: (cond ((equal (car sent) 'yow) (doctor-zippy)) ! 920: ((< (length sent) 2) ! 921: (cond ((eq (doctor-meaning (car sent)) 'howdy) ! 922: (doctor-howdy)) ! 923: (t (doctor-short)))) ! 924: (t ! 925: (if (memq 'am sent) ! 926: (setq sent (doctor-replace sent '((me . (i)))))) ! 927: (setq sent (doctor-fixup sent)) ! 928: (if (and (eq (car sent) 'do) (eq (cadr sent) 'not)) ! 929: (cond ((zerop (random-range 3)) ! 930: (doctor-type '(are you ($ afraidof) that \?))) ! 931: ((zerop (random-range 2)) ! 932: (doctor-type '(don\'t tell me what to do \. i am the ! 933: psychiatrist here!)) ! 934: (doctor-rthing)) ! 935: (t ! 936: (doctor-type '(($ whysay) that i shouldn\'t ! 937: (cddr sent) ! 938: \?)))) ! 939: (doctor-go (doctor-wherego sent)))))))) ! 940: ! 941: ;; Things done to process sentences once read. ! 942: ! 943: (defun doctor-correct-spelling (sent) ! 944: "correct the spelling and expand each word in sentence" ! 945: (if sent ! 946: (apply 'append (mapcar '(lambda (word) ! 947: (if (memq word typos) ! 948: (get (get word 'doctor-correction) 'doctor-expansion) ! 949: (list word))) ! 950: sent)))) ! 951: ! 952: (defun doctor-shorten (sent) ! 953: "Make a sentence managably short using a few hacks" ! 954: (let (foo ! 955: retval ! 956: (temp '(because but however besides anyway until ! 957: while that except why how))) ! 958: (while temp ! 959: (setq foo (memq (car temp) sent)) ! 960: (if (and foo ! 961: (> (length foo) 3)) ! 962: (setq sent foo ! 963: sent (doctor-fixup sent) ! 964: temp nil ! 965: retval t) ! 966: (setq temp (cdr temp)))) ! 967: retval)) ! 968: ! 969: (defun doctor-define (sent found) ! 970: (doctor-svo sent found 1 nil) ! 971: (and ! 972: (doctor-nounp subj) ! 973: (not (doctor-pronounp subj)) ! 974: subj ! 975: (doctor-meaning object) ! 976: (put subj 'doctor-meaning (doctor-meaning object)) ! 977: t)) ! 978: ! 979: (defun doctor-defq (sent) ! 980: "Set global var found to first keyword found in sentence SENT" ! 981: (setq found nil) ! 982: (let ((temp '(means applies mean refers refer related ! 983: similar defined associated linked like same))) ! 984: (while temp ! 985: (if (memq (car temp) sent) ! 986: (setq found (car temp) ! 987: temp nil) ! 988: (setq temp (cdr temp))))) ! 989: found) ! 990: ! 991: (defun doctor-def (x) ! 992: (progn ! 993: (doctor-type (list 'the 'word x 'means (doctor-meaning x) 'to 'me)) ! 994: nil)) ! 995: ! 996: (defun doctor-forget () ! 997: "Delete the last element of the history list" ! 998: (setq history (reverse (cdr (reverse history))))) ! 999: ! 1000: (defun doctor-query (x) ! 1001: "Prompt for a line of input from the minibuffer until a noun or a ! 1002: verb word is seen. Put dialogue in buffer." ! 1003: (let (a ! 1004: (prompt (concat (doctor-make-string x) ! 1005: " what \? ")) ! 1006: retval) ! 1007: (while (not retval) ! 1008: (while (not a) ! 1009: (insert ?\n ! 1010: prompt ! 1011: (read-string prompt) ! 1012: ?\n) ! 1013: (setq a (doctor-readin))) ! 1014: (while (and a (not retval)) ! 1015: (cond ((doctor-nounp (car a)) ! 1016: (setq retval (car a))) ! 1017: ((doctor-verbp (car a)) ! 1018: (setq retval (doctor-build ! 1019: (doctor-build x " ") ! 1020: (car a)))) ! 1021: ((setq a (cdr a)))))) ! 1022: retval)) ! 1023: ! 1024: (defun doctor-subjsearch (sent key type) ! 1025: "Search for the subject of a sentence SENT, looking for the noun closest to ! 1026: and preceding KEY by at least TYPE words. Set global variable subj to the ! 1027: subject noun, and return the portion of the sentence following it" ! 1028: (let ((i (- (length sent) (length (memq key sent)) type))) ! 1029: (while (and (> i -1) (not (doctor-nounp (nth i sent)))) ! 1030: (setq i (1- i))) ! 1031: (cond ((> i -1) ! 1032: (setq subj (nth i sent)) ! 1033: (nthcdr (1+ i) sent)) ! 1034: (t ! 1035: (setq subj 'you) ! 1036: nil)))) ! 1037: ! 1038: (defun doctor-nounp (x) ! 1039: "Returns t if the symbol argument is a noun" ! 1040: (or (doctor-pronounp x) ! 1041: (not (or (doctor-verbp x) ! 1042: (equal x 'not) ! 1043: (doctor-prepp x) ! 1044: (doctor-modifierp x) )) )) ! 1045: ! 1046: (defun doctor-pronounp (x) ! 1047: "Returns t if the symbol argument is a pronoun" ! 1048: (memq x '( ! 1049: i me mine myself ! 1050: we us ours ourselves ourself ! 1051: you yours yourself yourselves ! 1052: he him himself she hers herself ! 1053: it that those this these things thing ! 1054: they them themselves theirs ! 1055: anybody everybody somebody ! 1056: anyone everyone someone ! 1057: anything something everything))) ! 1058: ! 1059: (mapcar (function (lambda (x) (put x 'doctor-sentence-type 'verb))) ! 1060: '(abort aborted aborts ask asked asks am ! 1061: applied applies apply are associate ! 1062: associated ate ! 1063: be became become becomes becoming ! 1064: been being believe belived believes ! 1065: bit bite bites bore bored bores boring bought buy buys buying ! 1066: call called calling calls came can caught catch come ! 1067: contract contracted contracts control controlled controls ! 1068: could croak croaks croaked cut cuts ! 1069: dare dared define defines dial dialed dials did die died dies ! 1070: dislike disliked ! 1071: dislikes do does drank drink drinks drinking ! 1072: drive drives driving drove dying ! 1073: eat eating eats expand expanded expands ! 1074: expect expected expects expel expels expeled expelled ! 1075: explain explained explains ! 1076: fart farts feel feels felt fight fights find finds finding ! 1077: forget forgets forgot fought found fuck fucked ! 1078: fucking fucks ! 1079: gave get gets getting give gives go goes going gone got gotten ! 1080: had harm harms has hate hated hates have having ! 1081: hear heard hears hearing help helped helping helps ! 1082: hit hits hope hoped hopes hurt hurts ! 1083: implies imply is ! 1084: join joined joins jump jumped jumps ! 1085: keep keeping keeps kept ! 1086: kill killed killing kills kiss kissed kisses kissing ! 1087: knew know knows ! 1088: laid lay lays let lets lie lied lies like liked likes ! 1089: liking listen listens ! 1090: login look looked looking looks ! 1091: lose losing lost ! 1092: love loved loves loving ! 1093: luse lusing lust lusts ! 1094: made make makes making may mean means meant might ! 1095: move moved moves moving must ! 1096: need needed needs ! 1097: order ordered orders ought ! 1098: paid pay pays pick picked picking picks ! 1099: placed placing prefer prefers put puts ! 1100: ran rape raped rapes ! 1101: read reading reads recall receive received receives ! 1102: refer refered referred refers ! 1103: relate related relates remember remembered remembers ! 1104: romp romped romps run running runs ! 1105: said sang sat saw say says ! 1106: screw screwed screwing screws scrod see sees seem seemed ! 1107: seems seen sell selling sells ! 1108: send sendind sends sent shall shoot shot should ! 1109: sing sings sit sits sitting sold studied study ! 1110: take takes taking talk talked talking talks tell tells telling ! 1111: think thinks ! 1112: thought told took tooled touch touched touches touching ! 1113: transfer transfered transfers transmit transmits transmitted ! 1114: type types types typing ! 1115: walk walked walking walks want wanted wants was watch ! 1116: watched watching went were will wish would work worked works ! 1117: write writes writing wrote use used uses using)) ! 1118: ! 1119: (defun doctor-verbp (x) (if (symbolp x) ! 1120: (eq (get x 'doctor-sentence-type) 'verb))) ! 1121: ! 1122: (defun doctor-plural (x) ! 1123: "form the plural of the word argument" ! 1124: (let ((foo (doctor-make-string x))) ! 1125: (cond ((string-equal (substring foo -1) "s") ! 1126: (cond ((string-equal (substring foo -2 -1) "s") ! 1127: (intern (concat foo "es"))) ! 1128: (t x))) ! 1129: ((string-equal (substring foo -1) "y") ! 1130: (intern (concat (substring foo 0 -1) ! 1131: "ies"))) ! 1132: (t (intern (concat foo "s")))))) ! 1133: ! 1134: (defun doctor-setprep (sent key) ! 1135: (let ((val) ! 1136: (foo (memq key sent))) ! 1137: (cond ((doctor-prepp (cadr foo)) ! 1138: (setq val (doctor-getnoun (cddr foo))) ! 1139: (cond (val val) ! 1140: (t 'something))) ! 1141: ((doctor-articlep (cadr foo)) ! 1142: (setq val (doctor-getnoun (cddr foo))) ! 1143: (cond (val (doctor-build (doctor-build (cadr foo) " ") val)) ! 1144: (t 'something))) ! 1145: (t 'something)))) ! 1146: ! 1147: (defun doctor-getnoun (x) ! 1148: (cond ((null x)(setq object 'something)) ! 1149: ((atom x)(setq object x)) ! 1150: ((eq (length x) 1) ! 1151: (setq object (cond ! 1152: ((doctor-nounp (setq object (car x))) object) ! 1153: (t (doctor-query object))))) ! 1154: ((eq (car x) 'to) ! 1155: (doctor-build 'to\ (doctor-getnoun (cdr x)))) ! 1156: ((doctor-prepp (car x)) ! 1157: (doctor-getnoun (cdr x))) ! 1158: ((not (doctor-nounp (car x))) ! 1159: (doctor-build (doctor-build (cdr (assq (car x) ! 1160: (append ! 1161: '((a . this) ! 1162: (some . this) ! 1163: (one . that)) ! 1164: (list ! 1165: (cons ! 1166: (car x) (car x)))))) ! 1167: " ") ! 1168: (doctor-getnoun (cdr x)))) ! 1169: (t (setq object (car x))) )) ! 1170: ! 1171: (defun doctor-modifierp (x) ! 1172: (or (doctor-adjectivep x) ! 1173: (doctor-adverbp x) ! 1174: (doctor-othermodifierp x))) ! 1175: ! 1176: (defun doctor-adjectivep (x) ! 1177: (or (numberp x) ! 1178: (doctor-nmbrp x) ! 1179: (doctor-articlep x) ! 1180: (doctor-colorp x) ! 1181: (doctor-sizep x) ! 1182: (doctor-possessivepronounp x))) ! 1183: ! 1184: (defun doctor-adverbp (xx) ! 1185: (string-equal (substring (doctor-make-string xx) -2) "ly")) ! 1186: ! 1187: (defun doctor-articlep (x) ! 1188: (memq x '(the a an))) ! 1189: ! 1190: (defun doctor-nmbrp (x) ! 1191: (memq x '(one two three four five six seven eight nine ten ! 1192: eleven twelve thirteen fourteen fifteen ! 1193: sixteen seventeen eighteen nineteen ! 1194: twenty thirty forty fifty sixty seventy eighty ninety ! 1195: hundred thousand million billion ! 1196: half quarter ! 1197: first second third fourth fifth ! 1198: sixth seventh eighth nineth tenth))) ! 1199: ! 1200: (defun doctor-colorp (x) ! 1201: (memq x '(beige black blue brown crimson ! 1202: gray grey green ! 1203: orange pink purple red tan tawny ! 1204: violet white yellow))) ! 1205: ! 1206: (defun doctor-sizep (x) ! 1207: (memq x '(big large tall fat wide thick ! 1208: small petite short thin skinny))) ! 1209: ! 1210: (defun doctor-possessivepronounp (x) ! 1211: (memq x '(my your his her our their))) ! 1212: ! 1213: (defun doctor-othermodifierp (x) ! 1214: (memq x '(all also always amusing any anyway associated awesome ! 1215: bad beautiful best better but certain clear ! 1216: ever every fantastic fun funny ! 1217: good great gross growdy however if ignorant ! 1218: less linked losing lusing many more much ! 1219: never nice obnoxious often poor pretty real related rich ! 1220: similar some stupid super superb ! 1221: terrible terrific too total tubular ugly very))) ! 1222: ! 1223: (defun doctor-prepp (x) ! 1224: (memq x '(about above after around as at ! 1225: before beneath behind beside between by ! 1226: for from in inside into ! 1227: like near next of on onto over ! 1228: same through thru to toward towards ! 1229: under underneath with without))) ! 1230: ! 1231: (defun doctor-remember (thing) ! 1232: (cond ((null history) ! 1233: (setq history (list thing))) ! 1234: (t (setq history (append history (list thing)))))) ! 1235: ! 1236: (defun doctor-type (x) ! 1237: (setq x (doctor-fix-2 x)) ! 1238: (doctor-txtype (doctor-assm x))) ! 1239: ! 1240: (defun doctor-fixup (sent) ! 1241: (setq sent (append ! 1242: (cdr ! 1243: (assq (car sent) ! 1244: (append ! 1245: '((me i) ! 1246: (him he) ! 1247: (her she) ! 1248: (them they) ! 1249: (okay) ! 1250: (well) ! 1251: (sigh) ! 1252: (hmm) ! 1253: (hmmm) ! 1254: (hmmmm) ! 1255: (hmmmmm) ! 1256: (gee) ! 1257: (sure) ! 1258: (great) ! 1259: (oh) ! 1260: (fine) ! 1261: (ok) ! 1262: (no)) ! 1263: (list (list (car sent) ! 1264: (car sent)))))) ! 1265: (cdr sent))) ! 1266: (doctor-fix-2 sent)) ! 1267: ! 1268: (defun doctor-fix-2 (sent) ! 1269: (let ((foo sent)) ! 1270: (while foo ! 1271: (if (and (eq (car foo) 'me) ! 1272: (doctor-verbp (cadr foo))) ! 1273: (rplaca foo 'i) ! 1274: (cond ((eq (car foo) 'you) ! 1275: (cond ((memq (cadr foo) '(am be been is)) ! 1276: (rplaca (cdr foo) 'are)) ! 1277: ((memq (cadr foo) '(has)) ! 1278: (rplaca (cdr foo) 'have)) ! 1279: ((memq (cadr foo) '(was)) ! 1280: (rplaca (cdr foo) 'were)))) ! 1281: ((equal (car foo) 'i) ! 1282: (cond ((memq (cadr foo) '(are is be been)) ! 1283: (rplaca (cdr foo) 'am)) ! 1284: ((memq (cadr foo) '(were)) ! 1285: (rplaca (cdr foo) 'was)) ! 1286: ((memq (cadr foo) '(has)) ! 1287: (rplaca (cdr foo) 'have)))) ! 1288: ((and (doctor-verbp (car foo)) ! 1289: (eq (cadr foo) 'i) ! 1290: (not (doctor-verbp (car (cddr foo))))) ! 1291: (rplaca (cdr foo) 'me)) ! 1292: ((and (eq (car foo) 'a) ! 1293: (doctor-vowelp (string-to-char ! 1294: (doctor-make-string (cadr foo))))) ! 1295: (rplaca foo 'an)) ! 1296: ((and (eq (car foo) 'an) ! 1297: (not (doctor-vowelp (string-to-char ! 1298: (doctor-make-string (cadr foo)))))) ! 1299: (rplaca foo 'a))) ! 1300: (setq foo (cdr foo)))) ! 1301: sent)) ! 1302: ! 1303: (defun doctor-vowelp (x) ! 1304: (memq x '(?a ?e ?i ?o ?u))) ! 1305: ! 1306: (defun doctor-replace (sent rlist) ! 1307: "Replaces any element of SENT that is the car of a replacement element ! 1308: pair in RLIST" ! 1309: (apply 'append ! 1310: (mapcar ! 1311: (function ! 1312: (lambda (x) ! 1313: (cdr (or (assq x rlist) ; either find a replacement ! 1314: (list x x))))) ; or fake an identity mapping ! 1315: sent))) ! 1316: ! 1317: (defun doctor-wherego (sent) ! 1318: (cond ((null sent)($ whereoutp)) ! 1319: ((null (doctor-meaning (car sent))) ! 1320: (doctor-wherego (cond ((zerop (random-range 2)) ! 1321: (reverse (cdr sent))) ! 1322: (t (cdr sent))))) ! 1323: (t ! 1324: (setq found (car sent)) ! 1325: (doctor-meaning (car sent))))) ! 1326: ! 1327: (defun doctor-svo (sent key type mem) ! 1328: "Find subject, verb and object in sentence SENT with focus on word KEY. ! 1329: TYPE is number of words preceding KEY to start looking for subject. MEM is ! 1330: t if results are to be put on doctor's memory stack. Return is in global ! 1331: variables subj, verb and object" ! 1332: (let ((foo (doctor-subjsearch sent key type) sent)) ! 1333: (or foo ! 1334: (setq foo sent ! 1335: mem nil)) ! 1336: (while (and (null (doctor-verbp (car foo))) (cdr foo)) ! 1337: (setq foo (cdr foo))) ! 1338: (setq verb (car foo)) ! 1339: (setq obj (doctor-getnoun (cdr foo))) ! 1340: (cond ((eq object 'i)(setq object 'me)) ! 1341: ((eq subj 'me)(setq subj 'i))) ! 1342: (cond (mem (doctor-remember (list subj verb obj)))))) ! 1343: ! 1344: (defun doctor-possess (sent key) ! 1345: "Set possessive in SENT for keyword KEY. Hack on previous word, setting ! 1346: global variable owner to possibly correct result" ! 1347: (let* ((i (- (length sent) (length (memq key sent)) 1)) ! 1348: (prev (if (< i 0) 'your ! 1349: (nth i sent)))) ! 1350: (setq owner (if (or (doctor-possessivepronounp prev) ! 1351: (string-equal "s" ! 1352: (substring (doctor-make-string prev) ! 1353: -1))) ! 1354: prev ! 1355: 'your)))) ! 1356: ! 1357: ;; Output of replies. ! 1358: ! 1359: (defun doctor-txtype (ans) ! 1360: "Output to buffer a list of symbols or strings as a sentence" ! 1361: (setq *print-upcase* t *print-space* nil) ! 1362: (mapcar 'doctor-type-symbol ans) ! 1363: (insert "\n")) ! 1364: ! 1365: (defun doctor-type-symbol (word) ! 1366: "Output a symbol to the buffer with some fancy case and spacing hacks" ! 1367: (setq word (doctor-make-string word)) ! 1368: (if (string-equal word "i") (setq word "I")) ! 1369: (if *print-upcase* ! 1370: (progn ! 1371: (setq word (capitalize word)) ! 1372: (if *print-space* ! 1373: (insert " ")))) ! 1374: (cond ((or (string-match "^[.,;:?! ]" word) ! 1375: (not *print-space*)) ! 1376: (insert word)) ! 1377: (t (insert ?\ word))) ! 1378: (if (> (current-column) fill-column) ! 1379: (apply auto-fill-hook nil)) ! 1380: (setq *print-upcase* (string-match "[.?!]$" word) ! 1381: *print-space* t)) ! 1382: ! 1383: (defun doctor-build (str1 str2) ! 1384: "Make a symbol out of the concatenation of the two non-list arguments" ! 1385: (cond ((null str1) str2) ! 1386: ((null str2) str1) ! 1387: ((and (atom str1) ! 1388: (atom str2)) ! 1389: (intern (concat (doctor-make-string str1) ! 1390: (doctor-make-string str2)))) ! 1391: (t nil))) ! 1392: ! 1393: (defun doctor-make-string (obj) ! 1394: (cond ((stringp obj) obj) ! 1395: ((symbolp obj) (symbol-name obj)) ! 1396: ((numberp obj) (int-to-string obj)) ! 1397: (t ""))) ! 1398: ! 1399: (defun doctor-concat (x y) ! 1400: "like append, but force atomic arguments to be lists" ! 1401: (append ! 1402: (if (and x (atom x)) (list x) x) ! 1403: (if (and y (atom y)) (list y) y))) ! 1404: ! 1405: (defun doctor-assm (proto) ! 1406: (cond ((null proto) nil) ! 1407: ((atom proto) (list proto)) ! 1408: ((atom (car proto)) ! 1409: (cons (car proto) (doctor-assm (cdr proto)))) ! 1410: (t (doctor-concat (doctor-assm (eval (car proto))) (doctor-assm (cdr proto)))))) ! 1411: ! 1412: ;; Functions that handle specific words or meanings when found. ! 1413: ! 1414: (defun doctor-go (destination) ! 1415: "Call a doctor- function" ! 1416: (funcall (intern (concat "doctor-" (doctor-make-string destination))))) ! 1417: ! 1418: (defun doctor-desire1 () ! 1419: (doctor-go ($ whereoutp))) ! 1420: ! 1421: (defun doctor-huh () ! 1422: (cond ((< (length sent) 9) (doctor-type ($ huhlst))) ! 1423: (t (doctor-type ($ longhuhlst))))) ! 1424: ! 1425: (defun doctor-rthing () (doctor-type ($ thlst))) ! 1426: ! 1427: (defun doctor-remem () (cond ((null history)(doctor-huh)) ! 1428: ((doctor-type ($ remlst))))) ! 1429: ! 1430: (defun doctor-howdy () ! 1431: (cond ((not howdyflag) ! 1432: (doctor-type '(($ hello) what brings you to see me \?)) ! 1433: (setq howdyflag t)) ! 1434: (t ! 1435: (doctor-type '(($ ibelieve) we\'ve introduced ourselves already \.)) ! 1436: (doctor-type '(($ please) ($ describe) ($ things) \.))))) ! 1437: ! 1438: (defun doctor-when () ! 1439: (cond ((< (length (memq found sent)) 3)(doctor-short)) ! 1440: (t ! 1441: (setq sent (cdr (memq found sent))) ! 1442: (setq sent (doctor-fixup sent)) ! 1443: (doctor-type '(($ whatwhen)(// sent) \?))))) ! 1444: ! 1445: (defun doctor-conj () ! 1446: (cond ((< (length (memq found sent)) 4)(doctor-short)) ! 1447: (t ! 1448: (setq sent (cdr (memq found sent))) ! 1449: (setq sent (doctor-fixup sent)) ! 1450: (cond ((eq (car sent) 'of) ! 1451: (doctor-type '(are you ($ sure) that is the real reason \?)) ! 1452: (setq things (cons (cdr sent) things))) ! 1453: (t ! 1454: (doctor-remember sent) ! 1455: (doctor-type ($ beclst))))))) ! 1456: ! 1457: (defun doctor-short () ! 1458: (cond ((= (car repetitive-shortness) (1- lincount)) ! 1459: (rplacd repetitive-shortness ! 1460: (1+ (cdr repetitive-shortness)))) ! 1461: (t ! 1462: (rplacd repetitive-shortness 1))) ! 1463: (rplaca repetitive-shortness lincount) ! 1464: (cond ((> (cdr repetitive-shortness) 6) ! 1465: (cond ((not **mad**) ! 1466: (doctor-type '(($ areyou) ! 1467: just trying to see what kind of things ! 1468: i have in my vocabulary \? please try to ! 1469: carry on a reasonable conversation!)) ! 1470: (setq **mad** t)) ! 1471: (t ! 1472: (doctor-type '(i give up \. you need a lesson in creative ! 1473: writing \.\.\.)) ! 1474: ;;(push monosyllables observation-list) ! 1475: ))) ! 1476: (t ! 1477: (cond ((equal sent (doctor-assm '(yes))) ! 1478: (doctor-type '(($ isee) ($ inter) ($ whysay) this is so \?))) ! 1479: ((equal sent (doctor-assm '(because))) ! 1480: (doctor-type ($ shortbeclst))) ! 1481: ((equal sent (doctor-assm '(no))) ! 1482: (doctor-type ($ neglst))) ! 1483: (t (doctor-type ($ shortlst))))))) ! 1484: ! 1485: (defun doctor-alcohol () (doctor-type ($ drnk))) ! 1486: ! 1487: (defun doctor-desire () ! 1488: (let ((foo (memq found sent))) ! 1489: (cond ((< (length foo) 2) ! 1490: (doctor-go (doctor-build (doctor-meaning found) 1))) ! 1491: ((memq (cadr foo) '(a an)) ! 1492: (rplacd foo (append '(to have) (cdr foo))) ! 1493: (doctor-svo sent found 1 nil) ! 1494: (doctor-remember (list subj 'would 'like obj)) ! 1495: (doctor-type ($ whywant))) ! 1496: ((not (eq (cadr foo) 'to)) ! 1497: (doctor-go (doctor-build (doctor-meaning found) 1))) ! 1498: (t ! 1499: (doctor-svo sent found 1 nil) ! 1500: (doctor-remember (list subj 'would 'like obj)) ! 1501: (doctor-type ($ whywant)))))) ! 1502: ! 1503: (defun doctor-drug () ! 1504: (doctor-type ($ drugs)) ! 1505: (doctor-remember (list 'you 'used found))) ! 1506: ! 1507: (defun doctor-toke () ! 1508: (doctor-type ($ toklst))) ! 1509: ! 1510: (defun doctor-state () ! 1511: (doctor-type ($ states))(doctor-remember (list 'you 'were found))) ! 1512: ! 1513: (defun doctor-mood () ! 1514: (doctor-type ($ moods))(doctor-remember (list 'you 'felt found))) ! 1515: ! 1516: (defun doctor-fear () ! 1517: (setq feared (doctor-setprep sent found)) ! 1518: (doctor-type ($ fears)) ! 1519: (doctor-remember (list 'you 'were 'afraid 'of feared))) ! 1520: ! 1521: (defun doctor-hate () ! 1522: (doctor-svo sent found 1 t) ! 1523: (cond ((memq 'not sent) (doctor-forget) (doctor-huh)) ! 1524: ((equal subj 'you) ! 1525: (doctor-type '(why do you (// verb)(// obj) \?))) ! 1526: (t (doctor-type '(($ whysay)(list subj verb obj)))))) ! 1527: ! 1528: (defun doctor-symptoms () ! 1529: (doctor-type '(($ maybe) you should consult a doctor of medicine\, ! 1530: i am a psychiatrist \.))) ! 1531: ! 1532: (defun doctor-hates () ! 1533: (doctor-svo sent found 1 t) ! 1534: (doctor-hates1)) ! 1535: ! 1536: (defun doctor-hates1 () ! 1537: (doctor-type '(($ whysay)(list subj verb obj)))) ! 1538: ! 1539: (defun doctor-loves () ! 1540: (doctor-svo sent found 1 t) ! 1541: (doctor-qloves)) ! 1542: ! 1543: (defun doctor-qloves () ! 1544: (doctor-type '(($ bother)(list subj verb obj) \?))) ! 1545: ! 1546: (defun doctor-love () ! 1547: (doctor-svo sent found 1 t) ! 1548: (cond ((memq 'not sent) (doctor-forget) (doctor-huh)) ! 1549: ((memq 'to sent) (doctor-hates1)) ! 1550: (t ! 1551: (cond ((equal object 'something) ! 1552: (setq object '(this person you love)))) ! 1553: (cond ((equal subj 'you) ! 1554: (setq lover obj) ! 1555: (cond ((equal lover '(this person you love)) ! 1556: (setq lover '(your partner)) ! 1557: (doctor-forget) ! 1558: (doctor-type '(with whom are you in love \?))) ! 1559: ((doctor-type '(($ please) ! 1560: ($ describe) ! 1561: ($ relation) ! 1562: (// lover) ! 1563: \.))))) ! 1564: ((equal subj 'i) ! 1565: (doctor-txtype '(we were discussing you!))) ! 1566: (t (doctor-forget) ! 1567: (setq obj 'someone) ! 1568: (setq verb (doctor-build verb 's)) ! 1569: (doctor-qloves)))))) ! 1570: ! 1571: (defun doctor-mach () ! 1572: (setq found (doctor-plural found)) ! 1573: (doctor-type ($ machlst))) ! 1574: ! 1575: (defun doctor-sexnoun () (doctor-sexverb)) ! 1576: ! 1577: (defun doctor-sexverb () ! 1578: (if (or (memq 'me sent)(memq 'myself sent)(memq 'i sent)) ! 1579: (doctor-foul) ! 1580: (doctor-type ($ sexlst)))) ! 1581: ! 1582: (defun doctor-death () (doctor-type ($ deathlst))) ! 1583: ! 1584: (defun doctor-foul () ! 1585: (doctor-type ($ foullst))) ! 1586: ! 1587: (defun doctor-family () ! 1588: (doctor-possess sent found) ! 1589: (doctor-type ($ famlst))) ! 1590: ! 1591: ;; I did not add this -- rms. ! 1592: (defun doctor-rms () ! 1593: (cond (rms-flag (doctor-type ($ stallmanlst))) ! 1594: (t (setq rms-flag t) (doctor-type '(do you know Stallman \?))))) ! 1595: ! 1596: (defun doctor-school nil (doctor-type ($ schoollst))) ! 1597: ! 1598: (defun doctor-eliza () ! 1599: (cond (eliza-flag (doctor-type ($ elizalst))) ! 1600: (t (setq eliza-flag t) ! 1601: (doctor-type '((// found) \? hah ! ! 1602: ($ please) ($ continue) \.))))) ! 1603: ! 1604: (defun doctor-sports () (doctor-type ($ sportslst))) ! 1605: ! 1606: (defun doctor-math () (doctor-type ($ mathlst))) ! 1607: ! 1608: (defun doctor-zippy () ! 1609: (cond (zippy-flag (doctor-type ($ zippylst))) ! 1610: (t (setq zippy-flag t) ! 1611: (doctor-type '(yow! are we interactive yet \?))))) ! 1612: ! 1613: ! 1614: (defun doctor-chat () (doctor-type ($ chatlst)))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.