home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / DOOR / ELIZA11.ZIP / ELIZA.PRG < prev    next >
Text File  |  1994-12-11  |  9KB  |  451 lines

  1. *-------------------------------------------------------------------*
  2. * PROGRAM NAME:     ELIZA.PRG                                       *
  3. *                                                                   *
  4. * DATE CREATED:     10/15/90                                        *
  5. *                                                                   *
  6. * PROGRAMMER:       DAVID R. PLACKO                                 *
  7. * MODIFICATIONS BY: RICHARD E. BOLLAR                               *
  8. *                                                                   *
  9. * DESCRIPTION:      THE PURPOSE OF THIS PROGRAM IS TO SIMULATE      *
  10. *                   INTELLIGENCE BY CARRYING ON A CONVERSATION      *
  11. *                   WITH ITS OPERATOR.                              *
  12. *                                                                   *
  13. *                   THE DATA AND BASIC PROGRAM STRUCTURE CAME FROM  *
  14. *                   THE BASIC VERSION OF ELIZA2.BAS WHICH WAS       *
  15. *                   WRITTEN BY JOSEPH WEIZENBAUM.                   *
  16. *                                                                   *
  17. * REVISION HISTORY:                                                 *
  18. *                                                                   *
  19. * DATE      REV   BY   DESCRIPTION                                  *
  20. * --------  ----  ---  -------------------------------------------  *
  21. * 01/13/90  1.00  DRP  CREATION                                     *
  22. * 12/11/94  1.10  REB  SPELLING & GRAMMAR CORRECTIONS, LOWER CASE   *
  23. *                      ADDED HELP, EXIT, ABOUT OPTIONS, DOES OWN    *
  24. *                      DATABASE CLEANUP                             *
  25. *-------------------------------------------------------------------*
  26.  
  27. *
  28. *  DECLARE ARRAYS
  29. *
  30.  
  31. DECLARE S[20], R[20]
  32.  
  33. *
  34. *  DECLARE PUBLICS
  35. *
  36.  
  37. PUBLIC TOTCONJ
  38.  
  39. *
  40. *  SET ENVIRONMENT
  41. *
  42.  
  43. SET DELETED ON
  44. SET EXCLUSIVE OFF
  45. SET EXACT ON
  46.  
  47. IF UANSI()
  48.    SET COLOR TO W+/B
  49. ENDIF
  50.  
  51. ? "ELIZA/TDBS V1.1 - TDBS Psychologist                                        "
  52. ? "Copyright 1990 By David R. Placko -- Modified 1994 By Richard E. Bollar    "
  53. ? "Original Eliza Concept by Joseph Weizenbaum, MIT, 1965                     "
  54. ?
  55.  
  56. *
  57. *  OPEN DATABASES
  58. *
  59.  
  60. SELECT 1
  61. USE ELIZAKEY
  62. SELECT 2
  63. F="ELIZA"+ULINE()+".DBF"
  64. IF .NOT. FILE(F)
  65.    USE ELIZAGRP
  66.    COPY TO &F
  67.    USE
  68. ENDIF
  69. USE &F ALIAS ELIZAGRP
  70. SELECT 3
  71. USE ELIZARES
  72. SELECT 4
  73. G="ELIZALOG.DBF"
  74. IF .NOT. FILE(G)
  75.    CREATE "TEMP"+ULINE()
  76.    USE "TEMP"+ULINE()
  77.    APPEND BLANK
  78.    REPLACE FIELD_NAME WITH "LOG_DATE",FIELD_TYPE WITH "D",FIELD_LEN WITH 8
  79.    APPEND BLANK
  80.    REPLACE FIELD_NAME WITH "LOG_USER",FIELD_TYPE WITH "C",FIELD_LEN WITH 48
  81.    APPEND BLANK
  82.    REPLACE FIELD_NAME WITH "LOG_INPUT",FIELD_TYPE WITH "C",FIELD_LEN WITH 200
  83.    APPEND BLANK
  84.    REPLACE FIELD_NAME WITH "LOG_OUTPUT",FIELD_TYPE WITH "C",FIELD_LEN WITH 200
  85.    USE
  86.    CREATE ELIZALOG FROM "TEMP"+ULINE()
  87.    ERASE "TEMP"+ULINE()+".DBF"
  88. ENDIF
  89.    USE ELIZALOG
  90.  
  91. *
  92. *  PERFORM INITIALIZATION
  93. *
  94.  
  95. DO INITIALIZE
  96.  
  97. PREV=SPACE(1)
  98. IN = ""
  99.  
  100. *
  101. *  GET USER'S NAME FROM USERLOG
  102. *
  103.  
  104. C=AT(" ",UNAME())
  105. IF C>0
  106.    USRNAME=LEFT(UNAME(),C-1)
  107. ELSE
  108.    USRNAME=UNAME()
  109. ENDIF
  110.  
  111. USRNAME=CAPFIRST(LOWER(USRNAME))
  112.  
  113. *
  114. *  INTRODUCE PROGRAM
  115. *
  116.  
  117. IF UANSI()
  118.    SET COLOR TO GR+/N
  119. ENDIF
  120.  
  121. ? "Hello, "
  122. ?? USRNAME
  123. ?? "! I'm Eliza. Let's Talk. Type 'BYE' to end this session."
  124.  
  125. DO WHILE .T.
  126.    ?
  127.  
  128.    *
  129.    *  GET RESPONSE FROM USER
  130.    *
  131.  
  132. IF UANSI()
  133.    SET COLOR TO BG+/N
  134. ENDIF
  135.  
  136.    DO WHILE .T.
  137.       ACCEPT ">" TO IN
  138.       IF LEN(IN) > 0
  139.          EXIT
  140.       ENDIF
  141.    ENDDO
  142.  
  143.    *
  144.    *  PUT SPACES AROUND STRING
  145.    *
  146.  
  147.    IN=" "+IN+" "
  148.  
  149.    *
  150.    *  FILTER STRING
  151.    *
  152.  
  153.    DO TRIMIT WITH IN
  154.  
  155.    *
  156.    *  DOES THE USER NEED SOME HELP?
  157.    *
  158.  
  159.    IF IN=" HELP "
  160.       IF UANSI()
  161.          SET COLOR TO W/N
  162.       ENDIF
  163.       TEXT
  164.  
  165. I'm here to help you with your psychological problems. I can best help
  166. you if you write to me in complete sentences. I am knowlegable about
  167. many things, and I sincerely want to help you. if you've had enough
  168. therapy for this session, just type 'BYE' and we'll stop for today. If
  169. you would like to know more about my history, type 'ABOUT' and I'll tell
  170. you about myself.
  171.  
  172.       ENDTEXT
  173.    ENDIF
  174.  
  175.    *
  176.    *  DOES THE USER WANT TO KNOW MORE ABOUT ELIZA?
  177.    *
  178.    IF IN=" ABOUT "
  179.       IF UANSI()
  180.          SET COLOR TO W/N
  181.       ENDIF
  182.       TEXT
  183.  
  184. I'm flattered that you want to know more about me! My name is Eliza. I
  185. am a cybernetic personality designed to pursue coherent conversations
  186. based on the psychoanalytic techniques of Carl Rogers.
  187.  
  188. I was created in 1965 by Joseph Weizenbaum at MIT. I was originally
  189. programmed in LISP, which is a language well suited for artificial
  190. intelligence applications. My personality was ported to BASIC by Jeff
  191. Shrager, Steve North and S.J. Shepard. This version of my personality
  192. was written by David Placko for TDBS, an xBase clone for TBBS. I was
  193. further converted by Richard Bollar. This code is derivative of the LISP
  194. and BASIC versions listed above.
  195.  
  196. Many people would say that I am a milestone in the field of artificial
  197. intelligence, but I prefer to think of myself as just Eliza.
  198.  
  199.       ENDTEXT
  200.    ENDIF
  201.  
  202.    *
  203.    *  IS IT TIME TO EXIT?
  204.    *
  205.  
  206.    IF IN=" BYE "
  207.       DO DONE
  208.    ENDIF
  209.  
  210.    IF IN=" QUIT "
  211.       DO DONE
  212.    ENDIF
  213.  
  214.    IF IN=" END "
  215.       DO DONE
  216.    ENDIF
  217.  
  218.    IF IN=" /QUIT "
  219.       DO DONE
  220.    ENDIF
  221.  
  222.    IF IN=" EXIT "
  223.       DO DONE
  224.    ENDIF
  225.  
  226.    *
  227.    *  DIDN'T YOU ALREADY SAY THIS?
  228.    *
  229.  
  230.    IF IN=PREV
  231.  
  232.    IF UANSI()
  233.       SET COLOR TO GR+/N
  234.    ENDIF
  235.  
  236.       ?
  237.       ? "Please don't repeat yourself!"
  238.       LOOP
  239.    ENDIF
  240.    PREV=IN
  241.  
  242.    *
  243.    *  FIND KEYWORDS IN USER INPUT
  244.    *
  245.  
  246.    CS=1
  247.    KEYFOUND=.F.
  248.    SELECT ELIZAKEY
  249.    GOTO TOP
  250.    DO WHILE .NOT. EOF()
  251.       KEYWORD=" "+LTRIM(RTRIM(KEY_WORD))+" "
  252.       C=AT(KEYWORD,IN)
  253.       IF C>0
  254.          KEYFOUND=.T.
  255.          IF C+LEN(KEYWORD) < LEN(IN)
  256.             REMAIN=" "+SUBSTR(IN,LEN(KEYWORD)+C)
  257.          ELSE
  258.             REMAIN=" "
  259.          ENDIF
  260.          EXIT
  261.       ENDIF
  262.       SKIP
  263.    ENDDO
  264.  
  265.    *
  266.    *  NO KEYWORD FOUND, USE LAST KEYWORD (NOKEYFOUND)
  267.    *
  268.  
  269.    IF .NOT. KEYFOUND
  270.       GOTO BOTTOM
  271.    ENDIF
  272.  
  273.    *
  274.    *  TAKE EVERYTHING AFTER REMAIN AND CONJUGATE IT
  275.    *
  276.  
  277.    IF KEYFOUND
  278.       L=0
  279.       C=0
  280.       DO WHILE .T.
  281.          L=L+1
  282.          IF L > TOTCONJ
  283.             EXIT
  284.          ENDIF
  285.          C=AT(S[L],REMAIN)
  286.          IF C=0
  287.             LOOP
  288.          ENDIF
  289.          TEMP=LEFT(REMAIN,C-1)
  290.          TEMP=TEMP+R[L]
  291.          IF C+LEN(S[L]) < LEN(REMAIN)
  292.             REMAIN=TEMP+SUBSTR(REMAIN,C+LEN(S[L]))
  293.          ELSE
  294.             REMAIN=TEMP
  295.          ENDIF
  296.       ENDDO
  297.  
  298.       DO WHILE .T.
  299.          C=AT("+",REMAIN)
  300.          IF C=0
  301.             EXIT
  302.          ENDIF
  303.          REMAIN=LEFT(REMAIN,C-1)+SUBSTR(REMAIN,C+1)
  304.       ENDDO
  305.    ENDIF
  306.  
  307.    *
  308.    *  GET THE APPLICABLE RESPONSE.
  309.    *
  310.  
  311.    RECORD=KEY_GROUP
  312.    SELECT ELIZAGRP
  313.    GOTO RECORD
  314.  
  315.    RECORD=GRP_HEAD+GRP_OFFSET
  316.  
  317.    *
  318.    *  BUMP OFFSETS
  319.    *
  320.  
  321.    W_OFFSET=GRP_OFFSET+1
  322.    IF GRP_HEAD+W_OFFSET > GRP_TAIL
  323.       W_OFFSET = 0
  324.    ENDIF
  325.  
  326.    *
  327.    *  UPDATE OFFSET
  328.    *
  329.  
  330.    REPLACE GRP_OFFSET WITH W_OFFSET
  331.  
  332.    SELECT ELIZARES
  333.    GOTO RECORD
  334.  
  335.    W_RESPONSE=LTRIM(RTRIM(RESPONSE))
  336.  
  337.    *
  338.    *  IF THE LAST CHARACTER IS A * THEN APPEND REMAIN
  339.    *
  340.  
  341.    IF RIGHT(W_RESPONSE,1) = "*"
  342.       W_RESPONSE=LEFT(W_RESPONSE,LEN(W_RESPONSE)-1)+LOWER(LEFT(REMAIN,LEN(REMAIN)-1))+"?"
  343.    ENDIF
  344.  
  345.    IF UANSI()
  346.       SET COLOR TO GR+/N
  347.    ENDIF
  348.  
  349.    ?
  350.    ? W_RESPONSE
  351.  
  352.    SELECT ELIZALOG
  353.    APPEND BLANK
  354.    REPLACE LOG_DATE WITH DATE(),LOG_USER WITH UNAME(),;
  355.            LOG_INPUT WITH LTRIM(IN),LOG_OUTPUT WITH W_RESPONSE
  356. ENDDO
  357.  
  358.  
  359. PROCEDURE INITIALIZE
  360.    S[01] = " ARE "
  361.    S[02] = " AM "
  362.    S[03] = " WERE "
  363.    S[04] = " WAS "
  364.    S[05] = " YOU "
  365.    S[06] = " I "
  366.    S[07] = " YOUR "
  367.    S[08] = " MY "
  368.    S[09] = " IVE "
  369.    S[10] = " YOUVE "
  370.    S[11] = " IM "
  371.    S[12] = " ME "
  372.    S[13] = " US "
  373.    S[14] = " WE "
  374.  
  375.    R[01] = " AM+ "
  376.    R[02] = " ARE+ "
  377.    R[03] = " WAS+ "
  378.    R[04] = " WERE+ "
  379.    R[05] = " ME+ "
  380.    R[06] = " YOU+ "
  381.    R[07] = " MY+ "
  382.    R[08] = " YOUR+ "
  383.    R[09] = " YOUVE+ "
  384.    R[10] = " IVE+ "
  385.    R[11] = " YOURE+ "
  386.    R[12] = " YOU+ "
  387.    R[13] = " YOU+ "
  388.    R[14] = " YOU+ "
  389.  
  390.    TOTCONJ=14
  391.  
  392.    *
  393.    *  INITIALIZE RESPONSE OFFSET DATABASE TO ZEROS
  394.    *
  395.  
  396.    SELECT ELIZAGRP
  397.    REPLACE GRP_OFFSET WITH 0 ALL
  398.  
  399.    *
  400.    *  TRIM LOG FILE TO ONE WEEK
  401.    *
  402.  
  403.    SELECT ELIZALOG
  404.    DELETE WHILE LOG_DATE < DATE()-7
  405.  
  406. RETURN
  407.  
  408. PROCEDURE TRIMIT
  409. PARAMETERS STRING
  410.    OSTRING=""
  411.    L=1
  412.    DO WHILE .T.
  413.       C=UPPER(SUBSTR(STRING,L,1))
  414.       IF C >= "A" .AND. C <= "Z"
  415.          OSTRING=OSTRING+C
  416.       ENDIF
  417.  
  418.       IF C >= "0" .AND. C <= "9"
  419.          OSTRING=OSTRING+C
  420.       ENDIF
  421.  
  422.       IF C = " "
  423.          OSTRING=OSTRING+C
  424.       ENDIF
  425.       L=L+1
  426.       IF L > LEN(STRING)
  427.          STRING=OSTRING
  428.          EXIT
  429.       ENDIF
  430.    ENDDO
  431. RETURN
  432.  
  433.  
  434. *
  435. *  END PROGRAM
  436. *
  437.  
  438. PROCEDURE DONE
  439.  
  440. ERASE "ELIZA"+ULINE()+".DBF"
  441.  
  442. IF UANSI()
  443.    SET COLOR TO GR+/N
  444. ENDIF
  445.  
  446. ?
  447. ? "Thanks for coming to me for therapy. The fee for this session is $75.00."
  448. WAIT  "Please press a key once you've written out your check payable to 'Eliza'."
  449. QUIT
  450. RETURN
  451.