-
G. سایر زبانهای برنامهنویسی تابعی غیر از Lisp
ما Lisp را به عنوان نماینده اصلی زبان برنامهنویسی تابعی معرفی كردیم (مخصوصاً نسخه پر استفاده Common Lisp )، زیرا هنوز هم زبان برنامهنویسی پر استفادهای برای تعدادی از مسئلههای هوش مصنوعی مانند فهم زبان طبیعی، استخراج اطلاعات، یادگیری ماشین، برنامهریزی AI یا برنامهنویسی ژنتیك است. دركنار Lispتعدادی از زبانهای برنامهنویسی تابعی دیگر توسعه یافتند. ما بطور خلاصه دو عضو مشهور را ذكر میكنیم، ML و Haskell.
ML برگرفته از Meta-Language است یك زبان برنامهنویسی تابعی با دامنه ایستاست. تفاوت اصلیاش با Lisp درsyntax (نحو) است (كه بیشتر شبیه پاسكال است)، و یك نوع سیستم چند ریختی محض است (یعنی بكاربردن انواع قوی و نوع استنتاجی بوسیله متغیرهایی كه نیاز به اعلان ندارند). نوع هر متغیر اعلان شده و عبارت میتواند در زمان كامپایل تعیین شود. MLتعریف انواع داده خلاصه را پشتیبانی میكند، به صورتی كه در مثال زیر شرح داده شده است:
datatype tree = L of int
| int * tree * tree;
خوانده میشود’’ هر درخت دو دویی دارای یك برگ شامل یك عدد صحیح و یا یك گره
شامل یك عدد صحیح و دو درخت است( زیر درختها)‘‘ در مثال بعدی، مثالی از تعریف یك تابع بازگشتی كه روی یك ساختار درخت بكار میرود نشان داده شده است:
fun depth(L ) = 1
| depth(N(i,l,r)) =
1 + max(depth l, depth r);
تابع depth نگاشتی از درختها به اعداد است. عمق هر برگ 1 است و عمق هر درخت دیگر 1 بعلاوه بیشترین عمق زیر درختهای چپ و راست آن است.
Haskell شبیه ML است: Syntax مشابهی بكار میبرد، دامنهاش هم ایستاست و از همان روش استنتاج استفاده میكند. با ML در این تفاوت دارد كه یك زبان كاملاً تابعی است. به این معنی است كه به اثرات جانبی اجازه نداده و شامل هیچ نوع ویژگی دستوری نیست، در اصل متغیر و جملات انتسابی ندارد. بعلاوه از یك تكنیك ارزیابی كند استفاده میكند، كه زیر عبارت را ارزیابی نمیكند تا موقع نیاز مقدارش معلوم باشد. لیستها رایجترین ساختار داده در Haskell هستند. برای مثال [1,2,3] لیستی از سه عدد صحیح 3,2,1 است لیست [1,2,3] در Haskell در واقع خلاصهنویسی شده لیست 1:(2:(3:[ ] )) است، كه[ ] لیست خالی است و: عملگری میانوندی است كه آرگومان اولش را جلوی آرگومان دومش اضافه میكند( یك لیست). بعنوان مثالی از یك تابع كاربر تعریفی كه روی لیستها عمل میكند، مسئله شمارش تعداد عناصر در یك لیست با تعریف تابع length ملاحظه میشود.
length :: [a] -> Integer
length [ ] = 0
length (x:xs) = 1 + length xs
خوانده میشود’’طول لیست خالی 0 است، و طول لیستی كه عنصر اولش x است و بقیه xs است،1 بعلاوه طول xs است‘‘. در Haskell تابع invocation احضار با تطبیق الگو راهنمایی میكند، برای مثال طرف چپ معادله داری الگوهایی مانند[ ] و x:xs است. در یك كاربرد تابع این الگوها با پارامترهای واقعی تطبیق داده میشوند [ ] ) تنها با لیست خالی مطابقت میكند، و x :xs با هر لیست با حداقل یك عنصر با موفقیت تطبیق میكند، x به عنصر اول و xs به بقیه لیست متصل میشوند). اگر تطبیق موفقیتآمیز باشد طرف راست معادله ارزیابی و بعنوان نتیجه كاربرد برگردانده میشود. اگر با شكست مواجه شود معادله بعدی سعی میشود، و اگر همه معادلات با شكست مواجه شوند، حاصل یك خطا میشود.
این پایان كوتاه ما از’’سفر در Lisp ‘‘ است. ما تنهای توانستیم جنبه بسیار مهم Lisp را مطرح كنیم. خوانندگان علاقمند به جزئیات خاص بیشتر باید حداقل یكی از كتابهای مذكور در آخر مقاله را كنكاش كنند. بقیه این مقاله معرفی الگوی برنامهنویسی دیگری بنام Prolog است كه در برنامهنویسی AI بطور گسترده مورد استفاده قرار میگیرد.
-
IV. برنامهنویسی منطقی در Prolog
در دهه 1970 یك الگوی دیگر برای محاسبات نمادین در برنامهنویسی AI از موفقیت در زمینه اثبات قضیه خودكار ارئه شد. حل رویه اثبات بطور قابل توجهی توسط رابینسون
(1965) توسعه یافته كه كه با منطق رسمی نشان داده شده است، در محاسبات گزارهای خاص میتوان بعنوان نمادی برای تعیین الگوریتمها و بنابراین برای انجام محاسبات نمادین استفاده شود. در اوایل (دهه 1970) Prolog ، مخفف(برنامهنویسی در منطق) اولین زبان برنامهنویسی بر مبنای منطق پدیدار شد. آن توسط آلن كالمرار، رابرت كووا لسكی و فیلیپ راسل توسعه یافته است. اساس Prolog شامل یك روش برای مشخص كردن گزارههای محاسبات گزارهای و تصمیات محدود است. برنامهنوسی در Prolog شامل مشخصات حقیقی در مورد اشیاء و ارتباط آنها و قوانینی كه ارتباطات را مشخص میكند، است. برنامههای Prolog مجموعهای از جملات اعلانی در مورد یك مسئله هستند زیرا آنها نحوه محاسبه نتیجه را مشخص نمیكند.بلكه ساختار منطقی نتیجه را مشخص میكنند Prolog با برنامهنویسی دستوری و حتی برنامهنویسی تابعی در تعریف نحوه محاسبه نتیجه كاملاً متفاوت است. با استفاده از Prolog برنامهنویسی میتواند در یك سطح خیلی خلاصه و كاملاً نزدیك به مشخصات رسمی یك مسئله انجام میگیرد. Prolog هنوز هم مهمترین زبان برنامهنوسی منطقی است. تعدادی از سیستمهای برنامهنوسی تجاری در بازار موجود است كه شامل ماجولهای مدرن برنامهنویسی هستند، یعنی كامپایلر، Debugger و ابزارهای تجسم. Prolog در تعدادی از زمینههای AI مانند سیستمهای خبره و پردازش زبان طبیعی بطور موفقیتآمیزی استفاده شده است. اما در زمینههای دیگری مانند سیستم های مدیریت پایگاه داده رابطهای یا در آموزش نیز استفاده میشود. یك برنامه 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)
مفهوم اتصال ساخته نمیشود چون mary و sue مطابق نیستند. روش جستجویی كه برای پیمایش فضای جستجو بكار میرود بوسیله حقایق و قوانین برنامه Prolog محدود شده است. Prolog یك روش بالا به پائین، روش جستجوی عمقی (dfs) استفاده میكند. این به چه معنا است؟ همه مراحل كاملاً شبیه به روش تابع ارزیابی استفاده شده در Lisp است اگر یك پرس و جوی Q مشخص شده باشد آنگاه ممكن است آن مطابق یك حقیقت یا یك قاعده باشد. در حالتی از قاعده Prolog ,R ابتدا سعی میكند سر R را تطبیق دهد و اگر موفق شود آنگاه سعی میكندهمه عناصر بدنه R كه زیر پرس و جو نامیده میشوند را تطبیق دهد اگر سر R حاوی متغیرها باشد آنگاه اتصالات در طول اثبات از زیر پرس و جوها استفاده خواهند كرد. از آنجایی كه اتصالات تنها برای زیر پرس و جوها معتبر هستند، گفته میشود كه برای یك قاعده محلی هستند. یك زیر پرس و جو هم میتواند یك قاعده باشد و هم یك حقیقت. اگر یك قاعده باشد آنگاه فرایند استنتاج Prolog بطور بازگشتی برای بدنه این پرس و جو بكار میرود. این، قسمت بالا به پائین روش جستجو را میسازد. عناصر بدنه یك قاعده از چپ به راست بكار میروند و تنها اگر عنصر جاری بتواند با موفقیت اثبات شود عنصر بعدی سعی میشود. این روش جستجوی عمقی را میسازد. ممكن است برای اثبات یك زیر پرس و جو دو یا چند حقیقت یا قاعده دیگر تعریف شوند. در آن صورت A, Prolog را انتخاب میكند و سعی میكند آن را اثبات كند، اگر لازم باشد زیر پرس و جوهای A را نیز پردازش میكند. اگر A با شكست مواجه شود Prolog به نقطهای كه اثبات A شروع شده بر میگردد(با حذف همه اتصالهایی كه در طول اثبات A انتساب داده شده است) و سعی میكند دیگری را اثبات كند. این فرایند عقبگرد نام دارد . به منظور شرح همه روشها پرس و جوهای نمونه زیر را میتوانیم ملاحظه كنید (مثال معرفی شده در بندهای پاراگراف قبلی را بعنوان پایگاه داده Prolog استفاده میكنیم):
?- grandparent(bill,mary).
تنها بندی كه با این پرس و جو تطبیق میكند قاعده زیر است.
grandparent(X,Z) :- parent(X,Y), parent(Y,Z).
و یكیسازی پرس و جو با سر قاعده اتصالهای زیر را بر میگرداند: Z=mary,X=bill برای اثبات قاعده، باید دو عنصر بدنه قاعده از چپ به راست اثبات شوند. توضیح اینكه متغیرهای مشترك قواعد با سر قاعده و بنابراین اتصالهای محاسبه شده در طول تطبیق سر با پرس و جو برای پاسخ به زیر پرس و جوها موجودند. بنابراین زیر پرس و جوی اول در واقع بصورت parent(bill,y) و زیر پرس و جوی دوم بصورت parent (y,mary) معرفی شود. حال برای اثبات بند اول prolog دو قاعده parent دیگر مییابد. اجازه دهید فرض كنیم prolog اولی را انتخاب میكند.( برای یادآوری بیش از یك انتخاب، prolog یك نقطه انتخاب مشخص میكند)
parent(X,Y) :- mother(X, Y).
یكیسازی زیر پرس و جوها با سه قاعده به راحتی ممكن است و متغیرx به واژه bill متصل خواهد شد . این عنصر تك بدنهای بصورت (bill,y) mother معرفی میشود. متاسفانه هیچ حقیقتی كه این زیر پرس و جو را معتبر كند در پایگاه داده وجود ندارد. چون یكیسازی (bill,y) mother با شكست مواجه میشود. پس همه قاعده انجام میشود. سپس prolog به نقطه انتخابی كه اولین قاعده parent ممكن را انتخاب كرده بود، برگشته و دومی را انتخاب میكند.
parent(X,Y) :- father(X, Y)
یكیسازی زیر پرس و جوی (هنوز فعال) parent(bill,y) ، father(bill,y) معرفی خواهد شد. اینبار یكیسازی ممكن است،اتصال y=john برگردانده میشود. حال اولین زیر پرس و جوی parent از قاعده grand parent اثبات شده متغیرهای واقعی X=bill Z=mary,Y=john, هستند. عنصر دوم از بدنه قاعده grandparent،
parent (john, mary) معرفی میشود (توضیح اینكه مقدار z بعد از انتخاب قاعده grand parent فوراً متصل شده است).
همان روش برای این زیر پرس و جو بكار رفته و prolog حقایق كافی برای اثبات موفقیتآمیز آن خواهد یافت. وقتی كه دو عنصر بدنه قاعده grand parent به طور معتبر اثبات شد، prolog به پایان میرسد كه اولین پرس و جو true میشود. توسعه prolog ، به منظور استفاده از prolog برای برنامهنویسی كاربردی است. كه با توسعههایی مانند لیست ساختارهای داده، عملكردهایی برای كنترل واضح پیمایش از فاصله جستجو با یك برنامه prolog(بنام عملگر برش) و روالهایی برای رابطهای ورودی /خروجی، تست درستی (ردیابی) و اشكالزدایی میآید. ما نمیتوانیم همه این توسعهها را در متن این مرور كوتاه شرح دهیم. ما تنها بطور خلاصه نشان میدهیم كه لیستها در prolog چگونه میتوانند استفاده شوند. Prolog لیستها را بعنوان یك ساختار دادهای پایهای با استفاده از syntax متداول پشتیبانی میكند. عناصر لیست با كاما جدا میشوند. كل لیست با براكت تعیین میشود. یك عنصر لیست میتواند یك واژه دلخواه یا یك لیست باشد، بنابراین كاملاً شبیه ساختارهای لیست در Lisp است. این مثالی از یك لیست prolog است:
[john, mary, bill]
لیست خالی بصورت [ ] نمایش داده میشود. برای ایجاد و پیمایش لیستها، prolog یك تركیب خاص مبنی بر سر و دنبال یك لیست فراهم میكند. [X | Y]یك لیست است شامل یك سرلیست x و یك دنباله y است. برای مثال لیست بالا میتواند بصورت زیر مشخص شود.
[john | mary, bill]
ما گزارهmember را بصورت مثالی برای نحوه رفتار لیستها در prolog استفاده خواهیم كرد. این گزاره تعیین خواهد كرد كه آیا یك عنصر داده شده در یك لیست داده شده واقع میشود؟ با توجه به توضیحات بالا یك عنصر در یك لیست است اگر سر لیست آن لیست باشد یا اگر در جایی از دنباله لیست واقع شود، با استفاده از تعریف غیررسمی گزاره member ما میتوانیم برنامه prolog زیر را طرح كنیم. (نمادی كه یك متغیر بینام را مشخص میكند،استفاده میشود تا به prolog بگوید مهم نیست مقدار یكی كننده به آن متصل شود)
member(Element,[Element | ]).
member(Element,[ | List]) :- member(Element,List).
با فرض پر س و جوی زیر
?- member(a, [b,c,a,d]).
Prolog ابتدا كنترل میكند كه آیا سر لیست [b | c,a,d]برابر a است.
به این علت بند اول با شكست مواجه میشود، پس دومی سعی میشود. این زیر پرس و جوی member (a,[c,a,d]) معرفی خواهد شد كه معنیاش این است كه از روی عنصر اول بسادگی میپرد با بكار بردن بازگشی member،prolog سعی میكند تا اثبات كند كه آیا سر لیست [c | a,d]با a برابر است، كه با شكست مواجه میشود.، زیر پر س و جوی جدید member (a,[a,d]) را با معرفی بند دوم بدست میآوریم. گام بازگشتی بعدی لیست [a | d]را كنترل خواهد كرد. اینبار a براستی با عنصر سر لیست این لیست برابر میشود، بنابراین prolog با "yes" پایان خواهد یافت.
برنامهنویسی منطقی محدودیت (clp)تصمیمی از سبك برنامهنویسی (ساده)prologاست. در clp واژه یكیسازی به حل محدودیت تعمیم یافته است. در برنامهنویسی منطقی محدودیت مولفههای اصلی یك مسئله بصورت محدودیتها حالت یافتهاند (یعنی ساختار اشیاء در سؤال) و مسئله بصورت یك كل كه با گذاشتن محدودیتهای مختلف بوسیله قواعد ارائه شده است. (اساساً بوسیله تعریف بندها) برای مثال بند معین زیر نمونه یك تجزیه ریز از گرامر یك زبان طبیعی مانند انگلیسی است.
sign(X0) ←
sign(X1),
sign(X2),
X0 syn cat = s,
X1 syn cat = np,
X2 syn cat = vp,
X1 syn agr = X2 syn ag
بیان میشود یك شی زبانی بصورت یك عبارت S طبقهبندی میشود كه باید مركب از یك شیء طبقهبندی شد كه بصورت یك NP (عبارت اسمی) و یك شئ طبقهبندی شده بصورت یك VP(عبارت لفظی) باشد و قرارداد اطلاعات (مانند شخص، حالت) باید بین NP و VP یكسان باشد. همه اشیایی كه حداقل این محدودیتها را انجام میدهند جزءاشیای S هستند. توضیح اینكه هیچ ترتیب پیش فرضی برای VP,NPبعنوان حالتی برای گرامر زبان طبیعی مبنی بر ظواهر وجود ندارد كه متن بدون استحكام به آن تكیه كند. اگر یك محدودیت نیاز به محدودیتهای اضافی داشته باشد. باید به قاعده اضافه شود، برای نمونه زیر ریشهها باید با الحاق تركیب شوند از نجاطیآنآن
آنجایی كه محدودیتهای مثال بالا تنها شرایط لازم برای شئ از كلاس S را مشخص میكند آنها اطلاعات مختصری بیان میكنند. این برای دانش مبنی بر استدلال خیلی مهم است زیرا در كل ما تنها اطلاعات مختصری درباره جهان (محیط)داریم، ما برای پردازش چنین خصوصیاتی دلیل مبنی بر حل محدودیت و الگوی برنامهنویسی منطقی میخواهیم. چون یكیسازی، فقط حالت خاصی از حل محدودیت است، برنامههای منطقی محدودیت توان بیان بالایی دارند.
تعدادی از زبانهای برنامهنویسی منطقی محدودیت (همراه با رابط كاربر سطح بالا و ابزارهای توسعه) تحقق یافتهاند. مانند CHIP یا زبان OZ كه برنامهنویسی اعلانی، برنامهنویسی شئ گرا، برنامهنویسی محدودیت و همزمانی را بعنوان جزئی از كل منسجم پشتیبانی میكند. OZ زبانی محدودیت قدرتمندی با متغیرهای منطقی،دامنهمتناهی، مجموعههای متناهی، درختهای عقلانی و ركورد محدودیتهاست. آن در صدد است تا یك روش یكتا و انعطافپذیر بدون شاخ و بندها برای برنامهنویسی منطقی فراهم كند. OZ بین روشهای مستقیم و غیر مستقیم برنامهنویسی منطقی اعلانی تفاوت قایل میشود.
-
V. سایر روشهای برنامهنویسی
در این مقاله قبلاً زبانهای AI را با روشهای برنامهنویسی دستوری مقایسه كردیم. زبانهای شیء گرا به الگوی برنامهنویسی مشهور دیگری تعلق دارند. در این جور زبانها اولین وسیله برای تعیین مسئلهها، تعیین خلاصه ساختارهای داده است كه كلاسها، اشیاءنام دارند. یك كلاس شامل یك ساختار داده همراه با عملیات اصلیاش كه اغلب اسلوبها (روشها) نام دارند است. یك ویژگی مهم این است كه ممكن است كلاسها در سلسله مراتبی از كلاسها و زیر كلاسها مرتب شوند. یك كلاس میتواند صفات سوپر كلاسهایش كه پیمانهای بودن را پشتیبانی میكنند را به ارث ببرد.
مشهورترین زبانهای شیءگرا C++,Eiffel و Java (جاوا) هستند. سیستم Common Lisp شیءگرا یك توسعه از common Lisp است. آن یكپارچهسازی كامل برنامهنویسی تابعی و شیءگرا را پشتیبانی میكند. اخیراً جاوا در بعضی از زمینهها AI، خصوصاً در فنآوری عامل هوشمند، موتورهای جستجوی اینترنت یا استخراج دادهها كاملاً مشهور شده است. جاوا بر مبنای C++ است و زبان اصلی برای برنامهنویسی كاربردهای اینترنتی است. مهمترین ویژگیهای زبان كه جاوا را از چشمآنداز AI جذاب میسازد فضای هرز خودكار پیشساخته آن و مكانیزم چند نخی (چند وظیفهای) آن است.
با افزایش تحقیقات در زمینه وب هوشمند یك الگوی برنامهنویسی جدید- برنامهنویسی عاملگرا – پدیدار شد. برنامهنویسی عاملگرا یك الگوی جدید برنامهنویسی است كه یك نمای اجتماعی از محاسبه را به خوبی پشتیبانی میكند. در AOP اشیاء بعنوان عاملهایی شناخته میشوند كه برای دستیابی به اهداف شخصی عمل میكنند. عامل در یك ساختار میتواند به پیچیدگی شبكه سراسری اینترنت یا به سادگی یك پیمانه (ماجول) از یك برنامه معمولی باشد. عاملها میتوانند موجودیتهای مستقل باشند یعنی بدون دخالت كاربر برای گام بعدیشان تصمیم بگیرند، یا میتوانند قابل كنترل باشند، یعنی بعنوان وسیلهای بین كاربر و عاملهای دیگر بكار بردند. از آنجایی كه عاملها زنده در نظر گرفته میشوند، با رشد موجودیتهای نرمافزار، به نظر میرسد انتقالی از نقطهنظر زبانهای برنامهنویسی به طرف نقطهنظر سكوی پیشرفت نرمافزار پدیدار میشود. اینجا تأكید روی طراحی سیستم، سكوی پیشرفت و اتصال است. سئوالات حساس عبارتنداز: چگونه تعدادی از منابع پیشرفته AI كه در زبانها و سكوهای مختلف موجودند میتوانند با سایر منابع استفادهكننده از ابزارهای پیشرفت سیستم جدید مانند CORBA (معماری عادی رابط درخواست شئ) تركیب شوند (یكپارچه شوند)، خلاصهسازی عمومی انواع داده و زبانهای تفسیری(یادداشت حاشیهای) مانند XML و زبان استاندارد ارتباطات عاملگرا مانند KQML (زبان شناخت پرس و جو و دستكاری).
بنابراین آینده برنامهنویسی AI كمتر نگران سئوالاتی مثل: ” مناسبترین الگوی برنامهنویسی چیست؟ “ است ولی باید به سئوالاتی مثل: ” چگونه میتوانم الگوهای مختلف برنامهنویسی را زیر یك سایبان یكپارچه كنم؟ “ و ” بهترین زبان ارتباطی برای نرمافزارهای مستقل پیمانهای هوشمند چیست؟ “ پاسخ دهیم.
برچسب برای این موضوع
مجوز های ارسال و ویرایش
- شما نمی توانید موضوع جدید ارسال کنید
- شما نمی توانید به پست ها پاسخ دهید
- شما strong>نمی توانید فایل پیوست ضمیمه کنید
- شما نمی توانید پست های خود را ویرایش کنید
-
قوانین انجمن