Àü¹®°¡ ½Ã½ºÅÛ

(Expert System)

 

C ÀΰøÁö´É ÇÁ·Î±×·¡¹Ö : Herbert Schildt ÁöÀ½, ½Å°æ¼÷.·ù¼º·Ä ¿Å±è, ¼¼¿õ, 1991 (¿ø¼­ : Artificial Intelligence using C, McGraw-Hill, 1987), page 93~153

 

1. Àü¹®°¡½Ã½ºÅÛ À̶õ ¹«¾ùÀΰ¡? (WHAT IS AN EXPERT SYSTEMS?)

    (1) Àü¹®°¡½Ã½ºÅÛÀÇ ÀåÁ¡Àº ¹«¾ùÀΰ¡? (What Are the Advantages of an Expert Systems ?)

    (2) »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛ ¸î°¡Áö ¿¹ (Some Examples of Commercial Expert Systems)

2. Àü¹®°¡½Ã½ºÅÛÀº ¾î¶»°Ô µ¿ÀÛÇϴ°¡? (HOW EXPERT SYSTEMS WORK?)

     (1) Áö½Äº£À̽º (The Knowledge Base)

     (2) Ã߷бâ°ü (The Inference Engine)    

3. ¸¸´É Àü¹®°¡½Ã½ºÅÛ ¸¸µé±â (CREATING A GENERAL-PURPOSE EXPERT SYSTEM)

  3.1. ¿¬»êÀÇ º»ÁúÀû ¿ä¼Ò (The Essential of Operation)

  3.2. Áö½Äº£À̽º ±¸Á¶È­ (Structuring the Knowledge Base)

  3.3. Áö½Äº£À̽º ·Îµå (Loading the Knowledge Base)

  3.4. Ã߷бâ°ü ±¸Çö (Implementing the Inference Engine)

  3.5. ½Ã¹ü ¼öÇà (A Sample Run)

  3.6. º¹¼öÀÇ ÇØ Ã£±â (Finding Multiple Solutions)

4. ´õ º¹ÀâÇÑ ¹öÀü (A MORE SOPHISTICATED VERSION)

5. Áö½Ä ¿£Áö´Ï¾î¸µ (KNOWLEDGE ENGINEERING)

  5.1. Áö½Äº£À̽º ±¸Á¶ (Knowledge Base Organization)

  5.2. Àü¹®°¡ ã±â (Finding the Expert)

  5.3. Áö½Äº£À̽º È®Áõ (Verifying the Knowledge Base)

 

Àü¹®°¡½Ã½ºÅÛÀº ÁÖ·Î µÎ °¡Áö ÀÌÀ¯ ¶§¹®¿¡ Èï¹Ì·Ó´Ù : ¸ÕÀú, Çö½ÇÀÇ ¿ä±¸¸¦ ¼öÇàÇÏ´Â, ÀϹÝÀûÀ¸·Î À¯¿ëÇÏ°í ½Ç¿ëÀûÀÎ ÇÁ·Î±×·¥ÀÌ´Ù. µÎ ¹ø°·Î, ½ÇÇöÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌ°ÍÀÌ ¹Ù·Î Àü¹®°¡½Ã½ºÅÛÀÌ AI ÀÇ »ó¾÷Àû ¼º°øÀÇ ´ëºÎºÐÀ» Â÷ÁöÇÏ´Â ÀÌÀ¯ÀÌ´Ù. ÀÌ ÀåÀÇ Ã¹ ºÎºÐÀº Àü¹®°¡½Ã½ºÅÛÀÌ ¹«¾ùÀΰ¡ ÇÏ´Â °Í°ú ¼öÇàÇÒ ¼ö ÀÖ´Â ¿©·¯ °¡Áö ¹æ¹ýÀ» º¸¿©ÁÙ °ÍÀÌ´Ù. ÀÌ ÀåÀÇ µÎ ¹ø° ºÎºÐÀº ¿ÏÀüÇÏ°í, ÀϹÝÀûÀÎ ¸ñÀûÀ¸·Î »ç¿ëµÇ´Â Àü¹®°¡½Ã½ºÅÛÀ» Çϳª °³¹ßÇÑ´Ù.

1. Àü¹®°¡½Ã½ºÅÛ À̶õ ¹«¾ùÀΰ¡? (WHAT IS AN EXPERT SYSTEMS?)

 

Á¦ 1 Àå¿¡¼­ ¾ð±ÞÇßµíÀÌ, Àü¹®°¡½Ã½ºÅÛÀº »ç¶÷ Àü¹®°¡ÀÇ ÇàÀ§¸¦ Èä³»³»´Â ÇÁ·Î±×·¥ÀÌ´Ù. »ç¿ëÀÚ°¡ ¾î¶² ÁÖÁ¦¿¡ °üÇÑ °ßÇظ¦ Ç¥ÇöÇϱâ À§ÇÏ¿© Á¦°øÇÏ´Â Á¤º¸¸¦ »ç¿ëÇÑ´Ù. ±×·¯¹Ç·Î, Àü¹®°¡½Ã½ºÅÛÀº ´ë´ä°ú ÀÏÄ¡ÇÏ´Â ´ë»óÀ» ¾Ë¾Æ³¾ ¼ö ÀÖÀ» ¶§±îÁö Áú¹®À» ÇÑ´Ù. Àü¹®°¡½Ã½ºÅÛÀÌ ¹«¾ùÀÎÁö ÀÌÇØÇϱâ À§ÇÏ¿©, °úÀÏ Àü¹®°¡¿Í Ãæ°í¸¦ ±¸ÇÏ´Â ¾î¶² »ç¶÷ »çÀÌÀÇ ´ÙÀ½ ´ëÈ­¸¦ »ý°¢ÇØ º¸ÀÚ.

ÄÄÇ»ÅÍÈ­µÈ °úÀÏ Àü¹®°¡½Ã½ºÅÛÀÇ ¸ñÇ¥´Â ÀÌ ´ëÈ­¸¦ Àç»ý»êÇÏ´Â °ÍÀÌ´Ù. ´õ ÀϹÝÀûÀ¸·Î, Àü¹®°¡½Ã½ºÅÛÀº Àü¹®±â¼úÀÇ ÁÖÁ¦¿¡ °üÇØ »ç¿ëÀÚ¿¡°Ô Ãæ°í¸¦ ÇÏ·Á°í ½ÃµµÇÑ´Ù.

(1) Àü¹®°¡½Ã½ºÅÛÀÇ ÀåÁ¡Àº ¹«¾ùÀΰ¡? (What Are the Advantages of an Expert Systems ?)

Àü¹®°¡½Ã½ºÅÛÀÇ ¹Ù¶÷Á÷ÇÔÀº ÁÖ·Î À¯¿ë¼º°ú ÆíÀǼº¿¡ ±âÃÊÇÑ´Ù. ÀáÀ» ÀÚ°í, ¸Ô°í, ÇǷθ¦ Ç®°í, ½¬°í ÇÏ´Â µîÀÇ ÀÏÀ» ÇØ¾ß ÇÏ´Â »ç¶÷ Àü¹®°¡¿Í´Â ´Þ¸®, Àü¹®°¡½Ã½ºÅÛÀº ÇÏ·ç 24 ½Ã°£, ¿¬Áß ¸ÅÀÏ »ç¿ëÇϱ⿡ À¯¿ëÇÏ´Ù. ¶ÇÇÑ, »ç¶÷ Àü¹®°¡ÀÇ ¼ö´Â Á¦ÇÑ µÉ ¼ö ÀÖ´Â ¹Ý¸é, ¸¹Àº Àü¹®°¡½Ã½ºÅÛÀº ¸¸µé¾îÁú ¼ö ÀÖ´Ù. ´õ¿íÀÌ, »ç¶÷°ú´Â ´Þ¸®, ÄÄÇ»ÅÍÈ­µÈ Àü¹®°¡´Â Àý´ë Á×Áö ¾Ê°í Áö½ÄÀ» ÃëÇÑ´Ù. Àü¹®°¡½Ã½ºÅÛ¿¡ ÀÖ´Â Áö½ÄÀº, ½±°Ô º¹»çµÇ°í ÀúÀåµÉ ¼ö ÀÖÀ¸¹Ç·Î, Àü¹® Áö½ÄÀÇ ¿µ±¸ÀûÀÎ ¼Õ½ÇÀÌ °ÅÀÇ µå¹°´Ù.

»ç¶÷ Àü¹®°¡¿¡ ºñÇØ Àü¹®°¡½Ã½ºÅÛÀÇ ¶Ç ´Ù¸¥ ÀåÁ¡Àº, ÄÄÇ»ÅÍÈ­µÈ Àü¹®°¡´Â Ç×»ó ¼º´ÉÀÌ ÃÖ°íÇÏ´Â °ÍÀÌ´Ù. »ç¶÷ Àü¹®°¡°¡ ÁöÄ¥ ¶§, Àü¹®°¡ Ãæ°íÀÇ ½Å·Ú¼ºÀº »ç¶óÁú·±Áöµµ ¸ð¸¥´Ù. ±×·¯³ª ÄÄÇ»ÅÍÈ­µÈ Àü¹®°¡´Â Ç×»ó ÃÖ»óÀÇ °ßÇØ - ÀÚ±âÀÇ Áö½ÄÀÇ Á¦ÇÑ ¹üÀ§ ¾È¿¡¼­ - ¸¦ »ý¼ºÇÒ °ÍÀÌ´Ù.

Àü¹®°¡½Ã½ºÅÛÀÇ ´ú Áß¿äÇÑ ÀåÁ¡Àº °³¼ºÀÌ ºÎÁ·ÇÏ´Ù´Â °ÍÀÌ´Ù. ¾Æ¸¶µµ ¾Ë°ÚÁö¸¸, °³¼ºÀº Ç×»ó ÀûÇÕÇÑ °ÍÀº ¾Æ´Ï´Ù. Àü¹®°¡¿Í Ä£ÇÏ°Ô Áö³»Áö ¾Ê´Â´Ù¸é, Àü¹®°¡ÀÇ Áö½ÄÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ ¸¶À½ ³»Å°Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ¹Ý´ë »óȲµµ »ý±æ¼ö ÀÖ´Ù : ÁÁ¾ÆÇÏÁö ¾Ê´Â »ç¶÷ Àü¹®°¡´Â ½Å·ÚÇÒ ¸¸ÇÑ Á¤º¸¸¦ Ç¥ÇöÇÒ ¼ö ¾øÀ» Áöµµ ¸ð¸¥´Ù. ±×·¯³ª ÄÄÇ»ÅÍÈ­µÈ Àü¹®°¡´Â °³¼ºÀ» °®Áö ¾Ê´Â´Ù. µû¶ó¼­ ÀÌ·¯ÇÑ ¹®Á¦µéÀº Á¦°ÅµÈ´Ù.

Àü¹®°¡½Ã½ºÅÛÀÇ ¸¶Áö¸· ÀåÁ¡Àº, ÄÄÇ»ÅÍÈ­µÈ Àü¹®°¡°¡ Á¸ÀçÇÑ ÈÄ, ´Ü¼øÈ÷ ÇÑ ±â°è¿¡¼­ ´Ù¸¥ ±â°è·Î ÇÁ·Î±×·¥À» º¹»çÇÔÀ¸·Î½á »õ·Î¿î Àü¹®°¡¸¦ ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù. »ç¶÷Àº ¾î¶² ºÐ¾ß¿¡¼­ Àü¹®°¡°¡ µÇ±â À§ÇÏ¿© ¿À·£ ±â°£À» ÇÊ¿ä·Î Çϴµ¥, ÀÌ°Í ¶§¹®¿¡ »ç¶÷ Àü¹®°¡¸¦ ¾ò±â°¡ Èûµé´Ù.

(2) »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛ ¸î°¡Áö ¿¹ (Some Examples of Commercial Expert Systems)

MYCIN À̶ó´Â Àü¹®°¡½Ã½ºÅÛÀÌ ¾ø´Ù¸é, Àü¹®°¡½Ã½ºÅÛÀº AI ¿¬±¸½Ç¿¡ ¸Ó¹°°í ¿ÜºÎ·Î ÁøÃâÇÏÁö ¸øÇßÀ»·±Áöµµ ¸ð¸¥´Ù. AI ÀÇ °¡Àå Ä¿´Ù¶õ °ü³ä ¹®Á¦µé (image problems) ÁßÀÇ Çϳª´Â, ´Ù¸¥ ÇÁ·Î±×·¡¸Ó¸¦ Æ÷ÇÔÇؼ­ ¸¹Àº »ç¶÷µéÀÌ AI ±â¹ýÀº ¾ö¹ÐÇÑ ±ÔÄ¢µé°ú °¡Á¤À» ¿ä±¸ÇÏ´Â ¹®Á¦¿¡ ´ëÇؼ­¸¸ ÀÛµ¿ÇÑ´Ù°í ¹Ï´Â °ÍÀ̾ú´Ù. ÀÌ »ç¶÷µéÀº AI ´Â °áÄÚ ¾î·Á¿î ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÏ¿© »ç¿ëµÉ ¼ö ¾ø´Ù°í ¹Ï¾ú´Ù. MYCIN Àº ±× ¸ðµÎ¸¦ º¯È­½ÃÄ×´Ù.

MYCIN Àº ¼¼°è¿¡¼­ ÃÖÃÊ·Î ¼º°øÇÑ Àü¹®°¡½Ã½ºÅÛÀÌ´Ù. 1970 ³â´ë Á߹ݿ¡ ½ºÅÄÆ÷µå ´ëÇп¡¼­ °³¹ßµÇ¾ú´Âµ¥, Àǻ簡 ¾î¶² ¼¼±Õ¼º Áúº´À» Áø´ÜÇÏ´Â °ÍÀ» µ½±â À§ÇÏ¿© ¼³°èÇÏ¿´´Ù. º´À» Áø´ÜÇÏ´Â °ÍÀº º»ÁúÀûÀ¸·Î ȯÀÚ°¡ Á¦½ÃÇÏ´Â Áõ»ó°ú º´ÀÇ Â¡ÈÄ »çÀÌ¿¡ ÀÏÄ¡°¡ ¹ß°ßµÉ ¶§±îÁö ±× µÑÀ» ºñ±³ÇÏ´Â ÀÏÀÌ´Ù. ¹®Á¦´Â, Àǻ簡 Á¸ÀçÇÏ´Â ¸ðµç º´À» ºü¸£°í ÀÚ½ÅÀÖ°Ô Áø´ÜÇÏ´Â °ÍÀº ¾î·Æ´Ù´Â °ÍÀÌ´Ù. MYCIN Àº Áø´ÜÀ» È®½ÇÈ÷ ÇØÁÜÀ¸·Î½á ÀÌ ¿ä±¸¸¦ ¸¸Á·½ÃÄ×´Ù.

»ó¾÷ÀûÀ¸·Î »ýÁ¸°¡´ÉÇÑ Àü¹®°¡½Ã½ºÅÛÀÇ ¶Ç ´Ù¸¥ ¿¹´Â, 1978 ³â ¸®Â÷µå µà´Ù, ÇÇÅÍ, Çϵå, ±×¸®°í ·¹³× ·¹º¸¿ì°¡ ¸¸µç PROSPECTOR ÀÌ´Ù. PROSPECTOR ´Â ÁöÁúÇп¡¼­ÀÇ Àü¹®°¡ÀÌ´Ù : ¾î¶² ±¤»óÀÌ ¾î¶² Ưº°ÇÑ Áö¿ª¿¡¼­ ¹ß°ßµÉ¼ö ÀÖ´Â °¡´É¼ºÀ» ¿¹ÃøÇÑ´Ù. ¼®À¯, õ¿¬°¡½º, Çï·ýÀÇ ¹ß°ßÀ» ¿¹ÃøÇÏ´Â ÇÁ·Î±×·¥À» Æ÷ÇÔÇÏ¿©, ÀÌ ÇÁ·Î±×·¥À» º¯ÇüÇÑ °ÍÀÌ ¿©·µ ÀÖ´Ù.

