ELIZA Á¤½Åº´È¯ÀÚ Áø´Ü ÇÁ·Î±×·¥

 

ÀΰøÁö´ÉÀÇ ¿ø¸®¿Í ½Ç¹«»ç·Ê : À̱¤Çü. È«À¯½Ä. ±èÀÎÅÃ. ÁøÇö¼ö. ¹ÎÁØ¿µ. ÁÖ¿µÈÆ °øÀú, µ¿¿µÃâÆÇ»ç, 1998, Page 109~124 

ÀÌ ÇÁ·Î±×·¥Àº Á¤½Åº´È¯ÀÚ°¡ Àǻ簡 ¾øÀ̵µ COMPUTER CRT¸¦ ÀÌ¿ëÇؼ­ ¼­·Î °£´ÜÇÑ ´ëÈ­¸¦ ÁÖ°í¹ÞÀ» ¼ö ÀÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ÄÄÇ»ÅÍ¿¡¼­ HOW ARE YOU THIS BEAUTIFUL DAY?ÀÇ ³»¿ëÀ» Àǻ簡 ¹°¾î º¸µíÀÌ ÇÁ·Î±×·¥¿¡¼­ ¾ð¾î°¡ ÀÚµ¿ »ý¼ºµÇ°í ȯÀÚ°¡ ÀÌ ³»¿ë¿¡ ÇØ´çÇÏ´Â ´ë´ä :  I DON'T KNOW, I FEEL BAD.À» COMPUTER KEYBOARD·Î TYPINGÇϸé ÇÁ·Î±×·¥¿¡¼­ TRANSE¿Í FRONT TOKENÀÇ ±â´ÉÀ¸·Î ´ÙÀ½°ú °°Àº ¾ð¾î°¡ ÀÚµ¿ »ý¼ºµÇ¾î CRT¿¡ DISPLAYµÉ °ÍÀÌ´Ù.

HOW DO YOU KNOW THAT?

