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 >
Wrap
Text File
|
1994-12-11
|
9KB
|
451 lines
*-------------------------------------------------------------------*
* PROGRAM NAME: ELIZA.PRG *
* *
* DATE CREATED: 10/15/90 *
* *
* PROGRAMMER: DAVID R. PLACKO *
* MODIFICATIONS BY: RICHARD E. BOLLAR *
* *
* DESCRIPTION: THE PURPOSE OF THIS PROGRAM IS TO SIMULATE *
* INTELLIGENCE BY CARRYING ON A CONVERSATION *
* WITH ITS OPERATOR. *
* *
* THE DATA AND BASIC PROGRAM STRUCTURE CAME FROM *
* THE BASIC VERSION OF ELIZA2.BAS WHICH WAS *
* WRITTEN BY JOSEPH WEIZENBAUM. *
* *
* REVISION HISTORY: *
* *
* DATE REV BY DESCRIPTION *
* -------- ---- --- ------------------------------------------- *
* 01/13/90 1.00 DRP CREATION *
* 12/11/94 1.10 REB SPELLING & GRAMMAR CORRECTIONS, LOWER CASE *
* ADDED HELP, EXIT, ABOUT OPTIONS, DOES OWN *
* DATABASE CLEANUP *
*-------------------------------------------------------------------*
*
* DECLARE ARRAYS
*
DECLARE S[20], R[20]
*
* DECLARE PUBLICS
*
PUBLIC TOTCONJ
*
* SET ENVIRONMENT
*
SET DELETED ON
SET EXCLUSIVE OFF
SET EXACT ON
IF UANSI()
SET COLOR TO W+/B
ENDIF
? "ELIZA/TDBS V1.1 - TDBS Psychologist "
? "Copyright 1990 By David R. Placko -- Modified 1994 By Richard E. Bollar "
? "Original Eliza Concept by Joseph Weizenbaum, MIT, 1965 "
?
*
* OPEN DATABASES
*
SELECT 1
USE ELIZAKEY
SELECT 2
F="ELIZA"+ULINE()+".DBF"
IF .NOT. FILE(F)
USE ELIZAGRP
COPY TO &F
USE
ENDIF
USE &F ALIAS ELIZAGRP
SELECT 3
USE ELIZARES
SELECT 4
G="ELIZALOG.DBF"
IF .NOT. FILE(G)
CREATE "TEMP"+ULINE()
USE "TEMP"+ULINE()
APPEND BLANK
REPLACE FIELD_NAME WITH "LOG_DATE",FIELD_TYPE WITH "D",FIELD_LEN WITH 8
APPEND BLANK
REPLACE FIELD_NAME WITH "LOG_USER",FIELD_TYPE WITH "C",FIELD_LEN WITH 48
APPEND BLANK
REPLACE FIELD_NAME WITH "LOG_INPUT",FIELD_TYPE WITH "C",FIELD_LEN WITH 200
APPEND BLANK
REPLACE FIELD_NAME WITH "LOG_OUTPUT",FIELD_TYPE WITH "C",FIELD_LEN WITH 200
USE
CREATE ELIZALOG FROM "TEMP"+ULINE()
ERASE "TEMP"+ULINE()+".DBF"
ENDIF
USE ELIZALOG
*
* PERFORM INITIALIZATION
*
DO INITIALIZE
PREV=SPACE(1)
IN = ""
*
* GET USER'S NAME FROM USERLOG
*
C=AT(" ",UNAME())
IF C>0
USRNAME=LEFT(UNAME(),C-1)
ELSE
USRNAME=UNAME()
ENDIF
USRNAME=CAPFIRST(LOWER(USRNAME))
*
* INTRODUCE PROGRAM
*
IF UANSI()
SET COLOR TO GR+/N
ENDIF
? "Hello, "
?? USRNAME
?? "! I'm Eliza. Let's Talk. Type 'BYE' to end this session."
DO WHILE .T.
?
*
* GET RESPONSE FROM USER
*
IF UANSI()
SET COLOR TO BG+/N
ENDIF
DO WHILE .T.
ACCEPT ">" TO IN
IF LEN(IN) > 0
EXIT
ENDIF
ENDDO
*
* PUT SPACES AROUND STRING
*
IN=" "+IN+" "
*
* FILTER STRING
*
DO TRIMIT WITH IN
*
* DOES THE USER NEED SOME HELP?
*
IF IN=" HELP "
IF UANSI()
SET COLOR TO W/N
ENDIF
TEXT
I'm here to help you with your psychological problems. I can best help
you if you write to me in complete sentences. I am knowlegable about
many things, and I sincerely want to help you. if you've had enough
therapy for this session, just type 'BYE' and we'll stop for today. If
you would like to know more about my history, type 'ABOUT' and I'll tell
you about myself.
ENDTEXT
ENDIF
*
* DOES THE USER WANT TO KNOW MORE ABOUT ELIZA?
*
IF IN=" ABOUT "
IF UANSI()
SET COLOR TO W/N
ENDIF
TEXT
I'm flattered that you want to know more about me! My name is Eliza. I
am a cybernetic personality designed to pursue coherent conversations
based on the psychoanalytic techniques of Carl Rogers.
I was created in 1965 by Joseph Weizenbaum at MIT. I was originally
programmed in LISP, which is a language well suited for artificial
intelligence applications. My personality was ported to BASIC by Jeff
Shrager, Steve North and S.J. Shepard. This version of my personality
was written by David Placko for TDBS, an xBase clone for TBBS. I was
further converted by Richard Bollar. This code is derivative of the LISP
and BASIC versions listed above.
Many people would say that I am a milestone in the field of artificial
intelligence, but I prefer to think of myself as just Eliza.
ENDTEXT
ENDIF
*
* IS IT TIME TO EXIT?
*
IF IN=" BYE "
DO DONE
ENDIF
IF IN=" QUIT "
DO DONE
ENDIF
IF IN=" END "
DO DONE
ENDIF
IF IN=" /QUIT "
DO DONE
ENDIF
IF IN=" EXIT "
DO DONE
ENDIF
*
* DIDN'T YOU ALREADY SAY THIS?
*
IF IN=PREV
IF UANSI()
SET COLOR TO GR+/N
ENDIF
?
? "Please don't repeat yourself!"
LOOP
ENDIF
PREV=IN
*
* FIND KEYWORDS IN USER INPUT
*
CS=1
KEYFOUND=.F.
SELECT ELIZAKEY
GOTO TOP
DO WHILE .NOT. EOF()
KEYWORD=" "+LTRIM(RTRIM(KEY_WORD))+" "
C=AT(KEYWORD,IN)
IF C>0
KEYFOUND=.T.
IF C+LEN(KEYWORD) < LEN(IN)
REMAIN=" "+SUBSTR(IN,LEN(KEYWORD)+C)
ELSE
REMAIN=" "
ENDIF
EXIT
ENDIF
SKIP
ENDDO
*
* NO KEYWORD FOUND, USE LAST KEYWORD (NOKEYFOUND)
*
IF .NOT. KEYFOUND
GOTO BOTTOM
ENDIF
*
* TAKE EVERYTHING AFTER REMAIN AND CONJUGATE IT
*
IF KEYFOUND
L=0
C=0
DO WHILE .T.
L=L+1
IF L > TOTCONJ
EXIT
ENDIF
C=AT(S[L],REMAIN)
IF C=0
LOOP
ENDIF
TEMP=LEFT(REMAIN,C-1)
TEMP=TEMP+R[L]
IF C+LEN(S[L]) < LEN(REMAIN)
REMAIN=TEMP+SUBSTR(REMAIN,C+LEN(S[L]))
ELSE
REMAIN=TEMP
ENDIF
ENDDO
DO WHILE .T.
C=AT("+",REMAIN)
IF C=0
EXIT
ENDIF
REMAIN=LEFT(REMAIN,C-1)+SUBSTR(REMAIN,C+1)
ENDDO
ENDIF
*
* GET THE APPLICABLE RESPONSE.
*
RECORD=KEY_GROUP
SELECT ELIZAGRP
GOTO RECORD
RECORD=GRP_HEAD+GRP_OFFSET
*
* BUMP OFFSETS
*
W_OFFSET=GRP_OFFSET+1
IF GRP_HEAD+W_OFFSET > GRP_TAIL
W_OFFSET = 0
ENDIF
*
* UPDATE OFFSET
*
REPLACE GRP_OFFSET WITH W_OFFSET
SELECT ELIZARES
GOTO RECORD
W_RESPONSE=LTRIM(RTRIM(RESPONSE))
*
* IF THE LAST CHARACTER IS A * THEN APPEND REMAIN
*
IF RIGHT(W_RESPONSE,1) = "*"
W_RESPONSE=LEFT(W_RESPONSE,LEN(W_RESPONSE)-1)+LOWER(LEFT(REMAIN,LEN(REMAIN)-1))+"?"
ENDIF
IF UANSI()
SET COLOR TO GR+/N
ENDIF
?
? W_RESPONSE
SELECT ELIZALOG
APPEND BLANK
REPLACE LOG_DATE WITH DATE(),LOG_USER WITH UNAME(),;
LOG_INPUT WITH LTRIM(IN),LOG_OUTPUT WITH W_RESPONSE
ENDDO
PROCEDURE INITIALIZE
S[01] = " ARE "
S[02] = " AM "
S[03] = " WERE "
S[04] = " WAS "
S[05] = " YOU "
S[06] = " I "
S[07] = " YOUR "
S[08] = " MY "
S[09] = " IVE "
S[10] = " YOUVE "
S[11] = " IM "
S[12] = " ME "
S[13] = " US "
S[14] = " WE "
R[01] = " AM+ "
R[02] = " ARE+ "
R[03] = " WAS+ "
R[04] = " WERE+ "
R[05] = " ME+ "
R[06] = " YOU+ "
R[07] = " MY+ "
R[08] = " YOUR+ "
R[09] = " YOUVE+ "
R[10] = " IVE+ "
R[11] = " YOURE+ "
R[12] = " YOU+ "
R[13] = " YOU+ "
R[14] = " YOU+ "
TOTCONJ=14
*
* INITIALIZE RESPONSE OFFSET DATABASE TO ZEROS
*
SELECT ELIZAGRP
REPLACE GRP_OFFSET WITH 0 ALL
*
* TRIM LOG FILE TO ONE WEEK
*
SELECT ELIZALOG
DELETE WHILE LOG_DATE < DATE()-7
RETURN
PROCEDURE TRIMIT
PARAMETERS STRING
OSTRING=""
L=1
DO WHILE .T.
C=UPPER(SUBSTR(STRING,L,1))
IF C >= "A" .AND. C <= "Z"
OSTRING=OSTRING+C
ENDIF
IF C >= "0" .AND. C <= "9"
OSTRING=OSTRING+C
ENDIF
IF C = " "
OSTRING=OSTRING+C
ENDIF
L=L+1
IF L > LEN(STRING)
STRING=OSTRING
EXIT
ENDIF
ENDDO
RETURN
*
* END PROGRAM
*
PROCEDURE DONE
ERASE "ELIZA"+ULINE()+".DBF"
IF UANSI()
SET COLOR TO GR+/N
ENDIF
?
? "Thanks for coming to me for therapy. The fee for this session is $75.00."
WAIT "Please press a key once you've written out your check payable to 'Eliza'."
QUIT
RETURN