1980 ³â´ë ÃÊ¿¡´Â ¼¼±Ý »ó´ã, º¸Çè Ãæ°í, ¹ýÀûÀÎ µµ¿òÀ» ÁÙ ¼ö ÀÖ´Â Àü¿ë Àü¹®°¡½Ã½ºÅÛµéÀÌ µµÀԵǾú´Ù. ¸¹Àº ÇÁ·Î±×·¡¸ÓµéÀº 1980 ³â´ë ¸»±îÁö, ÁýÀ̳ª »ç¹«½Ç¿¡¼­ »ç¿ëµÉ ¼ö ÀÖ´Â "°³ÀÎÀÇ" Àü¹®°¡½Ã½ºÅÛÀÇ Ä¿´Ù¶õ ½ÃÀåÀÌ »ý±æ °ÍÀ̶ó°í ¹Ï´Â´Ù. ÀÌ ½Ã½ºÅÛµéÀº ¿ø¿¹ ¿¡¼­ºÎÅÍ ÀÚµ¿ ¼ö¸®±îÁö ¸¹Àº ºÐ¾ß¿¡¼­ Àü¹®°¡°¡ µÉ °ÍÀÌ´Ù. ½Ç»ó, Àü¹®°¡½Ã½ºÅÛÀº °³Àοë ÄÄÇ»ÅÍ¿¡¼­ ¼öÇàµÇ´Â °¡Àå ÈçÇÑ À¯ÇüÀÇ ÇÁ·Î±×·¥ÀÓÀ» Áõ¸íÇÒ ¼öµµ ÀÖ´Ù.

2. Àü¹®°¡½Ã½ºÅÛÀº ¾î¶»°Ô µ¿ÀÛÇϴ°¡? (HOW EXPERT SYSTEMS WORK?)

¸ðµç Àü¹®°¡½Ã½ºÅÛÀº Áö½Äº£À̽º¿Í Ã߷бâ°üÀÇ µÎ ºÎºÐÀ» °®´Â´Ù. ÀÌ Àý¿¡¼­´Â Àü¹®°¡½Ã½ºÅÛÀÌ µÎ ºÎºÐÀ» ¸ðµÎ ±¸ÇöÇÒ ¼ö ÀÖ´Â ¿©·¯ °¡Áö ¼­·Î ´Ù¸¥ ¹æ¹ýµéÀ» ¼³¸íÇÑ´Ù.

(1) Áö½Äº£À̽º (The Knowledge Base)

Áö½Äº£À̽º´Â ¾î¶² ÁÖÁ¦¿¡ ´ëÇÏ¿© ƯÁ¤ÇÑ Á¤º¸¿Í ±ÔÄ¢À» °®´Â µ¥ÀÌÅͺ£À̽ºÀÌ´Ù. ÀÌ ¼³¸íÀ» À§ÇØ, ¾Ë¾Æ¾ß ÇÏ´Â µÎ °¡Áö ¿ë¾î°¡ ÀÖ´Ù :

±×·¯¹Ç·Î, Áö½Äº£À̽º¸¦ ´ë»ó »çÀÌÀÇ °ü·Ã ±ÔÄ¢°ú ¼Ó¼ºÀ» °®´Â ÀÏ·ÃÀÇ ´ë»óÀ¸·Î »ý°¢Çغ¸ÀÚ. °¡Àå °£´ÜÇÑ Àǹ̿¡¼­ (±×¸®°í, ¸¹Àº ÀÀ¿ëÀ» À§ÇÏ¿©), ¼Ó¼º¿¡ Àû¿ëµÇ´Â ±ÔÄ¢Àº, ´ë»óÀÌ ±× ¼Ó¼ºÀ» "°®´Â´Ù (has)" ¶Ç´Â "°®Áö ¾Ê´Â´Ù (has not)" ¶ó´Â °ÍÀ» ¸»ÇØÁØ´Ù. ±×·¯¹Ç·Î, ´ë»óÀÌ ¼ÒÀ¯Çϰųª ¼ÒÀ¯ÇÏÁö ¾Ê´Â ÀÏ·ÃÀÇ ¼Ó¼ºÀ» »ç¿ëÇÏ¿© ´ë»óÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ¿©·¯ °¡Áö À¯ÇüÀÇ °úÀÏÀ» ³ªÅ¸³»ÁÖ´Â Àü¹®°¡½Ã½ºÅÛÀº ´ÙÀ½°ú °°Àº Áö½Äº£À̽º¸¦ °¡Áú °ÍÀÌ´Ù.

´ë»ó

±ÔÄ¢

¼Ó¼º

»ç°ú

°®´Â´Ù

°®´Â´Ù

°®Áö ¾Ê´Â´Ù

°®´Â´Ù

³ª¹«¿¡¼­ ÀÚ¶õ´Ù

µÕ±Ù ¸ð¾çÀÌ´Ù

¾ÆÁÖ ³²ÂÊ¿¡¼­ ÀÚ¶õ´Ù

»¡°£»öÀ̳ª ³ë¶õ»öÀÌ´Ù

Æ÷µµ 

°®´Â´Ù

°®´Â´Ù

°®´Â´Ù

°®Áö ¾Ê´Â´Ù

°®´Â´Ù

µ¢±¼¿¡¼­ ÀÚ¶õ´Ù

ÀÛÀº Å©±âÀÌ´Ù

ÀÚÁÖ»öÀÌ´Ù

°¡½ÃÀÖ´Â µ¢±¼ÀÌ´Ù       

Æ÷µµÁÖ¸¦ ¸¸µé ¼ö ÀÖ´Ù

±Ö

°®´Â´Ù

°®´Â´Ù

°®Áö ¾Ê´Â´Ù

°®´Â´Ù

³ª¹«¿¡¼­ ÀÚ¶õ´Ù

µÕ±Ù ¸ð¾çÀÌ´Ù

ºÏºÎ¿¡¼­ ÀÚ¶õ´Ù

¿À·»Áö»öÀÌ´Ù

ÀÌ Áö½Äº£À̽º¿¡ ´ëÇÏ¿© »ý°¢ÇØ º¸¸é, °£´ÜÇØÁú ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ´Ü ÇÑ°¡Áö ±ÔÄ¢ - "°®´Â´Ù" - ¸¸ »ç¿ëÇÒ ¼ö ÀÖ°í, "°®Áö ¾Ê´Â´Ù" °ü°è¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù¸é ±× ¼Ó¼ºÀÇ ºÎÁ¤ÇüÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î, ±ÔÄ¢Àº ´Ü¼øÈ÷ "¼ÒÀ¯ÇÑ´Ù (possesses)" °¡ µÇ°í, °£´ÜÇØÁø Áö½Äº£À̽º´Â ´ÙÀ½°ú °°´Ù :

´ë»ó

¼ÒÀ¯

»ç°ú

³ª¹«¿¡¼­ ÀÚ¶õ´Ù

µÕ±Ù ¸ð¾çÀÌ´Ù

¾ÆÁÖ ³²ºÎ¿¡¼­ ÀÚ¶óÁö ¾Ê´Â´Ù

»¡°£»öÀ̳ª ³ë¶õ»öÀÌ´Ù

Æ÷µµ

µ¢±¼¿¡¼­ ÀÚ¶õ´Ù

ÀÛÀº Å©±âÀÌ´Ù

»öÀÌ °¡Áö°¢»öÀÌ´Ù

µ¢±¼¿¡´Â °¡½Ã°¡ ¾ø´Ù

Æ÷µµÁÖ¸¦ ¸¸µé±â À§ÇØ »ç¿ëµÉ¼ö ÀÖ´Ù.

±Ö

³ª¹«¿¡¼­ ÀÚ¶õ´Ù

µÕ±Ù ¸ð¾çÀÌ´Ù

ºÏºÎ¿¡¼­ ÀÚ¶ö¼ö ÀÖ´Ù

¿À·»Áö»öÀÌ´Ù

ºñ·Ï ¾î¶² º¹ÀâÇÑ Àü¹®°¡½Ã½ºÅÛÀº ´Ü¼øÈ÷ "¼ÒÀ¯ÇÑ´Ù" º¸´Ù ´õ º¹ÀâÇÑ ±ÔÄ¢À» ÇÊ¿ä·Î ÇÒÁöµµ ¸ð¸£Áö¸¸, ÀÌ ±ÔÄ¢Àº ¸¹Àº »óȲ¿¡ ´ëÇÏ¿© ÃæºÐÇÏ°í Áö½Äº£À̽º¸¦ Å©°Ô °£·«È­½ÃŲ´Ù. ÀÌ Ã¥ÀÇ ³ª¸ÓÁö¿¡¼­´Â Áö½Äº£À̽º°¡ ´ë»ó°ú ¼Ó¼ºÀ¸·Î¸¸ ÀÌ·ç¾îÁ³´Ù°í °¡Á¤ÇÑ´Ù.

(2) Ã߷бâ°ü (The Inference Engine)

Ã߷бâ°üÀº ÀÏÄ¡ÇÏ´Â ´ë»óÀ» ã±â À§ÇÏ¿© Á¦°øÇÏ´Â Á¤º¸¸¦ »ç¿ëÇÏ·Á°í ½ÃµµÇÏ´Â Àü¹®°¡½Ã½ºÅÛÀÇ ÀϺκÐÀÌ´Ù. Ã߷бâ°üÀÇ µÎ°¡Áö ³ÐÀº ºÎ·ù°¡ ÀÖ´Ù ; °áÁ¤Àû (deterministic) °ú È®·üÀû (probabilistic). ÀÌ µÎ ºÎ·ù »çÀÌÀÇ Â÷ÀÌÁ¡À» ÀÌÇØÇϱâ À§Çؼ­, µÎ Àü¹®°¡¸¦ »ý°¢Çغ¸ÀÚ - Çϳª´Â È­Çп¡¼­ ´Ù¸¥ Çϳª´Â »çȸÇп¡¼­. È­ÇÐÀÚ´Â ¹®Á¦ÀÇ ¿øÀÚ°¡ µÎ °³ÀÇ ÀüÀÚ (electron) À» °¡Áö¸é Çï·ý ¿øÀÚ¶ó°í È®½ÇÈ÷ (certainty) º¸°íÇÒ ¼ö ÀÖ´Ù. ÀüÀÚÀÇ ¼ö°¡ ¿ø¼ÒÀÇ À¯ÇüÀ» °áÁ¤Çϱ⠶§¹®¿¡ ¿øÀÚÀÇ ¸í¸í¿¡ ´ëÇؼ­´Â ÀǽÉÀÌ ¾ø´Ù. ±×·¯³ª, »çȸÇÐÀÚ¿¡°Ô, ÇлýµéÀÌ Çб³¸¦ ±×¸¸µÎ´Â °ÍÀ» ¸·´Â ÃÖ¼±ÀÇ ¹æ¹ýÀÌ ¹«¾ùÀÌ³Ä°í ¹°À¸¸é, »çȸÇÐÀÚ´Â ´ÜÁö ÀÖÀ» ¼ö ÀÖ´Â °ÍÀ¸·Î, ¶Ç´Â ¾î¶² ¼º°ø·üÀ» °®´Â °ÍÀ¸·Î Á¦ÇÑµÈ ´ë´äÀ» ÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î, ´ë´äÀº °¡´É¼ºÀº ÀÖÁö¸¸ ºÒÈ®½ÇÇÏ´Ù.

´ëºÎºÐÀº °áÁ¤ÀûÀÌ ¾Æ´Ï°í ¿ÀÈ÷·Á ¾î´À Á¤µµ È®·üÀûÀÌ´Ù. ±×·¯³ª, ÀÌ Áß ¸¹Àº ¼ö¿¡ ´ëÇÏ¿©, ±×°ÍµéÀ» °áÁ¤ÀûÀÎ »óȲÀ¸·Î ´Ù·ê ¼ö Àֱ⠶§¹®¿¡ ºÒÈ®½Ç¼º ¿äÀÎÀÌ Åë°èÀûÀ¸·Î Áß¿äÇÏÁö ¾Ê´Ù. ÀÌ ÀåÀÇ ³ª¸ÓÁö ºÎºÐ¿¡¼­´Â °áÁ¤Àû Àü¹®°¡½Ã½ºÅÛÀÇ ³í¸®°¡ ´õ ¸íÈ®ÇϹǷΠ±×°Í¸¸À» ´Ù·é´Ù (±×·¯³ª, Á¦ 8 Àå¿¡¼­´Â È®·ü°ú ºÒÈ®½Ç¼ºÀ» ´Ù·é´Ù.)

È®½Ç¼º°ú ºÒÈ®½Ç¼ºÀ̶ó´Â µÎ °¡Áö ³ÐÀº ºÎ·ù ¿Ü¿¡, Ã߷бâ°üÀ» ±¸¼ºÇÏ´Â ¼¼°¡Áö ±âº» ¹æ¹ýÀÌ ÀÖ´Ù : ÀüÁøÃß·Ð, ÈÄÁøÃß·Ð, ±ÔÄ¢°ª. ÀÌ ¹æ¹ýµéÀÇ Â÷ÀÌÁ¡Àº Ãß·ÐÀÌ ¸ñÇ¥¿¡ µµ´ÞÇÏ·Á°í ½ÃµµÇÏ´Â ¹æ¹ý¿¡ °ü°èµÈ´Ù.

ÀüÁø¿¬¼â´Â µ¥ÀÌÅÍ ÁöÇâ (data-driven) À̶ó°íµµ ºÎ¸¥´Ù. ¿Ö³ÄÇϸé Ã߷бâ°üÀÌ ´ë»ó¹° (object) ÀÎ Á¾´Ü ÁöÁ¡¿¡ µµ´ÞÇÒ ¶§±îÁö ³í¸® AND ¿Í OR µéÀÇ ³×Æ®¿öÅ©¸¦ ÅëÇØ À̵¿Çϵµ·Ï »ç¿ëÀÚ°¡ Á¦°øÇÏ´Â Á¤º¸¸¦ Ã߷бâ°üÀÌ »ç¿ëÇϱ⠶§¹®ÀÌ´Ù. ¸¸¾à Ã߷бâ°üÀÌ, Á¸ÀçÇÏ´Â Á¤º¸¸¦ »ç¿ëÇÏ¿© ´ë»óÀ» ¹ß°ßÇÒ ¼ö ¾ø´Ù¸é, ´õ ¸¹Àº Á¤º¸¸¦ ¿ä±¸ÇÑ´Ù. ´ë»óÀ» Á¤ÀÇÇÏ´Â ¼Ó¼ºÀº ´ë»óÀ¸·Î À¯µµÇÏ´Â °æ·Î¸¦ ¸¸µç´Ù : ´ë»ó¿¡ µµ´ÞÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀº ¸ðµç ±ÔÄ¢À» ¸¸Á·ÇÏ´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î, ÀüÁø¿¬¼â Ã߷бâ°üÀº ¾î¶² Á¤º¸¸¦ °¡Áö°í ½ÃÀÛÇÏ¿© ±× Á¤º¸¿¡ ¸Â´Â ´ë»óÀ» ¹ß°ßÇÏ·Á°í ÇÑ´Ù.

ÀüÁø¿¬¼â°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö ÀÌÇØÇϱâ À§ÇÏ¿©, Â÷°¡ ÀÛµ¿ÇÏÁö ¾Ê´Â ¹®Á¦¿¡ ´ëÇÑ °ßÇظ¦ µè±â À§ÇÏ¿© ÀÌ °æ¿ìÀÇ Àü¹®°¡ÀÎ ±â´É°ø¿¡°Ô ÀüÈ­¸¦ °Ç´Ù°í »ý°¢ÇØ º¸ÀÚ. ±â´É°øÀº ¹«¾ùÀÌ À߸øµÇ¾ú´ÂÁö ¼³¸íÇØ ÁÙ °ÍÀ» ¿ä±¸ÇÑ´Ù. Â÷¿¡ Àü·Â¼Õ½Ç°ú ³ëÅ· (knocking) ÀÌ ÀÖ´Ù´Â °Í°ú, ¶§¶§·Î Á¡È­ ÀåÄ¡¸¦ ²ö ÈÄ¿¡µµ °è¼Ó ¿îÀüÇßÀ¸¸ç, ¿©·¯ ´Þ µ¿¾È ¿£ÁøÀ» Á¶Á¤ÇØ ÁÖÁö ¾Ê¾Ò´Ù´Â °ÍÀ» ¼³¸íÇÑ´Ù. ÀÌ Á¤º¸¸¦ ÀÌ¿ëÇÏ¿© ±â´É°øÀº Â÷´Â ¿£Áø Á¶Á¤À» Àý½ÇÈ÷ ÇÊ¿ä·Î ÇÒ °¡´É¼ºÀÌ °¡Àå ³ô´Ù°í ¸»ÇÑ´Ù.

