Reyhane
عضو جدید
برنامه نویسی منطقی در Prolog
در دهه 1970 يك الگوي ديگر براي محاسبات نمادين در برنامهنويسي هوش مصنوعی از موفقيت در زمينه اثبات قضيه خودكار ارئه شد. حل رويه اثبات بطور قابل توجهي توسط رابينسون (1965) توسعه يافته كه كه با منطق رسمي نشان داده شده است، در محاسبات گزارهاي خاص ميتوان بعنوان نمادي براي تعيين الگوريتمها و بنابراين براي انجام محاسبات نمادين استفاده شود. در اوايل (دهه 1970) Prolog ، مخفف(برنامهنويسي در منطق) اولين زبان برنامهنويسي بر مبناي منطق پديدار شد. آن توسط آلن كالمرار، رابرت كووا لسكي و فيليپ راسل توسعه يافته است. اساس Prolog شامل يك روش براي مشخص كردن گزارههاي محاسبات گزارهاي و تصميات محدود است. برنامهنوسي در Prolog شامل مشخصات حقيقي در مورد اشياء و ارتباط آنها و قوانيني كه ارتباطات را مشخص ميكند، است. برنامههاي Prolog مجموعهاي از جملات اعلاني در مورد يك مسئله هستند زيرا آنها نحوه محاسبه نتيجه را مشخص نميكند.بلكه ساختار منطقي نتيجه را مشخص ميكنند Prolog با برنامهنويسي دستوري و حتي برنامهنويسي تابعي در تعريف نحوه محاسبه نتيجه كاملاً متفاوت است. با استفاده از Prolog برنامهنويسي ميتواند در يك سطح خيلي خلاصه و كاملاً نزديك به مشخصات رسمي يك مسئله انجام ميگيرد. Prolog هنوز هم مهمترين زبان برنامهنوسي منطقي است. تعدادي از سيستمهاي برنامهنوسي تجاري در بازار موجود است كه شامل ماجولهاي مدرن برنامهنويسي هستند، يعني كامپايلر، Debugger و ابزارهاي تجسم. Prolog در تعدادي از زمينههاي هوش مصنوعی مانند سيستمهاي خبره و پردازش زبان طبيعي بطور موفقيتآميزي استفاده شده است. اما در زمينههاي ديگري مانند سيستم هاي مديريت پايگاه داده رابطهاي يا در آموزش نيز استفاده ميشود. يك برنامه Prolog بسيار ساده برنامهاي است كه شامل دو حقيقت و يك قاعده است.
scientist(godel).
scientist(einstein).
logician(X) :- scientist(X).
دو جمله اول ميتواند بصورت ’’Godel is a scientist ‘‘ و ’’Einstein is a scientist ‘‘ تفسير شود.جمله قانون ميگويد: ’’X is a logician if x is a scientist ‘‘. براي تست اين برنامه بايد عبارات پرس و جو( يا قضايا) را مشخص كنيم كه Prolog سعي ميكند با استفاده از برنامه مشخص شده به آنها جواب دهد(يا اثبات كند). يك پرس و جوي ممكن اين است: ?- scientist(godel).
كه ميتواند به صورت ’’Is Godel a scientist?‘‘ بيان شود. Prolog با بكار بردن رويه اثبات پيشساخته خودش ’’yes‘‘ جواب خواهد داد، زيرا ممكن است يك حقيقت پيدا شود كه كاملاً مطابق با پرس و جو باشد. ديگر پرس و جوي ممكن بصورت سئوال:
’’who is a scientist?‘‘و در Prolog بصورت زير بيان ميشود:
?- scientist(X).
Prolog نتيجه خواهد داد’’X = godel , X= Einstein ‘‘. در اين حالت Prolog نهتنها جواب ميدهد’’yes ‘‘ بلكه همه متغيرهاي متصل به x را كه در طول اثبات موفق پرس و جو پيدا ميكند را بر ميگرداند. مثال ديگر، ممكن است ما با پرس و جوي Prolog زير سئوال كنيم ’’who is a logician ‘‘:
?- logician(X).
اثبات اين پرس و جو همان مجموعهاي از حقايق را كه قانون مشخص كرده است را نتيجه ميدهد. سرانجام ممكن است ما پرس و جوي زير را مشخص كنيم:
?- logician(mickey-mouse).
در اين حالت Prolog جواب خواهد داد با ’’No ‘‘. هر چند قانون ميگويد كسي منطقدان است كه دانشمند هم باشد، ولي Prolog حقيقتي نمييابد كه بگويدMickey Mouse دانشمند است. توضيح اينكه Prolog تنها نسبت به برنامه داده شده ميتواند پاسخ بدهد. در واقع به اين معني است كه ‘‘ No, I couldn’t deduce the fact‘‘. اين ويژگي بعنوان فرض جهان بسته يا رد آن بصورت شكست، مشهور است. به اين معني كه Prolog همه اطلاعات لازم براي حل مسئله موجود در پايگاه داده را فرض ميكند.
جملات برنامههاي Prolog شامل مجموعهاي از جملات بنام بند هستند كه براي نمايش دادهها و برنامهها استفاده ميشوند. نماد نقطه براي پايان دادن بند بكار ميرود. يك واژه ميتواند يك ثابت(نامهاي نمادين كه با يك حرف كوچك شروع ميشوند مانند godel يا eInstein )، يك متغير(نمادهايي كه با يك حرف بزرگ شروع ميشوند مانند x يا Scientist)، يا يك ساختار باشد. ساختارهاي گزارههاي اتمي محاسبات گزارهاي را نمايش ميدهند و شامل عملگر نام و يك ليست پارامتر هستند. هر پارامتر ميتواند يك واژه باشد به اين معني كه واژهها، اشياء بازگشتي هستند. Prolog سه نوع بند را تشخيص ميدهد: حقايق،قوانين و پرس و جوها. يك حقيقت با يك ساختار واحد نمايش داده ميشود كه بعنوان يك گزاره درست ساده تفسير ميشود. قبلاً در مثال ساده برنامه بالا دو حقيقت ساده را معرفي كرديم.
اينها چند مثال ديگر هستند:
male(john).
male(bill).
female(mary).
female(sue).
father(john, mary).
father(bill,john).
mother(sue,mary).
توضيح اينكه اين حقايق داراي معاني ذاتي نيستند يعني معني عملگر نام father تعريف نشده است. براي مثال با بكار بردن حواس معمول ممكن است آن را بصورت ’’John is the father of mary‘‘ تفسير كنيم. هر چند براي Prolog اين معني وجود ندارد و تنها يك نماد است.
قوانين متعلق به نوع ديگري از بندها هستند. يك بند قانون شامل دو قسمت است، سر كه تنها يك واژه است و بدنه كه تنها يك واژه يا يك اتحاد است. يك اتحاد يك مجموعه از واژههاست كه با نماد كاما از هم جدا ميشوند.
منطقاً يك بند قانون بعنوان يك استدلال تفسير ميشود، اگر همه عناصر بدنه درست باشند، آنگاه عنصر سر نيز درست است. بنابراين بدنه بند به صورت قسمت if (اگر) و سر بند بصورت قسمت then (آنگاه) قانون مشخص ميشوند.
اين مثال براي مجموعهاي از بندهاي قانون است:
parent(X,Y) :- mother(X, Y).
parent(X,Y) :- father(X, Y).
grandparent(X,Z) :- parent(X,Y), parent(Y,Z).
قانون اخير خوانده ميشود:
’’X is a grand parent of z if X is a parent of y and y is a parent of z ‘‘
دو قانون اولي ميگويند:
’’some one is parent if it is the father or mother of some one else‘‘
دليل رفتار دو قانون اول را هنگام معرفي رويه اثبات Prolog بعنوان فصلي بطور آشكار خواهد آمد. قبل از انجام اين كار بايد آخرين نوع بند را معرفي كنيم، بند پرس و جو (كه بند هدف ناميده ميشود). يك پرس و جو براي فعال كردن رويه اثبات Prolog بكار ميرود.
منطقاً يك پرس و جو مشابه يك قضيه مجهول است. آن شكلي مشابه حقيقت دارد تا به Prolog بگويد كه يك پرس و جو بايد اثبات شود، عملگر مخصوص پرس و جو –?است معمولاً در جلوي پرس و جو نوشته ميشود. در مثالهاي ساده برنامه Prolog معرفي شده در بالا، قبلاً توصيفي غير رسمي از چگونگي استفاده پرس و جو در Prologرا ديديم.
فرايند استنتاج Prolog شامل دو مؤلفه اساسي است: روش جستجو و يكي كننده. روش جستجو براي جستجو ميان حقيقت و قانون پايگاه داده بكار ميرود در حالي كه يكيسازي براي تطبيق الگو و بازگرداندن اتصالاتي كه يك عبارت صحيح ميسازد بكار ميرود.
يكيساز روي دو واژه بكار ميرود و سعي ميكند با تركيب آن دو يك واژه جديد شكل بدهد. اگر يكي سازي ممكن نباشد آنگاه گفته ميشود يكيسازي شكست خورده است. اگر دو واژه مادي هيچ متغيري نباشند آنگاه يكيسازي در واقع از بررسي اينكه آيا واژهها برابرند، خواهد كاست. براي مثال، يكيسازي دو واژه father (john,mary) و father(john,mary) موفق ميشود در حاليكه يكيسازي جفت واژههاي زير با شكست مواجه خواهند شد.
father(X,mary) و father(john,sue)
sequence(a,b,c) و sequence(a,b)
اگر يك واژه حاوي يك متغير (يا بيشتر) باشد آنگاه يكي كننده بررسي ميكند كه آيا متغير ميتواند با بعضي از اطلاعات واژه دوم متصل شود، هر چند تنها اگر قسمتهاي باقيمانده واژهها يكي شوند. براي مثال، براي دو واژه زير:
father(X,mary) and father(john,mary)
يكي كننده X را به john متصل خواهد كرد زيرا واژههاي باقيمانده برابرند. هرچند براي
زوج زير:
father(X,mary) and father(john,sue)
در دهه 1970 يك الگوي ديگر براي محاسبات نمادين در برنامهنويسي هوش مصنوعی از موفقيت در زمينه اثبات قضيه خودكار ارئه شد. حل رويه اثبات بطور قابل توجهي توسط رابينسون (1965) توسعه يافته كه كه با منطق رسمي نشان داده شده است، در محاسبات گزارهاي خاص ميتوان بعنوان نمادي براي تعيين الگوريتمها و بنابراين براي انجام محاسبات نمادين استفاده شود. در اوايل (دهه 1970) Prolog ، مخفف(برنامهنويسي در منطق) اولين زبان برنامهنويسي بر مبناي منطق پديدار شد. آن توسط آلن كالمرار، رابرت كووا لسكي و فيليپ راسل توسعه يافته است. اساس Prolog شامل يك روش براي مشخص كردن گزارههاي محاسبات گزارهاي و تصميات محدود است. برنامهنوسي در Prolog شامل مشخصات حقيقي در مورد اشياء و ارتباط آنها و قوانيني كه ارتباطات را مشخص ميكند، است. برنامههاي Prolog مجموعهاي از جملات اعلاني در مورد يك مسئله هستند زيرا آنها نحوه محاسبه نتيجه را مشخص نميكند.بلكه ساختار منطقي نتيجه را مشخص ميكنند Prolog با برنامهنويسي دستوري و حتي برنامهنويسي تابعي در تعريف نحوه محاسبه نتيجه كاملاً متفاوت است. با استفاده از Prolog برنامهنويسي ميتواند در يك سطح خيلي خلاصه و كاملاً نزديك به مشخصات رسمي يك مسئله انجام ميگيرد. Prolog هنوز هم مهمترين زبان برنامهنوسي منطقي است. تعدادي از سيستمهاي برنامهنوسي تجاري در بازار موجود است كه شامل ماجولهاي مدرن برنامهنويسي هستند، يعني كامپايلر، Debugger و ابزارهاي تجسم. Prolog در تعدادي از زمينههاي هوش مصنوعی مانند سيستمهاي خبره و پردازش زبان طبيعي بطور موفقيتآميزي استفاده شده است. اما در زمينههاي ديگري مانند سيستم هاي مديريت پايگاه داده رابطهاي يا در آموزش نيز استفاده ميشود. يك برنامه Prolog بسيار ساده برنامهاي است كه شامل دو حقيقت و يك قاعده است.
scientist(godel).
scientist(einstein).
logician(X) :- scientist(X).
دو جمله اول ميتواند بصورت ’’Godel is a scientist ‘‘ و ’’Einstein is a scientist ‘‘ تفسير شود.جمله قانون ميگويد: ’’X is a logician if x is a scientist ‘‘. براي تست اين برنامه بايد عبارات پرس و جو( يا قضايا) را مشخص كنيم كه Prolog سعي ميكند با استفاده از برنامه مشخص شده به آنها جواب دهد(يا اثبات كند). يك پرس و جوي ممكن اين است: ?- scientist(godel).
كه ميتواند به صورت ’’Is Godel a scientist?‘‘ بيان شود. Prolog با بكار بردن رويه اثبات پيشساخته خودش ’’yes‘‘ جواب خواهد داد، زيرا ممكن است يك حقيقت پيدا شود كه كاملاً مطابق با پرس و جو باشد. ديگر پرس و جوي ممكن بصورت سئوال:
’’who is a scientist?‘‘و در Prolog بصورت زير بيان ميشود:
?- scientist(X).
Prolog نتيجه خواهد داد’’X = godel , X= Einstein ‘‘. در اين حالت Prolog نهتنها جواب ميدهد’’yes ‘‘ بلكه همه متغيرهاي متصل به x را كه در طول اثبات موفق پرس و جو پيدا ميكند را بر ميگرداند. مثال ديگر، ممكن است ما با پرس و جوي Prolog زير سئوال كنيم ’’who is a logician ‘‘:
?- logician(X).
اثبات اين پرس و جو همان مجموعهاي از حقايق را كه قانون مشخص كرده است را نتيجه ميدهد. سرانجام ممكن است ما پرس و جوي زير را مشخص كنيم:
?- logician(mickey-mouse).
در اين حالت Prolog جواب خواهد داد با ’’No ‘‘. هر چند قانون ميگويد كسي منطقدان است كه دانشمند هم باشد، ولي Prolog حقيقتي نمييابد كه بگويدMickey Mouse دانشمند است. توضيح اينكه Prolog تنها نسبت به برنامه داده شده ميتواند پاسخ بدهد. در واقع به اين معني است كه ‘‘ No, I couldn’t deduce the fact‘‘. اين ويژگي بعنوان فرض جهان بسته يا رد آن بصورت شكست، مشهور است. به اين معني كه Prolog همه اطلاعات لازم براي حل مسئله موجود در پايگاه داده را فرض ميكند.
جملات برنامههاي Prolog شامل مجموعهاي از جملات بنام بند هستند كه براي نمايش دادهها و برنامهها استفاده ميشوند. نماد نقطه براي پايان دادن بند بكار ميرود. يك واژه ميتواند يك ثابت(نامهاي نمادين كه با يك حرف كوچك شروع ميشوند مانند godel يا eInstein )، يك متغير(نمادهايي كه با يك حرف بزرگ شروع ميشوند مانند x يا Scientist)، يا يك ساختار باشد. ساختارهاي گزارههاي اتمي محاسبات گزارهاي را نمايش ميدهند و شامل عملگر نام و يك ليست پارامتر هستند. هر پارامتر ميتواند يك واژه باشد به اين معني كه واژهها، اشياء بازگشتي هستند. Prolog سه نوع بند را تشخيص ميدهد: حقايق،قوانين و پرس و جوها. يك حقيقت با يك ساختار واحد نمايش داده ميشود كه بعنوان يك گزاره درست ساده تفسير ميشود. قبلاً در مثال ساده برنامه بالا دو حقيقت ساده را معرفي كرديم.
اينها چند مثال ديگر هستند:
male(john).
male(bill).
female(mary).
female(sue).
father(john, mary).
father(bill,john).
mother(sue,mary).
توضيح اينكه اين حقايق داراي معاني ذاتي نيستند يعني معني عملگر نام father تعريف نشده است. براي مثال با بكار بردن حواس معمول ممكن است آن را بصورت ’’John is the father of mary‘‘ تفسير كنيم. هر چند براي Prolog اين معني وجود ندارد و تنها يك نماد است.
قوانين متعلق به نوع ديگري از بندها هستند. يك بند قانون شامل دو قسمت است، سر كه تنها يك واژه است و بدنه كه تنها يك واژه يا يك اتحاد است. يك اتحاد يك مجموعه از واژههاست كه با نماد كاما از هم جدا ميشوند.
منطقاً يك بند قانون بعنوان يك استدلال تفسير ميشود، اگر همه عناصر بدنه درست باشند، آنگاه عنصر سر نيز درست است. بنابراين بدنه بند به صورت قسمت if (اگر) و سر بند بصورت قسمت then (آنگاه) قانون مشخص ميشوند.
اين مثال براي مجموعهاي از بندهاي قانون است:
parent(X,Y) :- mother(X, Y).
parent(X,Y) :- father(X, Y).
grandparent(X,Z) :- parent(X,Y), parent(Y,Z).
قانون اخير خوانده ميشود:
’’X is a grand parent of z if X is a parent of y and y is a parent of z ‘‘
دو قانون اولي ميگويند:
’’some one is parent if it is the father or mother of some one else‘‘
دليل رفتار دو قانون اول را هنگام معرفي رويه اثبات Prolog بعنوان فصلي بطور آشكار خواهد آمد. قبل از انجام اين كار بايد آخرين نوع بند را معرفي كنيم، بند پرس و جو (كه بند هدف ناميده ميشود). يك پرس و جو براي فعال كردن رويه اثبات Prolog بكار ميرود.
منطقاً يك پرس و جو مشابه يك قضيه مجهول است. آن شكلي مشابه حقيقت دارد تا به Prolog بگويد كه يك پرس و جو بايد اثبات شود، عملگر مخصوص پرس و جو –?است معمولاً در جلوي پرس و جو نوشته ميشود. در مثالهاي ساده برنامه Prolog معرفي شده در بالا، قبلاً توصيفي غير رسمي از چگونگي استفاده پرس و جو در Prologرا ديديم.
فرايند استنتاج Prolog شامل دو مؤلفه اساسي است: روش جستجو و يكي كننده. روش جستجو براي جستجو ميان حقيقت و قانون پايگاه داده بكار ميرود در حالي كه يكيسازي براي تطبيق الگو و بازگرداندن اتصالاتي كه يك عبارت صحيح ميسازد بكار ميرود.
يكيساز روي دو واژه بكار ميرود و سعي ميكند با تركيب آن دو يك واژه جديد شكل بدهد. اگر يكي سازي ممكن نباشد آنگاه گفته ميشود يكيسازي شكست خورده است. اگر دو واژه مادي هيچ متغيري نباشند آنگاه يكيسازي در واقع از بررسي اينكه آيا واژهها برابرند، خواهد كاست. براي مثال، يكيسازي دو واژه father (john,mary) و father(john,mary) موفق ميشود در حاليكه يكيسازي جفت واژههاي زير با شكست مواجه خواهند شد.
father(X,mary) و father(john,sue)
sequence(a,b,c) و sequence(a,b)
اگر يك واژه حاوي يك متغير (يا بيشتر) باشد آنگاه يكي كننده بررسي ميكند كه آيا متغير ميتواند با بعضي از اطلاعات واژه دوم متصل شود، هر چند تنها اگر قسمتهاي باقيمانده واژهها يكي شوند. براي مثال، براي دو واژه زير:
father(X,mary) and father(john,mary)
يكي كننده X را به john متصل خواهد كرد زيرا واژههاي باقيمانده برابرند. هرچند براي
زوج زير:
father(X,mary) and father(john,sue)