home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1998 #6
/
amigamamagazinepolishissue1998.iso
/
coders
/
jËzyki_programowania
/
logo
/
powerlogo
/
examples
/
doctor
< prev
next >
Wrap
Text File
|
1992-09-21
|
23KB
|
849 lines
; This is an Eliza like program called 'doctor'
; adapted from Computer Science LOGO Style by Brien Harvey.
; ****** Create Doctor ******
make "doctor [
procedure [ [ ] [ ]
[ :v.text :v.sentence :STUFF :A :B :C :rules :keywords ] ]
make "v.memory [ ]
setpen @0 3
pr [ ]
pr [ HELLO, I AM THE DOCTOR. ]
pr [ PLEASE TELL ME ALL OF YOUR LIFES PROBLEMS. ]
pr [ PLEASE END YOUR REMARKS WITH AN EMPTY LINE. ]
pr [ ]
setpen @0 1
loop ]
; Controlling the conversation
make "loop [
procedure [ ]
make "v.text tokenize getstuff [ ]
make "v.sentence getsentence :v.text
setpen @0 3
analyze :v.sentence :keywords
setpen @0 1
pr [ ]
loop
stop ]
; Reading and preparing the input
make "getstuff [
procedure [ [ :STUFF ] [ ] [ :line ] ]
while [ not linep ] [ sleep ]
make "line upper rl
if emptyp :line [ op :STUFF ] [ ]
op getstuff se :STUFF :line ]
make "tokenize [
procedure [ [ :v.text ] ]
if emptyp :v.text [ op [ ] ] [ ]
op se tokenword first :v.text " tokenize bf :v.text ]
make "tokenword [
procedure [ [ :v.word :out ] ]
if emptyp :v.word [ op :out ] [ ]
if memberp first :v.word [ , " ] [ op tokenword bf :v.word :out ] [ ]
if memberp first :v.word [ . ? ! \; ] [ op se :out ". ] [ ]
op tokenword bf :v.word word :out first :v.word ]
make "getsentence [
procedure [ [ :v.text ] ]
make "keywords [ ]
op getsentence1 :v.text [ ] ]
make "getsentence1 [
procedure [ [ :v.text :out ] ]
if emptyp :v.text [ op :out ] [ ]
if equalp first :v.text ".
[ if emptyp :keywords
[ op getsentence1 bf :v.text [ ] ]
[ op :out ] ]
[ ]
checkpriority first :v.text
op getsentence1 bf :v.text se :out translate first :v.text ]
make "translate [
procedure [ [ :v.word ] [ ] [ :v.new ] ]
make "v.new gprop :v.word "TRANSLATION
op if emptyp :v.new [ :v.word ] [ :v.new ] ]
make "checkpriority [
procedure [ [ :v.word ] [ ] [ :priority ] ]
make "priority gprop :v.word "PRIORITY
if emptyp :priority [ stop ] [ ]
if emptyp :keywords [ make "keywords fput :v.word [ ] stop ] [ ]
if > :priority gprop first :keywords "PRIORITY
[ make "keywords fput :v.word :keywords ]
[ make "keywords lput :v.word :keywords ] ]
; Choosing the rule and replying
make "analyze [
procedure [ [ :v.sentence :keywords ] [ ] [ :rules :keyword ] ]
if emptyp :keywords [ norules stop ] [ ]
make "keyword first :keywords
make "rules gprop :keyword "RULES
if wordp first :rules
[ make "keyword first :rules
make "rules gprop :keyword "RULES ] [ ]
checkrules :keyword :rules ]
make "checkrules [
procedure [ [ :keyword :rules ] ]
if not match first :rules :v.sentence
[ checkrules :keyword bf bf :rules
stop ] [ ]
dorule first bf :rules ]
make "dorule [
procedure [ [ :rule ] [ ] [ :v.print ] ]
make "v.print first gprop :keyword :rule
pprop :keyword :rule lput :v.print bf gprop :keyword :rule
if equalp :v.print "NEWKEY
[ analyze :v.sentence bf :keywords
stop ] [ ]
if wordp :v.print
[ checkrules :v.print gprop :v.print "RULES
stop ] [ ]
if equalp first :v.print "PRE
[ analyze reconstruct first bf :v.print bf bf :v.print
stop ] [ ]
pr reconstruct :v.print
memory :keyword :v.sentence ]
make "reconstruct [
procedure [ [ :v.sentence ] ]
if emptyp :v.sentence [ op [ ] ] [ ]
if not equalp ": first first :v.sentence
[ op fput first :v.sentence reconstruct bf :v.sentence ] [ ]
op se reword first :v.sentence reconstruct bf :v.sentence ]
make "reword [
procedure [ [ :v.word ] ]
if memberp last :v.word [ . ? , ]
[ op addpunct reword bl :v.word last :v.word ] [ ]
op thing bf :v.word ]
make "addpunct [
procedure [ [ :STUFF :v.char ] ]
if wordp :STUFF [ op word :STUFF :v.char ] [ ]
if emptyp :STUFF [ op :v.char ] [ ]
op se bl :STUFF word last :STUFF :v.char ]
make "memory [
procedure [ [ :keyword :v.sentence ] [ ] [ :rules :rule :v.name ] ]
make "rules gprop :keyword "MEMR
if emptyp :rules [ stop ] [ ]
if not match first :rules :v.sentence [ stop ] [ ]
make "v.name last :rules
make "rules gprop :keyword :v.name
make "rule first :rules
pprop :keyword :v.name lput :rule bf :rules
make "v.memory fput reconstruct :v.sentence :v.memory ]
make "norules [
procedure [ ]
if :memflag [ usememory ] [ uselastresort ]
make "memflag not :memflag ]
make "uselastresort [
procedure [ ]
pr first :lastresort
make "lastresort lput first :lastresort bf :lastresort ]
make "usememory [
procedure [ ]
if emptyp :v.memory [ uselastresort stop ] [ ]
pr first :v.memory
make "v.memory bf :v.memory ]
; Predicates for patterns
make "BELIEFP [
procedure [ [ :v.word ] ]
op not emptyp gprop :v.word "BELIEF ]
make "FAMILYP [
procedure [ [ :v.word ] ]
op not emptyp gprop :v.word "FAMILY ]
; Convert all lower case letters to upper case.
make "upper [
procedure [ [ :w ] [ ] [ :l :c :o ] ]
if listp :w
[ while [ not emptyp :w ]
[ make "o fput upper first :w :o
make "w bf :w ]
output reverselist :o ]
[ make "o "
make "c count :w
repeat :c
[ make "l item :c :w
if and >= ascii :l 97 <= ascii :l 122
[ make "o fput char - ascii :l 32 :o ]
[ make "o fput :l :o ]
make "c - :c 1 ]
output :o ] ]
; Reverse the order of the items in a list.
make "reverselist [
procedure [ [ :from ] [ ] [ :o ] ]
repeat count :from
[ make "o fput first :from :o
make "from bf :from ]
op :o ]
; ****** Pattern Matcher ******
make "match [
procedure [
[ :pat :sen ] [ ]
[ :special.var :special.pred :special.buffer :in.list ] ]
if or wordp :pat wordp :sen [ op false ] [ ]
if emptyp :pat [ op emptyp :sen ] [ ]
if listp first :pat [ op special fput "!: :pat :sen ] [ ]
if memberp first first :pat [ ? # ! & @ ] [ op special :pat :sen ] [ ]
if emptyp :sen [ op false ] [ ]
if equalp first :pat first :sen [ op match bf :pat bf :sen ] [ ]
op false ]
; Parsing quantifiers
make "special [
procedure [ [ :pat :sen ] ]
set.special parse.special bf first :pat "
op run fput first first :pat [ ] ]
make "parse.special [
procedure [ [ :v.word :var ] ]
if emptyp :v.word [ op list :var "p.always ] [ ]
if equalp first :v.word ": [ op list :var bf :v.word ] [ ]
op parse.special bf :v.word word :var first :v.word ]
make "set.special [
procedure [ [ :v.list ] ]
make "special.var first :v.list
make "special.pred last :v.list
if emptyp :special.var [ make "special.var "special.buffer ] [ ]
if memberp :special.pred [ IN anyof ] [ set.in ] [ ]
if not emptyp :special.pred [ stop ] [ ]
make "special.pred first bf :pat
make :pat fput first :pat bf bf :pat ]
make "set.in [
procedure [ ]
make "in.list first bf :pat
make "pat fput first :pat bf bf :pat ]
; Exactly one match
make "! [
procedure [ ]
if emptyp :sen [ op false ] [ ]
if not try.pred [ op false ] [ ]
make :special.var first :sen
op match bf :pat bf :sen ]
; Zero or one match
make "? [
procedure [ ]
make :special.var [ ]
if emptyp :sen [ op match bf :pat :sen ] [ ]
if not try.pred [ op match bf :pat :sen ] [ ]
make :special.var first :sen
if match bf :pat bf :sen [ op true ] [ ]
make :special.var [ ]
op match bf :pat :sen ]
; Zero or more matches
make "# [
procedure [ ]
make :special.var [ ]
op #test #gather :sen ]
make "#gather [
procedure [ [ :sen ] ]
if emptyp :sen [ op :sen ] [ ]
if not try.pred [ op :sen ] [ ]
make :special.var lput first :sen thing :special.var
op #gather bf :sen ]
make "#test [
procedure [ [ :sen ] ]
if match bf :pat :sen [ op true ] [ ]
if emptyp thing :special.var [ op false ] [ ]
op #test2 fput last thing :special.var :sen ]
make "#test2 [
procedure [ [ :sen ] ]
make :special.var bl thing :special.var
op #test :sen ]
; One or more matches
make "& [
procedure [ ]
op &test # ]
make "&test [
procedure [ [ :tf ] ]
if emptyp thing :special.var [ op false ] [ ]
op :tf ]
; Match words in a group
make "@ [
procedure [ ]
make :special.var :sen
op @test [ ] ]
make "@test [
procedure [ [ :sen ] ]
if @try.pred [ if match bf :pat :sen [ op true ] [ ] ] [ ]
if emptyp thing :special.var [ op false ] [ ]
op @test2 fput last thing :special.var :sen ]
make "@test2 [
procedure [ [ :sen ] ]
make :special.var bl thing :special.var
op @test :sen ]
; Applying the predicates
make "try.pred [
procedure [ ]
if listp :special.pred [ op match :special.pred first :sen ] [ ]
op run list :special.pred quoted first :sen ]
make "quoted [
procedure [ [ :v.thing ] ]
if listp :v.thing [ op thing ] [ ]
op word "" :v.thing ]
make "@try.pred [
procedure [ ]
if listp :special.pred [ op match :special.pred thing :special.var ] [ ]
op run list :special.pred thing :special.var ]
; Special predicates
make "p.always [
procedure [ [ :x ] ]
op true ]
make "IN [
procedure [ [ :v.word ] ]
op memberp :v.word :in.list ]
make "anyof [
procedure [ [ :sen ] ]
op anyof1 :sen :in.list ]
make "anyof1 [
procedure [ [ :sen :pats ] ]
if emptyp :pats [ op false ] [ ]
if match first :pats :sen [ op true ] [ ]
op anyof1 :sen bf :pats ]
; ****** Rules and responses ******
; Set up for doctor
make "setup [
procedure [ ]
make "memflag false
make "lastresort [
[ I AM NOT SURE I UNDERSTAND YOU FULLY. ]
[ PLEASE GO ON. ]
[ WHAT DOES THAT SUGEST TO YOU? ]
[ DO YOU FEEL STRONGLY ABOUT DISCUSSING SUCH THINGS? ] ]
; * SETUP 1 *
PPROP "SORRY "PRIORITY 0
ADDRULE "SORRY [ # ]
[ [ PLEASE DON'T APOLIGIZE. ]
[ WHAT FEELINGS DO YOU HAVE WHEN YOU APOLOGIZE? ]
[ APOLIGIES ARE NOT NECESSARY. ] ]
PPROP "DONT "TRANSLATION "DON'T
PPROP "CANT "TRANSLATION "CAN'T
PPROP "WONT "TRANSLATION "WON'T
PPROP "REMEMBER "PRIORITY 5
ADDRULE "REMEMBER [ # YOU REMEMBER #STUFF ]
[ [ DO YOU OFTEN THINK OF :STUFF? ]
[ DOES THINKING OF :STUFF BRING ANYTHING ELSE TO MIND? ]
[ WHY DO YOU REMBER :STUFF NOW? ]
[ WHAT NOW REMINDS YOU OF :STUFF? ]
[ WHAT ELSE DO YOU REMEMBER? ] ]
ADDRULE "REMEMBER [ # DO I REMEMBER :STUFF ]
[ [ DID YOU THINK I WOULD FORGET :STUFF? ]
[ WHY DO YOU THINK I SHOULD RECALL :STUFF NOW? ]
[ WHAT ABOUT :STUFF? ]
WHAT
[ YOU MENTIONED :STUFF. ] ]
ADDRULE "REMEMBER [ # ] [ NEWKEY ]
PPROP "IF "PRIORITY 3
ADDRULE "IF [ #A IF #B HAD #C ]
[ [ PRE [ :A IF :B MIGHT HAVE :C ] IF ] ]
ADDRULE "IF [ # IF #STUFF ]
[ [ DO YOU THINK THAT :STUFF? ]
[ WHAT DO YOU THINK ABOUT :STUFF? ]
[ DO YOU WISH THAT :STUFF? ] ]
PPROP "DREAMED "PRIORITY 4
ADDRULE "DREAMED [ # YOU DREAMED #STUFF ]
[ [ REALLY :STUFF? ]
[ HAVE YOU EVER FANTASIED :STUFF WHILE YOU WERE AWAKE? ]
[ HAVE YOU DREAMED :STUFF BEFORE? ]
DREAM
NEWKEY ]
ADDRULE "DREAMED [ # ]
[ DREAM
NEWKEY ]
PPROP "DREAMT "TRANSLATION "DREAMED
PPROP "DREAMT "PRIORITY 4
PPROP "DREAMT "RULES [ DREAMED ]
PPROP "DREAM "PRIORITY 3
ADDRULE "DREAM [ # ]
[ [ WHAT DOES THAT DREAM SUGGEST TO YOU. ]
[ DO YOU DREAM OFTEN? ]
NEWKEY ]
PPROP "DREAMS "TRANSLATION "DREAM
PPROP "DREAMS "PRIORITY 3
PPROP "DREAMS "RULES [ DREAM ]
PPROP "WHAT "PRIORITY 0
ADDRULE "WHAT [ !:IN [ WHAT WHERE ] # ] [ HOW ]
ADDRULE "WHAT [ # !A:IN [ WHAT WHERE ] #B ]
[ [ TELL ME ABOUT :A :B. ]
[ :A :B? ]
[ REALLY. ]
NEWKEY ]
PPROP "ALIKE "PRIORITY 10
PPROP "ALIKE "RULES [ DIT ]
PPROP "SAME "PRIORITY 10
PPROP "SAME "RULES [ DIT ]
PPROP "CERTAINLY "PRIORITY 0
PPROP "CERTAINLY "RULES [ YES ]
PPROP "FEEL "BELIEF "TRUE
PPROP "THINK "BELIEF "TRUE
PPROP "BELIEVE "BELIEF "TRUE
PPROP "WISH "BELIEF "TRUE
PPROP "BET "BELIEF "TRUE
ADDMEMR "MY [ # YOUR &STUFF ]
[ [ EARLIER YOU SAID YOUR :STUFF. ]
[ BUT YOUR :STUFF. ]
[ DOES THAT HAVE ANYTHING TO DO WITH YOUR STATEMENT ABOUT :STUFF? ] ]
PPROP "PERHAPS "PRIORITY 0
ADDRULE "PERHAPS [ # ]
[ [ YOU DON'T SEEM QUITE CERTAIN. ]
[ WHY THE USCERTAIN TONE? ]
[ DON'T YOU KNOW? ] ]
PPROP "MAYBE "PRIORITY 0
PPROP "MAYBE "RULES [ PERHAPS ]
PPROP "NAME "PRIORITY 15
ADDRULE "NAME [ # ]
[ [ I AM NOT INTERESTED IN NAMES. ]
[ I'VE TOLD YOU BEFORE I DON'T CARE ABOUT NAMES; PLEASE CONTINUE ] ]
PPROP "HELLO "PRIORITY 0
ADDRULE "HELLO [ # ]
[ [ HOW DO YOU DO. PLEASE STATE YOUR PROBLEM. ] ]
PPROP "COMPUTER "PRIORITY 50
ADDRULE "COMPUTER [ # ]
[ [ DO COMPUTERS WORRY YOU? ]
[ WHY DO YOU MENTION COMPUTERS? ]
[ WHAT DO YOU THINK ABOUT MACHINES? ] ]
PPROP "MACHINE "PRIORITY 50
PPROP "MACHINE "RULES [ COMPUTER ]
PPROP "MACHINES "PRIORITY 50
PPROP "MACHINES "RULES [ COMPUTER ]
PPROP "COMPUTERS "PRIORITY 50
PPROP "COMPUTERS "RULES [ COMPUTER ]
PPROP "AM "PRIORITY 0
PPROP "AM "TRANSLATION "ARE
; * SETUP 2 *
ADDRULE "AM [ # ARE YOU #STUFF ]
[ [ DO YOU BELIVE YOU ARE :STUFF? ]
[ WOULD YOU WANT TO BE :STUFF? ]
[ WHAT WOULD IT MEAN IF YOU WERE :STUFF? ]
HOW ]
ADDRULE "AM [ # ]
[ [ WHY DO YOU SAY "AM"? ]
[ I DON'T UNDERSTAND THAT ] ]
PPROP "ARE "PRIORITY 0
ADDRULE "ARE [ #A THERE ARE #B YOU #C ]
[ [ PRE [ :A THERE ARE :B ] ARE ] ]
ADDRULE "ARE [ # THERE ARE &STUFF ]
[ [ WHAT MAKES YOU THINK THERE ARE :STUFF? ]
[ DO YOU WISH THERE WERE :STUFF? ] ]
ADDRULE "ARE [ # ARE I #STUFF ]
[ [ WHY ARE YOU INTERESTED IN WETHER I AM :STUFF OR NOT? ]
[ WOULD YOU PREFER IF I WEREN'T :STUFF? ]
HOW ]
ADDRULE "ARE [ ARE # ]
[ HOW ]
ADDRULE "ARE [ # ARE #STUFF ]
[ [ DID YOU TRHINK THEY MIGHT NOT BE :STUFF? ]
[ POSSIBLY THEY ARE :STUFF. ] ]
PPROP "YOUR "PRIORITY 0
PPROP "YOUR "TRANSLATION "MY
ADDRULE "YOUR [ # MY #STUFF ]
[ [ WHY ARE YOU CONCERNED OVER MY :STUFF? ]
[ WHAT ABOUT YOUR OWN :STUFF? ]
[ ARE YOU WORRIED ABOUT SOMEONE ELSE'S :STUFF? ]
[ REALLY, MY :STUFF? ] ]
PPROP "WAS "PRIORITY 2
ADDRULE "WAS [ # WAS YOU #STUFF ]
[ [ WHAT IF YOU WERE :STUFF? ]
[ WHAT DOES " :STUFF " SUGGEST TO YOU? ]
HOW ]
ADDRULE "WAS [ # YOU WAS #STUFF ]
[ [ WERE YOU REALLY? ]
[ PERHAPS I ALREADY KNEW YOU WERE :STUFF? ] ]
ADDRULE "WAS [ # WAS I #STUFF ]
[ [ WOULD YOU LIKE TO BELIEVE I WAS :STUFF? ]
[ WHAT IF I HAD BEEN :STUFF? ] ]
ADDRULE "WAS [ # ] [ NEWKEY ]
PPROP "WERE "PRIORITY 0
PPROP "WERE "TRANSLATION "WAS
PPROP "WERE "RULES [ WAS ]
PPROP "ME "TRANSLATION "YOU
PPROP "YOU'RE "PRIORITY 0
PPROP "YOU'RE "TRANSLATION "I'M
ADDRULE "YOU'RE [ # I'M #STUFF ]
[ [ PRE [ I ARE :STUFF ] YOU ] ]
PPROP "I'M "PRIORITY 0
PPROP "I'M "TRANSLATION "YOU'RE
ADDRULE "I'M [ # YOU'RE #STUFF ]
[ [ PRE [ YOU ARE :STUFF ] I ] ]
PPROP "MYSELF "TRANSLATION "YOURSELF
PPROP "YOURSELF "TRANSLATION "MYSELF
PPROP "MOTHER "FAMILY "TRUE
PPROP "MOM "TRANSLATION "MOTHER
PPROP "MOM "FAMILY "TRUE
PPROP "MOMMY "TRANSLATION "MOTHER
PPROP "MOMMY "FAMILY "TRUE
PPROP "FATHER "FAMILY "TRUE
PPROP "DAD "TRANSLATION "FATHER
PPROP "DAD "FAMILY "TRUE
PPROP "DADDY "TRANSLATION "FATHER
PPROP "DADDY "FAMILY "TRUE
PPROP "SISTER "FAMILY "TRUE
PPROP "BROTHER "FAMILY "TRUE
PPROP "HUSBAND "FAMILY "TRUE
PPROP "WIFE "FAMILY "TRUE
PPROP "CHILDREN "FAMILY "TRUE
PPROP "I "PRIORITY 0
PPROP "I "TRANSLATION "YOU
ADDRULE "I [ # YOU !:IN [ WANT NEED ] #STUFF ]
[ [ WHAT WOULD IT MEAN TO YOU IF YOU GOT :STUFF? ]
[ WHY DO YOU WANT :STUFF? ]
[ I SUSPECT YOU REALLY DON'T WANT :STUFF. ] ]
ADDRULE "I [ # YOU ARE # !STUFF:IN [ SAD UNHAPPY DEPRESSED SICK ] # ]
[ [ I'M SORRY TO HEAR YOU ARE :STUFF. ]
[ DO YOU THINK I CAN HELP YOU NOT TO BE :STUFF? ]
[ PLEASE GO ON. ] ]
ADDRULE "I [ # YOU ARE # !STUFF:IN [ HAPPY ELATED GLAD BETTER ] # ]
[ [ HOW HAVE I HELPED YOU TO BE :STUFF? ]
[ WHAT MAKES YOU :STUFF JUST NOW? ]
[ WHAT DO YOU MEAN BY :STUFF? ] ]
ADDRULE "I [ # YOU WAS # ]
[ WAS ]
ADDRULE "I [ # YOU !:BELIEFP YOU #STUFF ]
[ [ DO YOU REALLY THINK SO? ]
[ DO YOU REALLY DOUBT YOU :STUFF? ] ]
ADDRULE "I [ # YOU # !:BELIEFP # I # ]
[ YOU ]
ADDRULE "I [ # YOU ARE #STUFF ]
[ [ IS IT BECAUSE YOU ARE :STUFF THAT YOU CAME TO ME? ]
[ DO YOU ENJOY BEING :STUFF? ] ]
ADDRULE "I [ # YOU !:IN [ CAN'T CANNOT ] #STUFF ]
[ [ HOW DO YOU KNOW YOU CAN'T :STUFF? ]
[ DO YOU REALLY WANT TO BE ABLE TO :STUFF? ] ]
; * SETUP 3 *
ADDRULE "I [ YOU DON'T #STUFF ]
[ [ DON'T YOU REALLY :STUFF? ]
[ WHY DON'T YOU :STUFF? ]
[ DOES THAT TROUBLE YOU? ] ]
ADDRULE "I [ # YOU FEEL #STUFF ]
[ [ TELL ME MORE ABOUT SUCH FEELINGS. ]
[ OF WHAT DOES FEELING :STUFF REMIND YOU? ] ]
ADDRULE "I [ # YOU #STUFF I # ]
[ [ PERHAPS IN YOUR FANTASY WE :STUFF EACH OTHER. ]
[ DO YOU WISH TO :STUFF ME? ]
[ DO YOU :STUFF ANYONE ELSE? ] ]
ADDRULE "I [ #STUFF ]
[ [ YOU SAY :STUFF. ]
[ DO YOU SAY :STUFF FOR SOME SPECIAL REASON? ] ]
PPROP "YOU "PRIORITY 0
PPROP "YOU "TRANSLATION "I
ADDRULE "YOU [ # I REMIND YOU OF # ]
[ DIT ]
ADDRULE "YOU [ # I ARE # YOU # ]
[ NEWKEY ]
ADDRULE "YOU [ # I ARE #STUFF ]
[ [ WHAT MAKES YOU THINK I AM :STUFF? ]
[ DO YOU SOMETIMES WISH YOU WERE :STUFF? ] ]
ADDRULE "YOU [ # I #STUFF YOU ]
[ [ WHY DO YOU THINK I :STUFF YOU? ]
[ DOES SOMEONE ELSE BELIEVE I :STUFF YOU? ] ]
ADDRULE "YOU [ # I &STUFF ]
[ [ WE WERE DISCUSSING YOU, NOT ME. ]
[ OH, I :STUFF? ]
[ DO YOU :STUFF? ]
[ WHAT ARE YOUR FEELINGS NOW? ] ]
ADDRULE "YOU [ # ]
[ NEWKEY ]
PPROP "WE "TRANSLATION "YOU
PPROP "WE "PRIORITY 0
PPROP "WE "RULES [ I ]
PPROP "XXYYZZ "PRIORITY 0
ADDRULE "XXYYZZ [ # ]
[ [ YOU'RE BEING SOMEWHAT SHORT WITH ME. ]
[ PERHAPS YOU'D RATHER TALK ABOUT SOMETHING ELSE. ]
NEWKEY ]
PPROP "YES "PRIORITY 0
ADDRULE "YES [ YES ]
[ XXYYZZ [ PREE [ X YES ] YES ] ]
ADDRULE "YES [ # ]
[ [ YOU SEEM QUITE POSITIVE. ]
[ I SEE. ]
NEWKEY ]
PPROP "NO "PRIORITY 0
ADDRULE "NO [ NO ]
[ XXYYZZ [ PRE [ X NO ] NO ] ]
ADDRULE "NO [ # ]
[ [ ARE YOU SAYING "NO" JUST TO BE NEGATIVE? ]
[ WHY NOT? ]
NEWKEY ]
PPROP "MY "PRIORITY 2
PPROP "MY "TRANSLATION "YOUR
ADDRULE "MY [ # YOUR # !A:FAMILYP #B ]
[ [ TEL ME MORE ABOUT YOUR FAMILY. ]
[ WHAT ELSE COMES TO MIND WHEN YOU THINK OF YOUR :A? ] ]
ADDRULE "MY [ # YOUR &STUFF ]
[ [ YOUR :STUFF? ]
[ IS IT IMPORTANT TO YOU THAT YOUR :STUFF? ] ]
ADDRULE "MY [ # ]
[ NEWKEY ]
PPROP "CAN "PRIORITY 0
ADDRULE "CAN [ # CAN I #STUFF ]
[ [ YOU BELIEVE I CAN :STUFF, DON'T YOU? ]
HOW
[ PERHAPS YOU WOULD LIKE TO BE ABLE TO :STUFF YOURSELF. ] ]
ADDRULE "CAN [ # CAN YOU #STUFF ]
[ [ WETHER OR NOT YOU CAN :STUFF DEPENDS MORE ON YOU THAN ON ME. ]
[ PERHAPS YOU DON'T WANT TO BE ABLE TO :STUFF? ]
HOW ]
ADDRULE "CAN [ # ]
[ HOW
NEWKEY ]
PPROP "IS "PRIORITY 0
ADDRULE "IS [ &A IS &B ]
[ [ SUPPOSE :A WERE NOT :B. ]
[ PERHAPS :A REALLY IS :B. ]
[ TELL ME MORE ABOUT :A. ] ]
ADDRULE "IS [ # ]
[ NEWKEY ]
PPROP "WHERE "PRIORITY 0
PPROP "WHERE "RULES [ HOW ]
PPROP "HOW "PRIORITY 0
ADDRULE "HOW [ # ]
[ [ WHY DO YOU ASK? ]
[ DOES THAT QUSTION INTEREST YOU? ]
[ WHAT DO YOU THINK? ]
[ HAVE YOU ASKED ANYONE ELSE? ] ]
PPROP "BECAUSE "PRIORITY 0
ADDRULE "BECAUSE [ # ]
[ [ IS THAT THE REAL REASON? ]
[ YOUR NOT CONCEALING ANYTHING FROM ME, ARE YOU? ] ]
PPROP "WHY "PRIORITY 0
ADDRULE "WHY [ # WHY DON'T I #STUFF ]
[ [ DO YOU BELIEVE I DON'T :STUFF? ]
[ YOU SHOULD :STUFF YOURSELF? ]
[ YOU WANT ME TO :STUFF? ]
HOW ]
; * SETUP 4 *
ADDRULE "WHY [ # WHY CAN'T YOU #STUFF ]
[ [ DO YOU THINK YOU SHOULD BE ABLE TO :STUFF? ]
[ HAVE YOU ANY IDEA WHY YOU CAN'T :STUFF? ]
HOW ]
ADDRULE "WHY [ # ]
[ [ WHY INDEED? ]
[ WHY "WHY"? ]
[ WHY NOT? ]
HOW
NEWKEY ]
PPROP "EVERYONE "PRIORITY 2
ADDRULE "EVERYONE [ # !A:IN [ EVERYONE EVERYBODY NOBODY NOONE ] # ]
[ [ REALLY, :A? ]
[ SURELY NOT :A. ]
[ CAN YOU THINK OF ANYONE IN PARTICULAR? ]
[ I SUSPECT YOU'RE EXAGGERATING A LITTLE. ] ]
PPROP "EVERYBODY "PRIORITY 2
PPROP "EVERYBODY "RULES [ EVERYONE ]
PPROP "NOBODY "PRIORITY 2
PPROP "NOBODY "RULES [ EVERYONE ]
PPROP "NOONE "PRIORITY 2
PPROP "NOONE "RULES [ EVERYONE ]
PPROP "ALWAYS "PRIORITY 1
ADDRULE "ALWAYS [ # ]
[ [ CAN YOU THINK OF A SPECIFIC EXAMPLE? ]
[ WHEN? ]
[ WHAT IF THIS NEVER HAPPENED? ] ]
PPROP "LIKE "PRIORITY 10
ADDRULE "LIKE [ # !:IN [ AM IS ARE WAS ] # LIKE # ]
[ DIT ]
ADDRULE "LIKE [ # ]
[ NEWKEY ]
ADDRULE "DIT [ # ]
[ [ IN WHAT WAY? ]
[ WHAT RESENBLANCE DO YOU SEE? ]
[ COULD THERE REALLY BE SOME CONNECTION? ]
HOW ]
PPROP "PROBLEM "PRIORITY 5
ADDRULE "PROBLEM
[ #A !B:IN [ IS ARE ] YOUR !C:IN [ PROBLEM PROBLEMS ] # ]
[ [ :A :B YOUR :C. ]
[ ARE YOU SURE :A :B YOUR :C. ]
[ DO YOU OFTEN THINK ABOUT :A? ] ]
ADDRULE "PROBLEM
[ # YOUR !A:IN [ PROBLEM PROBLEMS ] !B:IN [ IS ARE ] #C ]
[ [ YOUR :A :B :C? ]
[ ARE YOU SURE YOUR :A :B :C? ]
[ YOU THINK YOU HAVE PROBLEMS? ] ]
ADDRULE "PROBLEM [ # ]
[ [ PLEASE CONTINUE, THIS MAY BE INTERESTING. ]
[ YOU SEEM A BIT UNEASY. ]
NEWKEY ]
PPROP "PROBLEMS "PRIORITY 5
PPROP "PROBLEMS "RULES [ PROBLEM ]
ADDMEMR "PROBLEM [ #STUFF IS YOUR PROBLEM # ]
[ [ EARLIER YOU MENTIONED :STUFF. ]
[ TELL ME MORE ABOUT :STUFF. ]
[ YOU HAVEN'T MENTIONED :STUFF FOR A WHILE. ] ]
PPROP "ASK "PRIORITY 0
ADDRULE "ASK [ # YOU ASK # ]
[ HOW ]
ADDRULE "ASK [ # YOU ! ASKING # ]
[ HOW ]
ADDRULE "ASK [ # I # ]
[ YOU ]
ADDRULE "ASK [ # ]
[ NEWKEY ]
] ; *** end of setup ***
; Adding rules
make "ADDRULE [
procedure [ [ :v.word :pattern :results ] [ ] [ :propname ] ]
make "propname gensym
pprop :v.word "RULES ( se gprop :v.word "RULES list :pattern :propname )
pprop :v.word :propname :results ]
make "ADDMEMR [
procedure [ [ :v.word :pattern :results ] [ ] [ :propname ] ]
make "propname gensym
pprop :v.word "MEMR ( se gprop :v.word "MEMR list :pattern :propname )
pprop :v.word :propname :results ]
make "gensym [
procedure [ ]
if not namep "gensym.number [ make "gensym.number 0 ] [ ]
make "gensym.number + 1 :gensym.number
op word "g :gensym.number ]
make "PPROP [
procedure [ [ :a :b :c ] ]
if equalp :c "TRUE [ make "c true ] [ ]
pprop :a :b :c ]
; Do setup
pr [ ]
pr [ Running setup for doctor. ]
pr [ ]
setup
erase [ setup ADDRULE ADDMEMR gensym PPROP ]
pr [ Setup for doctor is complete. ]
pr [ ]
pr [ Give the command "doctor" to see it run. ]
pr [ ]