¸¸¾à ¾Õ¿¡¼­ ¼³¸íµÈ °úÀÏ Áö½Äº£À̽º·Î µÇµ¹¾Æ°¡ »ý°¢ÇÑ´Ù¸é ±×¸² 1 ¿¡¼­Ã³·³ ÀûÀýÇÑ ¼Ó¼ºÀÌ ÁÖ¾îÁú ¶§ ÀüÁø¿¬¼â Ã߷бâ°üÀÌ, ´ë»óÀÎ »ç°ú¿¡ ¾î¶»°Ô µµ´ÞÇϴ°¡¸¦ º¸ÀÌ´Â ´ÙÀ̾Ʊ׷¥À» ¸¸µé ¼ö ÀÖ´Ù. º¸´Â ¹Ù¿Í °°ÀÌ, ÀüÁø¿¬¼â ½Ã½ºÅÛÀº ±âº»ÀûÀ¸·Î ÀÙ ³ëµå·ÎºÎÅÍ ·çÆ® ³ëµå·Î Æ®¸®¸¦ ¸¸µç´Ù.

±×¸² 1  ´ë»ó¹° »ç°ú (apple) ¸¦ ÇâÇÑ ÀüÁø¿¬¼â ¹æ¹ý

ÈÄÁø¿¬¼â´Â ÀüÁø¿¬¼âÀÇ ¹Ý´ëÀÌ´Ù. ÈÄÁø¿¬¼â Ã߷бâ°üÀº °¡¼³ (hypothesis) À» °®°í ½ÃÀÛÇÏ¿© ±×°ÍÀ» È®½ÅÇϰųª ºÎÁ¤Çϱâ À§ÇÑ Á¤º¸¸¦ ¿ä±¸ÇÑ´Ù. ÈÄÁø¿¬¼â´Â, Àü¹®°¡½Ã½ºÅÛÀÌ ÇÑ ´ë»óÀ» °®°í ½ÃÀÛÇÏ¿© ±×°ÍÀ» È®ÁõÇÏ·Á°í Çϱ⠶§¹®¿¡, ¶§¶§·Î ¸ñÀû ÁöÇâ (object-driven) À̶ó°í ºÎ¸¥´Ù.

ÈÄÁø ¿¬¼â°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö ÀÌÇØÇϱâ À§Çؼ­, ÄÄÇ»ÅÍ°¡ °©ÀÚ±â ÀÛµ¿À» ¸ØÃß¾ú´Ù°í »ý°¢Çغ¸ÀÚ. ù ¹ø° °¡¼³Àº Àü·ÂÀÌ ³ª°¬´Ù´Â °ÍÀÌ´Ù. À̸¦ üũÇϱâ À§ÇØ, ȯdz±â (fan) ¼Ò¸®¸¦ µé¾îº»´Ù. ȯdz±â°¡ µ¹¾Æ°¡´Â ¼Ò¸®°¡ µé¸®¸é ÀÌ °¡¼³À» °ÅÀýÇÏ°í ´Ù¸¥ °ÍÀ¸·Î ÁøÇàÇÑ´Ù. µÎ ¹ø° °¡¼³Àº À߸øµÈ ¼ÒÇÁÆ®¿þ¾î ¶§¹®¿¡ ÄÄÇ»ÅÍ°¡ °íÀå³µ´Ù´Â °ÍÀÌ´Ù. ÀÌ °¡´É¼ºÀ» È®ÀÎÇϰųª °ÅÀýÇϱâ À§ÇÏ¿©, ÄÄÇ»ÅÍ°¡ ¼º°øÀûÀ¸·Î ´Ù½Ã ºÎÆ®µÉ °ÍÀÎÁö ¾Ë±â À§ÇÏ¿© ¸®¼Â½ÃŲ´Ù. ´ÙÇàÈ÷µµ, ÄÄÇ»ÅÍ´Â ÀçºÎÆ®µÈ´Ù ; µÎ ¹ø° °¡¼³Àº ÂüÀÌ µÈ´Ù.

¹®Á¦ÀÇ °úÀÏÀÌ »ç°úÀ̸é, °úÀÏ Áö½Äº£À̽º¿¡ ÈÄÁø¿¬¼â Ãß·ÐÀ» Àû¿ëÇÏ¿© ±×¸² 2 ¿¡ ÀÖ´Â µµÇ¥¸¦ ¸¸µé¾î³½´Ù. µµÇ¥°¡ º¸¿©ÁÖµíÀÌ, ÈÄÁø¿¬¼â´Â Æ®¸®¸¦ ÀÚ¸¥´Ù. ÀÌ°ÍÀº Æ®¸®¸¦ ±¸¼ºÇÏ´Â, ÀüÁø¿¬¼âÀÇ ¹Ý´ë °úÁ¤ÀÌ´Ù.

±×¸² 2  ´ë»ó¹° »ç°ú (apple) ¸¦ ÇâÇÑ ÈÄÁø¿¬¼â ¹æ¹ý

±ÔÄ¢°ª Ã߷бâ°üÀº ½Ã½ºÅÛÀÇ ÇöÀç »óÅ¿¡ µû¶ó °¡Àå Å« Á߿伺À» °®´Â Á¤º¸¸¦ ¿ä±¸Çϱ⠶§¹®¿¡ ÀüÁø¿¬¼â³ª ÈÄÁø¿¬¼â ½Ã½ºÅÛº¸´Ù À̷лó ¿ì¼öÇÏ´Ù. ±ÔÄ¢°ª Ã߷бâ°üÀº ½ÇÁ¦·Î °³¼±µÈ ÈÄÁø¿¬¼â ±â°üÀÌ´Ù. ÀϹÝÀûÀÎ ÀÛµ¿ ¿ø¸®´Â ÀÌ·¸´Ù. Áï, ½Ã½ºÅÛÀ¸·ÎºÎÅÍ ºÒÈ®½Ç¼ºÀÌ °¡Àå Å« °ÍÀ» Á¦°ÅÇÒ (remove the most uncertainty from the system) Á¤º¸¸¦ ´ÙÀ½ Á¤º¸·Î¼­ ½Ã½ºÅÛÀÌ ¿ä±¸ÇÑ´Ù.

±ÔÄ¢°ª Á¢±Ù ¹æ½ÄÀ» ÀÌÇØÇϱâ À§ÇØ, ¾ÆÀÌ°¡ ¾ÆÆļ­ Àǻ縦 ºÒ·¶´Ù°í »ý°¢Çغ¸ÀÚ. ÀÇ»ç´Â ¸ÕÀú ¾ÆÀÌ°¡ ¿­ÀÌ ÀÖ´ÂÁö¸¦ ¹¯´Âµ¥, ÀÌ°ÍÀº ÀÌ Áú¹®¿¡ ´ëÇÑ ¸¹Àº °¡´É¼ºÀÇ ¼ö¸¦ ÁÙÀ̱⠶§¹®ÀÌ´Ù. ´ç½ÅÀÌ "¿¹" ÇÏ°í ´ë´äÇϸé, ÀÇ»ç´Â ´ç½Å¿¡°Ô ¾ÆÀÌ°¡ ±¸Å並 ´À³¢´Â Áö¸¦ ¹¯´Â´Ù. ù ¹ø° Áú¹®¿¡¼­Ã³·³, ÀÇ»ç´Â ÇöÀç »óÅ°¡ ÁÖ¾îÁ® ÀÖÀ» ¶§ ±× ´ë´äÀÌ Áø´Ü¿¡ °¡Àå Å« ¿µÇâÀ» ¹ÌÄ¡±â ¶§¹®¿¡ ´Ù¸¥ Áú¹®µéº¸´Ù ÀÌ Áú¹®À» ÇÑ´Ù. ÀÌ °úÁ¤Àº Àǻ簡 Áø´ÜÀ» ÇÒ¼ö ÀÖÀ» ¶§ ±îÁö °è¼ÓµÈ´Ù. ÀÌ ¿¹¿¡¼­, Áß¿äÇÑ Á¡Àº Àǻ簡 °á·Ð±îÁö °¡Àå ºü¸£°Ô À̸¦ Áú¹®µéÀ» ¼±ÅÃÇÑ´Ù´Â °ÍÀÌ´Ù.

±ÔÄ¢°ª ½Ã½ºÅÛÀÇ ¹®Á¦Á¡Àº ±¸ÇöÇϱⰡ ¾î·Æ´Ù´Â °ÍÀÌ´Ù. ¿©±â¿¡´Â µÎ°¡Áö ÀÌÀ¯°¡ ÀÖ´Ù : ¿ì¼±, ½Ç»ýÈ°¿¡¼­, Áö½Äº£À̽º´Â Á¾Á¾ ³Ê¹« Ä¿¼­ °¡´ÉÇÑ Á¶ÇÕÀÇ ¼ö´Â ½Ã½ºÅÛ ¿ë·®À» ÃÊ°úÇÑ´Ù. ±×·¯¹Ç·Î, ½Ã½ºÅÛÀº ¾î¶² ÁÖ¾îÁø »óÅ¿¡ ´ëÇÏ¿© ¾î´À Á¤º¸°¡ °¡Àå ¸¹Àº ºÒÈ®½Ç¼ºÀ» Á¦°ÅÇÏ´ÂÁö ¾Ë ¼ö ¾ø´Ù. µÎ ¹ø°, ±ÔÄ¢°ª ½Ã½ºÅÛÀº Áö½Äº£À̽º·Î ÇÏ¿©±Ý Ç¥ÁØ ´ë»ó-¼Ó¼º Á¤º¸»Ó¸¸ ¾Æ´Ï¶ó °ª ÇÑÁ¤»ç (Quantifier) ¸¦ Æ÷ÇÔÇϵµ·Ï ¿ä±¸Çϴµ¥ ÀÌ°ÍÀº Áö½Äº£À̽º ±¸¼ºÇÏ´Â ÀÏÀ» ´õ ¾î·Æ°Ô ÇÑ´Ù. ±×·¯³ª, ÀÚ½ÅÀ» ´Ù¸¥ °Íµéº¸´Ù ±ÔÄ¢°ª Ãß·ÐÀ¸·Î À¯µµÇÏ´Â ¾î¶² »óȲÀÌ ÀÖ´Ù. ¶ÇÇÑ, ±¸ÇöµÉ ¶§, ±ÔÄ¢°ª ½Ã½ºÅÛÀº ÀϹÝÀûÀ¸·Î ´Ù¸¥ µÎ ¹æ¹ýº¸´Ù ´õ ³ªÀº ÀÏÀ» ÇÑ´Ù.

¾î¶² ±ÔÄ¢°ª Àü¹®°¡½Ã½ºÅÛÀº ½Ã½ºÅÛÀÇ ¿©·¯ ¸éÀ» ±â·ÏÇϱâ À§ÇÏ¿© Åë°è ¸ðµâÀ» °®´Â ÀüÁø¿¬¼â ¶Ç´Â ÈÄÁø¿¬¼â·Î ½ÃÀÛÇß´Ù. ÈÄ¿¡, ±×·± À¯ÇüÀÇ Àü¹®°¡½Ã½ºÅÛÀÌ Àá±ñ »ç¿ëµÈ µÚ¿¡, ÀÌ Åë°è Á¤º¸´Â ±ÔÄ¢°ª Á¢±Ù ¹æ½ÄÀ» ±¸ÇöÇϱâ À§ÇÏ¿© »ç¿ëµÉ ¼ö ÀÖ´Ù.

ÀÌ ½ÃÁ¡¿¡¼­, Ã߷бâ°üÀÇ ¼¼°¡Áö À¯Çü Áß ¾î´À °ÍÀÌ »ç¿ëÇϱ⿡ °¡Àå ÁÁÀºÁö ¾Ë°í ½Í¾îÇÒ °ÍÀÌ´Ù. ´ë´äÀº, ¼¼°¡Áö ¸ðµÎ°¡ ±× ÀÏÀ» ÇÒ¼ö Àֱ⠶§¹®¿¡ ´ÙºÐÈ÷ °¢°¢ÀÇ ¼º´É¿¡ µû¸¥´Ù. ¾Õ¿¡¼­ ¾ð±ÞÇßµíÀÌ, ±ÔÄ¢°ª ½Ã½ºÅÛÀÌ ±¸ÇöÇϱⰡ ´Ù¼Ò ¾î·Æ´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ´Ù : µû¶ó¼­, Àü¹®°¡½Ã½ºÅÛÀ» ±¸ÃàÇϴµ¥¿¡ Àü¹®°¡°¡ µÉ ¶§ ±îÁö ¾Æ¸¶µµ ÀÌ ¹æ¹ýÀ» ÇÇÇØ¾ß ÇÒ °ÍÀÌ´Ù.

ÀüÁø¿¬¼â ¹æ¹ýÀº Æ®¸®¸¦ ±¸¼ºÇϱ⠶§¹®¿¡ Áö½Äº£À̽º·ÎºÎÅÍ °¡Àå ¸¹Àº ¾çÀÇ Á¤º¸¸¦ À̲ø¾î³»´Â °úÁ¤À» ´Ù¼Ò ½±°Ô ÇÑ´Ù. ÀüÇüÀûÀÎ ÀüÁø¿¬¼â ½Ã½ºÅÛÀº ¼Ó¼º°ú ÀÏÄ¡ÇÏ´Â °¡´ÉÇÑ ¸ðµç ´ë»óµéÀ» ¹ß°ßÇÏ´Ù. ÈÄÁø¿¬¼â ¹æ¹ýÀÇ ÀåÁ¡Àº ´ë»óÀ» ¹ß°ßÇϱ⿡ ÃæºÐÇÑ Á¤º¸¸¸µé ¿ä±¸ÇÑ´Ù´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î, ÈÄÁø¿¬¼â ½Ã½ºÅÛÀº ¸ñÇ¥À§ÁÖ (goal-driven) À̱⠶§¹®¿¡ ÀûÀýÇÑ Á¤º¸¸¸ÀÌ ½Ã½ºÅÛ¿¡ ÀÔ·ÂµÇ°Ô ÇÑ´Ù. ÈÄÁø¿¬¼â ½Ã½ºÅÛÀº ´Ü ÇϳªÀÇ ´ë»ó¸¸À» ¿øÇÒ ¶§ ÁÁ´Ù - ºñ·Ï ´Ù¸¥ ´ë»óµéµµ ±× ¼Ó¼ºÀ» ¸¸Á·ÇÑ´Ù°í ÇÏ´õ¶óµµ ÁÁ´Ù. º¹¼öÇظ¦ ¹ß°ßÇÏ´Â ÈÄÁø¿¬¼â Àü¹®°¡½Ã½ºÅÛÀ» ¸¸µé ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ÀüÁø¿¬¼â Àü¹®°¡½Ã½ºÅÛÀ» ±¸¼ºÇÏ´Â °Íº¸´Ù ¾à°£ ´õ ¸¹Àº ÀÏÀ» ¿ä±¸ÇÑ´Ù.

ÃÖÁ¾ÀûÀÎ ºÐ¼®¿¡¼­, »ç¿ëÇÏ·Á´Â ½ÇÁ¦ Á¢±Ù¹æ½ÄÀº °¢ÀÚ¿¡°Ô ´Þ·ÁÀÖ´Ù. ±×·¯³ª, ¸ðµç °ÍÀÌ °°À¸¸é, ÈÄÁø¿¬¼â ¹æ¹ýÀº ±¸ÇöÇϱⰡ ´õ ½¬¿ì¹Ç·Î, ±â´ëÇÒ °ÍÀ¸·Î »ý°¢ÇÏ´Â ¹æ¹ýÀÎ µíÇÑ Àü¹®°¡½Ã½ºÅÛÀ» »ý¼ºÇÑ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯ ¶§¹®¿¡, ÀÌ Àå¿¡¼­´Â ÈÄÁø¿¬¼â¸¦ »ç¿ëÇÏ´Â Àü¹®°¡½Ã½ºÅÛÀ» °³¹ßÇÑ´Ù.

3. ¸¸´É Àü¹®°¡½Ã½ºÅÛ ¸¸µé±â (CREATING A GENERAL-PURPOSE EXPERT SYSTEM)

