RE: هوش مصنوعی
درمورد پرولوگ about prolog/
1. تاریخچه همان طور که گفته شد در پیدایش این زبان کلمرار در مارسی فرانسه بوده است(1972). و اولین سیستم مورد استفاده قرار گرفته شده توسط آلن فیلیپ راسل پیاده سازی شده است و بعدا توسط رابرت کوالسکی ارتقا یافته است. اما زمزمههای ایجاد یک زبان منطق گرا از دهه 70 میلادی از شمال امریکا شکل گرفته است. بعدا در نسل پنجم کامپیوترها از پرلوگ برای نوشتن کرنل سیستم عامل نیز در ایجاد پروژه سیستم FGCS استفاده شده است. 2. انواع داده ها نوع داده در پرلوگ به صورت ترم ها تعریف میشود که این ترم ها میتوانند اتم ،اعداد ،متغیرها و یا ترکیبی از ترم های دیگر باشند. اتم ها به طور کلی هیچ معنای ذاتی ندارند و یک سری رشته از حروف یا ... هستند که خواننده پرلوگ آنها را تجزیه کرده است. اتم کلمات آشکار در کد میباشند که هیچ نحو خاصی برای آنها در نظر گرفته نشده است مثل : x, blue,some,atom اعداد که میتوانند به صورت اعداد شناور و یا صحیح باشند و حتی اعدا گویا متغیر که یک رشتهٔ متشکل از حروف است که میتواند نشان دهندهٔ یک واژه باشند و ارزش آنها با توجه به پرلوگ مقداردهی داده میشود. یک واژه مرکب (عمل کننده یا functor) ترکیبی از اتم ها است که به صورت یک متغیر با آن رفتار می کنیم و نیز مجموعهای از استدلال هاست که یک نتیجه نهایی درست یا غلط را دربرمی گیرد. .واژههای مرکب در یک پرانتز تعریف میشوند و به انها عبارت های مرکب نیز اطلاق میشود. مثل
truck_year('Mazda', 1986) 'Person_Friends'(zelda,[tom,jim])
لیست ها که یک حالت خاص عبارت ها ترکیبی هستند و ساختمان داده ایی پیشرفته برای نگهداشت استدلال ها و منطق هاست و به طور کلی لیستی از اتم ها هستندو بوسیله پرانتز، نقطه و کاما نشان داده میشود. رشتهها که مجموعه ایی از کارکترها هستند برای نگهداری یونیکدها و نام های شخصیت های محلی.
3. برنامه نویسی در Prolog برنامه پرلوگ مجموعهای از روابط است که توسط بندهای خاص تعریف شده اند . این بندها محدود به بند های horn و تورینگ است که زیر مجموعه کاملی از منطق منظور اول است (first-order predicate logic) . بندها به دو دستهٔ قوانین و حقیقت ها تقسیم میشوند . یک مثال از قانون: Head :- Body. سر : -- بدن است. سر یک عضوی از بدن است . و بعد با پرس و جو های انجام شده با توجه به قوانین موجود و حقایق اولیه نتایج ثانویه که حقایق جدیدی هستند شکل میگیرد. پرس و جو ها میتوانند براساس لیست های پیوندی نیز باشد و طبق قوانین از پیش تعیین شده نتایجی را در اختیار کاربر گذاشت . مثل اندازه لیست . عنصر آخر لیست و ... . بهمین خاطر مجموعهای از کتابخانههای این زبان شکل گرفته است و در راستای آن هم دستوراتی برای چاپ دادهها و امثال آن شکل گرفته است . 4. بررسی بررسی ابتدا با یک پرس و جو شروع میشود و با توجه به حقایق موجود که درست یا غلط است نتیجه منتقل میشود. اساس کار بدین گونه است که بهدنبال اولین غلط و یا تکذیب مساله مییابد و با توجه به نوع مساله در صورت نیافتن آن همین روال را برای دیگر دادهها نیز انجام میدهد و در صورت حصول نتیجه حقیقت دادههای قبلی بصورت بازگشتی معلوم میگردد. با این استراتژی که Backtracking نیز گفته میشود اساس یافت جواب در زبان پرلوگ اطلاق میشود. به طور مثال:
mother_child(trude, sally).
father_child(tom, sally). father_child(tom, erica). father_child(mike, tom).
sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y).
parent_child(X, Y) :- father_child(X, Y). parent_child(X, Y) :- mother_child(X, Y).
و سوال پرسیده شده در دنباله آن
?- sibling(sally, erica).
Yes
طبق قانون وقتی دونفر خواهر و برادرند که والدین آنها یکی باشد پس زبان به دنبال والدین میگردد و آنها را بر می گرداند و جواب را به جای گزارههای مذکور می گذارد و طبق قانون اگر دو گزاره یکی باشند درست برمی گرداند. پس روش کلی روشی بازگشتی اثبات بندهاست و جایگزینی نتایج آنها. 5. حلقهها و بازگشت الگوریتمهای Iterative (پشت سرهمی) میتوانید بوسیله predicates بازگشتی به اجرا درآیند. سیستم های Prolog معمولا به روش بهینه سازی معروفی به نام تماس دم (tco) پایبندند که ملتزم به بازگشت قطعی است و حتما در این روش بهینه سازی می بایست به دم برسد. بهمین خاطر در روش بازگشتی از یک پشته با یک نوع محدودیت بهره میگیرد و بدین وسیله میتواند حلقههای متعدد و بازگشتی را با اطمینان به بازگشت به جواب را جوابگو باشد.
6. خنثی سازی
ایجاد یک مسند نفی و شکست باعث خنثی کردن یک استدلال میشود. حالت دیگری نیز در بر دارد بدینگونه که برای اثبات یک استدلال دنباله بازگشتی آنرا تا رسیدن به یک دم و یا انتها میرود و در صورتی که نتواند حقیقتی برای آن پیدا کند در حقیقت نتوانسته آنرا اثبات کند اما شاید هم حقیقتی مربوط به نفی آن پیدا شود که در صورت آنرا نفی میکند.
7. ملاحظات عملیاتی
یکسری قوانینی تعبیه شده است که در آن کاربر با استفاده از آن میتواند از ایجاد لوپ های تودرتو جلوگیری کند. و البته با نظم دادن به دستورات میتوان از ایجاد آنها جلوگیری کرد به طور مثال:
predicate1(X) :-
predicate2(X,X).
predicate2(X,Y) :-
predicate1(X),
X \= Y.
برای پرسش
?- predicate1(atom).
ایجاد یک حلقه بی نهایت توسط کاربر میکند ولی اگر دستورات را اینگونه نظم دهیم چنین اتفاقی نمی افتد
predicate2(X,Y) :-
X \= Y,
predicate1(X).
8. DCGs و تجزیه
یک نماد ویژهای به نام گرامرهای بند قطعی (DCGs) وجود دارد . یک قاعده تعریف شده به عنوان --> به جای -: که با استفاده از آن میتوان به تجزیه کردن و ایجاد یک رابط مناسب برای یک لیست بکار گرفت. در زیر یک مثال از این مورد را می بینید:
<sentence> ::= <stat_part> <stat_part> ::= <statement> | <stat_part> <statement> <statement> ::= <id> = <expression> ; <expression> ::= <operand> | <expression> <operator> <operand> <operand> ::= <id> | <digit> <id> ::= a | b <digit> ::= 0..9 <operator> ::= + | - | * و با استفاده از DCG sentence(S) --> statement(S0), sentence_r(S0, S). sentence_r(S, S) --> []. sentence_r(S0, seq(S0, S)) --> statement(S1), sentence_r(S1, S).
statement(assign(Id,E)) --> id(Id), [=], expression(E), [;].
expression(E) --> term(T), expression_r(T, E). expression_r(E, E) --> []. expression_r(E0, E) --> [+], term(T), expression_r(plus(E0,T), E). expression_r(E0, E) --> [-], term(T), expression_r(minus(E0, T), E).
term(T) --> factor(F), term_r(F, T). term_r(T, T) --> []. term_r(T0, T) --> [*], factor(F), term_r(times(T0, F), T).
factor(id(ID)) --> id(ID). factor(digit(D)) --> [D], { (number(D) ; var(D)), between(0, 9, D)}.
id(a) --> [a]. id(b) --> [b]. همان طور که می بینید علاوه بر مزیت های گفته شده موجب بزرگتر شدن کد نیز میشود.
9. برنامه نویسی سفارشی
یکی دیگر امکاناتی که در پرلوگ با توجه به ماهیت آن بوجود آمده است برنامه نویسی سفارشی است . با توجه به روند BachTracking و روش بهینه سازی بازگشت قطعی میتوانیم حالاتی را ایجاد کنیم که از آن طریق برنامه به طور خودکار و تنها با داشتن یک قاعده ساده به دنبال جواب در یک لیست پیوندی بگردد. به طور مثال شمارش اعداد و پیدا کردن اعداد اول. perfect(N) :-
between(1, inf, N), U is N // 2,
findall(D, (between(1,U,D), N mod D =:= 0), Ds),
sumlist(Ds, N).
10. متا - مترجم و انعکاس
یک زبان homoiconic فراهم شده است و بسیاری از امکانات را برای انعکاس را در اختیار ما می گذارد.. این زبان امکان نوشتن meta-circular evaluator را نیز فراهم می سازد که اغلب از آن به عنوان متا- مترجم یاد میشود. بدلیل آنکه برنامههای به زبان پرلوگ دنبالهای از اصطلاحات خود این زبان است بهمین دلیل خواندن آن راحت و مکانیزم ساده ایی جهت ترجمه را خواستار است.
11. روش های پیاده سازی
برای بهره وری از کد Prolog معمولا به صورت کد ماشین انتزاعی ترجمه میشود و اغلب تحت تاثیر مجموعه دستورات ثبت نامی براساس ماشین انتراعی وارن (Warren Abstract Machine (WAM)) است.برای پیاده سازی انتزاعی متناسب به نوع اصطلاحات و اطلاعات در زمان کامپایل است. برای ترجمه بهتر و نزدیک تر بودن به زبان ماشین واقعی برای عملکرد بهتر نیاز به تحقیقات مبتنی بر جامعه منطقی برنامه ریزی شده است که دو کار اساسی براساس قواعد منطقی انجام میدهد یک باینری کردن عبارات و بند ها و دیگری فراهم کردن پشته مبتنی بر ماشین مجازی.در نسل پنجم سعی شده است ماشین ها و سیستم های مبتنی بر پرلوگ نیاز های سخت افزاری این نوع برنامه سازی منطقی را نیز فراهم سازند تا سرعت اجرای آن هزاران برابر شود. بعلاوه این پرلوگ این توانایی را نیز دارد که با پردازش موازی بندها سرعت را بهبود بخشد.
12. مثال ها
در اینجا مثال هایی از برنامه ساخته شده به زبان پرلوگ را می بینیم.
12.1 . الگوریتم مرتب سازی سریع ((QuickSort
partition([], _, [], []). partition([X|Xs], Pivot, Smalls, Bigs) :-
( X @< Pivot ->
Smalls = [X|Rest],
partition(Xs, Pivot, Rest, Bigs)
; Bigs = [X|Rest],
partition(Xs, Pivot, Smalls, Rest)
).
quicksort([]) --> []. quicksort([X|Xs]) -->
{ partition(Xs, X, Smaller, Bigger) },
quicksort(Smaller), [X], quicksort(Bigger).
12.2 . ماشین تورینگ turing(Tape0, Tape) :-
perform(q0, [], Ls, Tape0, Rs),
reverse(Ls, Ls1),
append(Ls1, Rs, Tape).
perform(qf, Ls, Ls, Rs, Rs) :- !. perform(Q0, Ls0, Ls, Rs0, Rs) :-
symbol(Rs0, Sym, RsRest),
once(rule(Q0, Sym, Q1, NewSym, Action)),
action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
perform(Q1, Ls1, Ls, Rs1, Rs).
symbol([], b, []). symbol([Sym|Rs], Sym, Rs).
action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs). action(stay, Ls, Ls, Rs, Rs). action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).
left([], [], Rs0, [b|Rs0]). left([L|Ls], Ls, Rs, [L|Rs]). مثالی ساده از برنامه پیاده سازی ماشین تورینگ rule(q0, 1, q0, 1, right). rule(q0, b, qf, 1, stay).
?- turing([1,1,1], Ts). Ts = [1, 1, 1, 1] ;
12.3 . برنامه نویسی پویا
برنامه Prolog زیر استفاده میکند برنامه نویسی پویا برای یافتن توالی مشترک طولانی از دو فهرست در زمان چند جملهای: پایگاه داده بند برای memoization استفاده شده است :
- dynamic(stored/1).
memo(Goal) :- ( stored(Goal) -> true ; Goal, assertz(stored(Goal)) ).
lcs([], _, []) :- !. lcs(_, [], []) :- !. lcs([X|Xs], [X|Ys], [X|Ls]) :- !, memo(lcs(Xs, Ys, Ls)). lcs([X|Xs], [Y|Ys], Ls) :-
memo(lcs([X|Xs], Ys, Ls1)), memo(lcs(Xs, [Y|Ys], Ls2)),
length(Ls1, L1), length(Ls2, L2),
( L1 >= L2 -> Ls = Ls1 ; Ls = Ls2 ).
مثال پرس و جو ?- lcs([x,m,j,y,a,u,z], [m,z,j,a,w,x,u], Ls). Ls = [m, j, a, u]
13. ضمیمه ها
درحال حاضرتلاش در راستای توسعه این زبان برای گسترش قابلیت های برنامه سازی در جهات مختلف میباشند که این قابلیت ها عبارتند از محدودیت های برنامه نویسی منطقی (CLP)(بیشتر در تنظیمات صنعتی مانند جدول های زمان بندی) ، برنامه نویسی شی گرای منطقی (OOLP) ، همزمانی ، منطق خطی و قابلیت همکاری با پایگاههای دانش. بدین منظور نسخههایی همچون نمونههای زیر تهیه شده است: HiLog و λProlog تمدید Prolog با بالاتربردن ویژگی های برنامه نویسی سفارشی. اف منطق گسترش Prolog با قاب / اشیاء را برای نمایش دانش. OW Prolog ایجاد شده است به منظور پاسخ به عدم Prolog است از گرافیک و رابط. Logtalk یک شیء گرا منطق زبان برنامه نویسی است (بهمراه ایجاد خاصیت چندریختی و وراثت و همچنین چند نخی و همزمانی) Prolog - MPI یک منبع باز SWI - Prolog میباشد که برای محاسبات توزیع شده از طریق واسط پیام رسان اینکار را انجام میدهد. Oblog کوچک ، قابل حمل ، شیء گرا را به فرمت - Prolog توسط McDougall مارگارت از EdCAAD ، دانشگاه ادینبورگ است.
14. زبان های مرتبط
Datalog که در واقع یک زیر مجموعه از Prolog است و شرایط ترکیب را بخوبی اجازه نمیدهد و در مقابل به Prolog ، Datalog تورینگ نشده است. ویژوال پرلوگ که بیشتر به عنوان PDC prolog شناخته میشود و شی گرا میباشد و با ایجاد محیطی شی گرا فهم را در هنگام کدزنی بالا میبرد. InterProlog که یک کتابخانه برنامه نویسی شده بین جاوا و پرلوگ است. JPL که پلی بین جاوا و پرلوگ است. Prova یک زبان اسکریپ نویسی بر اساس پرلوگ است .
15. Prolog Gnu چیست؟
gnu Prolog (همچنین به نام gprolog) یک کامپایلرکد باز توسط دانیل دیاز با یک اشکال زدایی محیط تعاملی برای Prolog در دسترس در یونیکس و ویندوزمی باشد. همچنین پشتیبانی از برخی از الحاقات را به Prolog از جمله محدودیت های برنامه نویسی بیش از یک دامنه محدود ، با استفاده از تجزیه grammars بند تصریح شده ، و یک سیستم عامل و رابط را داراست. کامپایلر تبدیل کد منبع را تبدیل به بایت کد میکند که میتواند توسط یک دستگاه مترجم و یا مفسر وارون انتزاعی آن را به کد اجرایی رایج تبدیل کند.
زمانی که به پایان رسیدی بدان شروعی دوباره در کام تولد است.
|