Àü¹®°¡ ½Ã½ºÅÛ
(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.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 Àå¿¡¼ ¾ð±ÞÇßµíÀÌ, Àü¹®°¡½Ã½ºÅÛÀº »ç¶÷ Àü¹®°¡ÀÇ ÇàÀ§¸¦ Èä³»³»´Â ÇÁ·Î±×·¥ÀÌ´Ù. »ç¿ëÀÚ°¡ ¾î¶² ÁÖÁ¦¿¡ °üÇÑ °ßÇØ¸¦ Ç¥ÇöÇϱâ À§ÇÏ¿© Á¦°øÇÏ´Â Á¤º¸¸¦ »ç¿ëÇÑ´Ù. ±×·¯¹Ç·Î, Àü¹®°¡½Ã½ºÅÛÀº ´ë´ä°ú ÀÏÄ¡ÇÏ´Â ´ë»óÀ» ¾Ë¾Æ³¾ ¼ö ÀÖÀ» ¶§±îÁö Áú¹®À» ÇÑ´Ù. Àü¹®°¡½Ã½ºÅÛÀÌ ¹«¾ùÀÎÁö ÀÌÇØÇϱâ À§ÇÏ¿©, °úÀÏ Àü¹®°¡¿Í Ãæ°í¸¦ ±¸ÇÏ´Â ¾î¶² »ç¶÷ »çÀÌÀÇ ´ÙÀ½ ´ëȸ¦ »ý°¢ÇØ º¸ÀÚ.
ÄÄÇ»ÅÍÈµÈ °úÀÏ Àü¹®°¡½Ã½ºÅÛÀÇ ¸ñÇ¥´Â ÀÌ ´ëȸ¦ Àç»ý»êÇÏ´Â °ÍÀÌ´Ù. ´õ ÀϹÝÀûÀ¸·Î, Àü¹®°¡½Ã½ºÅÛÀº Àü¹®±â¼úÀÇ ÁÖÁ¦¿¡ °üÇØ »ç¿ëÀÚ¿¡°Ô Ãæ°í¸¦ ÇÏ·Á°í ½ÃµµÇÑ´Ù.
Àü¹®°¡½Ã½ºÅÛÀÇ ¹Ù¶÷Á÷ÇÔÀº ÁÖ·Î À¯¿ë¼º°ú ÆíÀǼº¿¡ ±âÃÊÇÑ´Ù. ÀáÀ» ÀÚ°í, ¸Ô°í, ÇǷθ¦ Ç®°í, ½¬°í ÇÏ´Â µîÀÇ ÀÏÀ» ÇØ¾ß ÇÏ´Â »ç¶÷ Àü¹®°¡¿Í´Â ´Þ¸®, Àü¹®°¡½Ã½ºÅÛÀº ÇÏ·ç 24 ½Ã°£, ¿¬Áß ¸ÅÀÏ »ç¿ëÇϱ⿡ À¯¿ëÇÏ´Ù. ¶ÇÇÑ, »ç¶÷ Àü¹®°¡ÀÇ ¼ö´Â Á¦ÇÑ µÉ ¼ö ÀÖ´Â ¹Ý¸é, ¸¹Àº Àü¹®°¡½Ã½ºÅÛÀº ¸¸µé¾îÁú ¼ö ÀÖ´Ù. ´õ¿íÀÌ, »ç¶÷°ú´Â ´Þ¸®, ÄÄÇ»ÅÍÈµÈ Àü¹®°¡´Â Àý´ë Á×Áö ¾Ê°í Áö½ÄÀ» ÃëÇÑ´Ù. Àü¹®°¡½Ã½ºÅÛ¿¡ ÀÖ´Â Áö½ÄÀº, ½±°Ô º¹»çµÇ°í ÀúÀåµÉ ¼ö ÀÖÀ¸¹Ç·Î, Àü¹® Áö½ÄÀÇ ¿µ±¸ÀûÀÎ ¼Õ½ÇÀÌ °ÅÀÇ µå¹°´Ù.
»ç¶÷ Àü¹®°¡¿¡ ºñÇØ Àü¹®°¡½Ã½ºÅÛÀÇ ¶Ç ´Ù¸¥ ÀåÁ¡Àº, ÄÄÇ»ÅÍÈµÈ Àü¹®°¡´Â Ç×»ó ¼º´ÉÀÌ ÃÖ°íÇÏ´Â °ÍÀÌ´Ù. »ç¶÷ Àü¹®°¡°¡ ÁöÄ¥ ¶§, Àü¹®°¡ Ãæ°íÀÇ ½Å·Ú¼ºÀº »ç¶óÁú·±Áöµµ ¸ð¸¥´Ù. ±×·¯³ª ÄÄÇ»ÅÍÈµÈ Àü¹®°¡´Â Ç×»ó ÃÖ»óÀÇ °ßÇØ - ÀÚ±âÀÇ Áö½ÄÀÇ Á¦ÇÑ ¹üÀ§ ¾È¿¡¼ - ¸¦ »ý¼ºÇÒ °ÍÀÌ´Ù.
Àü¹®°¡½Ã½ºÅÛÀÇ ´ú Áß¿äÇÑ ÀåÁ¡Àº °³¼ºÀÌ ºÎÁ·ÇÏ´Ù´Â °ÍÀÌ´Ù. ¾Æ¸¶µµ ¾Ë°ÚÁö¸¸, °³¼ºÀº Ç×»ó ÀûÇÕÇÑ °ÍÀº ¾Æ´Ï´Ù. Àü¹®°¡¿Í Ä£ÇÏ°Ô Áö³»Áö ¾Ê´Â´Ù¸é, Àü¹®°¡ÀÇ Áö½ÄÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ ¸¶À½ ³»Å°Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ¹Ý´ë »óȲµµ »ý±æ¼ö ÀÖ´Ù : ÁÁ¾ÆÇÏÁö ¾Ê´Â »ç¶÷ Àü¹®°¡´Â ½Å·ÚÇÒ ¸¸ÇÑ Á¤º¸¸¦ Ç¥ÇöÇÒ ¼ö ¾øÀ» Áöµµ ¸ð¸¥´Ù. ±×·¯³ª ÄÄÇ»ÅÍÈµÈ Àü¹®°¡´Â °³¼ºÀ» °®Áö ¾Ê´Â´Ù. µû¶ó¼ ÀÌ·¯ÇÑ ¹®Á¦µéÀº Á¦°ÅµÈ´Ù.
Àü¹®°¡½Ã½ºÅÛÀÇ ¸¶Áö¸· ÀåÁ¡Àº, ÄÄÇ»ÅÍÈµÈ Àü¹®°¡°¡ Á¸ÀçÇÑ ÈÄ, ´Ü¼øÈ÷ ÇÑ ±â°è¿¡¼ ´Ù¸¥ ±â°è·Î ÇÁ·Î±×·¥À» º¹»çÇÔÀ¸·Î½á »õ·Î¿î Àü¹®°¡¸¦ ¸¸µé¾î ³¾ ¼ö ÀÖ´Ù. »ç¶÷Àº ¾î¶² ºÐ¾ß¿¡¼ Àü¹®°¡°¡ µÇ±â À§ÇÏ¿© ¿À·£ ±â°£À» ÇÊ¿ä·Î Çϴµ¥, ÀÌ°Í ¶§¹®¿¡ »ç¶÷ Àü¹®°¡¸¦ ¾ò±â°¡ Èûµé´Ù.
MYCIN À̶ó´Â Àü¹®°¡½Ã½ºÅÛÀÌ ¾ø´Ù¸é, Àü¹®°¡½Ã½ºÅÛÀº AI ¿¬±¸½Ç¿¡ ¸Ó¹°°í ¿ÜºÎ·Î ÁøÃâÇÏÁö ¸øÇßÀ»·±Áöµµ ¸ð¸¥´Ù. AI ÀÇ °¡Àå Ä¿´Ù¶õ °ü³ä ¹®Á¦µé (image problems) ÁßÀÇ Çϳª´Â, ´Ù¸¥ ÇÁ·Î±×·¡¸Ó¸¦ Æ÷ÇÔÇØ¼ ¸¹Àº »ç¶÷µéÀÌ AI ±â¹ýÀº ¾ö¹ÐÇÑ ±ÔÄ¢µé°ú °¡Á¤À» ¿ä±¸ÇÏ´Â ¹®Á¦¿¡ ´ëÇØ¼¸¸ ÀÛµ¿ÇÑ´Ù°í ¹Ï´Â °ÍÀ̾ú´Ù. ÀÌ »ç¶÷µéÀº AI ´Â °áÄÚ ¾î·Á¿î ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÏ¿© »ç¿ëµÉ ¼ö ¾ø´Ù°í ¹Ï¾ú´Ù. MYCIN Àº ±× ¸ðµÎ¸¦ º¯È½ÃÄ×´Ù.
MYCIN Àº ¼¼°è¿¡¼ ÃÖÃÊ·Î ¼º°øÇÑ Àü¹®°¡½Ã½ºÅÛÀÌ´Ù. 1970 ³â´ë Á߹ݿ¡ ½ºÅÄÆ÷µå ´ëÇп¡¼ °³¹ßµÇ¾ú´Âµ¥, Àǻ簡 ¾î¶² ¼¼±Õ¼º Áúº´À» Áø´ÜÇÏ´Â °ÍÀ» µ½±â À§ÇÏ¿© ¼³°èÇÏ¿´´Ù. º´À» Áø´ÜÇÏ´Â °ÍÀº º»ÁúÀûÀ¸·Î ȯÀÚ°¡ Á¦½ÃÇÏ´Â Áõ»ó°ú º´ÀÇ Â¡ÈÄ »çÀÌ¿¡ ÀÏÄ¡°¡ ¹ß°ßµÉ ¶§±îÁö ±× µÑÀ» ºñ±³ÇÏ´Â ÀÏÀÌ´Ù. ¹®Á¦´Â, Àǻ簡 Á¸ÀçÇÏ´Â ¸ðµç º´À» ºü¸£°í ÀÚ½ÅÀÖ°Ô Áø´ÜÇÏ´Â °ÍÀº ¾î·Æ´Ù´Â °ÍÀÌ´Ù. MYCIN Àº Áø´ÜÀ» È®½ÇÈ÷ ÇØÁÜÀ¸·Î½á ÀÌ ¿ä±¸¸¦ ¸¸Á·½ÃÄ×´Ù.
»ó¾÷ÀûÀ¸·Î »ýÁ¸°¡´ÉÇÑ Àü¹®°¡½Ã½ºÅÛÀÇ ¶Ç ´Ù¸¥ ¿¹´Â, 1978 ³â ¸®Â÷µå µà´Ù, ÇÇÅÍ, Çϵå, ±×¸®°í ·¹³× ·¹º¸¿ì°¡ ¸¸µç PROSPECTOR ÀÌ´Ù. PROSPECTOR ´Â ÁöÁúÇп¡¼ÀÇ Àü¹®°¡ÀÌ´Ù : ¾î¶² ±¤»óÀÌ ¾î¶² Ưº°ÇÑ Áö¿ª¿¡¼ ¹ß°ßµÉ¼ö ÀÖ´Â °¡´É¼ºÀ» ¿¹ÃøÇÑ´Ù. ¼®À¯, õ¿¬°¡½º, Çï·ýÀÇ ¹ß°ßÀ» ¿¹ÃøÇÏ´Â ÇÁ·Î±×·¥À» Æ÷ÇÔÇÏ¿©, ÀÌ ÇÁ·Î±×·¥À» º¯ÇüÇÑ °ÍÀÌ ¿©·µ ÀÖ´Ù.
1980 ³â´ë ÃÊ¿¡´Â ¼¼±Ý »ó´ã, º¸Çè Ãæ°í, ¹ýÀûÀÎ µµ¿òÀ» ÁÙ ¼ö ÀÖ´Â Àü¿ë Àü¹®°¡½Ã½ºÅÛµéÀÌ µµÀԵǾú´Ù. ¸¹Àº ÇÁ·Î±×·¡¸ÓµéÀº 1980 ³â´ë ¸»±îÁö, ÁýÀ̳ª »ç¹«½Ç¿¡¼ »ç¿ëµÉ ¼ö ÀÖ´Â "°³ÀÎÀÇ" Àü¹®°¡½Ã½ºÅÛÀÇ Ä¿´Ù¶õ ½ÃÀåÀÌ »ý±æ °ÍÀ̶ó°í ¹Ï´Â´Ù. ÀÌ ½Ã½ºÅÛµéÀº ¿ø¿¹ ¿¡¼ºÎÅÍ ÀÚµ¿ ¼ö¸®±îÁö ¸¹Àº ºÐ¾ß¿¡¼ Àü¹®°¡°¡ µÉ °ÍÀÌ´Ù. ½Ç»ó, Àü¹®°¡½Ã½ºÅÛÀº °³Àοë ÄÄÇ»ÅÍ¿¡¼ ¼öÇàµÇ´Â °¡Àå ÈçÇÑ À¯ÇüÀÇ ÇÁ·Î±×·¥ÀÓÀ» Áõ¸íÇÒ ¼öµµ ÀÖ´Ù.
¸ðµç Àü¹®°¡½Ã½ºÅÛÀº Áö½Äº£À̽º¿Í Ã߷бâ°üÀÇ µÎ ºÎºÐÀ» °®´Â´Ù. ÀÌ Àý¿¡¼´Â Àü¹®°¡½Ã½ºÅÛÀÌ µÎ ºÎºÐÀ» ¸ðµÎ ±¸ÇöÇÒ ¼ö ÀÖ´Â ¿©·¯ °¡Áö ¼·Î ´Ù¸¥ ¹æ¹ýµéÀ» ¼³¸íÇÑ´Ù.
Áö½Äº£À̽º´Â ¾î¶² ÁÖÁ¦¿¡ ´ëÇÏ¿© ƯÁ¤ÇÑ Á¤º¸¿Í ±ÔÄ¢À» °®´Â µ¥ÀÌÅͺ£À̽ºÀÌ´Ù. ÀÌ ¼³¸íÀ» À§ÇØ, ¾Ë¾Æ¾ß ÇÏ´Â µÎ °¡Áö ¿ë¾î°¡ ÀÖ´Ù :
±×·¯¹Ç·Î, Áö½Äº£À̽º¸¦ ´ë»ó »çÀÌÀÇ °ü·Ã ±ÔÄ¢°ú ¼Ó¼ºÀ» °®´Â ÀÏ·ÃÀÇ ´ë»óÀ¸·Î »ý°¢Çغ¸ÀÚ. °¡Àå °£´ÜÇÑ Àǹ̿¡¼ (±×¸®°í, ¸¹Àº ÀÀ¿ëÀ» À§ÇÏ¿©), ¼Ó¼º¿¡ Àû¿ëµÇ´Â ±ÔÄ¢Àº, ´ë»óÀÌ ±× ¼Ó¼ºÀ» "°®´Â´Ù (has)" ¶Ç´Â "°®Áö ¾Ê´Â´Ù (has not)" ¶ó´Â °ÍÀ» ¸»ÇØÁØ´Ù. ±×·¯¹Ç·Î, ´ë»óÀÌ ¼ÒÀ¯Çϰųª ¼ÒÀ¯ÇÏÁö ¾Ê´Â ÀÏ·ÃÀÇ ¼Ó¼ºÀ» »ç¿ëÇÏ¿© ´ë»óÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ¿©·¯ °¡Áö À¯ÇüÀÇ °úÀÏÀ» ³ªÅ¸³»ÁÖ´Â Àü¹®°¡½Ã½ºÅÛÀº ´ÙÀ½°ú °°Àº Áö½Äº£À̽º¸¦ °¡Áú °ÍÀÌ´Ù.
´ë»ó |
±ÔÄ¢ |
¼Ó¼º |
»ç°ú |
°®´Â´Ù °®´Â´Ù °®Áö ¾Ê´Â´Ù °®´Â´Ù |
³ª¹«¿¡¼ ÀÚ¶õ´Ù µÕ±Ù ¸ð¾çÀÌ´Ù ¾ÆÁÖ ³²ÂÊ¿¡¼ ÀÚ¶õ´Ù »¡°£»öÀ̳ª ³ë¶õ»öÀÌ´Ù |
Æ÷µµ |
°®´Â´Ù °®´Â´Ù °®´Â´Ù °®Áö ¾Ê´Â´Ù °®´Â´Ù |
µ¢±¼¿¡¼ ÀÚ¶õ´Ù ÀÛÀº Å©±âÀÌ´Ù ÀÚÁÖ»öÀÌ´Ù °¡½ÃÀÖ´Â µ¢±¼ÀÌ´Ù Æ÷µµÁÖ¸¦ ¸¸µé ¼ö ÀÖ´Ù |
±Ö |
°®´Â´Ù °®´Â´Ù °®Áö ¾Ê´Â´Ù °®´Â´Ù |
³ª¹«¿¡¼ ÀÚ¶õ´Ù µÕ±Ù ¸ð¾çÀÌ´Ù ºÏºÎ¿¡¼ ÀÚ¶õ´Ù ¿À·»Áö»öÀÌ´Ù |
ÀÌ Áö½Äº£À̽º¿¡ ´ëÇÏ¿© »ý°¢ÇØ º¸¸é, °£´ÜÇØÁú ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ´Ü ÇѰ¡Áö ±ÔÄ¢ - "°®´Â´Ù" - ¸¸ »ç¿ëÇÒ ¼ö ÀÖ°í, "°®Áö ¾Ê´Â´Ù" °ü°è¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù¸é ±× ¼Ó¼ºÀÇ ºÎÁ¤ÇüÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î, ±ÔÄ¢Àº ´Ü¼øÈ÷ "¼ÒÀ¯ÇÑ´Ù (possesses)" °¡ µÇ°í, °£´ÜÇØÁø Áö½Äº£À̽º´Â ´ÙÀ½°ú °°´Ù :
´ë»ó |
¼ÒÀ¯ |
»ç°ú |
³ª¹«¿¡¼ ÀÚ¶õ´Ù µÕ±Ù ¸ð¾çÀÌ´Ù ¾ÆÁÖ ³²ºÎ¿¡¼ ÀÚ¶óÁö ¾Ê´Â´Ù »¡°£»öÀ̳ª ³ë¶õ»öÀÌ´Ù |
Æ÷µµ |
µ¢±¼¿¡¼ ÀÚ¶õ´Ù ÀÛÀº Å©±âÀÌ´Ù »öÀÌ °¡Áö°¢»öÀÌ´Ù µ¢±¼¿¡´Â °¡½Ã°¡ ¾ø´Ù Æ÷µµÁÖ¸¦ ¸¸µé±â À§ÇØ »ç¿ëµÉ¼ö ÀÖ´Ù. |
±Ö |
³ª¹«¿¡¼ ÀÚ¶õ´Ù µÕ±Ù ¸ð¾çÀÌ´Ù ºÏºÎ¿¡¼ ÀÚ¶ö¼ö ÀÖ´Ù ¿À·»Áö»öÀÌ´Ù |
ºñ·Ï ¾î¶² º¹ÀâÇÑ Àü¹®°¡½Ã½ºÅÛÀº ´Ü¼øÈ÷ "¼ÒÀ¯ÇÑ´Ù" º¸´Ù ´õ º¹ÀâÇÑ ±ÔÄ¢À» ÇÊ¿ä·Î ÇÒÁöµµ ¸ð¸£Áö¸¸, ÀÌ ±ÔÄ¢Àº ¸¹Àº »óȲ¿¡ ´ëÇÏ¿© ÃæºÐÇϰí Áö½Äº£À̽º¸¦ Å©°Ô °£·«È½ÃŲ´Ù. ÀÌ Ã¥ÀÇ ³ª¸ÓÁö¿¡¼´Â Áö½Äº£À̽º°¡ ´ë»ó°ú ¼Ó¼ºÀ¸·Î¸¸ ÀÌ·ç¾îÁ³´Ù°í °¡Á¤ÇÑ´Ù.
Ã߷бâ°üÀº ÀÏÄ¡ÇÏ´Â ´ë»óÀ» ã±â À§ÇÏ¿© Á¦°øÇÏ´Â Á¤º¸¸¦ »ç¿ëÇÏ·Á°í ½ÃµµÇÏ´Â Àü¹®°¡½Ã½ºÅÛÀÇ ÀϺκÐÀÌ´Ù. Ã߷бâ°üÀÇ µÎ°¡Áö ³ÐÀº ºÎ·ù°¡ ÀÖ´Ù ; °áÁ¤Àû (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) À̱⠶§¹®¿¡ ÀûÀýÇÑ Á¤º¸¸¸ÀÌ ½Ã½ºÅÛ¿¡ ÀÔ·ÂµÇ°Ô ÇÑ´Ù. ÈÄÁø¿¬¼â ½Ã½ºÅÛÀº ´Ü ÇϳªÀÇ ´ë»ó¸¸À» ¿øÇÒ ¶§ ÁÁ´Ù - ºñ·Ï ´Ù¸¥ ´ë»óµéµµ ±× ¼Ó¼ºÀ» ¸¸Á·ÇÑ´Ù°í ÇÏ´õ¶óµµ ÁÁ´Ù. º¹¼öÇØ¸¦ ¹ß°ßÇÏ´Â ÈÄÁø¿¬¼â Àü¹®°¡½Ã½ºÅÛÀ» ¸¸µé ¼ö ÀÖ´Ù. ÇÏÁö¸¸ ÀüÁø¿¬¼â Àü¹®°¡½Ã½ºÅÛÀ» ±¸¼ºÇÏ´Â °Íº¸´Ù ¾à°£ ´õ ¸¹Àº ÀÏÀ» ¿ä±¸ÇÑ´Ù.
ÃÖÁ¾ÀûÀÎ ºÐ¼®¿¡¼, »ç¿ëÇÏ·Á´Â ½ÇÁ¦ Á¢±Ù¹æ½ÄÀº °¢ÀÚ¿¡°Ô ´Þ·ÁÀÖ´Ù. ±×·¯³ª, ¸ðµç °ÍÀÌ °°À¸¸é, ÈÄÁø¿¬¼â ¹æ¹ýÀº ±¸ÇöÇϱⰡ ´õ ½¬¿ì¹Ç·Î, ±â´ëÇÒ °ÍÀ¸·Î »ý°¢ÇÏ´Â ¹æ¹ýÀÎ µíÇÑ Àü¹®°¡½Ã½ºÅÛÀ» »ý¼ºÇÑ´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯ ¶§¹®¿¡, ÀÌ Àå¿¡¼´Â ÈÄÁø¿¬¼â¸¦ »ç¿ëÇÏ´Â Àü¹®°¡½Ã½ºÅÛÀ» °³¹ßÇÑ´Ù.
ÀÌÁ¦ Àü¹®°¡½Ã½ºÅÛ¿¡ ÇÊ¿äÇÑ ¹è°æÀ» °®°í ÀÖÀ¸¹Ç·Î, ½ÇÁ¦ Àü¹®°¡½Ã½ºÅÛÀÌ ¾î¶²°¡¸¦ º¼ Áغñ°¡ µÇ¾îÀÖ´Ù. ÀÌ Àý¿¡¼´Â ÈÄÁø ¿¬¼â¸¦ »ç¿ëÇÏ´Â ¸¸´É Àü¹®°¡½Ã½ºÅÛÀ» ¸¸µç´Ù. ¿©·¯ °¡Áö ´Ù¸¥ Áö½Äº£À̽ºµéÀ» °¡Áö°í °°Àº Ãß·Ð ±â°üÀ» »ç¿ëÇÒ¼ö ÀÖ°Ô Çϱ⠶§¹®¿¡ ¸¸´ÉÀ̶ó°í ºÎ¸¥´Ù. ¶ÇÇÑ Áö½Äº£À̽º¸¦ ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ·çƾµéÀ» Æ÷ÇÔÇÑ´Ù. ±×·¯³ª ½ÃÀÛÇϱâ Àü¿¡, Àü¹®°¡½Ã½ºÅÛÀÌ ±¸ÇöµÇ´Â ¹æ¹ý¿¡ ´ëÇÏ¿© °¡Áú ¼ö ÀÖ´Â ¸î °¡Áö ¼±ÀÔ°ßÀ» ¹ö¸®´Â °ÍÀÌ Áß¿äÇÏ´Ù.
ºÒÇàÇÏÁö¸¸ ¶Ç ÀÌÇØ°¡ °¡´Â »ç½ÇÀº, »ç½Ç»ó AI ¿¡ °üÇÑ ¸ðµç ¼Ò°³ Ã¥µéÀº °£´ÜÇÑ µ¿¹° Àü¹®°¡½Ã½ºÅÛÀ» ¿¹·Î »ç¿ëÇÑ´Ù´Â °ÍÀÌ´Ù. ¶§¶§·Î, ¼Ò°³ÀûÀΠåÀº ±×°ÍÀ» ´Ù¸¥ °ÍÀ¸·Î ºÎ¸¦ ¼öµµ ÀÖÁö¸¸, °ÅÀÇ °°Àº ¹æ¹ýÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ºñ·Ï ÀÌ °£´ÜÇÑ Àü¹®°¡½Ã½ºÅÛÀÌ Àü¹®°¡½Ã½ºÅÛÀÇ ¿©·¯ ¸éÀ» ¼³¸íÇÏ´Â (±×¸®°í »ó»ó·ÂÀ» ÀÚ±ØÇÏ´Â) ¿ªÇÒÀ» ÇÏÁö¸¸, Àü¹®°¡½Ã½ºÅÛÀ» ±¸ÇöÇÏ´Â µ¥¿¡ ¿ÇÁö ¸øÇÑ ¹æ¹ýÀ» Á¦½ÃÇÑ´Ù. Ã߷бâ°ü¿¡ ´ë»ó°ú ¼Ó¼ºÀÌ È¥ÇյǾî ÀÖ´Ù : À̰ÍÀº Áö½Äº£À̽º°¡ ÇÁ·Î±×·¥À¸·Î ÄÚµåÈµÇ±â ¾î·Æ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. À̰ÍÀº ¿©·¯ °¡Áö ÀÌÀ¯ ¶§¹®¿¡ ³ª»Û ÇÁ·Î±×·¡¹Ö ±â¹ýÀÌ´Ù. °¡Àå ³ª»Û ÀÌÀ¯ ÁßÀÇ Çϳª´Â, Áö½Äº£À̽º¸¦ º¯°æÇϰí ÁúÀ» ³ôÀ̰ųª È®ÀåÇÏ´Â °ÍÀº ÇÁ·Î±×·¥ ÄÚµå·ÎÀÇ º¯°æ-±×¸®°í ÀçÄÄÆÄÀÏÀ» ÀǹÌÇÏ´Â °ÍÀÌ´Ù. ÀÌ º¯°æÀº ¿ì¹ßÀûÀÎ ÄÄÆÄÀÏ ¿¡·¯¿¡¼ºÎÅÍ Àͼ÷Ä¡ ¸øÇÑ ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇÑ ½ÇÁ¦ ÄÚµåÀÇ ´Ùº¯¼º±îÁöÀÇ ¹üÀ§¿¡ À̸£´Â ¸ðµç Á¾·ùÀÇ °ñÄ¡°Å¸®·Î ³ëÃâµÈ´Ù. Áö½Äº£À̽º¸¦ ÇÁ·Î±×·¥À¸·Î ¾î·Æ°Ô ÄÚµùÇÏ´Â °ÍÀÌ ³ª»Û ÇÁ·Î±×·¡¹Ö ±â¹ýÀ̶ó´Â ¶Ç´Ù¸¥ ÀÌÀ¯´Â, Áö½Äº£À̽º·ÎÀÇ ½ÇÁö º¯È´Â »ç¿ëÀÚ°¡ ÇÁ·Î±×·¥À» º¯È½Ãų °ÍÀ» ¿ä±¸ÇÒ °ÍÀε¥ À̰ÍÀº ÀÚÁ¸½É ÀÖ´Â ¾î¶² ÇÁ·Î±×·¡¸Óµµ ¿øÇÏÁö ¾Ê´Â ÀÏÀÏ °ÍÀÌ´Ù. ¶Ç, ÀÌ·¸°Ô µÇ¸é »ç¿ëÀÚ°¡ ¿ø½Ã Äڵ带 ÇÊ¿ä·Î ÇÑ´Ù´Â ÀǹÌÀε¥ À̰ÍÀº ¾î¶² »ó¾÷ ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚµµ Çã¿ëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.
ÀÌ ¼³¸í¿¡¼ º¸¿©ÁÖµíÀÌ, Áö½Äº£À̽º´Â Ã߷бâ°ü°ú ºÐ¸®µÇ¾î¾ß ÇÑ´Ù. ÀÌ·± ¹æ½ÄÀ¸·Î ¸¸ÀÌ Çö¸íÇÑ ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚµéÀº Áø½Ç·Î ÀÛµ¿ÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛÀ» ¸¸µé ¼ö ÀÖ´Ù. À̰ÍÀÌ ¹Ù·Î ¸ðµç »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛÀÇ ±¸Á¶À̰í ÀÌ Àå¿¡ ÀÖ´Â Àü¹®°¡½Ã½ºÅÛÀÇ ±¸Á¶ÀÌ´Ù.
Àü¹®°¡½Ã½ºÅÛ ÇÁ·Î±×·¥ ÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» º¸±â Àü¿¡, ÀÌ Àý¿¡¼´Â Ã߷бâ°üÀ» ¸¸µé±â À§ÇÑ °ÍµéÀ» ½ÇÁ¦ ¿ë¾î·Î Á¤ÀÇÇÑ´Ù. ÀÌ Àý¿¡¼´Â Áö½Äº£À̽º°¡ ´ÜÁö ´ë»ó°ú ±× ¼Ó¼ºµé·Î¸¸ ±¸¼ºµÉ °ÍÀ̶ó°í °¡Á¤ÇÑ´Ù. Ã߷бâ°üÀÌ ¹«¾ùÀ» ÇÒ¼ö ÀÖ¾î¾ß ÇÏ´ÂÁö ÀÌÇØÇϱâ À§Çؼ, ´ÙÀ½ÀÇ ÀÛÀº Áö½Äº£À̽º¸¦ »ç¿ëÇØº¸ÀÚ :
´ë»ó |
¼Ó¼º |
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 ¸¦ °®´Â Áö½Äº£À̽º°¡ ÁÖ¾îÁ³À» ¶§ ´ÙÀ½ ´ëȸ¦ »ý¼ºÇÏ´Â Ã߷бâ°üÀÌ´Ù.
ÀÌ·± À¯ÇüÀÇ Ã߷бâ°üÀ» ¸ñÇ¥·Î Çϸé Ã߷бâ°üÀÌ °®Ãß¾î¾ß ÇÒ ½Ã¹æÀº ´ÙÀ½°ú °°´Ù :
1. Àü¹®°¡½Ã½ºÅÛÀº °°Àº ¼Ó¼º¿¡ ´ëÇÏ¿© µÎ ¹ø Áú¹®À» ÇØ¼´Â ¾ÈµÈ´Ù.
2. Àü¹®°¡½Ã½ºÅÛÀº, Áï½Ã °ÅÀýÇØ¾ß Çϰí, ÀÌ¹Ì ¾Ë·ÁÁø ÇÊ¿äÇÑ ¼Ó¼ºµéÁß Çϳª ÀÌ»ó °®Áö ¾Ê´Â, ¶Ç´Â ÀÌ¹Ì °ÅÀýµÈ ¼Ó¼ºÀ» °®´Â ¸ðµç ´ë»óÀ» ±×³É ³Ñ¾î°¡¾ß ÇÑ´Ù.
3. ¸í·É¿¡ ´ëÇÏ¿©, Àü¹®°¡½Ã½ºÅÛÀº ¿Ö ±× Ãß·ÐÀ» µû¸£°í ÀÖ´ÂÁö º¸°íÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
¼¼ ¹øÂ° Á¦ÇÑÁ¶°ÇÀº Àü¹®°¡½Ã½ºÅÛÀÌ ¿Ã¹Ù·Î µ¿ÀÛÇϰí ÀÖ´Ù´Â °ÍÀ» Áõ¸íÇÏ´Â ¹æ¹ýÀÏ »Ó ¾Æ´Ï¶ó »ç¿ëÀÚ¸¦ ±³À°½ÃŰ´Â ¹æ¹ýÀ̱⵵ ÇÏ´Ù.
Àü¹®°¡½Ã½ºÅÛÀ» ¸¸µé ¶§, ù ´Ü°è´Â Áö½Äº£À̽ºÀÇ ±¸Á¶¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. Áö½Äº£À̽º¿¡ ÀÖ´Â °¢ ¿£Æ®¸®´Â ´ë»óÀÇ À̸§°ú ÀÏ·ÃÀÇ ¼Ó¼ºµé·Î ±¸¼ºµÇ¾î¾ß ÇÑ´Ù. ´ë»óÀ» Æ÷ÇÔÇÏ´Â ºÎºÐÀ» ±¸¼ºÇÏ´Â °¡Àå ½¬¿î ¹æ¹ý ÁßÀÇ Çϳª´Â ´ÙÀ½ ±¸Á¶¸¦ °®´Â ¹è¿À» »ç¿ëÇÏ´Â °ÍÀÌ´Ù (¿¬°á ¸®½ºÆ®³ª Æ®¸®¸¦ »ç¿ëÇÒ ¼öµµ ÀÖÁö¸¸).
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; |
½ÇÁ¦·Î Ã߷бâ°üÀ» °³¹ßÇϱâ Àü¿¡, Áö½Äº£À̽º¿¡ Á¤º¸¸¦ ³ÖÀ» ·çƾÀ» ¸¸µé¾î¾ß ÇÑ´Ù. º¸Åë »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛ¿¡¼Ã³·³ º°µµÀÇ ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸, °£´ÜÈ÷ Çϱâ À§ÇØ, »ç¿ëÀÚ·Î ÇÏ¿©±Ý ½Ã½ºÅÛ¿¡ Á¤º¸¸¦ ÀÔ·ÂÇÏ°Ô ÇÏ´Â ·çƾµéÀº, ¿©±â¼ °³¹ßµÈ Àü¹®°¡½Ã½ºÅÛ¿¡ ±¸ÃàµÈ ¼±Åà »çÇ×ÀÏ °ÍÀÌ´Ù. ´ÙÀ½¿¡¼ º¸µíÀÌ, 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'; } } |
ÀÌÁ¦ Á¤º¸¸¦ Áö½Äº£À̽º¿¡ ·ÎµåÇÒ ¼ö ÀÖ°Ô µÇ¾úÀ¸¹Ç·Î, Ã߷бâ°üÀº µµÀüÇØº¼ Áغñ°¡ µÇ¾îÀÖ´Ù. Ã߷бâ°üÀº Àü¹®°¡½Ã½ºÅÛÀÇ ÃßÁø·ÂÀÌ´Ù. ºñ·Ï Ãß»óÀûÀÎ Àǹ̿¡¼´Â ¾ÆÁÖ °£´ÜÇÏÁö¸¸, Ã߷бâ°üÀ» ±¸ÇöÇÏ´Â °ÍÀº ¾î·Á¿ï ¼öµµ ÀÖ´Ù. ¿©±â¼ °³¹ßµÈ Ã߷бâ°üÀº ¾ÆÁÖ °£´ÜÇÏÁö¸¸, ½ÇÁ¦·Î ¸¹Àº ¾÷¹«¿¡ À¯¿ëÇÏ´Ù. »ó¾÷Àû Àü¹®°¡½Ã½ºÅÛÀº ÀϹÝÀûÀ¸·Î ÀÌ Àü¹®°¡½Ã½ºÅÛ¿¡ ºÎ°úÇÏ´Â °Íº¸´Ù ´õ ¸¹Àº Á¦¾àÁ¶°Ç°ú ¿ä±¸»çÇ×À» °®´Â´Ù´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. ±×·¯³ª, ¿©±â¿¡¼ °³¹ßÇÑ Ã߷бâ°üÀº ´õ ¹ßÀüµÈ ½Ã½ºÅÛÀ» À§ÇÑ ½ÃÀÛÁ¡ ¿ªÇÒÀº ÃæºÐÈ÷ ÇÒ ¼ö ÀÖ´Ù.
Ã߷бâ°üÀÇ ¸Ç À ¼öÁØ ÇÔ¼ö´Â ´ÙÀ½¿¡ ÀÖ´Â 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 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 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 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 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; } |
ÀÌÁ¦ Àü¹®°¡½Ã½ºÅÛÀ» ÄÄÇ»ÅÍ¿¡ ³Ö¾úÀ¸¹Ç·Î, ±×°ÍÀ» ¼öÇàÇÏ°í ´ÙÀ½ Á¤º¸¸¦ Áö½Äº£À̽º¿¡ ³Ö´Â´Ù.
´ë »ó |
¼Ó ¼º |
»ç°ú (Apple) ±Ö (Orange) Æ÷µµ (Grape) ³ª¹«µþ±â (Raspberry) ¹è (Pear) ¼ö¹Ú (Watermelon) ü¸® (Cherry) źÁ¦¸° (Tangerine) |
µÕ±Û°í, »¡°²°Å³ª ³ë¶þ°í, ³ª¹«¿¡¼ ÀÚ¶÷ µÕ±Û°í, ³ª¹«¿¡¼ ÀÚ¶ó°í, ¿À·»Áö»ö °¡½Ã°¡ ¾ø°í, ³ÕÄð¿¡¼ ÀÚ¶ó°í, ÀÚÁÖ»ö °¡½Ã°¡ ÀÖ°í, »¡°²°í, Áٱ⿡¼ ÀÚ¶÷ µÕ±ÛÁö ¾Ê°í, »¡°²°Å³ª ³ì»öÀ̰í, ³ª¹«¿¡¼ ÀÚ¶÷ Å©°í, ³ì»öÀ̰í, °¡½Ã°¡ ¾ø°í, ³ÕÄð¿¡¼ ÀÚ¶÷ ÀÛ°í, ³ª¹«¿¡¼ ÀÚ¶ó°í, »¡°²°Å³ª ³ë¶õ»ö ¿À·»Áö ³ª¹«¿¡¼ ÀÚ¶ó°í, µÕ±Û°í, Ç¥¸éÀÌ ¸Å²ô·¯¿ò |
Áö½ÄÀÌ ÁغñµÈ ½Ã½ºÅÛÀ» °¡Áö°í, ´Ù¸¥ À¯ÇüÀÇ °úÀÏÀ» ¾Ë¾Æ³»±â À§ÇÏ¿© »ç¿ëÇÑ´Ù. ´ÙÀ½¿¡ ¿À´Â ¼¼°¡Áö ´ëȰ¡ ÀÌ ½Ã½ºÅÛÀ» »ç¿ëÇÏ¿© »êÃâµÇ¾ú´Ù.
is/has/does it round y is/has/does it red or yellow n is/has/does it grow on trees y is/has/does it orange y it is orange |
is/has/does it round n is/has/does it not thorns y is/has/does it grow on vines y is/has/does it purple n is/has/does it large y is/has/does it green y it is watermelon |
is/has/does it round n is/has/does it no thorns y is/has/does it grow on vines y is/has/does it purple n is/has/does it large y is/has/does it green w
Trying watermelon: it is/has/does: grow on vines no thorns it is/has/does not: round purple
is/has/does it green y it is watermelon |
¼¼ ¹øÂ° ´ëÈ¿¡¼ why ¸í·É »ç¿ëÀ» ´«¿©°Ü º¸±â ¹Ù¶õ´Ù. ½Ã½ºÅÛÀ» °¡Áö°í ½ÇÇèÇØº¸±â ¹Ù¶õ´Ù ; ÀÛµ¿À» ÀÌÇØÇϰí È®½ÅµÇ¸é °ð ´ÙÀ½ Àý·Î ÁøÇàÇØ¾ß ÇÑ´Ù.
Áö½Äº£À̽º¸¦ °ËÅäÇØº¸¸é, źÁ¦¸£°¡ Ç¥¸éÀÌ ºÎµå·´´Ù´Â ºÎ°¡ÀûÀÎ ¼Ó¼ºÀ» °®´Â °ÍÀ» Á¦¿ÜÇÏ°í ¿À·»Áö¿Í źÁ¦¸£ÀÇ Á¤Àǰ¡ µ¿ÀÏÇÑ °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù. ±×·¯¹Ç·Î, »ç¿ëÀÚ¿¡°Ô ºñ·Ï źÁ¦¸£°¡ ÀÖÁö¸¸, ÁÖ¾îÁø °Í°ú °°Àº Àü¹®°¡½Ã½ºÅÛÀº Ç×»ó ¿À·»Áö¸¦ º¸°íÇÒ °ÍÀÌ´Ù. ¿Ö³ÄÇϸé źÁ¦¸£ÀÇ Ã³À½ ¼¼°¡Áö ¼Ó¼º°ú ÀÏÄ¡Çϱ⠶§¹®ÀÌ´Ù. ÀÌ ´äÀº ¾î¶² »óȲ¿¡¼´Â ¹Þ¾ÆµéÀÏ ¼ö ÀÖÁö¸¸, ´ëºÎºÐ ¿ÏÀüÇÑ ÇØ¸¦ ã´Â °ÍÀÌ Áß¿äÇÒ °ÍÀÌ´Ù.
ÀÌÁ¦ ¸ðµç ÇØ¸¦ ãµµ·Ï ÀÌ ½Ã½ºÅÛÀ» º¯°æÇÒ ¹æ¹ýÀ» ¿¬±¸ÇØ º¸ÀÚ. ½Ã½ºÅÛÀÌ º¹¼öÇØ¸¦ ãÀ» ¼ö ÀÖµµ·Ï 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 |
ºñ½ÁÇÑ Á¤ÀǸ¦ °®´Â »õ·Î¿î °úÀÏÀ» °¡Áö°í ½ÇÇèÇÏ·Á°í ½ÃµµÇϱ⠿øÇÒÁöµµ ¸ð¸¥´Ù. À̿Ͱ°ÀÌ, ÇÁ·Î±×·¥Àº ¶§¶§·Î ¾ÆÁÖ ¿µ¸®ÇØ º¸ÀδÙ.
Á» ´õ ³ë·ÂÇϸé, ½Ã½ºÅÛÀÌ 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 |
º¸´Â ¹Ù¿Í °°ÀÌ, ÀÌ ´ëÈ´Â ½Ã½ºÅÛÀÌ ¿©·¯ ´ë»óµéÀ» ¿Ö °ÅÀýÇß´ÂÁö ¼³¸íÇØ Áֱ⠶§¹®¿¡ »ç¿ëÀÚ¿¡°Ô »ó´çÈ÷ ¸¹Àº Á¤º¸¸¦ Àü´ÞÇØ ÁØ´Ù. Å« Áö½Äº£À̽º¸¦ °¡Áö°í, ¸¹Àº °ÅÀý (½Ã½ºÅÛÀÇ ÇöÀç »óÅÂ¿Í °ü°è¾ø´Â ¸¹Àº °Íµé) À» µð½ºÇ÷¹ÀÌ ÇÏ´Â °ÍÀ» ¸·À» ¹æ¹ýÀ» ã´Â °ÍÀÌ ÇÊ¿äÇÒ ¼öµµ ÀÖ´Ù. ÀÌ·± °³¼±Àº ½º½º·Î ÇØº¸±â ¹Ù¶õ´Ù ; ±×·¯³ª, ÈùÆ®·Î¼, Áö½Äº£À̽º´Â ¶ÇÇÑ ½Ã½ºÅÛÀÌ ÇöÀçÀÇ °¡¼³¿¡ °ü·ÃµÈ °ÅÀýµÈ ´ë»óµé¸¸ µð½ºÇ÷¹ÀÌÇϵµ·Ï ¾î¶² °ü°è¸¦ µ¿¹ÝÇÒ °ÍÀ» ¿ä±¸ÇÒ °ÍÀÌ´Ù.
ÀÌ Àå¿¡¼ °³¹ßµÈ Àü¹®°¡½Ã½ºÅÛÀº Áö½Äº£À̽º¿¡ Àִ ù ¹øÂ° ¿£Æ®¸®¸¦ °®°í Ž»öÀ» ½ÃÀÛÇÑ´Ù. ±×¸®°í ´Ü¼øÈ÷ ´ë»óµéÀÇ ¸®½ºÆ®¸¦ µû¶ó ¼ø¼´ë·Î ÁøÇàÇÑ´Ù. ÀÌ °úÁ¤Àº ´ë»óÀÌ ÀûÀº °æ¿ì¿¡´Â ÁÁÁö¸¸, ´õ Å« Áö½Äº£À̽º¸¦ »ç¿ëÇÒ ¶§ ¹®Á¦¸¦ ÀÏÀ¸Å³ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, ¹¦»çÇÏ´Â °ÍÀÌ ¼ýÀÚ 999 ·Î Ç¥ÇöÇÑ Ãµ°³ÀÇ ´ë»óÀÌ ÀÖ°í °øÅëµÈ ¼Ó¼ºÀÌ ÀÖÀ¸¸é, ã´Âµ¥¿¡ ¿À·£ ½Ã°£ÀÌ °É¸± ¼öµµ ÀÖ´Ù. ´Ù¸¥ ¹®Á¦µµ ÀÖ°ÚÁö¸¸ ÀÌ·± Á¾·ùÀÇ ¹®Á¦¸¦ ÇØ°áÇÏ·Á°í Çϸé Áö½Ä°øÇÐÀ̶ó´Â ºÐ¾ß°¡ ÇÊ¿äÇÏ´Ù.
Áö½Ä°øÇÐÀº Áö½Äº£À̽º°¡ Á¶Á÷µÇ°í, ±¸¼ºµÇ°í, È®ÁõµÇ´Â ¹æ¹ýÀ» ´Ù·ç´Â ºÐ¾ßÀÌ´Ù. ÀÌ ÁÖÁ¦¿¡ ´ëÇÏ¿© ÃæºÐÈ÷ ¼³¸íÇÏ´Â °ÍÀº ÀÌ Ã¥ÀÇ ¹üÀ§¸¦ ³Ñ¾î¼Áö¸¸, Áö½Äº£À̽º¸¦ ±¸ÃàÇÏ·Á¸é ¿©·¯ °¡Áö ¾î·Á¿ò¿¡ ºÀÂøÇÑ´Ù´Â Á¡Àº ¾Ë¾Æ¾ß ÇÑ´Ù. Áö½Ä°øÇÐ ºÐ¾ß´Â ¿ª»ç°¡ ¾ÆÁÖ Âª°í, ¿¬±¸µÉ °ÍÀÌ ¸¹´Ù´Â °ÍÀ» ¸í½ÉÇÏÀÚ.
¾Õ¿¡¼ ¸»ÇßµíÀÌ, ÀÌ Àå¿¡¼ °³¹ßµÈ Àü¹®°¡½Ã½ºÅÛÀº Áö½Äº£À̽ºÀÇ ±âÃÊ¿¡¼ ½ÃÀÛÇÏ¿©, Àüü¸¦ ¼øÂ÷ÀûÀ¸·Î ÁøÇàÇÏ¿´´Ù. ÈÞ¸®½ºÆ½¸¸ Ãß°¡µÇ¸é, À̰ÍÀº Ã߷бâ°ü¿¡¼ ±â´ëÇÏ´Â °¡Àå ÁÁÀº °á°ú°¡ µÉ °ÍÀÌ´Ù. ±×·¯³ª, Áö½Äº£À̽º¸¦ ¸¸µå´Â »ç¶÷À¸·Î¼, Áö½Äº£À̽ºÀÇ ±¸¼ºµµ Á¦¾îÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ÇÏ¸é ´õ ÁÁ¾ÆÁö±âµµ ´õ ³ªºüÁö±âµµ ÇÒ °ÍÀÌ´Ù.
¾î¶² °æ¿ì¿¡´Â, Á¤º¸¸¦ ±¸¼ºÇÏ´Â ÁÁÀº ¹æ¹ýÀ¸·Î °¡Àå °¡´É¼ºÀÌ ¸¹Àº ´ë»óµéÀ» ¸Ç À§¿¡ ³õ°í, °¡Àå °¡´É¼ºÀÌ ÀûÀº ´ë»óµéÀ» ¾Æ·¡ ºÎºÐ¿¡ ³õ´Â´Ù. ¹®Á¦´Â ¾î´À ´ë»óÀÌ °¡´É¼ºÀÌ ³ô°í ¾î´À °ÍÀÌ °¡´É¼ºÀÌ ÀûÀºÁö¸¦ °áÁ¤ÇÏ´Â °ÍÀÌ´Ù. »ç¶÷ Àü¹®°¡Á¶Â÷µµ ¾î´À ÇØ°¡ °¡Àå °¡´É¼ºÀÌ ³ôÀºÁö ¸ð¸¦ ¼ö ÀÖ´Ù. ¶§¶§·Î, Áö½Äº£À̽º¸¦ ÀÓÀÇ·Î ¸¸µé¾î¼, ½Ã½ºÅÛÀÌ °¢ ´ë»óÀ» ¼±ÅÃÇϴ Ƚ¼ö¸¦ ±â·ÏÇÏ´Â µ¿¾ÈÀÇ ÂªÀº ±â°£¸¸ »ç¿ëÇÏ´Â ¼öµµ ÀÖ´Ù. ÀÌ·± ºóµµ¼ö¸¦ »ç¿ëÇϸé Áö½Äº£À̽º¸¦ ´Ù½Ã ¹è¿ÇÒ ¼ö ÀÖ´Ù.
Áö½Äº£À̽º¸¦ ±¸¼ºÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀº Áö½Äº£À̽ºÀÇ ÀºÎºÐ¿¡ "Æ®¸®" ÀÇ °¡Àå Å« ºÎºÐÀÌ À߸®°Ô ÇÏ´Â ±×·± ¼Ó¼ºµéÀ» ³õ´Â °ÍÀÌ´Ù. Å« Áö½Äº£À̽º¿¡ ´ëÇØ¼, ¾î´Â ¼Ó¼ºÀÌ °¡Àå Å« È¿°ú¸¦ °®´ÂÁö °áÁ¤ÇÏ´Â °ÍÀº ¾î·Æ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
ÀÌ Àå Àüü¿¡¼ »ç¶÷ Àü¹®°¡¸¦ ãÀ» ¼ö ÀÖ°í, ±× Àü¹®°¡ÀÇ Áö½ÄÀ» ½±°Ô »©³¾ ¼ö ÀÖ´Ù°í °¡Á¤Çß´Ù. ºÒÇàÈ÷µµ, ±×·± °æ¿ì´Â °ÅÀÇ ¾ø´Ù. ¸ÕÀú, ´©°¡ ÁøÂ¥ Àü¹®°¡ÀÌ°í ¾Æ´ÑÁö °áÁ¤ÇÏ´Â °ÍÀº ²Ï³ª ¾î·Æ´Ù. ƯÈ÷ ±× ÁÖÁ¦¿¡ ´ëÇÏ¿© °ÅÀÇ ¸ð¸¦ ¶§ ¹®Á¦°¡ µÈ´Ù. µÎ ¹øÂ°·Î, °°Àº ´ë»ó¿¡ ´ëÇÏ¿© µÎ ¸íÀÇ ´Ù¸¥ Àü¹®°¡°¡ Á¾Á¾ ÀǰßÀÌ Æ²¸®´Ù - À̰ÍÀº ¾î´À °ÍÀ» »ç¿ëÇÒÁö ¾Æ´Â °ÍÀ» ¾î·Æ°Ô ÇÑ´Ù.
Àü¹®°¡µéÀÇ ÀǰßÀÌ ´Ù¸¦ ¶§, ÀϹÝÀûÀ¸·Î ¼¼°¡Áö Áß¿¡¼ ¼±ÅÃÀ» ÇÒ ¼ö ÀÖ´Ù. ù°, ÇÑ Àü¹®°¡¸¦ ¼±ÅÃÇÏ°í ´Ù¸¥ °ÍÀ» ¹«½ÃÇÑ´Ù. À̰ÍÀº ºÐ¸í °¡Àå ½¬¿î ¼±ÅÃÀÌ´Ù. ÇÏÁö¸¸ Áö½Äº£À̽º°¡ ¾î¶² À߸øµÈ Á¤º¸¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù (±×·¯³ª ¿ÇÁö ¸øÇÑ Á¤º¸ÀÇ ¾çÀº »ç¶÷ Àü¹®°¡°¡ Á¦°øÇÒ ¼ö ÀÖ´Â °Í»ÓÀÌ´Ù). µÑ°, Á¤º¸¸¦ Æò±ÕÈÇÒ ¼ö ÀÖ´Ù : Áï, µÎ Àü¹®°¡ »çÀÌ¿¡ °øÅëµÈ Á¤º¸¸¸ »ç¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ¼±ÅÃÀÌ Ã¹ ¹øÂ° °Í¸¸Å ½±Áö´Â ¾ÊÁö¸¸ ±×¸® Å« ¹®Á¦¾øÀÌ ÀÌ °úÁ¤À» Á¾Á¾ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÜÁ¡Àº Áö½Äº£À̽ºÀÇ ³»¿ëÀÌ ¿Ïȵȴٴ °Í°ú, ¾î´À Àü¹®°¡ÀÇ Áö½Äµµ ÃæºÐÈ÷ ¹Ý¿µµÇÁö ¸øÇÑ´Ù´Â °ÍÀÌ´Ù. ¼¼ ¹øÂ°, µÎ Àü¹®°¡ÀÇ Áö½ÄÀ» ¸ðµç ½Ã½ºÅÛ¿¡ Æ÷ÇÔÇØ¼ »ç¿ëÀÚ°¡ °áÁ¤ÇÏ°Ô ÇÒ ¼öµµ ÀÖ´Ù. °¢ Ç׸ñ¿¡ ´ëÇÏ¿© È®·ü ÀÎÀÚ (probability factor) ¸¦ ºÎ°¡ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¼±ÅÃÀÌ ºñ·Ï ¾î¶² »óȲ¿¡¼´Â ¹Þ¾Æµé¿© Áú ¼ö ÀÖÁö¸¸, ¸¹Àº ÀÀ¿ë¿¡ ´ëÇÏ¿© Àü¹®°¡½Ã½ºÅÛÀÌ ±ÇÀ§°¡ Àֱ⸦ ¿øÇÒ °ÍÀÌ´Ù - Áï, »ç¿ëÀÚ°¡ °áÁ¤Çϱ⸦ ¿øÇÏÁö ¾Ê´Â´Ù.
¶Ç ´Ù¸¥ ¾î·Á¿î Á¡Àº ´ëºÎºÐÀÇ »ç¶÷ Àü¹®°¡°¡ ±×µéÀÌ ¹«¾ùÀ» ¾Æ´ÂÁö¸¦ ¸ð¸¥´Ù´Â °ÍÀÌ´Ù : »ç¶÷Àº ÄÄÇ»ÅͰ¡ ÇÒ ¼ö ÀÖ´Â °Í°ú °°Àº ¹æ¹ýÀ¸·Î "¸Þ¸ð¸® ´ýÇÁ" ¸¦ ÇÒ ¼ö ¾ø´Ù. ±×·¯¹Ç·Î, ÇÊ¿äÇÑ Á¤º¸¸¦ ¸ðµÎ »Ì¾Æ³»´Â °ÍÀÌ ¾î·Á¿ï ¼ö ÀÖ´Ù. ¶ÇÇÑ, ¾î¶² Àü¹®°¡µéÀº ±×µéÀÌ ¾Ë°í ÀÖ´Â ¸ðµç °ÍÀ» ¸»ÇØÁÖ±â À§ÇÏ¿© ½Ã°£ÀÌ °É¸®´Â °ÍÀ» ÀÚÁøÇؼ ÇÏ·Á°í ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.
ºñ·Ï ÇùÁ¶ÀûÀ̰í, ÀÚ½ÅÀÇ Àü¹®Áö½Ä¿¡ ´ëÇÏ¿© ¿Ïº®ÇÏ°Ô ¼³¸íÇØ ÁÙ Àü¹®°¡¸¦ ã¾Ò´Ù°í ÇÏ´õ¶óµµ, Áö½ÄÀ» ÄÄÇ»ÅÍ¿¡ Á¤È®ÇÏ°Ô º£²¸ ³Ö¾ú´Ù´Â °ÍÀ» È®ÁõÇÏ´Â ¹®Á¦¿¡ ¿©ÀüÈ÷ ºÎµúÄ¡°Ô µÈ´Ù. º»ÁúÀûÀ¸·Î, Áö½Äº£À̽º¸¦ ½ÃÇèÇØ ºÁ¾ß ÇÑ´Ù. ¹®Á¦´Â ÀÌ·¸´Ù. Áö½Äº£À̽º¸¦ ¾î¶»°Ô Å×½ºÆ®ÇÒ °ÍÀΰ¡?
Á¦ 1 Àå¿¡¼ ¾ð±ÞÇßµíÀÌ, ¼Ò¸ðÀûÀΠŽ»öÀº Æø¹ßÀû Ž»öÀÌ µÇ±â ¶§¹®¿¡, ¾ÆÁÖ ÀÛÀº µ¥ÀÌÅÍ ÁýÇÕ ÀÌ¿ÜÀÇ ¾î¶² °Í¿¡µµ Àû¿ëÀÌ ºÒ°¡´ÉÇÏ´Ù. ±×·¯¹Ç·Î, ´ëºÎºÐÀÇ ½Ç¼¼°è Àü¹®°¡½Ã½ºÅÛ¿¡ ´ëÇÏ¿©, Áö½Äº£À̽º°¡ Á¤È®ÇÏ´Ù´Â °ÍÀ» ¿Ïº®ÇÏ°Ô Áõ¸íÇÒ ¹æ¹ýÀº ¾ø´Ù. °¡Àå ÁÁÀº ÇØ°áÀº Áö½Äº£À̽ºÀÇ Á¤È®¼º¿¡ ´ëÇÏ¿© ¾ÆÁÖ ÀÚ½ÅÇÒ ¼ö ÀÖµµ·Ï ÃæºÐÇÑ Å×½ºÆ®¸¦ ÇÏ´Â °ÍÀÌ´Ù. Åë°èÀû Ç¥º» ±â¹ýÀ» »ç¿ëÇÏ¿©, ¿ä±¸ÇÏ´Â ¾î¶² ½Å·Ú¼öÁØ (confidence level) ÀÌµç »êÃâÇÒ ÀÏ·ÃÀÇ Å×½ºÆ®¸¦ °í¾ÈÇÒ ¼ö ÀÖ´Ù.
¶Ç´Ù¸¥ Á¢±Ù ¹æ½ÄÀ¸·Î, Àϰü¼ºÀ» À§ÇÏ¿© Áö½Äº£À̽º¿¡ ÀÖ´Â ¸ðµç Á¤º¸°¡ ±× ÀÚü¿Í ÀÏÄ¡ÇÏ´ÂÁö ¾Ë±â À§ÇÏ¿© ½Ã½ºÅÛÀ¸·Î ÇÏ¿©±Ý Á÷Á¢ üũÇÏ°Ô ÇÒ ¼öµµ ÀÖ´Ù. À̰ÍÀº È®½ÇÈ÷ ¸ðµç ¹®Á¦¸¦ ¹ß°ßÇÏÁö´Â ¾Ê°ÚÁö¸¸, ¸î °³´Â ¹ß°ßÇÒ °ÍÀÌ´Ù. ±×·¯³ª ÀÌ ÀÚ±âüũ (self-check) ¸¦ ¾î¶»°Ô ±¸ÇöÇÏ´Â Áö¿¡ µû¶ó¼, ¾î¶² Ä¿´Ù¶õ Áö½Äº£À̽º¿¡¼´Â Æø¹ßÀûÀÎ 'º® (brick wall)" ¿¡ ºÎµúÄ¥ ¼öµµ ÀÖ´Ù. ±×·¡¼ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ´Â °ÍÀÌ ºÒ°¡´ÉÇÒÁöµµ ¸ð¸¥´Ù.
±×·¯¹Ç·Î, Àü¹®°¡½Ã½ºÅÛÀ» ´õ ¸¹ÀÌ »ç¿ëÇÏ°Ô µÊ¿¡ µû¶ó, Áö½Äº£À̽º È®Áõ (verification) Àº °¡Àå Áß¿äÇÑ ¿¬±¸ºÐ¾ß ÁßÀÇ Çϳª°¡ µÉ °ÍÀÌ´Ù.