ÀÌÁ¦ Àü¹®°¡½Ã½ºÅÛ¿¡ ÇÊ¿äÇÑ ¹è°æÀ» °®°í ÀÖÀ¸¹Ç·Î, ½ÇÁ¦ Àü¹®°¡½Ã½ºÅÛÀÌ ¾î¶²°¡¸¦ º¼ Áغñ°¡ µÇ¾îÀÖ´Ù. ÀÌ Àý¿¡¼­´Â ÈÄÁø ¿¬¼â¸¦ »ç¿ëÇÏ´Â ¸¸´É Àü¹®°¡½Ã½ºÅÛÀ» ¸¸µç´Ù. ¿©·¯ °¡Áö ´Ù¸¥ Áö½Äº£À̽ºµéÀ» °¡Áö°í °°Àº Ãß·Ð ±â°üÀ» »ç¿ëÇÒ¼ö ÀÖ°Ô Çϱ⠶§¹®¿¡ ¸¸´ÉÀ̶ó°í ºÎ¸¥´Ù. ¶ÇÇÑ Áö½Äº£À̽º¸¦ ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ·çƾµéÀ» Æ÷ÇÔÇÑ´Ù. ±×·¯³ª ½ÃÀÛÇϱâ Àü¿¡, Àü¹®°¡½Ã½ºÅÛÀÌ ±¸ÇöµÇ´Â ¹æ¹ý¿¡ ´ëÇÏ¿© °¡Áú ¼ö ÀÖ´Â ¸î °¡Áö ¼±ÀÔ°ßÀ» ¹ö¸®´Â °ÍÀÌ Áß¿äÇÏ´Ù.

ºÒÇàÇÏÁö¸¸ ¶Ç ÀÌÇØ°¡ °¡´Â »ç½ÇÀº, »ç½Ç»ó AI ¿¡ °üÇÑ ¸ðµç ¼Ò°³ Ã¥µéÀº °£´ÜÇÑ µ¿¹° Àü¹®°¡½Ã½ºÅÛÀ» ¿¹·Î »ç¿ëÇÑ´Ù´Â °ÍÀÌ´Ù. ¶§¶§·Î, ¼Ò°³ÀûÀΠåÀº ±×°ÍÀ» ´Ù¸¥ °ÍÀ¸·Î ºÎ¸¦ ¼öµµ ÀÖÁö¸¸, °ÅÀÇ °°Àº ¹æ¹ýÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ºñ·Ï ÀÌ °£´ÜÇÑ Àü¹®°¡½Ã½ºÅÛÀÌ Àü¹®°¡½Ã½ºÅÛÀÇ ¿©·¯ ¸éÀ» ¼³¸íÇÏ´Â (±×¸®°í »ó»ó·ÂÀ» ÀÚ±ØÇÏ´Â) ¿ªÇÒÀ» ÇÏÁö¸¸, Àü¹®°¡½Ã½ºÅÛÀ» ±¸ÇöÇÏ´Â µ¥¿¡ ¿ÇÁö ¸øÇÑ ¹æ¹ýÀ» Á¦½ÃÇÑ´Ù. Ã߷бâ°ü¿¡ ´ë»ó°ú ¼Ó¼ºÀÌ È¥ÇյǾî ÀÖ´Ù : ÀÌ°ÍÀº Áö½Äº£À̽º°¡ ÇÁ·Î±×·¥À¸·Î ÄÚµåÈ­µÇ±â ¾î·Æ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ°ÍÀº ¿©·¯ °¡Áö ÀÌÀ¯ ¶§¹®¿¡ ³ª»Û ÇÁ·Î±×·¡¹Ö ±â¹ýÀÌ´Ù. °¡Àå ³ª»Û ÀÌÀ¯ ÁßÀÇ Çϳª´Â, Áö½Äº£À̽º¸¦ º¯°æÇÏ°í ÁúÀ» ³ôÀ̰ųª È®ÀåÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ ÄÚµå·ÎÀÇ º¯°æ-±×¸®°í ÀçÄÄÆÄÀÏÀ» ÀǹÌÇÏ´Â °ÍÀÌ´Ù. ÀÌ º¯°æÀº ¿ì¹ßÀûÀÎ ÄÄÆÄÀÏ ¿¡·¯¿¡¼­ºÎÅÍ Àͼ÷Ä¡ ¸øÇÑ ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇÑ ½ÇÁ¦ ÄÚµåÀÇ ´Ùº¯¼º±îÁöÀÇ ¹üÀ§¿¡ À̸£´Â ¸ðµç Á¾·ùÀÇ °ñÄ¡°Å¸®·Î ³ëÃâµÈ´Ù. Áö½Äº£À̽º¸¦ ÇÁ·Î±×·¥À¸·Î ¾î·Æ°Ô ÄÚµùÇÏ´Â °ÍÀÌ ³ª»Û ÇÁ·Î±×·¡¹Ö ±â¹ýÀ̶ó´Â ¶Ç´Ù¸¥ ÀÌÀ¯´Â, Áö½Äº£À̽º·ÎÀÇ ½ÇÁö º¯È­´Â »ç¿ëÀÚ°¡ ÇÁ·Î±×·¥À» º¯È­½Ãų °ÍÀ» ¿ä±¸ÇÒ °ÍÀε¥ ÀÌ°ÍÀº ÀÚÁ¸½É ÀÖ´Â ¾î¶² ÇÁ·Î±×·¡¸Óµµ ¿øÇÏÁö ¾Ê´Â ÀÏÀÏ °ÍÀÌ´Ù. ¶Ç, ÀÌ·¸°Ô µÇ¸é »ç¿ëÀÚ°¡ ¿ø½Ã Äڵ带 ÇÊ¿ä·Î ÇÑ´Ù´Â ÀǹÌÀε¥ ÀÌ°ÍÀº ¾î¶² »ó¾÷ ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚµµ Çã¿ëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.

ÀÌ ¼³¸í¿¡¼­ º¸¿©ÁÖµíÀÌ, Áö½Äº£À̽º´Â Ã߷бâ°ü°ú ºÐ¸®µÇ¾î¾ß ÇÑ´Ù. ÀÌ·± ¹æ½ÄÀ¸·Î ¸¸ÀÌ Çö¸íÇÑ ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚµéÀº Áø½Ç·Î ÀÛµ¿ÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛÀ» ¸¸µé ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ ¹Ù·Î ¸ðµç »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛÀÇ ±¸Á¶ÀÌ°í ÀÌ Àå¿¡ ÀÖ´Â Àü¹®°¡½Ã½ºÅÛÀÇ ±¸Á¶ÀÌ´Ù.

(1) ¿¬»êÀÇ º»ÁúÀû ¿ä¼Ò (The Essential of Operation)

Àü¹®°¡½Ã½ºÅÛ ÇÁ·Î±×·¥ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» º¸±â Àü¿¡, ÀÌ Àý¿¡¼­´Â Ã߷бâ°üÀ» ¸¸µé±â À§ÇÑ °ÍµéÀ» ½ÇÁ¦ ¿ë¾î·Î Á¤ÀÇÇÑ´Ù. ÀÌ Àý¿¡¼­´Â Áö½Äº£À̽º°¡ ´ÜÁö ´ë»ó°ú ±× ¼Ó¼ºµé·Î¸¸ ±¸¼ºµÉ °ÍÀ̶ó°í °¡Á¤ÇÑ´Ù. Ã߷бâ°üÀÌ ¹«¾ùÀ» ÇÒ¼ö ÀÖ¾î¾ß ÇÏ´ÂÁö ÀÌÇØÇϱâ À§Çؼ­, ´ÙÀ½ÀÇ ÀÛÀº Áö½Äº£À̽º¸¦ »ç¿ëÇغ¸ÀÚ :

´ë»ó

¼Ó¼º

1

2

3

4

    A, B, C

    A, B, Y

    B, X

    A, B, D

°¡Àå ¿ø½ÃÀûÀÎ ¼öÁØ¿¡¼­, Ã߷бâ°üÀº ´ë»ó 1 ÀÌ ¸ñÇ¥¶ó°í °¡Á¤ÇÏ¿© ½ÃÀÛÇÏ°í ¸ñÇ¥°¡ ´ë»ó 1 ÀÇ ¼Ó¼ºÀ» °¡Áö°í ÀÖ´ÂÁö ¹°¾î À̸¦ È®ÀÎÇÏ·Á°í ÇÑ´Ù. ¸¸¾à ±×·¸´Ù¸é, Ã߷бâ°üÀº ´ë»ó 1 ÀÌ ´äÀ̶ó°í º¸°íÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é, Ã߷бâ°üÀº ´ë»ó 2 ·Î ÁøÇàÇÏ°í ´ë»ó 2 ÀÇ ¼Ó¼º¿¡ °üÇÏ¿© Áú¹®ÇÑ´Ù. ÀÌ °úÁ¤Àº Ãß·Ð ±â°üÀÌ Àû´çÇÑ ´ë»óÀ» ¹ß°ßÇϰųª ´ë»óÀÌ ´õ ÀÌ»ó ¾øÀ» ¶§ ±îÁö ¹Ýº¹µÈ´Ù. ÀÌ°ÍÀÌ Ã߷бâ°üÀÌ µû¶ó°¡´Â ´Ü°èÀÌ°í ´ë»ó 4 °¡ ¸ñÇ¥ÀÌ¸é ´ÙÀ½ ´ëÈ­°¡ »ý±ä´Ù.

ÀÌ·¸°Ô ÀÛµ¿ÇÏ´Â Àü¹®°¡½Ã½ºÅÛÀº »ç¿ëÇϱⰡ Áö·çÇÒ »Ó ¾Æ´Ï¶ó ½Ã½ºÅÛ¿¡ ´ë»óÀÌ Á» ´õ ¸¹À» ¶§´Â °ÅÀÇ °¡Ä¡°¡ ¾ø´Ù. ÀÌ·± ½Ã½ºÅÛ¿¡´Â µÎ°¡Áö ´ÜÁ¡ÀÌ ÀÖ´Ù. ù°, °°Àº ¼Ó¼º¿¡ ´ëÇÏ¿© ¿©·¯¹ø ¹¯´Â´Ù. µÑ°, ´ë»ó 3 À» Á¶»çÇÒ ¶§ ºÒÇÊ¿äÇÑ Áú¹®À» ÇÑ´Ù. ½Ã½ºÅÛÀº ÀÌÀüÀÇ Áú¹®À¸·ÎºÎÅÍ ¹®Á¦ÀÇ ´ë»óÀÌ ¼Ó¼º A ¸¦ °®´Â´Ù´Â °ÍÀ» ¾Ë¾Ò¾î¾ß Çß´Ù : ´ë»ó 3 Àº ¼Ó¼º A ¸¦ °®Áö ¾Ê±â ¶§¹®¿¡ ´õ ½ÃµµÇÏÁö ¾Ê°í ´ë»ó 3 À» °ÅÀýÇß¾î¾ß Çß´Ù. ¼Ó¼º X ¿¡ ´ëÇÑ Áö½ÄÀÌ À¯¿ëÇßÀ» ¼öµµ (could) ÀÖÁö¸¸, Ã߷бâ°üÀº ÇöÀç »óÅÂ¿Í ¸ÂÁö ¾Ê´Â ¸ðµç ´ë»óµéÀ» °Ç³Ê¶Ú´Ù¸é Æò±ÕÀûÀ¸·Î ´õ È¿À²ÀûÀÏ °ÍÀÌ´Ù. ±×·¯¹Ç·Î, ¿ä±¸µÇ´Â °ÍÀº, ¸ñÇ¥¿Í °°Àº ´ë»ó 4 ¸¦ °®´Â Áö½Äº£À̽º°¡ ÁÖ¾îÁ³À» ¶§ ´ÙÀ½ ´ëÈ­¸¦ »ý¼ºÇÏ´Â Ã߷бâ°üÀÌ´Ù.

ÀÌ·± À¯ÇüÀÇ Ã߷бâ°üÀ» ¸ñÇ¥·Î Çϸé Ã߷бâ°üÀÌ °®Ãß¾î¾ß ÇÒ ½Ã¹æÀº ´ÙÀ½°ú °°´Ù :

¼¼ ¹ø° Á¦ÇÑÁ¶°ÇÀº Àü¹®°¡½Ã½ºÅÛÀÌ ¿Ã¹Ù·Î µ¿ÀÛÇÏ°í ÀÖ´Ù´Â °ÍÀ» Áõ¸íÇÏ´Â ¹æ¹ýÀÏ »Ó ¾Æ´Ï¶ó »ç¿ëÀÚ¸¦ ±³À°½ÃÅ°´Â ¹æ¹ýÀ̱⵵ ÇÏ´Ù.

(2) Áö½Äº£À̽º ±¸Á¶È­ (Structuring the Knowledge Base)

Àü¹®°¡½Ã½ºÅÛÀ» ¸¸µé ¶§, ù ´Ü°è´Â Áö½Äº£À̽ºÀÇ ±¸Á¶¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. Áö½Äº£À̽º¿¡ ÀÖ´Â °¢ ¿£Æ®¸®´Â ´ë»óÀÇ À̸§°ú ÀÏ·ÃÀÇ ¼Ó¼ºµé·Î ±¸¼ºµÇ¾î¾ß ÇÑ´Ù. ´ë»óÀ» Æ÷ÇÔÇÏ´Â ºÎºÐÀ» ±¸¼ºÇÏ´Â °¡Àå ½¬¿î ¹æ¹ý ÁßÀÇ Çϳª´Â ´ÙÀ½ ±¸Á¶¸¦ °®´Â ¹è¿­À» »ç¿ëÇÏ´Â °ÍÀÌ´Ù (¿¬°á ¸®½ºÆ®³ª Æ®¸®¸¦ »ç¿ëÇÒ ¼öµµ ÀÖÁö¸¸).

    struct object {

      char name[80];

      struct attribute *alist;    /* pointer to list of attribute */

    } ob;

    struct object k_base[MAX];    /* holds the knowledge base */

¼Ó¼ºÀÇ ¼ö¸¦ ¸ð¸£±â ¶§¹®¿¡, ¼Ó¼º ¸®½ºÆ®´Â ´ÙÀ½ ±¸Á¶ÀÇ ´ÜÀÏ ¿¬°á ¸®½ºÆ®ÀÌ´Ù.

    struct attribute {

      char attrib[80];

      struct attribute *next;    /* use linked list */

    } at;

¾Ë°Ô µÇ°ÚÁö¸¸, Ã߷бâ°üÀº ¸ñÇ¥¿¡ ¼ÓÇÏ´Â ¸ðµç ¼Ó¼º°ú ¼ÓÇÏÁö ¾Ê´Â ¼Ó¼ºÀ» ÃßÀûÇØ ³ª°¡¾ß ÇÑ´Ù. À̸¦ ÇÏ´Â °¡Àå ÁÁÀº ¹æ¹ýÀº ±¸Á¶ À¯Çü attribute ÀÇ µÎ ¿¬°á ¸®½ºÆ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù : µÎ Æ÷ÀÎÅÍ yes ¿Í no ´Â ÀÌ ¸®½ºÆ®µéÀÇ Ã³À½À» °®°Ô µÈ´Ù. ÃÑ°ýº¯¼ö l_pos ´Â ÇöÀç Áö½Äº£À̽º¿¡ ÀÖ´Â ´ë»óµéÀÇ ¼ö¸¦ °¡Áö°í ÀÖ´Ù. Àü¹®°¡½Ã½ºÅÛÀÇ Àüü µ¥ÀÌÅͺ£À̽º ¼±¾ð ºÎºÐÀÌ ´ÙÀ½¿¡ ÀÖ´Ù :

    # define MAX 100    /* arbitrary, could be much larger */

    struct attribute {

      char attrib[80];

      struct attribute *next;    /* use linked list */

    } at;

    struct object {

      char name[80];

      struct attribute *alist;    /* pointer to list of attribute */

    } ob;

    struct object k_base[MAX];    /* holds the knowledge base */

    int l_pos=-1;       /* location of top of k base */

    struct attribute *yes, *no;       /* used for yes and no lists */

    struct attribute *yesnext, *nonext;

(3) Áö½Äº£À̽º ·Îµå (Loading the Knowledge Base)