±×·¯¸é ÀÌ¿Í °°Àº ±â´ÉÀÌ ¾î¶»°Ô µÇ´ÂÁö¸¦ ¾Ë¾Æº¸ÀÚ. ¿ì¼± ¿ì¸®°¡ »ç¿ëÇÏ´Â ¾ð¾îµµ ¾Ë°í º¸¸é DO YOU HAVE A BOOK?ÀÇ ´ë´äÀ¸·Î´Â YES, I HAVE A BOOK. ARE YOU A BOY?ÀÇ ´ë´äÀ¸·Î´Â YES, I AM A BOY.¿Í °°ÀÌ µÉ °ÍÀÌ´Ù. Áï ¿ì¸®´Â Àǹ®¹®ÀÇ ÁÖ¾î¿Í µ¿»ç´Â ±àÁ¤¹®À¸·Î ´ë´äµÉ ¶§¿¡ YOU¸¦ I·Î ¹Ù²Ù°í µ¿»ç ARE¸¦ AMÀ¸·Î ¹Ù²Û´Ù. ÀÌ·¯ÇÑ °ÍÀº TRANSÀÇ ±â´ÉÀ» ÀÌ¿ëÇؼ­ ÀûÀýÇÑ ´Ü¾î¿¡ ´ëÀÀÇÏ°Ô²û ¹Ù²Ü ¼ö ÀÖ´Ù.

        char *trans[ ] = {
                "you", "Let's not talk about me.",
                "think", "Why do you think that?",
                "hate", "So you hate something - tell me more.",

  ±×¸®°í ¸ñÀû¾î´Â ±×´ë·Î ¹Ýº¹µÇ¾î ±àÁ¤¹®À¸·Î »ç¿ëµÈ´Ù. ÀÌ·± ¿ø¸®¸¦ ÄÄǪÅÍ¿¡ ÀÌ¿ëÇϱâ À§Çؼ­ ÇÑ ¹®ÀåÀ» HEAD¿Í TAIL·Î ³ª´« ÈÄ¿¡ int head=0;/* head of topics queue*/ int tail=0;
 /* tail of topics queue */ ÇÁ·Î±×·¥Àº ȯÀÚ°¡ ÀÔ·ÂÇÑ ÀÀ´äÀ» ´Ü¼øÈ÷ RETURNÀ» Ä¡°Å³ª ±æÀÌ°¡ VERYSHORT°³ÀÇ #define SHORT 10 #define VERYSHORT 3 ¹®ÀÚº¸´Ù ªÀº ¹ÝÀÀÀ» ³ÖÀ¸¸é RESPOND( )ÀÇ È£ÃâÇÔÀ¸·Î½á ÀÌÀüÀÇ ÁÖÁ¦·Î µ¹¾Æ°¡·Á°í ÇÑ´Ù.

        if (strlen(s)<VERYSHORT && strcmp(s, "bye")) {
          else{
             if (!*response[res]) res=0;/* start over again */
             printf("%s\n", response[res++]);
          }
          return;
        }

  TOPICS Å¥¿¡ ÁÖÁ¦°¡ ÀÖÀ¸¸é FIND_TOPIC( )´Â ÂüÀ» ¸®ÅÏÇÏ°í ÁÖÁ¦¸¦ ¹è¿­ T¿¡ ³ÖÀ» °ÍÀÌ´Ù.  ¸¸¾à ÀÌÀüÀÇ ÁÖÁ¦°¡ ¾øÀ¸¸é RESPOND( )´Â RESPONSE µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Àü¿¡ ÀÖ´ø ¹ÝÀÀ (STOCK RESPONSE)À» ¼±ÅÃÇÑ´Ù. ȯÀÚ°¡ SHORT¹®ÀÚ¼öº¸´Ù ´õ ±ä ¹ÝÀÀÀ» ³ÖÀ¸¸é RESPOND( )´Â ´ë´äÀ» TOPICS Å¥¿¡ ³õ´Â´Ù.

          if (strlen(s)<VERYSHORT && strcmp(s, "bye")) {
                  if (find_topic(t))  {
                    printf("You just said : ");
                    printf("%s \n", t);
                    printf("tell me more.\n");
                    }

  ÀÌ Ã¼Å©´Â Àǻ簡 ¸Å¿ì ªÀº ´ë´äÀ» ÁÖÁ¦·Î À߸øÇÏ´Â °ÍÀ» ¸·±â À§Çؼ­ ÇÊ¿äÇϸç RESPOND( )´Â TRANS µ¥ÀÌÅͺ£À̽º¿¡ ÀÖ´Â ¾î¶² ´Ü¾î¿¡ ´ëÇؼ­µµ ȯÀÚÀÇ ¹ÝÀÀÀ» ÀÚ¼¼È÷ Á¶»çÇÑ ÈÄ¿¡ RESPOND( )°¡ Çϳª¸¦ ¹ß°ßÇϸé Àû´çÇÑ ¹ÝÀÀÀ» ¸¸µé°í ¹®ÀåÀÇ ³¡¿¡¼­ ¾î¶² ´Ü¾îµµ µ¥ÀÌÅͺ£À̽º¿¡ ÀÖ´Â °Í°ú ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é ÀÇ»ç´Â ´Ü¼øÈ÷ TELL ME MORE¶ó°í ¸»ÇÑ´Ù. ÇÔ¼ö respond( )´Â "my"¸¦ "you"ÇÏ´Â °Íó·³ ¸î ´Ü¾îÀÇ ³»¿ëÀ» ¹Ù²Ù±â À§Çؼ­ trans µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÑ´Ù. ÇÁ·Î±×·¥ÀÌ trans µ¥ÀÌÅͺ£À̽º¿¡¼­ ´Ü¾î¸¦ ãÁö¸øÇϸé ÇöÀçÀÇ ´Ü¾î¸¦ ´Ü¼øÈ÷ ´Ù½Ã ÇÁ¸°Æ®ÇÑ´Ù. ȯÀÚ°¡ returnÀ» Ä¡¸é respond( )´Â ¹ÝÀÀ µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ ÀÌ¹Ì ÀÖ´Â ¹ÝÀÀ(stock response)À» »ç¿ëÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥Àº get_token( )ÇÔ¼öÀÇ ¾à°£ º¯ÇüµÈ ¹öÀüÀ» »ç¿ëÇÏ¿© ȯÀÚÀÇ ¹ÝÀÀÀ» ºÐ¼®ÇÑ´Ù.

        get_token( );
          loc=lookup(token);
          if (loc!=-1) {
             printf("%s\n", trans[loc+1]);
             return;
          }
        }  while(*token);

  Áï ȯÀÚÀÇ ¹ÝÀÀÀ» ÀúÀåÇÒ Å¥¸¦ ¸¸µé°í TRANS µ¥ÀÌÅͺ£À̽º´Â Å°¿öµå¿Í ¹ÝÀÀÀ» °£Á÷ÇÒ °ÍÀÌ´Ù. Áï ÇÁ·Î±×·¥ÀÌ Å°¿öµå¸¦ ÀνÄÇÒ ¶§¸¶´Ù Àû´çÇÑ ¹ÝÀÀÀ» ³ªÅ¸³¾ °ÍÀÌ´Ù.  2Â÷¿ø ¹®Àڹ迭 TOPICS´Â ȯÀÚÀÇ ¹ÝÀÀ¿¡ ´ëÇÑ È¯ÇüÅ¥¸¦ À¯ÁöÇÏ°í ÇÁ·Î±×·¥Àº TOPICS¸¦ À妽º·Î ÇÏ°í Å¥¸¦ ¸¸µé±â À§Çؼ­ HEAD¿Í TAIL º¯¼öµéÀ» »ç¿ëÇÑ´Ù.  MAX´Â Å¥¸¦ ¼³Á¤ÇÑ ÀÓÀÇÀÇ °ªÀ̸ç ÇÁ·Î±×·¥Àº ȯÀÚ°¡ ´äÀ» ³ÖÀ¸¸é ³ªÁß¿¡ ÇàÀ§ÀÇ ¾î¶² °úÁ¤ÀÌ ÃëÇØÁú °ÍÀÎÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ SHORT¿Í VERYSHORT¸¦ »ç¿ëÇÑ´Ù. ÇÁ·Î±×·¥Àº ȯÀÚ°¡ ÀÔ·ÂÇÑ ÀÀ´äÀ» ´Ü¼øÈ÷ RETURNÀ» Ä¡°Å³ª ±æÀÌ°¡ VERYSHORT°³ÀÇ ¹®ÀÚº¸´Ù ªÀº ¹ÝÀÀÀ» ³ÖÀ¸¸é REPOND( )ÀÇ È£ÃâÇÔÀ¸·Î½á ÀÌÀüÀÇ ÁÖÁ¦·Î µ¹¾Æ°¡·Á°í ÇÑ´Ù. TOPICS Å¥¿¡ ÁÖÁ¦°¡ ÀÖÀ¸¸é FIND_TOPIC( )´Â ÂüÀ» ¸®ÅÏÇÏ°í ÁÖÁ¦¸¦ ¹è¿­ T¿¡ ³ÖÀ» °ÍÀÌ´Ù. ¸¸¾à ÀÌÀüÀÇ ÁÖÁ¦°¡ ¾øÀ¸¸é RESPOND( )´Â RESPONSE µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Àü¿¡ ÀÖ´ø ¹ÝÀÀ(STOCK RESPONSE)À» ¼±ÅÃÇÑ´Ù.
  È¯ÀÚ°¡ SHORT¹®ÀÚ¼öº¸´Ù ´õ ±ä ¹ÝÀÀÀ» ³ÖÀ¸¸é RESPOND( )´Â ´ë´äÀ» TOPICS Å¥¿¡ ³õ´Â´Ù. ÀÌ Ã¼Å©´Â Àǻ簡 ¸Å¿ì ªÀº ´ë´äÀ» ÁÖÁ¦·Î À߸øÇÏ´Â °ÍÀ» ¸·±â À§Çؼ­ ÇÊ¿äÇϸç, RESPOND( )´Â TRANS µ¥ÀÌÅͺ£À̽º¿¡ ÀÖ´Â ¾î¶² ´Ü¾î¿¡ ´ëÇؼ­µµ ȯÀÚÀÇ ¹ÝÀÀÀ» ÀÚ¼¼È÷ Á¶»çÇÑ ÈÄ¿¡ RESPOND( )°¡ Çϳª¸¦ ¹ß°ßÇϸé Àû´çÇÑ ¹ÝÀÀÀ» ¸¸µé°í ¹®ÀåÀÇ ³¡¿¡¼­ ¾î¶² ´Ü¾îµµ µ¥ÀÌÅͺ£À̽º¿¡ ÀÖ´Â °Í°ú ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é ÀÇ»ç´Â ´Ü¼øÈ÷ TELL ME MORE¶ó°í ¸»ÇÑ´Ù. ÇÔ¼ö respond( )´Â "my"¸¦ "your"ÇÏ´Â °Íó·³ ¸î ´Ü¾îÀÇ ³»¿ëÀ» ¹Ù²Ù±â À§Çؼ­ trans µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÑ´Ù.
  ÇÁ·Î±×·¥ÀÌ trans µ¥ÀÌÅͺ£À̽º¿¡¼­ ´Ü¾î¸¦ ãÁö ¸øÇϸé ÇöÀçÀÇ ´Ü¾î¸¦ ´Ü¼øÈ÷ ´Ù½Ã ÇÁ¸°Æ® ÇÑ´Ù. ȯÀÚ°¡ returnÀ» Ä¡¸é respond( )´Â ¹ÝÀÀ µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ ÀÌ¹Ì ÀÖ´Â ¹ÝÀÀ(stock response)À» »ç¿ëÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥Àº get_token( )ÇÔ¼öÀÇ ¾à°£ º¯ÇüµÈ ¹öÀüÀ» »ç¿ëÇÏ¿© ȯÀÚÀÇ ¹ÝÀÀÀ» ºÐ¼®ÇÑ´Ù. Áï ȯÀÚÀÇ ¹ÝÀÀÀ» ÀúÀåÇÒ Å¥¸¦ ¸¸µé°í, TRANS µ¥ÀÌÅͺ£À̽º´Â Å°¿öµå¿Í ¹ÝÀÀÀ» °£Á÷ÇÒ °ÍÀÌ´Ù. Áï ÇÁ·Î±×·¥ÀÌ Å°¿öµå¸¦ ÀνÄÇÒ ¶§¸¶´Ù Àû´çÇÑ ¹ÝÀÀÀ» ³ªÅ¸³¾ °ÍÀÌ´Ù.  2Â÷¿ø ¹®Àڹ迭 TOPICS´Â ȯÀÚÀÇ ¹ÝÀÀ¿¡ ´ëÇÑ È¯ÇüÅ¥¸¦ À¯ÁöÇÏ°í ÇÁ·Î±×·¥Àº TOPICS¸¦ À妽º·Î ÇÏ°í Å¥¸¦ ¸¸µé±â À§Çؼ­ HEAD¿Í TAIL º¯¼öµéÀ» »ç¿ëÇÑ´Ù. MAX´Â Å¥¸¦ ¼³Á¤ÇÑ ÀÓÀÇÀÇ °ªÀ̸ç ÇÁ·Î±×·¥Àº ȯÀÚ°¡ ´äÀ» ³ÖÀ¸¸é ³ªÁß¿¡ ÇàÀ§ÀÇ ¾î¶² °úÁ¤ÀÌ ÃëÇØÁú °ÍÀÎÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ SHORT¿Í VERYSHORT¸¦ »ç¿ëÇÑ´Ù.  

½ÇÇà°á°ú 

   ÄÄÇ»ÅÍ ½ºÅ©¸°  :   HOW ARE YOU THIS BEAUTIFUL DAY?
   »ç¿ëÀÚ             :   I DON'T KNOW. I FEEL BAD
   ÄÄÇ»ÅÍ ½ºÅ©¸°  :   HOW DO YOU KNOW THAT?
   »ç¿ëÀÚ             :   I FEEL LIKE I COULD KILL.
   ÄÄÇ»ÅÍ ½ºÅ©¸°  :  IT IS WRONG TO KILL
   »ç¿ëÀÚ             :   I NEVER SEEM TO WIN
 

ÀΰøÁö´É¾ð¾î¸¦ »ç¿ëÇÑ °æ¿ì 

   È¯ÀÚ°¡ RESPONSEÇÑ ³»¿ë MY, YOUR·Î Çϱâ À§Çؼ­ TRANSLATE¸¦ »ç¿ëÇÑ´Ù.
   ASSERT(translate("UNHAPPY", "WHY ARE YOU UNHAPPY?")),
   ASSERT(translate("THINK", "WHY DO YOU THINK THAT?")), 
   ASSERT(translate("YOU", "LET'S NOT TALK ABOUT ME."))

  ¸¸ÀÏ RESPOND°¡ TRANSE  µ¥ÀÌÅͺ£À̽º¿¡¼­ ´Ü¾î¸¦ ¹ß°ßÇÏÁö ¸øÇϸé DOCTOR´Â RESPONSE µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÈ ÀÀ´äÀ» ÀÌ¿ëÇÏ¿© ȯÀÚ°¡ ÀÔ·ÂÇÑ ÀÀ´ä¿¡  ASSERTÀÇ ±â´ÉÀ» ÀÌ¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽ºÀÇ ¾ÕÀ̳ª µÚ¿¡ ÀýÀ» Ãß°¡½ÃŲ´Ù.

     PATIENT(S)  :-
          ASSERT(patresponses(S)),
          ASSERT(temp(S)),
     PURGE  :- 
          RETRACT(translate(_, _)),
     FAIL.

  ASSERTA(X)¿Í ASSERTZ(X) ´Â ¶È°°ÀÌ µ¥ÀÌÅͺ£À̽º¿¡ ÀýÀ» Ãß°¡ÇÏÁö¸¸  ASSERTA(X)..... µ¥ÀÌÅͺ£À̽ºÀÇ Á¦ÀÏ ¾Õ¿¡ ÀýÀ» Ãß°¡ÇÏ°í ASSERTZ(X)...... µ¥ÀÌÅͺ£À̽ºÀÇ Á¦ÀÏ µÚ¿¡ ÀýÀ» Ãß°¡ÇÏ°í RETRACT(X)..... µ¥ÀÌÅͺ£À̽º¿¡¼­ ºÒÇÊ¿äÇÑ ÀýµéÀ» Ãß°¡ÇÑ´Ù. ¶Ç ÇÁ·Î±×·¥Àº DOCTOR°¡ ȯÀÚÀÇ ÀÀ´äÀ» ó¸®ÇÒ ¼ö ÀÖÀ» ¶§±îÁö TEMP µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇÑ´Ù.

      TEMP(S),
      S=quit,
      PURGE.


  È¯ÀÚ°¡ ´ÜÁö RETURN Å°¸¦ Ä£´Ù¸é DOCTORÀÇ Ã¹ ¹ø° ¶óÀÎÀº ¾ÕÀÇ ÁÖÁ¦¿¡ °üÇÑ ³»¿ëÀ¸·Î µ¹¾Æ°¡·Á°í ÇÑ´Ù. TOPICS µ¥ÀÌÅͺ£À̽º¿¡ ¾ÕÀÇ ÁÖÁ¦¿¡ °üÇÑ ³»¿ëÀÌ ¾ø´Ù¸é ÇÁ·Î±×·¥Àº RESPONSES µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÈ ÀÀ´ä Áß¿¡¼­ ÀûÇÕÇÑ °ÍÀ» ȯÀÚ°¡ ÇÑ ¹®ÀåÀ» ¼±ÅÃÇϸé RESPOND°¡ ½ÇÇàµÇ¸ç ½ÇÇà¿¡ ¼º°øÇϱâ À§Çؼ­´Â ȯÀÚ°¡ ÀÔ·ÂÇÑ ¹®Àå¿¡¼­ Å°¿öµå¸¦ ¹ß°ßÇØ¾ß ÇÑ´Ù. Å°¿öµå¸¦ ¹ß°ßÇϸé ÇÁ·Î±×·¥Àº Å°¿öµå¿Í ¿¬°áµÈ ÀÀ´äÀ» ÇÏ°í ¹ß°ßÇÏÁö ¸øÇϸé DOCTORÀÇ ¼¼ ¹ø° ÀýÀ» ÀÌ¿ëÇؼ­ ¹®Àå¿¡¼­ ´ÙÀ½ Å°¿öµå¸¦ ãÀ¸·Á°í ÇÑ´Ù.


    PARETRACT(topics(R)),
    R<>"", WRITE("YOU JUST SAID", ""),
    WRITE(R, ""), NL,
    WRITE("TELL ME MORE..."), NL.
    RESPOND("") :=FAIL.
    RESPOND(S) :-
    FRONTTOKEN(S, T, _),
    TRANSLATE(T, T2),
    WRITE(T2, " ").
    RESPOND(S) :-
    FRONTTOKEN(S, _, S2),
    RESPOND(S2).TIENT(S) :-

  ¹®Àå ³¡¿¡ µµ´ÞÇÏ°íµµ Å°¿öµå¸¦ ãÁö ¸øÇÏ¸é ¼ú¾îÀüü´Â ½ÇÇà¿¡ ½ÇÆÐÇÑ´Ù. À̶§¿¡´Â DOCTORÀÇ ¸¶Áö¸· ÀýÀÌ ¼öÇàµÇ¸ç ¸¶Áö¸· ÀýÀº ù ¹ø° Àý°ú µ¿ÀÏÇÏ´Ù.


    /* ELIZA Á¤½Åº´È¯ÀÚ Áø·á ÇÁ·Î±×·¥ */
    /* ºñÀΰøÁö´É¾ð¾î TURBO C¸¦ »ç¿ëÇÑ ¿¹ */

    /* Doctor #3 - optimistic and easily annoyed. */
     #define MAX 100
     #define SHORT 10
     #define VERYSHORT 3
     
     char *response[] = {
        "How are you this beautiful day?",
        "Did you have a happy childhood?",
        "Did you hate your father?",
        "I'm not sure I understand.",
        ""
     };

     char *trans[] = {
        "you", "Let's not talk about me.",
        "think", "Why do you think that?",
        "hate", "So you hate something - tell me more.",
        :what", "Why do you ask?",
        "want", "Why do you want that?",
        "need", "We all need many things - is this special?",
        "why", "Remember, therapy is good for you.",
        "know", "How do you know that?",
        "bye", "Your bill will be mailed to you.",
        "murder", "I don't like killing.",
        "kill", "It is wrong to kill.",
        "jerk", "Don't ever call me a jerk!",
        "can't", "Don't be negative - be positive.",
        "failure", "Strive for success.",
        "never", "Don't be negative - be positive.",
        "unhappy", "Why are you unhappy?",
        ""
     };

     char topics[MAX][80];/* holds old topics */
     char token[80];
     char *p_pos;
     int res=0;/* index into response array */
     int head=0;/* head of topics queue */
     int tail=0;/* tail of topics queue */

     main()
     {
        char s[80];
        printf("%s\n", response[res++]);
        do {
             printf(" : ");
             p_pos=s;
             gets(s);
             respond(s);
        }  while(strcmp(s, "bye"));
     }

     /* create the doctor's responses */
     respond(s)
     char *s;
     {
        char t[80];
        int loc;

        if (strlen(s) < VERYSHORT && strcmp(s, "bye")) {
           if (find_topic(t)) {
                printf("You just said :");
                printf("%s \n", t);
                printf("tell me more.\n");
           }
           else {
             if (!*response[res]) res=0;/* start over again */
             printf("%s\n", response[res++]);
           }
           return;
        }
        if (in_topics(s)) {
           printf("Stop repeating yourself!\n");
           return;
        }

        if (strlen(s) > SHORT) assert_topic(s);
        do {
           get_token();
           loc=lookup(token);
           if (loc!=-1) {
                printf("%s\n", trans[loc+1]);
                return;
           }
        } while(*token);
        /* comment of last resort */
        printf("Tell me more..., \n");
     }

     /* lookup a keyword in translation table */
     lookup(token)
     char *token;
     {
        int t;
        
        t=0;
        while(*trans[t]) {
           if (!strcmp(trans[t], token)) return t;
           t++;
        }
        return -1;
     }
     /* place a topic into the topics database */
     assert_topic(t)
     char *t;
     {
        if (head==MAX) head=0; /* wrap around */
        strcpy(topics[head], t);
        head++;
     }
     /* retrieve a topic */
     find_topic(t)
     char *t;
     {
        if (tail!=head) {
           strcpy(t, topics[tail]);
           tail++;
           /* wrap around if necessary */
           if (tail==MAX) tail=0;
           return 1;
        }
        return 0;
     }

     /* see if in topics queue */
     in_topics(s)
     char *s;
     {
        int t;
        for (t=0; t<MAX; t++)
           if (!strcmp(s, topics[t])) return 1;
        return 0;
     }
     /* return a token from the input stream */
     get_token()
     {
        char *p;
        p=token;
        /* skip spaces */
        while (*p_pos==' ') p_pos++;
        if (*p_pos=='\0') {  /* is end of input */
           *p++='\0';
           return;  
        }
        if (is_in(*p_pos, ".!?")) {
           *p=*p_pos;
           p++, p_pos++;
           *p='\0';
           return;
        }
        /* read word until */
        while(*p_pos!=' ' && !is_in(*p_pos, "., ;?!") && *p_pos) {
           *p=tolower(*p_pos++);
           p++;
        }
        *p='\0';
     }
     is_in(c, s)
     char c, *s;
     {
        while(*s) {
           if(c==*s) return 1;
           s++;
        }
        return 0;
     }

    /* ELIZA Á¤½Åº´ È¥ÀÚ Áø·á ÇÁ·Î±×·¥ */
    /* ÀΰøÁö´É¾ð¾î TURBO PROLOG¸¦ »ç¿ëÇÑ ¿¹ */
    /* AN IMPROVED DOCTOR PROGRAM */
     diagnostics
     domains
     list = symbol*
     number = integer
     database
      RESPONSES(STRING)
      TEMP(STRING)
      TRANSLATE(SYMBOL, SYMBOL)
      TOPICS(STRING)
      PATRESPONSES(STRING)

     PREDICATES
      CONVERSE
      PATIENT(STRING)
      DOCTOR(STRING)
      RESPOND(STRING)
      purge

    GOAL

     makewindow(1, 7, 4, " ", 0, 0, 25, 80),
     makewindow(2, 32, 7, " SPIDER", 0, 5, 10, 60),
     makewindow(4, 16, 6, " S E P", 11, 0, 14, 40),
     makewindow(5, 96, 1, " N   C", 11, 41, 14, 38),
     ASSERT(responses("HOW ARE YOU?")),
     ASSERT(responses("CAN I HELP YOU?")),
     ASSERT(responses("DO YOU HAVE SOME PROBLEMS?")),
     ASSERT(responses("GO ON")),
     ASSERT(responses("WHAT KIND OF PROBLEM DO YOU HAVE?")),
     ASSERT(temp("")),
     ASSERT(translate("UNHAPPY", "WHY ARE YOU UNHAPY?")),
     ASSERT(translate("THINK", "WHY DO YOU THINK THAT?")),
     ASSERT(translate("YOU", "LET'S NOT TALK ABOUT ME.")),
     ASSERT(translate("IMPORTANT", "PLEASE TELL ME MORE.")),
     ASSERT(translate("WHAT", "WHY DO YOU ASK?")),
     ASSERT(translate("WANT", "WHAT WOULD YOU DO WITH IT?")),

     ASSERT(translate("NEED", "OK TELL ME MORE.")),
     ASSERT(translate("WHY", "REMEMBER, THIS IS THE ONLY ONE POLICY TO WIN THE WAR.")),
     ASSERT(translate("KNOW", "YOU HAVE TO OBEY THE COMMANDER'S RULE")),
     ASSERT(translate("ENEMY", "YOU ARE A GOOD COMMANDER.")),
     ASSERT(translate("KILL", "THAT IS GOOD YOU HAVE TO KILL ENEMIES")),
     ASSERT(translate("HURRY", "YOU HAVE TO HURRY!")),
     ASSERT(translate("NEVER", "DON'T WORRY; GOD HELP US ALWAYS!")),
     ASSERT(translate("FAILURE", "MAKE IT A SUCCESS")),

     CONVERSE.
     CLAUSES
     CONVERSE :-
        TEMP(S),
        S=quip,
        PURGE.
     Converse :-
        retract(temp(S)),
        DOCTOR(S),
        write(":"),
        readln(P),
        PATIENT(P),
        converse.

     DOCTOR("") :-
    /** NO RESPONSE FROM PATIENT
        CHECK PATIENT RESPONSE FILE **/
      RETRACT(topics(R)),
      R<>"",
      WRITE("You Just Said", ""),
      WRITE(R, ""), NL,
      WRITE("TELL ME MORE .."), NL.

     DOCTOR(S) :-
      RESPOND(S),
      ASSERT(topics(S)),
      NL.

     DOCTOR(_) :-
     /* NO RESPONSE FROM PATIENT
        CHECK PATIENT RESPONSE FILE */
     RETRACT(topics(R)),
     R<>"", WRITE("YOU JUST SAID", ""),
     WRITE(R, ""), NL,
     WRITE("TELL ME MORE..."), NL.
     RESPOND("") :-FAIL.
     RESPOND(S) :-
      FRONTTOKEN(S, T, _),
      TRANSLATE(T, T2),
      WRITE(T2, " ").
     RESPOND(S) :-
      FRONTTOKEN(S, _, S2),
      RESPOND(S2).
     PATIENT(S) :-
      PATRESPONSES(S),
      WRITE("YOU ARE REPEATING YOURSELF."),
      NL,
      WRITE(":"),
      readln(S2),
      PATIENT(S2),
     PATIENT(S) :-
      PATRESPONSES(S),
      WRITE("YOU ARE REPEATING YOURSELF."),
      NL,
      WRITE(":"),

      readln(S2),
     PATIENT(S) :-
      ASSERT(patresponses(S)),
      ASSERT(temp(S)).

     PURGE :-
      RETRACT(translate(_,_)),
      FAIL.
     PURGE :-
      RETRACT(temp(_)), FAIL.
     PURGE :-
      retract(responses(_)), fail.
     PURGE :-
      RETRACT(topics(_)), FAIL.
     PURGE :-
      RETRACT(patresponses(_)), FAIL.
     PURGE.


     ******************
     PROGRAM OUTPUT
     ******************
 

     HOW ARE YOU THIS BEAUTIFUL DAY?
      : I DON'T KNOW, I FEEL BAD.
     HOW DO YOU KNOW THAT?
      : I FEEL LIKE I COULD KILL
     IT IS WRONG TO KILL
      : I NEVER SEEM TO WIN
     DON'T BE NEGATIVE; THINK POSITIVE!
      :WHY
     REMEMBER, IT IS GOOD FOR YOU.
      :WHY
     YOU ARE REPEATING YOURSELF.
      :HEY, WHO CARES JERK
     DON'T YOU EVER CALL ME A JERK!
      :I'LL CALL YOU A JERK ANY TIME I WANT TO
     LET'S NOT TALK ABOUT ME.
      :I AM UNHAPPY
     WHY ARE YOU UNHAPPY?