½ÇÁ¦·Î Ã߷бâ°üÀ» °³¹ßÇϱâ Àü¿¡, Áö½Äº£À̽º¿¡ Á¤º¸¸¦ ³ÖÀ» ·çƾÀ» ¸¸µé¾î¾ß ÇÑ´Ù. º¸Åë »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛ¿¡¼­Ã³·³ º°µµÀÇ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸, °£´ÜÈ÷ Çϱâ À§ÇØ, »ç¿ëÀÚ·Î ÇÏ¿©±Ý ½Ã½ºÅÛ¿¡ Á¤º¸¸¦ ÀÔ·ÂÇÏ°Ô ÇÏ´Â ·çƾµéÀº, ¿©±â¼­ °³¹ßµÈ Àü¹®°¡½Ã½ºÅÛ¿¡ ±¸ÃàµÈ ¼±Åà »çÇ×ÀÏ °ÍÀÌ´Ù. ´ÙÀ½¿¡¼­ º¸µíÀÌ, enter() ´Â ´ë»óÀÇ À̸§°ú ¼Ó¼º ¸®½ºÆ®¸¦ Àд´Ù. ÀÌ °úÁ¤Àº »ç¿ëÀÚ°¡ ºó ÁÙÀ» ŸÀÌÇÎÇÒ ¶§ ±îÁö ¹Ýº¹µÈ´Ù. ±×¸®°í ³ª¼­, enter() ´Â ¶Ç ´Ù¸¥ ´ë»óÀ» À§ÇÏ¿© ÇÁ·ÒÇÁÆ®¸¦ ³»º¸³½´Ù : ´Ù¸¥ ´ë»óÀÇ À̸§°ú ¼Ó¼ºÀ» ÀÔ·ÂÇϰųª, ¿£Æ®¸® °úÁ¤À» °Ç³Ê¶Ù±â À§ÇÏ¿© ºó ÁÙÀ» ÀÔ·ÂÇÏ°Ô ÇÏ¿´´Ù.

    /* input an object and its list of attributes */

    enter( )

    {

        int t;

        struct attribute *p, *oldp;

        

        for (; ;)  {

            t=get_net( );    /*get the index of next available object in k_base */

            if (t == -1) {

                printf("Out of list space. ¡¬n");

                return ;

            }

            printf("object name : ");

            gets(k_base[t].name) {

            if (!*_base[t].name) {

                l_pos--;

                break;

            }

            p=(struct attribute *) malloc(sizeof(at));

            if (p=='¡¬0') {

                printf("Out of memory. ¡¬n");

                return;

            }

            k_base[t].alist=p;

            printf("Enter attributes (RETURN to quit) ¡¬n");

            for (; ;) {

                printf(": ");

                gets(p->attrib);

                if(!p->attrib[0]) break;

                oldp=p;

                p->next=struct attribute *) malloc(sizeof(at));

                p=p->next;

                p->next'¡¬0' '

                if (p == '¡¬0') {

                    printf("Out of memory. ¡¬n");

                    return;

                }

            }

            oldp->next='¡¬0';

        }

    }

(4) Ã߷бâ°ü ±¸Çö (Implementing the Inference Engine)

ÀÌÁ¦ Á¤º¸¸¦ Áö½Äº£À̽º¿¡ ·ÎµåÇÒ ¼ö ÀÖ°Ô µÇ¾úÀ¸¹Ç·Î, Ã߷бâ°üÀº µµÀüÇغ¼ Áغñ°¡ µÇ¾îÀÖ´Ù. Ã߷бâ°üÀº Àü¹®°¡½Ã½ºÅÛÀÇ ÃßÁø·ÂÀÌ´Ù. ºñ·Ï Ãß»óÀûÀÎ Àǹ̿¡¼­´Â ¾ÆÁÖ °£´ÜÇÏÁö¸¸, Ã߷бâ°üÀ» ±¸ÇöÇÏ´Â °ÍÀº ¾î·Á¿ï ¼öµµ ÀÖ´Ù. ¿©±â¼­ °³¹ßµÈ Ã߷бâ°üÀº ¾ÆÁÖ °£´ÜÇÏÁö¸¸, ½ÇÁ¦·Î ¸¹Àº ¾÷¹«¿¡ À¯¿ëÇÏ´Ù. »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛÀº ÀϹÝÀûÀ¸·Î ÀÌ Àü¹®°¡½Ã½ºÅÛ¿¡ ºÎ°úÇÏ´Â °Íº¸´Ù ´õ ¸¹Àº Á¦¾àÁ¶°Ç°ú ¿ä±¸»çÇ×À» °®´Â´Ù´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. ±×·¯³ª, ¿©±â¿¡¼­ °³¹ßÇÑ Ã߷бâ°üÀº ´õ ¹ßÀüµÈ ½Ã½ºÅÛÀ» À§ÇÑ ½ÃÀÛÁ¡ ¿ªÇÒÀº ÃæºÐÈ÷ ÇÒ ¼ö ÀÖ´Ù.

Ã߷бâ°üÀÇ ¸Ç À­ ¼öÁØ ÇÔ¼ö´Â ´ÙÀ½¿¡ ÀÖ´Â query() ÀÌ´Ù.

    /* inquire information from the expert */

    query( )

    {

        int t;

        char ch;

        struct attribute *p;

     

        for (t=0 ; t<=1_pos;t++) {

            p=k_base[t].alist;

            if (try(p,k_base[t].name)) {

                printf("the object is %s¡¬n", k_base[t].name);

                return;

            }

        }

        printf("No object found¡¬n");

    }

query() ÇÔ¼ö´Â ÁÖ¿ä ·çƾ, try() ÇÔ¼ö¿¡ ´ëÇÑ µå¶óÀ̹ö·Î¼­ÀÇ ¿ªÇÒ¸¸ Çϱ⠶§¹®¿¡ ¸Å¿ì °£´ÜÇÏ´Ù. º»ÁúÀûÀ¸·Î, query() ´Â try() °¡ ÀÏÄ¡ (match) ¸¦ ¹ß°ßÇϰųª Áö½Äº£À̽º¿¡ ´õÀÌ»ó ÇÒ °ÍÀÌ ¾øÀ» ¶§±îÁö ÇÑ ¹ø¿¡ ÇÑ ´ë»ó ¾¿À» try() ¿¡°Ô º¸³½´Ù. try() ÇÔ¼ö´Â ´ÙÀ½¿¡ ÀÖ´Â °Íó·³, Ã߷бâ°üÀÇ Áö´É (intelligence) À» Æ÷ÇÔÇÑ´Ù.

    /* try an object */

    try(p, ob)

    struct attribute *p;

    char *ob;

    {

        char answer;

        struct attribute *a, *t;

        

        if (!trailno(p)) return 0 ;

     

        if (!trailyes(p)) return 0 ;

    while(p) {

        /* if already been asked then move on to next

           attribute

        */

        if (ask(p->attrib)) {

           printf("is/does/has if %s? ", p->attrib);

           answer=tolower(getche());

           printf("¡¬n");

     

           a=(struct attribute *) malloc(sizeof(at));

           if (!a) {

               printf("out of memory¡¬n");

               return ;

           }

      a->next='¡¬0';

      switch(answer) {

        case 'n':

          strcpy(a->attrib,p->attrib);

          if (!no) {

             no=a;

             nonext=no;

          }

          else {

             nonext->next=a;

             nonext=a;

          }

          return 0;

        case 'y':

          strcpy(a->attrib,p->attrib);

          if (!yes) {

             yes=a;

             yesnext=yes;

          }

          else {

             yesnext->next=a;

             yesnext=a;

          }

          p=p->next;

          break;

        case 'w' :    /* why? */

          printf("trying %s¡¬n", ob);

          if(yes)

             printf("it is/has/does:¡¬", ob);

          t=yes;

          while(t) {

             printf("%s¡¬n", t->attrib);

             t=t->next;

          }

          if (no) printf("and is/has/does not :¡¬n");

          t=no;

          while(t) {

             printf("%s¡¬n", t->attrib);

             t=t->next;

          }

          break;

        }

      }

      else p=p->next;

    }

    return 1;

    }

try() ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛµ¿ÇÑ´Ù. ù°, trailyes() ¿Í trailno() ·çƾÀº °Ç³×Áø °¢ ´ë»óÀÇ ¼Ó¼º ¸®½ºÆ®¸¦ üũÇÑ´Ù. trailyes() ¿Í trailno() ·çƾÀº ½Ã½ºÅÛÀÇ ÇöÀç »óŸ¦ ¸¸Á·½ÃÅ°Áö ¾Ê´Â ´ë»óÀ» ½ºÅ©¸°À¸·Î ³»º¸³½´Ù. ½ÇÁ¦·Î, trailyes() ´Â ´ë»óÀÇ ¼Ó¼ºÀÌ ±× ´ë»óÀÌ °¡Á®¾ß ÇÑ´Ù°í »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ¸ðµç ¼Ó¼ºÀ» °®´Â´Ù´Â °ÍÀ» üũÇÏ°í, trailno() ´Â ±× ´ë»óÀÌ °ÅÀýµÈ ´ë»óÀ» °®Áö ¾Ê´Â´Ù´Â °ÍÀ» È®ÀÎÇϱâ À§ÇÏ¿© üũÇÑ´Ù. ÀÌ ´Ü°è´Â ½Ã¹æÀÇ Ã¹ ¹ø° Á¦¾àÁ¶°ÇÀ» ¸¸Á·½ÃŲ´Ù.

´ÙÀ½, ´ë»óÀÌ ÀÌ¹Ì È®ÀÎµÈ ¼Ó¼ºÀ» Æ÷ÇÔÇϸé, try() ´Â ¸®½ºÆ®¿¡¼­ ´ÙÀ½ ¼Ó¼ºÀ¸·Î ÁøÇàÇÑ´Ù - ±×¸®ÇÏ¿© Áú¹®ÀÌ µÎ ¹ø »ý±â´Â °ÍÀ» ¸·´Â´Ù. ask() ÇÔ¼ö´Â ÀÌ °áÁ¤À» ÇÏ°í ½Ã¹æÀÇ µÎ ¹ø° Á¦¾àÁ¶°ÇÀ» ¸¸Á·½ÃŲ´Ù.

´ÙÀ½, try() ´Â »ç¿ëÀÚ¿¡°Ô ¼Ó¼º¿¡ ´ëÇÏ¿© ¹¯´Â´Ù. °¢°¢ÀÇ ±àÁ¤ÀûÀÎ ´ë´äÀº try() ·Î ÇÏ¿©±Ý yes ¼Ó¼º ¸®½ºÆ®¿¡ ±× ¼Ó¼ºÀ» ´õÇÏ°Ô ÇÑ´Ù. ±×¸®°í ³ª¼­ try() ´Â ´ÙÀ½ ¼Ó¼ºÀ» ½ÃµµÇÑ´Ù. ¸ðµç ¼Ó¼ºµéÀÌ ÀÏÄ¡Çϸé, ´ë»óÀÌ ¹ß°ßµÇ¾ú°í try() ´Â Âü (true) À» ¸®ÅÏÇÑ´Ù. °¢°¢ÀÇ ºÎÁ¤ÀûÀÎ ´ë´äÀº try() ·Î ÇÏ¿©±Ý no ¸®½ºÆ®¿¡ ±× ¼Ó¼ºÀ» ´õÇÏ°Ô ÇÏ°í °ÅÁþ (false) À» ¸®ÅÏÇÑ´Ù.

¸¶Áö¸·À¸·Î, »ç¿ëÀÚ´Â ¶ÇÇÑ "Why" ÀÇ W ¸¦ ŸÀÌÇÁÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ½Ã½ºÅÛÀ¸·Î ÇÏ¿©±Ý ÇöÀçÀÇ Ã߷аúÁ¤À» Á¤´çÈ­ (justify) ÇÏ°Ô ÇÑ´Ù. ÀÌ ´Ü°è´Â ½Ã¹æÀÇ ¼¼ ¹ø° Á¦¾àÁ¶°ÇÀ» ¸¸Á·½ÃŲ´Ù. Áö¿ø ÇÔ¼ö trailyes(), trailno(), ask() °¡ ´ÙÀ½¿¡ ÀÖ´Ù.

    /* see if it has any attributes known not
        to be part of the object by checking the no list */

    trailno(p)

    struct attribute *p;

    {

      struct attribute *a, *t;

       

      a=no;

      while(a) {

        t=p;

        while(t) {

          if (!strcmp(t->atrib, a->attrib))

            return 0;    /* does have a negative attribute */

          t=t->next;

        }

        a=a->next;

      }

      return 1;

    }

     

    /* see if it has all attributes known

       to be part of the object by checking the yes list */

    trailyes(p)

    struct attribute *p;

    {

      struct attribute *a, *t;

      char ok;

         

      a=yes;

      while(a) {

        ok=0

        t=p;

        while(t) {

          if (!strcmp(t->attrib, a->attrib))

            ok=1;    /* does have a needed attribute */

          t=t->next;

        }

        if (!ok) return 0;

        a=a->next;

      }

      return 1;

    }

     

    /* see if attribute already asked*/

    ask(attrib)

    char *attrib;

    {

     

      struct attribute *p;

       

      p=yes;

      whiple(p && strcmp(attrib, p->attrib))

        p=->next;

         

      if (!p) return 1;    /*false if end of list */

      else return 0;

    }

»ç¿ëÀÚ´Â Áö½Äº£À̽º¿¡ Á¤º¸¸¦ ÇÑ ¹ø ³Ö±â¸¸ ÇÏ¸é µÇ±â ¶§¹®¿¡, save() ¿Í load() ÇÔ¼ö´Â µð½ºÅ© ÆÄÀÏ expert.dat ·ÎºÎÅÍ Áö½Äº£À̽º¸¦ ÀúÀåÇÏ°í ·ÎµåÇϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù (±×·¯³ª, »ç¿ëÀÚ·Î ÇÏ¿©±Ý ÆÄÀÏÀÇ À̸§À» ÁöÁ¤ÇÏ´Â °ÍÀÌ ½¬¿ï °ÍÀÌ´Ù. ÀÌ·¯ÇÑ °³¼±À» Á÷Á¢ Çϱ⠿øÇÒÁöµµ ¸ð¸¥´Ù). save() ¿Í load() ·çƾµéÀÌ ¾Æ·¡¿¡ ³ª¿Í ÀÖ´Ù.

    /* save the knowledge base */

    save()

    {

      int t, x;

      stuct attribut *p;

      FILE *fp;

       

      if ((fp=fopen("expert.dat", "w")) ==0) {

        printf("cannt open file¡¬n"

        return;

      }

      printf("saving knowledge base¡¬n");

       

      for(t=0;t<=1_pos;++t) {

        for (x=0;x<sizeof(k_base[t].name);x++)

          putc(k_base[t].name[x], );

        p=k_base[t].alist;

        while(p) {

          for (x=0;x<sizeof(p->atrib);x++)

            putc(p->attrib[x], fp);

          p=p->next;

        }

        /* end of list marker */

        for (x=0;x<sizeof(p->attrib);x++) putc('¡¬0', fp);

      }

      putc('¡¬0', fp);

      fclose(fp);

    }

     

    /* load the knowledge base */

    load( )

    {

      int t, x;

      struct attribute *p, *oldp;

    FILE *fp;

     

    if ((fp=fopen("expert.dat", "r"))==0) {

      printf("cannot open file¡¬n");

      return;

    }

    printf("loading knowledge base¡¬n");

     

    /* free any old lists */

    clear_kbase();

     

    for (t=0;t<MAX;++t) {

      if ((k_base[t].name[0]=getc(fp))==0) break;

      for (x=1;x<sizeof(k_base[t].name);x++)

        k_base[t].name[x]=getc(fp);

      k_base[t].alist=(struct attribute *) malloc(sizeof(at));

      if(!k_base[t].alist) {

        printf("Out of memory¡¬n");

        break;

      }

       

      k_base[t].alist=(struct attribute *) malloc(sizeof(at));

      p=k_base[t].alist;

      if(!p) {

        printf("Out of memory¡¬n");

        return;

      }

      for (;;) {

        for (x=0;x<sizeof(p->attrib);x++)

          p->attrib[x]=getc(fp);

           

        if (!p->attrib[0]) {

          oldp->next='¡¬0';

            break;     /* end of list */

        }

        p->next=(struct attribute *) malloc(sizeof(at));

          if (!p->next)

            printf("Out of memory¡¬n");

            break;

          }

          oldp=p;

          p=p->next;

        }

      }

      fclose(fp);

      l_pos=t-1;

    }

Àüü Àü¹®°¡½Ã½ºÅÛ ÇÁ·Î±×·¥ÀÌ ´ÙÀ½¿¡ ÀÖ´Ù. ÀÌÁ¦ ½Ã¹ü ¼öÇàÀ» ÇÒ ¼ö ÀÖµµ·Ï ÄÄÇ»ÅÍ¿¡ ÀÔ·ÂÇØ¾ß ÇÑ´Ù.

    /* A simple expert system */

     

    #include <stdio.h>

    #include <malloc.h>

     

    #define MAX 100    /* arbitrary, could be much larger */

     

    struct attribute {

        char attrib[80];

        struct attribute *next;    /* use linked list */

    } at;

     

    struct object {

        char name[80];

        struct attribute *alist;    /* pointer to list of attribute */

    } ob;

     

    struct object k_base[MAX];    /* holds the knowledge base */

    int l_pos=-1;    /* location of top of k base */

     

    struct attribute *yes, *no;    /* used for yes and no lists */

    struct attribute *uesnext, *nonext;

    main()

    {

      char ch;

       

      no-yes='¡¬0';

      do {

        free_trails();

        ch=menu();

        switch(ch) {

          case 'e': enter();

            break;

          case 'q': query();

            break;

          case 's': save();

            break;

          case 'l': load();

        }

       

      } while (ch != 'x');

    }

     

    free_trails()

    {

      struct attribute *p;

       

      while(yes) {

        p=yes->next;

        free(yes);

        yes=p;

      }

       

      while(no) {

        p=no->next;

        free(no);

        no=p;

      }

    }

     

    /* input an object and its list of attributes */

    enter()

    {

      int t,i;

      struct attribute *p, *oldp;

     

    for (;;) {

      t=get_next();    /* get the index of the next
                               available object in k_base */

      if (t == -1) {

        printf("Out of list space. ¡¬n");

        return;

      }

      printf("Object name: ");

      gets(k_base[t].name);

       

      if (!*k_base[t].name) {

        l_pos--;

        break;

      }

      p=(struct attribute *) malloc(sizeof(at));

      if (p=='¡¬0') {

        printf("Out of memory.¡¬n");

        return;

      }

      k_base[t].alist=p;

      for (i=0;i<sizeof(p->attrib);i++) p->attrib[i]=' ';

      printf("Enter attributes (RETURN to quit)¡¬n");

      for (;;) {

        printf(": ");

        gets(p->attrib);

        if(!p->attrib[0]) break;

        oldp=p;

        p->nest=(struct attribute *) malloc(sizeof(at));

        if (p->next == '¡¬0') {

          printf("Out of memory.¡¬n");

          return;

        }

        p=p->next;

        p->next='¡¬0';

        for (i=0;i<sizeof(p->attrib);i++) p->attrib[i]=' ';

      }

      oldp->next = '¡¬0';

    }

    }

     

    /* These routines make up the inference engine */

     

    /* inquire information from the expert */

    query()

    {

      int t;

      char ch;

      struct attribute *p;

       

      for (t=0;t<=l_pos;t++) {

        p=k_base[t].alist;

        if (try(p, k_base[t].name)) {

          printf("the object is %s¡¬n", k_base[t].name);

          return;

        }

      }

      printf("No object found¡¬n");

    }

     

    /* try an object */

    try(p, ob)

    struct attribute *p;

    char *ob;

    {

      char answer;

      struct attribute *a, *t;

     

      if (!trailno(p)) return 0;

       

      if (!trailyes(p)) return 0;

     

      while(p) {

        /* if already been asked then move on to next
            attribute
        */

        if (ask(p->attrib)) {

        printf("is/does/has it %s? ", p->attrib);

        answer=tolower(getche());

        printf("¡¬n");

         

        a=(struct attribute *) malloc(sizeof(at));

        if (!a) {

          printf("out of memory¡¬n");

          return ;

        }

        a->next='¡¬0';

        switch(answer) {

          case 'n':

            strcpy(a->attrib, p->attrib);

            if (!no) {

              no=a;

              nonext=no;

            }

            else {

              nonext->next=a;

              nonext=a;

            }

            return 0;

          case 'y' :

            strcpy(a->attrib, p->attrib);

            if (!yes) {

              yes=a;

              yesnext=yes;

            }

            else {

              yesnext->next=a;

              yesnext=a;

            }

            p=p->next;

            break;

          case 'w':    /* why? */

            printf("Trying %s¡¬n", ob);

            if(yes)

              printf("it is/has/does:¡¬n", ob);

            t=yes;

            while(t) {

              printf("%s¡¬n", t->attrib);

              t=t->next;

            }

            if (no) printf("and is/has/does not :¡¬n");

            t=no;

            while(t) {

              printf("%s¡¬n", t->attrib);

              t=t->next;

            }

            break;

          }

        }

        else p=p->next;

      }

      return 1;

    }

     

    /* see if it has any attributes known not
        to be part of the object by checking the no list */

    trailno(p)

    struct attribute *p;

    {

      struct attribute *a, *t;

      a=no;

      while(a) {

       

        t=p;

        while(t) {

          if (!strcmp(t->attrib, a->attrib))

            return 0;    /* does have a negative attribute */

          t=t->next;

        }

        a=a->next;

      }

      return 1;

    }

     

    /* see if it has all attributes known

       to be part of the object by checking the yes list */

    trailyes(p)

    struct attribute *p;

    {

     

      struct attribute *a, *t;

      char ok;

       

      a=yes;

      while(a) {

        ok=0;

        t=p;

        while(t) {

          if (!strcmp(t->attrib, a->attrib))

            ok=1;    /* does have a needed attribute */

          t=t->next;

        }

        if (!ok) return 0;

        a=a->next;

      }

      return 1;

    }

     

    /* see if attribute already asked */

    ask(attrib)

    char *attrib;

    {

      struct attribute *p;

       

      p=yes;

      while(p && strcmp(attrib, p->attrib))

        p=p->next;

         

      if (!p) return 1;    /* false if end of list */

      else return 0;

    }

     

    /* support routines */

    /* get next free index in k_base array */

    get_next()

    {

      l_pos++;

      if (l_pos<MAX) return l_pos;

      else return -1;

    }

     

    menu()

    {

      char ch;

      printf("(E)nter, (Q)uery, (S)save, (L)oad, e(X)it¡¬n");

      do {

        printf("chooose one:");

        ch=tolower(getche());

      } while (!is_in(ch, "eqslx"));

      printf("¡¬n");

      return ch;

    }

     

    /* save the knowledge base */

    save()

    {

      int t, x;

      struct attribute *p;

      FILE *fp;

       

      if ((fp=fopen("expert.dat", "w"))==0) {

        printf("cannot open file¡¬n");

        return;

      }

      printf("saving knowledge base¡¬n");

       

      for (t=0;t<=lpos;++t) {

        for (x=0;x<sizeof(k_base[T].name);x++)

          putc(k_base[t].name[x],fp);

        p=k_base[t].alist;

        while(p) {

          for (x=0;x<sizeof(p->attrib);x++)

            putc(p->attrib[x],fp);

          p=p->next;

        }

        /* end of list marker */

        for (x=0;x<sizeof(p->attrib);x++)putc('¡¬0',fp);

      }

      putc('¡¬0',fp);

      fclose(fp);

    }

     

    /* load the knowledge base */

    load()

    {

      int t, x;

      struct attribute *p, *oldp;

      FILE *fp;

       

      if ((fp=fopen("exper.dat", "r"))==0) {

        printf("cannot open file¡¬n");

        return;

      }

      priintf("loading knowledge base¡¬n")'

       

      /* free any old lists */

      clear_kbase();

       

      for (t=0;t<MAX;++t) {

        if ((k_basd[t].name[0]=getc(fp))==0) break;

        for (x=1;x<sizeof(k_base[t].name);x++)

          k_base[t].name[x]=getc(fp);

       

        k_base[t].alist=(struct attribute *) malloc(sizeof(at));

        p=k_base[t].alist;

        if(!p) {

          printf("Out of memory¡¬n");

          return;

        }

        for (;;) {

          for (x=0;x<sizeof(p->attri);x++)

            p->attrib[x]=getc(fp);

           

          if (!p->attrib[0]) {

            oldp->next='¡¬0';

              break;    /* end of list */

          }

          p->next=(struct attribute *) malloc(sizeof(at));

          if (!p->next) {

            printf("out of memory¡¬n");

            break;

          }

          oldp=p;

          p=p->next;

        }

      }

      fclose(fp);

        l_os=t-1;

    }

           

    /* reset the k base */

    clear_kbase()

    {

      int t;

      struct attribute *p, *p2;

       

      for (t=0;t<=l_pos;t++) {

        p=k_base[t].alist;

        while(p) {

          p2=p;

          free(p);

          p=p2->next;

         

        }

      }

    }

    is_in(ch, s)

    char ch, *s;

    {

      while(*s)

        if (ch==*s++) return 1;

      return 0;

    }

(5) ½Ã¹ü ¼öÇà (A Sample Run)

ÀÌÁ¦ Àü¹®°¡½Ã½ºÅÛÀ» ÄÄÇ»ÅÍ¿¡ ³Ö¾úÀ¸¹Ç·Î, ±×°ÍÀ» ¼öÇàÇÏ°í ´ÙÀ½ Á¤º¸¸¦ Áö½Äº£À̽º¿¡ ³Ö´Â´Ù.

     ´ë            »ó

¼Ó                    ¼º

»ç°ú (Apple)

±Ö (Orange)

Æ÷µµ (Grape)

³ª¹«µþ±â (Raspberry)

¹è (Pear)

¼ö¹Ú (Watermelon)

ü¸® (Cherry)

źÁ¦¸° (Tangerine)

µÕ±Û°í, »¡°²°Å³ª ³ë¶þ°í, ³ª¹«¿¡¼­ ÀÚ¶÷

µÕ±Û°í, ³ª¹«¿¡¼­ ÀÚ¶ó°í, ¿À·»Áö»ö

°¡½Ã°¡ ¾ø°í, ³ÕÄð¿¡¼­ ÀÚ¶ó°í, ÀÚÁÖ»ö

°¡½Ã°¡ ÀÖ°í, »¡°²°í, Áٱ⿡¼­ ÀÚ¶÷

µÕ±ÛÁö ¾Ê°í, »¡°²°Å³ª ³ì»öÀÌ°í, ³ª¹«¿¡¼­ ÀÚ¶÷

Å©°í, ³ì»öÀÌ°í, °¡½Ã°¡ ¾ø°í, ³ÕÄð¿¡¼­ ÀÚ¶÷

ÀÛ°í, ³ª¹«¿¡¼­ ÀÚ¶ó°í, »¡°²°Å³ª ³ë¶õ»ö

¿À·»Áö ³ª¹«¿¡¼­ ÀÚ¶ó°í, µÕ±Û°í, Ç¥¸éÀÌ ¸Å²ô·¯¿ò

Áö½ÄÀÌ ÁغñµÈ ½Ã½ºÅÛÀ» °¡Áö°í, ´Ù¸¥ À¯ÇüÀÇ °úÀÏÀ» ¾Ë¾Æ³»±â À§ÇÏ¿© »ç¿ëÇÑ´Ù. ´ÙÀ½¿¡ ¿À´Â ¼¼°¡Áö ´ëÈ­°¡ ÀÌ ½Ã½ºÅÛÀ» »ç¿ëÇÏ¿© »êÃâµÇ¾ú´Ù.

¼¼ ¹ø° ´ëÈ­¿¡¼­ why ¸í·É »ç¿ëÀ» ´«¿©°Ü º¸±â ¹Ù¶õ´Ù. ½Ã½ºÅÛÀ» °¡Áö°í ½ÇÇèÇغ¸±â ¹Ù¶õ´Ù ; ÀÛµ¿À» ÀÌÇØÇÏ°í È®½ÅµÇ¸é °ð ´ÙÀ½ Àý·Î ÁøÇàÇØ¾ß ÇÑ´Ù.

(6) º¹¼öÀÇ ÇØ Ã£±â (Finding Multiple Solutions)

Áö½Äº£À̽º¸¦ °ËÅäÇغ¸¸é, źÁ¦¸£°¡ Ç¥¸éÀÌ ºÎµå·´´Ù´Â ºÎ°¡ÀûÀÎ ¼Ó¼ºÀ» °®´Â °ÍÀ» Á¦¿ÜÇÏ°í ¿À·»Áö¿Í źÁ¦¸£ÀÇ Á¤ÀÇ°¡ µ¿ÀÏÇÑ °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù. ±×·¯¹Ç·Î, »ç¿ëÀÚ¿¡°Ô ºñ·Ï źÁ¦¸£°¡ ÀÖÁö¸¸, ÁÖ¾îÁø °Í°ú °°Àº Àü¹®°¡½Ã½ºÅÛÀº Ç×»ó ¿À·»Áö¸¦ º¸°íÇÒ °ÍÀÌ´Ù. ¿Ö³ÄÇϸé źÁ¦¸£ÀÇ Ã³À½ ¼¼°¡Áö ¼Ó¼º°ú ÀÏÄ¡Çϱ⠶§¹®ÀÌ´Ù. ÀÌ ´äÀº ¾î¶² »óȲ¿¡¼­´Â ¹Þ¾ÆµéÀÏ ¼ö ÀÖÁö¸¸, ´ëºÎºÐ ¿ÏÀüÇÑ Çظ¦ ã´Â °ÍÀÌ Áß¿äÇÒ °ÍÀÌ´Ù.

ÀÌÁ¦ ¸ðµç Çظ¦ ãµµ·Ï ÀÌ ½Ã½ºÅÛÀ» º¯°æÇÒ ¹æ¹ýÀ» ¿¬±¸ÇØ º¸ÀÚ. ½Ã½ºÅÛÀÌ º¹¼öÇظ¦ ãÀ» ¼ö ÀÖµµ·Ï query() ÇÔ¼ö¸¸À» ¾à°£ º¯ÇüÇÏ¸é µÈ´Ù. »õ ¹öÀüÀÌ ´ÙÀ½¿¡ ÀÖ´Ù.

    /* inquire information from the expert */

    query()

    {

      int t;

      char ch;

      struct attribute *p;

       

      for (t=0;t<=1_pos;t++) {

        p=k_base[t].alist;

        if (try((p, k_basee[t].name)) {

          printf("%s fits current description¡¬n", k_base[t].name);

          printf("continue? (Y/N): ");

          ch=tolower(getche());

          printf("¡¬n");

          if (ch=='n') return;

        }

      }

      printf("No (more) object(s) found¡¬n");

    }

ÀÌ ¹öÀü¿¡¼­, ½Ã½ºÅÛÀÌ ÇöÀçÀÇ »ç½Ç°ú ¸Â´Â ´ë»óÀ» ¹ß°ßÇÒ ¶§¸¶´Ù query() ´Â ±× À̸§À» Ãâ·ÂÇÏ°í »ç¿ëÀÚ¿¡°Ô °è¼ÓÇÒ °ÍÀÎÁö¸¦ ¹¯´Â´Ù. »ç¿ëÀÚ°¡ y ¸¦ ŸÀÌÇÁÇϸé, Ž»öÀº °è¼ÓµÈ´Ù. ´ÙÀ½ ´ëÈ­¿¡ º¯È­°¡ ³ªÅ¸³ª ÀÖ´Ù.

    is/has/does it round y

    is/has/does it red or yellow n

    is/has/does it grow on trees y

    orange fits the current description

    continue (Y/N)? y

    is/has/does it soft skinned y

    tangerine fits the current description

    contine (Y/N)? n

ºñ½ÁÇÑ Á¤ÀǸ¦ °®´Â »õ·Î¿î °úÀÏÀ» °¡Áö°í ½ÇÇèÇÏ·Á°í ½ÃµµÇϱ⠿øÇÒÁöµµ ¸ð¸¥´Ù. ÀÌ¿Í°°ÀÌ, ÇÁ·Î±×·¥Àº ¶§¶§·Î ¾ÆÁÖ ¿µ¸®ÇØ º¸ÀδÙ.

4. ´õ º¹ÀâÇÑ ¹öÀü (A MORE SOPHISTICATED VERSION)

Á» ´õ ³ë·ÂÇϸé, ½Ã½ºÅÛÀÌ why ¸í·É¿¡ ´ëÇÑ ¹ÝÀÀÀ» Çâ»ó ½Ãų ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥ÀÌ ÇöÀç ƯÁ¤ÇÑ ´ë»ó¿¡¼­ ÀÛµ¿ÇÏ°í ÀÖ´Â ÀÌÀ¯¸¦ ¾Ë·ÁÁÖ°í´Â ÀÖÁö¸¸ ´Ù¸¥ ´ë»óµéÀ» ¿Ö °ÅÀýÇß´ÂÁö´Â ¾Ë·ÁÁÖÁö ¾Ê´Â´Ù. À̸¦ º¯°æÇÏ´Â °ÍÀº »õ·Î¿î µ¥ÀÌÅͺ£À̽º, µÎ °³ÀÇ »õ·Î¿î ÇÔ¼ö, ±×¸®°í ÇÁ·Î±×·¥ÀÇ ´Ù¸¥ ¿©·¯ ºÎºÐÀÇ º¯È­¸¦ ¿ä±¸ÇÑ´Ù.

»õ·Î¿î µ¥ÀÌÅͺ£À̽º´Â °ÅÀý´çÇÑ ´ë»óÀÇ À̸§°ú °ÅÀýÀÇ ¿øÀÎÀÌ µÈ ¼Ó¼ºÀ» °®°Ô µÈ´Ù. ´ÙÀ½ ±¸Á¶ ¹è¿­Àº ÀÌ Á¤º¸¸¦ À¯ÁöÇϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù.

    struct rejected_object {

    char name[80];

    char attrib[80];    /* attribute that caused rejection */

    char condition;    /*  should it or shouldn't it

                                 have been found ? */

    } rj;

    struct rejected_object r_base[MAX];

condition Çʵå´Â ´ë»ó¿¡ ¾î¶² ¼Ó¼ºÀÌ ¾ø´ÂÁö, ¶Ç´Â ´ë»óÀÌ ÀÌ¹Ì °ÅÀýµÈ ¼Ó¼ºÀ» °®´ÂÁö¸¦ ¸»ÇØÁØ´Ù. ÇÑ ´ë»óÀÌ °ÅÀýµÉ ¶§¸¶´Ù - try() ¿¡¼­ÀÇ no ´ë´ä¿¡ ÀÇÇؼ­µç trailyes() ³ª trailno() ¿¡ ÀÇÇؼ­µçÁö, reject() ´Â °ÅÀýµÈ µ¥ÀÌÅͺ£À̽º¿¡ ±× ´ë»ó°ú ¼Ó¼ºÀ» ³Ö´Â´Ù. reject() ÇÔ¼ö°¡ ´ÙÀ½¿¡ ÀÖ´Ù.

    /* place rejected object into database */

    reject(ob, at, cond)

    char *ob, *at, cond;

    {

      r_pos++;

       

      strcpy(r_base[r_pos].name, ob);

      strcpy(r_base[r_pos].attrib, at);

      r_base[r_pos.condition=cond;

    }

½Ã½ºÅÛÀÌ why ¸í·ÉÀ» ³»º¸³¾ ¶§¸¶´Ù, ½Ã½ºÅÛÀº »õ·Î¿î ÇÔ¼ö reasoning() À» È£ÃâÇϴµ¥, ÀÌ°ÍÀº ½Ã½ºÅÛÀÇ ÇöÀç »óŸ¦ º¸ÀÏ »Ó ¾Æ´Ï¶ó ¾î¶² ´ë»óÀÌ ¿Ö °ÅÀýµÇ¾ú´ÂÁö¸¦ º¸¿©ÁØ´Ù. reasoning() ÇÔ¼ö°¡ ´ÙÀ½¿¡ ÀÖ´Ù.

    /* show why a line of reasoning is being followed */

    reasonig(ob)

    char *ob;

    {

      struct attribute *t;

      int i;

     

      printf("Trying %s¡¬n", ob);

      if (yes)

        printf("it is/has/does:¡¬n");

      t=yes;

      while(t) {

        printf("%s¡¬n", t->attrib);

        t=t->next;

      }

      if (no) printf("it is/has/does not:¡¬n");

      t=no;

      while(t) {

        printf("%s¡¬n", t->attrib);

        t=t->next;

      }

       

      for (i=0;i<=r_pos;i++) {

        printf("%s is rejected because ", r_base[i].name);

        if (r_base[i].condition=='n')

          printf("$s is not an attribute.¡¬n", r_base[i].attrib);

        else

          printf("%s is not an attribute.¡¬n", r_base[i].attrib);

      }

    }

ÀÌ º¯È­¿Í ÷°¡¸¦ Áö¿øÇÏ·Á¸é, ÇÁ·Î±×·¥ Àüü¿¡ ¾à°£ÀÇ º¯È­¸¦ ¸¹Àº ºÎºÐ¿¡¼­ ¿ä±¸ÇÑ´Ù. µû¶ó¼­ ÆíÀÇ»ó, °³¼±µÈ Àü¹®°¡½Ã½ºÅÛ Àüü¸¦ ´ÙÀ½¿¡ Á¦½ÃÇÑ´Ù :

    /* An improve expert system that finds multiple

       goals and displays reasoning */

     

    #include "stdio.h"

    #include <malloc.h>

    #define MAX 100

    struct attribute {

      char attrib[80];

      struct attribute *next;    /* use linked list */

    } at;

     

    struct object [

      char name[80];

      struct attribute *alist;    /* pointer to list of attributes */

    } ob;

     

    struct rejected_object {

      char name[80];

      char attrib[80];    /* attribute that caused rejection */

      char condition;    /* should it or shouldn't it

                                  have been found ? */

    } rj;

    struct rejected_object r_base[MAX];    /* holds the knowledge base */

    int l_pos=-1;    /* location of top of k base */

    int r_pos=-1;   /* location of top of reject base */

     

    struct attribute *yes, *no;    /* used foor yes and no llists */

    struct attribute *yesnext, *nonext;

     

    main()

    {

      char ch;

     

      no=yes='¡¬0';

      do {

        free_trails();

        ch=menu();

        switch(ch) {

          case 'e' : enter();

            break;

          case 'q': query();

            break;

          case 's': save();

            break;

          case 'l': load();

      }

      } while (ch != 'x');

    }

         

    free_trails()

    {

      struct attribute *p;

         

      while(yes) {

        p=yes->next;

        free(yes);

        yes=p;

      }

         

      while(no) {

        p=no->next;

        free(no);

        no=p;

      }

      r_pos=-1;

    }

    /* input an object and its list of attributes */

    enter()

    {

      int t, i;

      struct attribute *p, *oldp;

       

      for (;;) {

        t=get_next();    /* get the index of the next

                                 availabel object in k_base */

        if (t == -1) {

          printf("Out of list space.¡¬n");

          return;

        }

        printf("Object name: ");

        gets(k_base[t].name);

     

        if (!*k_base[t].name) {

          l_pos--;

          break;

        }

       

        p=(struct attribute *) malloc(sizeof(at));

        if (p=='¡¬0') {

          printf ("out of memory.¡¬n");

          return;

        }

        k_base[t].alist=p;

        for (i=0;i<sizeof(p->attrib);i++) p->attrib[i]=' ';

        printf("Enter attributes (RETURN to  quit)¡¬n");

        for (;;) {

          printf(": ");

          gets(p->attrib):

          if(!p->attrib[0]) break;

          oldp=p;

          p->next=(struct attribute *) malloc(sizeof(at));

          if (p->next == '¡¬0') {

            printf("Out of memory.¡¬n");

            return;

          }

          p=p->next;

          p->next-'¡¬0';

          for (i=0;i<sizeof(p->attrib);i++) p->attrib[i]=' ';

        }

        oldp->next = '¡¬0';

      }

    }

         

    /* inquire information from the expert */

    query()

    {

      int t;

      char ch;

      struct attribute *p;

         

      for (t=0;t<=1_pos;t++) {

        p=k_base[t].alist;

        if (try(p, k_base[t].name)) {

          printf("%s fits current description¡¬n", k_base[t].name);

          printf("continue? (Y/N): ");

          ch=tolower(getche());

          printf("¡¬n");

          if (ch=='n') return;

        }

      }

      printf("No (more) object(s) found¡¬n");

      }

       

      /* try an object */

      try(p, ob)

      struct attribute *p;

      char *ob;

      {

      char answer;

      struct attribute *a, *t;

       

      if (!trailno(p, ob)) return 0;

       

      if (!trailyes(p, ob)) return 0;

       

      while(p) {

          /* if already been asked then move on to next

             attribute

          */

          if (ask(p->attrib)) {

        printf("is/does/has it %s? ",  p->attrib);

        answer=tolower(getche());

        printf("¡¬n");

         

        a=(struct attribute *) malloc(sizeof(at));

        if (!a) {

          printf("out memory¡¬n");

          return 0;

        }

        a->next='¡¬0';

        switch(answer) {

          case 'n':

            strcpy(a->attrib, p->attrib);

            if (!no) {

              no=a;

              nonext=no;

            }

            else {

              nonext->next=a;

              nonext=a;

            }

            reject(ob, p->attrib, 'n');

            return 0;

          case 'y':

            strcpy(a->attrib, p->attrib);

            if (!yes) {

              yes=a;

              yesnext=yes;

            }

            else {

              yesnext->next=a;

              yesnext=a;

            }

            p=p->next;

            break;

          case 'w':    /* why? */

            reasonig(ob);

            break;

          }

        }

        else p=p->next;

      }

      return 1;

    }

     

    /* see if it has any attributes known not

        to be part of the object by checking the no list */

    trailno(p, ob)

    struct attribute *p;

    char *ob;

    {

      struct attribute *a, *t;

     

      a=no;

      while(a) {

        t=p;

        while(t) {

          if (!strcmp(t->attrib, a->attrib)) {

            reject(ob, t->attrib, 'n');

            return 0;    /* does have a negative attribute */

          }

          t=t->next;

        }

        a=a->next;

      }

      return 1;

    }

     

    /* see if it has all attributes known

        to be part of the object by checking the yes list */

    trailyes(p, ob)

    struct attribute *p;

    char *ob;

    {

        struct attribute *a, *t;

        char ok;

      a=yes;

      while(a) {

        ok=0;

        t=p;

        while(t) {

          if (!strcmp(t->attrib, a->attrib)) {

            ok=1;    /* does have a needed attribute */

          }

          t=t->next;

        }

        if (!ok) {

          reject (ob, a->attrib, 'y');

          return 0;

        }

        a=a->next;

      }

      return 1;

    }

         

    /* see if attribute already asked */

    ask(attrib)

    char *attrib;

    {

      struct attribute *p;

         

      p=yes;

      while(p && strcmp(attrib, p->attrib))

        p=p->next;

         

      if (!p) return 1;    /* false if end of list */

      else return 0;

    }

     

    /* show why a line of reasoning is being followed */

    reasoning(ob)

    char *ob;

    {

      stuct attribute *t;

      int i;

       

      printf("Trying %s¡¬n", ob);

      if (yes)

        printf("it is/has/does:¡¬n");

      t=yes;

      while(t) {

        printf("%s¡¬n", t->attrib);

        t=t->next;

      }

      if (no) printf("it is/has/does noot:¡¬n");

      t=no;

      while(t) {

        printf("%s¡¬n", t->attrib);

        t=t->next;

      }

     

      for (i=0;i<=r_pos;i++) {

        printf("%s is rejected because ", r_base[i].name);

        if (r_base[i].condition=='n')

          printf("%s is not an attribute.¡¬n", r_base[i].attrib);

        else

          printf("%s is a required attribute.¡¬n", r_base[i].attrib);

      }

    }

     

    /* place rejected object into databese */

    reject(ob, at, cond)

    char *ob, *at, cond;

    {

      r_pos++;

       

      strcpy(r_base[r_pos].name, ob);

      strcpy(r_base[r_pos].attrib, at);

      r_base[r_pos].condition=cond;

    }

     

    /* get next free index in k_base array */

    get_next()

    {

    l_pos++;

    if(l_pos<MAX) return l_pos;

    else ruturn -1;

    }

     

    menu()

    {

    char ch;

    printf("(E)mneter, (Q)uery, (S)save, (L)oad, e(X)it¡¬n");

    do {

    printf("choose one:");

    ch=toloower(getche());

    } while (!is_in(ch, "eqslx"));

    printf("¡¬n");

    return ch;

    }

     

    save()

    {

      int t, x;

      struct attribute *p;

      FILE *fp;

     

      if ((fp=fopen("expert.dat", "w"))==0) {

        printf("cannot open file¡¬n");

        return;

      }

      printf("saving knowledge base¡¬n");

     

      for (t=0;t<=1_pos;++t) {

        for (x=0;x<sizeof(k_base[t].name);x++)

          putc(k_base[t].name[x], fp);

        p=k_base[t].alist;

        while(p) {

          for (x=0;x<sizeof(p->attrib);x++)

            putc(p->attrib[x], fp);

          p=p->next;

        }

        /* end of list marker */

        for (x=0;x<sizeof(p->attrib);x++) putc('¡¬0', fp);

      }

      putc(0, fp);

      fclose(fp);

    }

     

    load()

    {

      int t, x;

      struct attribute *p, *oldp;

      FILE *fp;

       

      if((fp=fopen("expert.dat", "r"))==0) {

        printf("cannot open file¡¬n");

        return;

      }

      printf("loading knowledge base¡¬n");

       

      /* free any old lists */

      clear_kbase();

      for(t=0;t<MAX;++t) {

        if((k_base[t].name[0]=getc(fp))==0) break;

        for (x=1;x<sizeof(k_base[t].name);x++)

           k_base[t].name[x]=getc(fp);

       

        k_base[t].alist=(struct attribute *) malloc(sizeof(at));

        p=k_base[t].alist;

        if(!p) {

          printf("Out of memory¡¬n");

          return;

        }

        for(;;) {

          for(x=0;x<sizeof(p->attrib);x++)

            p->attrib[x]=getc(fp);

          if(!p->attrib[0]) {

            oldp->next='¡¬0';

            break;    /* end of list */

          }

          p->next=(struct attribute *) malloc(sizeof(at));

          if(!p->next) {

            printf("out of memory¡¬n");

            break;

          }

          oldp=p;

          p=p->next;

        }

      }

      fclose(fp);

      l_poos=t-1;

    }

           

    clear_kbase()

    {

      int t;

      struct attribute *p, *p2;

           

      for(t=0;t<=l_pos;t++) {

        p=k_base[t].alist;

        while(p) {

          p2=p->next;

          free(p);

          p=p2;

        }

      }

    }

           

    is_in(ch, s)

    char ch, *s;

    {

      while(*s)

        if(ch==*s++) return 1;

        return 0;

      }

       

     

½Ã¹ü ¼öÇà¿¡¼­ °úÀÏ µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÑ Çâ»óµÈ Ãâ·Â ¿¹°¡ ´ÙÀ½¿¡ ³ª¿Í ÀÖ´Ù.

    is/has/does it round? y

    is/has/does it red or yellow? n

    is/has/does it grow on trees? w

     

    Trying orange

    it is/has/does:

    round

    it is/has/does not:

    red or yellow

     

    apple is rejected because red or yellow is not an attribute

º¸´Â ¹Ù¿Í °°ÀÌ, ÀÌ ´ëÈ­´Â ½Ã½ºÅÛÀÌ ¿©·¯ ´ë»óµéÀ» ¿Ö °ÅÀýÇß´ÂÁö ¼³¸íÇØ Áֱ⠶§¹®¿¡ »ç¿ëÀÚ¿¡°Ô »ó´çÈ÷ ¸¹Àº Á¤º¸¸¦ Àü´ÞÇØ ÁØ´Ù. Å« Áö½Äº£À̽º¸¦ °¡Áö°í, ¸¹Àº °ÅÀý (½Ã½ºÅÛÀÇ ÇöÀç »óÅÂ¿Í °ü°è¾ø´Â ¸¹Àº °Íµé) À» µð½ºÇ÷¹ÀÌ ÇÏ´Â °ÍÀ» ¸·À» ¹æ¹ýÀ» ã´Â °ÍÀÌ ÇÊ¿äÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·± °³¼±Àº ½º½º·Î Çغ¸±â ¹Ù¶õ´Ù ; ±×·¯³ª, ÈùÆ®·Î¼­, Áö½Äº£À̽º´Â ¶ÇÇÑ ½Ã½ºÅÛÀÌ ÇöÀçÀÇ °¡¼³¿¡ °ü·ÃµÈ °ÅÀýµÈ ´ë»óµé¸¸ µð½ºÇ÷¹ÀÌÇϵµ·Ï ¾î¶² °ü°è¸¦ µ¿¹ÝÇÒ °ÍÀ» ¿ä±¸ÇÒ °ÍÀÌ´Ù.

5. Áö½Ä ¿£Áö´Ï¾î¸µ (KNOWLEDGE ENGINEERING)

ÀÌ Àå¿¡¼­ °³¹ßµÈ Àü¹®°¡½Ã½ºÅÛÀº Áö½Äº£À̽º¿¡ Àִ ù ¹ø° ¿£Æ®¸®¸¦ °®°í Ž»öÀ» ½ÃÀÛÇÑ´Ù. ±×¸®°í ´Ü¼øÈ÷ ´ë»óµéÀÇ ¸®½ºÆ®¸¦ µû¶ó ¼ø¼­´ë·Î ÁøÇàÇÑ´Ù. ÀÌ °úÁ¤Àº ´ë»óÀÌ ÀûÀº °æ¿ì¿¡´Â ÁÁÁö¸¸, ´õ Å« Áö½Äº£À̽º¸¦ »ç¿ëÇÒ ¶§ ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, ¹¦»çÇÏ´Â °ÍÀÌ ¼ýÀÚ 999 ·Î Ç¥ÇöÇÑ Ãµ°³ÀÇ ´ë»óÀÌ ÀÖ°í °øÅëµÈ ¼Ó¼ºÀÌ ÀÖÀ¸¸é, ã´Âµ¥¿¡ ¿À·£ ½Ã°£ÀÌ °É¸± ¼öµµ ÀÖ´Ù. ´Ù¸¥ ¹®Á¦µµ ÀÖ°ÚÁö¸¸ ÀÌ·± Á¾·ùÀÇ ¹®Á¦¸¦ ÇØ°áÇÏ·Á°í Çϸé Áö½Ä°øÇÐÀ̶ó´Â ºÐ¾ß°¡ ÇÊ¿äÇÏ´Ù.

Áö½Ä°øÇÐÀº Áö½Äº£À̽º°¡ Á¶Á÷µÇ°í, ±¸¼ºµÇ°í, È®ÁõµÇ´Â ¹æ¹ýÀ» ´Ù·ç´Â ºÐ¾ßÀÌ´Ù. ÀÌ ÁÖÁ¦¿¡ ´ëÇÏ¿© ÃæºÐÈ÷ ¼³¸íÇÏ´Â °ÍÀº ÀÌ Ã¥ÀÇ ¹üÀ§¸¦ ³Ñ¾î¼­Áö¸¸, Áö½Äº£À̽º¸¦ ±¸ÃàÇÏ·Á¸é ¿©·¯ °¡Áö ¾î·Á¿ò¿¡ ºÀÂøÇÑ´Ù´Â Á¡Àº ¾Ë¾Æ¾ß ÇÑ´Ù. Áö½Ä°øÇÐ ºÐ¾ß´Â ¿ª»ç°¡ ¾ÆÁÖ Âª°í, ¿¬±¸µÉ °ÍÀÌ ¸¹´Ù´Â °ÍÀ» ¸í½ÉÇÏÀÚ.

(1) Áö½Äº£À̽º ±¸Á¶ (Knowledge Base Organization)

¾Õ¿¡¼­ ¸»ÇßµíÀÌ, ÀÌ Àå¿¡¼­ °³¹ßµÈ Àü¹®°¡½Ã½ºÅÛÀº Áö½Äº£À̽ºÀÇ ±âÃÊ¿¡¼­ ½ÃÀÛÇÏ¿©, Àüü¸¦ ¼øÂ÷ÀûÀ¸·Î ÁøÇàÇÏ¿´´Ù. ÈÞ¸®½ºÆ½¸¸ Ãß°¡µÇ¸é, ÀÌ°ÍÀº Ã߷бâ°ü¿¡¼­ ±â´ëÇÏ´Â °¡Àå ÁÁÀº °á°ú°¡ µÉ °ÍÀÌ´Ù. ±×·¯³ª, Áö½Äº£À̽º¸¦ ¸¸µå´Â »ç¶÷À¸·Î¼­, Áö½Äº£À̽ºÀÇ ±¸¼ºµµ Á¦¾îÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ÇÏ¸é ´õ ÁÁ¾ÆÁö±âµµ ´õ ³ªºüÁö±âµµ ÇÒ °ÍÀÌ´Ù.

¾î¶² °æ¿ì¿¡´Â, Á¤º¸¸¦ ±¸¼ºÇÏ´Â ÁÁÀº ¹æ¹ýÀ¸·Î °¡Àå °¡´É¼ºÀÌ ¸¹Àº ´ë»óµéÀ» ¸Ç À§¿¡ ³õ°í, °¡Àå °¡´É¼ºÀÌ ÀûÀº ´ë»óµéÀ» ¾Æ·¡ ºÎºÐ¿¡ ³õ´Â´Ù. ¹®Á¦´Â ¾î´À ´ë»óÀÌ °¡´É¼ºÀÌ ³ô°í ¾î´À °ÍÀÌ °¡´É¼ºÀÌ ÀûÀºÁö¸¦ °áÁ¤ÇÏ´Â °ÍÀÌ´Ù. »ç¶÷ Àü¹®°¡Á¶Â÷µµ ¾î´À ÇØ°¡ °¡Àå °¡´É¼ºÀÌ ³ôÀºÁö ¸ð¸¦ ¼ö ÀÖ´Ù. ¶§¶§·Î, Áö½Äº£À̽º¸¦ ÀÓÀÇ·Î ¸¸µé¾î¼­, ½Ã½ºÅÛÀÌ °¢ ´ë»óÀ» ¼±ÅÃÇϴ Ƚ¼ö¸¦ ±â·ÏÇÏ´Â µ¿¾ÈÀÇ ÂªÀº ±â°£¸¸ »ç¿ëÇÏ´Â ¼öµµ ÀÖ´Ù. ÀÌ·± ºóµµ¼ö¸¦ »ç¿ëÇϸé Áö½Äº£À̽º¸¦ ´Ù½Ã ¹è¿­ÇÒ ¼ö ÀÖ´Ù.

Áö½Äº£À̽º¸¦ ±¸¼ºÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀº Áö½Äº£À̽ºÀÇ À­ºÎºÐ¿¡ "Æ®¸®" ÀÇ °¡Àå Å« ºÎºÐÀÌ À߸®°Ô ÇÏ´Â ±×·± ¼Ó¼ºµéÀ» ³õ´Â °ÍÀÌ´Ù. Å« Áö½Äº£À̽º¿¡ ´ëÇؼ­, ¾î´Â ¼Ó¼ºÀÌ °¡Àå Å« È¿°ú¸¦ °®´ÂÁö °áÁ¤ÇÏ´Â °ÍÀº ¾î·Æ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

(2) Àü¹®°¡ ã±â (Finding the Expert)

ÀÌ Àå Àüü¿¡¼­ »ç¶÷ Àü¹®°¡¸¦ ãÀ» ¼ö ÀÖ°í, ±× Àü¹®°¡ÀÇ Áö½ÄÀ» ½±°Ô »©³¾ ¼ö ÀÖ´Ù°í °¡Á¤Çß´Ù. ºÒÇàÈ÷µµ, ±×·± °æ¿ì´Â °ÅÀÇ ¾ø´Ù. ¸ÕÀú, ´©°¡ ÁøÂ¥ Àü¹®°¡ÀÌ°í ¾Æ´ÑÁö °áÁ¤ÇÏ´Â °ÍÀº ²Ï³ª ¾î·Æ´Ù. ƯÈ÷ ±× ÁÖÁ¦¿¡ ´ëÇÏ¿© °ÅÀÇ ¸ð¸¦ ¶§ ¹®Á¦°¡ µÈ´Ù. µÎ ¹ø°·Î, °°Àº ´ë»ó¿¡ ´ëÇÏ¿© µÎ ¸íÀÇ ´Ù¸¥ Àü¹®°¡°¡ Á¾Á¾ ÀÇ°ßÀÌ Æ²¸®´Ù - ÀÌ°ÍÀº ¾î´À °ÍÀ» »ç¿ëÇÒÁö ¾Æ´Â °ÍÀ» ¾î·Æ°Ô ÇÑ´Ù.

Àü¹®°¡µéÀÇ ÀÇ°ßÀÌ ´Ù¸¦ ¶§, ÀϹÝÀûÀ¸·Î ¼¼°¡Áö Áß¿¡¼­ ¼±ÅÃÀ» ÇÒ ¼ö ÀÖ´Ù. ù°, ÇÑ Àü¹®°¡¸¦ ¼±ÅÃÇÏ°í ´Ù¸¥ °ÍÀ» ¹«½ÃÇÑ´Ù. ÀÌ°ÍÀº ºÐ¸í °¡Àå ½¬¿î ¼±ÅÃÀÌ´Ù. ÇÏÁö¸¸ Áö½Äº£À̽º°¡ ¾î¶² À߸øµÈ Á¤º¸¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù (±×·¯³ª ¿ÇÁö ¸øÇÑ Á¤º¸ÀÇ ¾çÀº »ç¶÷ Àü¹®°¡°¡ Á¦°øÇÒ ¼ö ÀÖ´Â °Í»ÓÀÌ´Ù). µÑ°, Á¤º¸¸¦ Æò±ÕÈ­ÇÒ ¼ö ÀÖ´Ù : Áï, µÎ Àü¹®°¡ »çÀÌ¿¡ °øÅëµÈ Á¤º¸¸¸ »ç¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ¼±ÅÃÀÌ Ã¹ ¹ø° °Í¸¸Å­ ½±Áö´Â ¾ÊÁö¸¸ ±×¸® Å« ¹®Á¦¾øÀÌ ÀÌ °úÁ¤À» Á¾Á¾ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÜÁ¡Àº Áö½Äº£À̽ºÀÇ ³»¿ëÀÌ ¿ÏÈ­µÈ´Ù´Â °Í°ú, ¾î´À Àü¹®°¡ÀÇ Áö½Äµµ ÃæºÐÈ÷ ¹Ý¿µµÇÁö ¸øÇÑ´Ù´Â °ÍÀÌ´Ù. ¼¼ ¹ø°, µÎ Àü¹®°¡ÀÇ Áö½ÄÀ» ¸ðµç ½Ã½ºÅÛ¿¡ Æ÷ÇÔÇؼ­ »ç¿ëÀÚ°¡ °áÁ¤ÇÏ°Ô ÇÒ ¼öµµ ÀÖ´Ù. °¢ Ç׸ñ¿¡ ´ëÇÏ¿© È®·ü ÀÎÀÚ (probability factor) ¸¦ ºÎ°¡ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¼±ÅÃÀÌ ºñ·Ï ¾î¶² »óȲ¿¡¼­´Â ¹Þ¾Æµé¿© Áú ¼ö ÀÖÁö¸¸, ¸¹Àº ÀÀ¿ë¿¡ ´ëÇÏ¿© Àü¹®°¡½Ã½ºÅÛÀÌ ±ÇÀ§°¡ Àֱ⸦ ¿øÇÒ °ÍÀÌ´Ù - Áï, »ç¿ëÀÚ°¡ °áÁ¤Çϱ⸦ ¿øÇÏÁö ¾Ê´Â´Ù.

¶Ç ´Ù¸¥ ¾î·Á¿î Á¡Àº ´ëºÎºÐÀÇ »ç¶÷ Àü¹®°¡°¡ ±×µéÀÌ ¹«¾ùÀ» ¾Æ´ÂÁö¸¦ ¸ð¸¥´Ù´Â °ÍÀÌ´Ù : »ç¶÷Àº ÄÄÇ»ÅÍ°¡ ÇÒ ¼ö ÀÖ´Â °Í°ú °°Àº ¹æ¹ýÀ¸·Î "¸Þ¸ð¸® ´ýÇÁ" ¸¦ ÇÒ ¼ö ¾ø´Ù. ±×·¯¹Ç·Î, ÇÊ¿äÇÑ Á¤º¸¸¦ ¸ðµÎ »Ì¾Æ³»´Â °ÍÀÌ ¾î·Á¿ï ¼ö ÀÖ´Ù. ¶ÇÇÑ, ¾î¶² Àü¹®°¡µéÀº ±×µéÀÌ ¾Ë°í ÀÖ´Â ¸ðµç °ÍÀ» ¸»ÇØÁÖ±â À§ÇÏ¿© ½Ã°£ÀÌ °É¸®´Â °ÍÀ» ÀÚÁøÇؼ­ ÇÏ·Á°í ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.

(3) Áö½Äº£À̽º È®Áõ (Verifying the Knowledge Base)

ºñ·Ï ÇùÁ¶ÀûÀÌ°í, ÀÚ½ÅÀÇ Àü¹®Áö½Ä¿¡ ´ëÇÏ¿© ¿Ïº®ÇÏ°Ô ¼³¸íÇØ ÁÙ Àü¹®°¡¸¦ ã¾Ò´Ù°í ÇÏ´õ¶óµµ, Áö½ÄÀ» ÄÄÇ»ÅÍ¿¡ Á¤È®ÇÏ°Ô º£²¸ ³Ö¾ú´Ù´Â °ÍÀ» È®ÁõÇÏ´Â ¹®Á¦¿¡ ¿©ÀüÈ÷ ºÎµúÄ¡°Ô µÈ´Ù. º»ÁúÀûÀ¸·Î, Áö½Äº£À̽º¸¦ ½ÃÇèÇØ ºÁ¾ß ÇÑ´Ù. ¹®Á¦´Â ÀÌ·¸´Ù. Áö½Äº£À̽º¸¦ ¾î¶»°Ô Å×½ºÆ®ÇÒ °ÍÀΰ¡?

Á¦ 1 Àå¿¡¼­ ¾ð±ÞÇßµíÀÌ, ¼Ò¸ðÀûÀΠŽ»öÀº Æø¹ßÀû Ž»öÀÌ µÇ±â ¶§¹®¿¡, ¾ÆÁÖ ÀÛÀº µ¥ÀÌÅÍ ÁýÇÕ ÀÌ¿ÜÀÇ ¾î¶² °Í¿¡µµ Àû¿ëÀÌ ºÒ°¡´ÉÇÏ´Ù. ±×·¯¹Ç·Î, ´ëºÎºÐÀÇ ½Ç¼¼°è Àü¹®°¡½Ã½ºÅÛ¿¡ ´ëÇÏ¿©, Áö½Äº£À̽º°¡ Á¤È®ÇÏ´Ù´Â °ÍÀ» ¿Ïº®ÇÏ°Ô Áõ¸íÇÒ ¹æ¹ýÀº ¾ø´Ù. °¡Àå ÁÁÀº ÇØ°áÀº Áö½Äº£À̽ºÀÇ Á¤È®¼º¿¡ ´ëÇÏ¿© ¾ÆÁÖ ÀÚ½ÅÇÒ ¼ö ÀÖµµ·Ï ÃæºÐÇÑ Å×½ºÆ®¸¦ ÇÏ´Â °ÍÀÌ´Ù. Åë°èÀû Ç¥º» ±â¹ýÀ» »ç¿ëÇÏ¿©, ¿ä±¸ÇÏ´Â ¾î¶² ½Å·Ú¼öÁØ (confidence level) ÀÌµç »êÃâÇÒ ÀÏ·ÃÀÇ Å×½ºÆ®¸¦ °í¾ÈÇÒ ¼ö ÀÖ´Ù.

¶Ç´Ù¸¥ Á¢±Ù ¹æ½ÄÀ¸·Î, ÀÏ°ü¼ºÀ» À§ÇÏ¿© Áö½Äº£À̽º¿¡ ÀÖ´Â ¸ðµç Á¤º¸°¡ ±× ÀÚü¿Í ÀÏÄ¡ÇÏ´ÂÁö ¾Ë±â À§ÇÏ¿© ½Ã½ºÅÛÀ¸·Î ÇÏ¿©±Ý Á÷Á¢ üũÇÏ°Ô ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ°ÍÀº È®½ÇÈ÷ ¸ðµç ¹®Á¦¸¦ ¹ß°ßÇÏÁö´Â ¾Ê°ÚÁö¸¸, ¸î °³´Â ¹ß°ßÇÒ °ÍÀÌ´Ù. ±×·¯³ª ÀÌ ÀÚ±âüũ (self-check) ¸¦ ¾î¶»°Ô ±¸ÇöÇÏ´Â Áö¿¡ µû¶ó¼­, ¾î¶² Ä¿´Ù¶õ Áö½Äº£À̽º¿¡¼­´Â Æø¹ßÀûÀÎ 'º® (brick wall)" ¿¡ ºÎµúÄ¥ ¼öµµ ÀÖ´Ù. ±×·¡¼­ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ´Â °ÍÀÌ ºÒ°¡´ÉÇÒÁöµµ ¸ð¸¥´Ù.

±×·¯¹Ç·Î, Àü¹®°¡½Ã½ºÅÛÀ» ´õ ¸¹ÀÌ »ç¿ëÇÏ°Ô µÊ¿¡ µû¶ó, Áö½Äº£À̽º È®Áõ (verification) Àº °¡Àå Áß¿äÇÑ ¿¬±¸ºÐ¾ß ÁßÀÇ Çϳª°¡ µÉ °ÍÀÌ´Ù.