پرولوگ
| این مقاله دقیق، کامل و صحیح ترجمه نشده است. لطفاً این ترجمه را با توجه به نسخهٔ اصلی اصلاح کنید و سپس این الگو را از بالای صفحه بردارید. |
|
|
این مقاله نیازمند بازنویسی است. برای راهنمایی بیشتر به کپیکاری مراجعه کنید. در پایان، پس از بازنویسی این الگوی پیامی را بردارید. |
|
|
ممکن است این مقاله نیازمند ویکیسازی باشد تا با استانداردهای کیفی ویکیپدیا همخوانی یابد. خواهشمندیم با افزودن پیوندهای داخلی مرتبط، یا با بهبود چیدمان به بهبود آن کمک کنید.
برای جزئیات بیشتر روی [نمایش] کلیک کنید.
هیچ دلیلی برای این برچسب ویکیسازی ذکر نشدهاست. میتوانید دلیلتان را با استفاده از پارامتر
|
پرولوگ یک زبان برنامهنویسی منطقی چند منظوره مبتنی بر مفاهیم هوش مصنوعی و زبانشناسی محاسباتی است. این زبان بر پایه منطق ریاضی بنا نهاده شده و میتوان گفت نسبت سایر زبانهای برنامه نویسی متفاوت است. بهمین خاطر این زبان را به عنوان زبان کاملاً منطقی میشناسند و حتی به آن پرلوگ خالص نیز اطلاق میشود.
این زبان، ریشه خود را بر خلاف بسیاری از زبانهای برنامه نویسی دیگر از منطق صوری گرفته است. پس منطق برنامه را از لحاظ روابط بیان کرده است و اجرای آنها بیشتر از طریق پرس و جوها حول این روابط موجب شده میشود. باید توجه داشت که این پرس و جوها از داده های مجزایی ساخته می شوند.
منطق گرا بودن این زبان، آنرا برای بکارگیری در بانکهای اطلاعاتی، ریاضیات نمادین، زبان تجزیه و برنامههای دیگر سودمند ساخته است.
محتویات |
تاریخچه [ویرایش]
این زبان برای اولین بار در اوایل ۱۹۷۰ توسط یک گروه دربرگرفته شده توسط آلن کلمرار در مارسی فرانسه بودهاست. به گفته رابرت کوالسکی، اولین سیستم Prolog در سال ۱۹۷۲ توسط آلن فیلیپ راسل توسعه داده شد و پیادهسازان اولین مترجم Prolog بودند، با این حال، دیوید اچ دی وارن با ایجاد ماشین خلاصه وارن در اوایل کامپایلر Prolog با نفوذ را نوشت و «Edinburgh Prolog» را تعریف نمود که گویشی است که اساس برای نحو بسیاری از پیادهسازی مدرن است. Prolog یکی از زبانهای برنامه نویسی به منطق اول بود، و باقیماندهاست در میان از رایجترین زبانها مانند امروز، بخاطر پیاده سازی آزاد و تجاری به وجود آمدهاست. در حالی که در ابتدا در با هدف پردازش زبان طبیعی ساخته شد اما به تدریج بخاطر استفاده و پشتیبانی سیستمهای خبره، بازیها، سیستم پاسخ خودکار، ontologies و سیستمهای کنترل پیچیده، تغییر کرد و محیطهای Prolog مدرن و با حمایت از ایجاد واسط کاربر گرافیکی، به عنوان برنامههای اداری و شبکه.. معرفی گردید و الحاقات بعدی از Prolog که توسط تیم اصلی ایجاد گشت محدودیت توانایی در منطق برنامه نویسی را در پیاده سازی از بین بردند.
زمزمههای ایجاد یک زبان منطق گرا از دهه ۷۰ میلادی از شمال امریکا شکل گرفتهاست. بعداً در نسل پنجم کامپیوترها از پرلوگ برای نوشتن کرنل سیستمعامل نیز در ایجاد پروژه سیستم FGCS استفاده شدهاست.
انواع داده ها [ویرایش]
نوع داده در پرلوگ به صورت ترمها تعریف میشود که این ترمها میتوانند اتم، اعداد، متغیرها و یا ترکیبی از ترمهای دیگر باشند. اتمها به طور کلی هیچ معنای ذاتی ندارند و یک سری رشته از حروف یا ... هستند که خواننده پرلوگ آنها را تجزیه کرده است. اتم کلمات آشکار در کد میباشند که هیچ نحو خاصی برای آنها در نظر گرفته نشده است مثل : x, blue,some,atom اعداد که میتوانند به صورت اعداد شناور و یا صحیح باشند و حتی اعدا گویا متغیر که یک رشتهٔ متشکل از حروف است که میتواند نشان دهندهٔ یک واژه باشند و ارزش آنها با توجه به پرلوگ مقداردهی داده میشود. یک واژه مرکب (عمل کننده یا functor) ترکیبی از اتمها است که به صورت یک متغیر با آن رفتار می کنیم و نیز مجموعهای از استدلال هاست که یک نتیجه نهایی درست یا غلط را دربرمی گیرد. .واژههای مرکب در یک پرانتز تعریف میشوند و به انها عبارتهای مرکب نیز اطلاق میشود. مثل
truck_year('Mazda', 1986) 'Person_Friends'(zelda, [tom,jim])
لیستها که یک حالت خاص عبارتها ترکیبی هستند و ساختمان داده ایی پیشرفته برای نگهداشت استدلالها و منطق هاست و به طور کلی لیستی از اتمها هستندو بوسیله پرانتز، نقطه و کاما نشان داده میشود. رشتهها که مجموعه ایی از کارکترها هستند برای نگهداری یونیکدها و نامهای شخصیتهای محلی.
برنامه نویسی در پرولوگ [ویرایش]
برنامه پرلوگ مجموعهای از روابط است که توسط بندهای خاص تعریف شدهاند . این بندها محدود به بندهای horn و تورینگ است که زیر مجموعه کاملی از منطق منظور اول است (first-order predicate logic) . بندها به دو دستهٔ قوانین و حقیقتها تقسیم میشوند . یک مثال از قانون: Head :- Body. سر : -- بدن است. سر یک عضوی از بدن است . و بعد با پرس و جوهای انجام شده با توجه به قوانین موجود و حقایق اولیه نتایج ثانویه که حقایق جدیدی هستند شکل میگیرد. پرس و جوها میتوانند براساس لیستهای پیوندی نیز باشد و طبق قوانین از پیش تعیین شده نتایجی را در اختیار کاربر گذاشت . مثل اندازه لیست . عنصر آخر لیست و ... . بهمین خاطر مجموعهای از کتابخانههای این زبان شکل گرفته است و در راستای آن هم دستورهایی برای چاپ دادهها و امثال آن شکل گرفته است .
بررسی [ویرایش]
بررسی ابتدا با یک پرس و جو شروع میشود و با توجه به حقایق موجود که درست یا غلط است نتیجه منتقل میشود. اساس کار بدین گونه است که بهدنبال اولین غلط و یا تکذیب مساله مییابد و با توجه به نوع مساله در صورت نیافتن آن همین روال را برای دیگر دادهها نیز انجام میدهد و در صورت حصول نتیجه حقیقت دادههای قبلی بصورت بازگشتی معلوم میگردد. با این استراتژی که 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
طبق قانون وقتی دونفر خواهر و برادرند که والدین آنها یکی باشد پس زبان به دنبال والدین میگردد و آنها را بر می گرداند و جواب را به جای گزارههای مذکور می گذارد و طبق قانون اگر دو گزاره یکی باشند درست برمی گرداند. پس روش کلی روشی بازگشتی اثبات بندهاست و جایگزینی نتایج آنها.
حلقهها و بازگشت [ویرایش]
الگوریتمهای Iterative (پشت سرهمی) میتوانید بوسیله predicates بازگشتی به اجرا درآیند. سیستمهای Prolog معمولاً به روش بهینه سازی معروفی به نام تماس دم (tco) پایبندند که ملتزم به بازگشت قطعی است و حتماً در این روش بهینه سازی می بایست به دم برسد. بهمین خاطر در روش بازگشتی از یک پشته با یک نوع محدودیت بهره میگیرد و بدین وسیله میتواند حلقههای متعدد و بازگشتی را با اطمینان به بازگشت به جواب را جوابگو باشد.
خنثی سازی [ویرایش]
ایجاد یک مسند نفی و شکست باعث خنثی کردن یک استدلال میشود. حالت دیگری نیز در بر دارد بدینگونه که برای اثبات یک استدلال دنباله بازگشتی آنرا تا رسیدن به یک دم و یا انتها میرود و در صورتی که نتواند حقیقتی برای آن پیدا کند در حقیقت نتوانسته آنرا اثبات کند اما شاید هم حقیقتی مربوط به نفی آن پیدا شود که در صورت آنرا نفی میکند.
ملاحظات عملیاتی [ویرایش]
یکسری قوانینی تعبیه شده است که در آن کاربر با استفاده از آن میتواند از ایجاد لوپهای تودرتو جلوگیری کند. و البته با نظم دادن به دستورات میتوان از ایجاد آنها جلوگیری کرد به طور مثال:
predicate1(X) :-
predicate2(X,X).
predicate2(X,Y) :-
predicate1(X), X \= Y.
برای پرسش
?- predicate1(atom).
ایجاد یک حلقه بی نهایت توسط کاربر میکند ولی اگر دستورات را اینگونه نظم دهیم چنین اتفاقی نمیافتد
predicate2(X,Y) :-
X \= Y, predicate1(X).
تجزیه DCGها [ویرایش]
یک نماد ویژهای به نام گرامرهای بند قطعی (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]. همان طور که می بینید علاوه بر مزیتهای گفته شده موجب بزرگتر شدن کد نیز میشود.
برنامه نویسی سفارشی [ویرایش]
یکی دیگر امکاناتی که در پرلوگ با توجه به ماهیت آن بوجود آمده است برنامه نویسی سفارشی است . با توجه به روند 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).
متا - مترجم و انعکاس [ویرایش]
یک زبان homoiconic فراهم شده است و بسیاری از امکانات را برای انعکاس را در اختیار ما می گذارد.. این زبان امکان نوشتن meta-circular evaluator را نیز فراهم می سازد که اغلب از آن به عنوان متا- مترجم یاد میشود. بدلیل آنکه برنامههای به زبان پرلوگ دنبالهای از اصطلاحات خود این زبان است بهمین دلیل خواندن آن راحت و مکانیزم ساده ایی جهت ترجمه را خواستار است.
روشهای پیاده سازی [ویرایش]
برای بهره وری از کد Prolog معمولاً به صورت کد ماشین انتزاعی ترجمه میشود و اغلب تحت تاثیر مجموعه دستورات ثبت نامی براساس ماشین انتراعی وارن (Warren Abstract Machine (WAM)) است.برای پیاده سازی انتزاعی متناسب به نوع اصطلاحات و اطلاعات در زمان کامپایل است. برای ترجمه بهتر و نزدیک تر بودن به زبان ماشین واقعی برای عملکرد بهتر نیاز به تحقیقات مبتنی بر جامعه منطقی برنامه ریزی شده است که دو کار اساسی براساس قواعد منطقی انجام میدهد یک باینری کردن عبارات و بندها و دیگری فراهم کردن پشته مبتنی بر ماشین مجازی.در نسل پنجم سعی شده است ماشینها و سیستمهای مبتنی بر پرلوگ نیازهای سختافزاری این نوع برنامه سازی منطقی را نیز فراهم سازند تا سرعت اجرای آن هزاران برابر شود. بعلاوه این پرلوگ این توانایی را نیز دارد که با پردازش موازی بندها سرعت را بهبود بخشد.
مثال ها [ویرایش]
در اینجا مثال هایی از برنامه ساخته شده به زبان پرلوگ را می بینیم.
الگوریتم مرتب سازی سریع [ویرایش]
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).
ماشین تورینگ [ویرایش]
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] ;
برنامه نویسی پویا [ویرایش]
برنامه 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]
ضمیمه ها [ویرایش]
درحال حاضرتلاش در راستای توسعه این زبان برای گسترش قابلیتهای برنامه سازی در جهات مختلف میباشند که این قابلیتها عبارتند از محدودیتهای برنامه نویسی منطقی (CLP)(بیشتر در تنظیمات صنعتی مانند جدولهای زمان بندی)، برنامه نویسی شی گرای منطقی (OOLP)، همزمانی، منطق خطی و قابلیت همکاری با پایگاههای دانش. بدین منظور نسخههایی همچون نمونههای زیر تهیه شده است: HiLog و λProlog تمدید Prolog با بالاتربردن ویژگیهای برنامه نویسی سفارشی. اف منطق گسترش Prolog با قاب / اشیاء را برای نمایش دانش. OW Prolog ایجاد شده است به منظور پاسخ به عدم Prolog است از گرافیک و رابط. Logtalk یک شیء گرا منطق زبان برنامه نویسی است (بهمراه ایجاد خاصیت چندریختی و وراثت و همچنین چند نخی و همزمانی) Prolog - MPI یک منبع باز SWI - Prolog میباشد که برای محاسبات توزیع شده از طریق واسط پیام رسان اینکار را انجام میدهد. Oblog کوچک، قابل حمل، شیء گرا را به فرمت - Prolog توسط McDougall مارگارت از EdCAAD، دانشگاه ادینبورگ است.
زبانهای مرتبط [ویرایش]
Datalog که در واقع یک زیر مجموعه از Prolog است و شرایط ترکیب را بخوبی اجازه نمیدهد و در مقابل به Prolog ، Datalog تورینگ نشده است. ویژوال پرلوگ که بیشتر به عنوان PDC prolog شناخته میشود و شی گرا میباشد و با ایجاد محیطی شی گرا فهم را در هنگام کدزنی بالا میبرد. InterProlog که یک کتابخانه برنامه نویسی شده بین جاوا و پرلوگ است. JPL که پلی بین جاوا و پرلوگ است. Prova یک زبان اسکریپ نویسی بر اساس پرلوگ است .
Prolog Gnu چیست؟ [ویرایش]
gnu Prolog (همچنین به نام gprolog) یک کامپایلرکد باز توسط دانیل دیاز با یک اشکال زدایی محیط تعاملی برای Prolog در دسترس در یونیکس و ویندوزمی باشد. همچنین پشتیبانی از برخی از الحاقات را به Prolog از جمله محدودیتهای برنامه نویسی بیش از یک دامنه محدود، با استفاده از تجزیه grammars بند تصریح شده، و یک سیستمعامل و رابط را داراست. کامپایلر تبدیل کد منبع را تبدیل به بایت کد میکند که میتواند توسط یک دستگاه مترجم و یا مفسر وارون انتزاعی آن را به کد اجرایی رایج تبدیل کند.
پیوند به بیرون [ویرایش]
- ویلیام اف. Clocksin، کریستوفر S. Mellish : برنامه نویسی در Prolog : با استفاده از استاندارد ایزو. Springer, 5th ed., 2003, ISBN 978-3-540-00678-7 . (This edition is updated for ISO Prolog. Previous editions described Edinburgh Prolog.) کمند انداز ، 5th اد. ، 2003، شابک 978-3540006787. (این نسخه به روز شده در تاریخ ایزو Prolog است. نسخههای قبلی شرح ادینبورگ Prolog).
- William F. Clocksin: Clause and Effect. ویلیام اف. Clocksin : بند و اثر. Prolog Programming for the Working Programmer . برنامه نویسی Prolog برای برنامه کاری. Springer, 2003, ISBN 978-3-540-62971-9 . کمند انداز ، 2003، شابک 978-3540629719.
- Michael A. Covington , Donald Nute, Andre Vellino, Prolog Programming in Depth , 1996, ISBN 0-13-138645-X . مایکل A. Covington، دونالد Nute، آندره Vellino، برنامه نویسی Prolog در عمق ، 1996، شابک 0 - 13 - 138645 - X.
- Michael A. Covington, Natural Language Processing for Prolog Programmers , 1994, ISBN 0-13-62921 مایکل A. Covington، بیشتر برای پردازش زبان برنامه نویسی Prolog ، 1994، شابک 0-13-62921
- Robert Smith, John Gibson, Aaron Sloman : 'POPLOG's two-level virtual machine support for interactive languages', in Research Directions in Cognitive Science Volume 5: Artificial Intelligence , Eds D. Sleeman and N. Bernsen, Lawrence Erlbaum Associates, pp 203-231, 1992. رابرت اسمیت، جان گیبسون، هارون Sloman : 'POPLOG دو سطح پشتیبانی از ماشین مجازی را برای زبانهای تعاملی'، راهنمایی در پژوهش در علوم شناختی جلد 5 : هوش مصنوعی ، Eds D. Sleeman و N. Bernsen، لارنس Erlbaum همکاران، ص 203 -- 231 ، 1992.
- Leon Sterling and Ehud Shapiro , The Art of Prolog: Advanced Programming Techniques , 1994, ISBN 0-262-19338-8 . لئون استرلینگ و اهود Shapiro، هنر Prolog : جستجوی پیشرفته برنامه نویسی فنون ، 1994، شابک 0-262-19338-8.
- Ivan Bratko , PROLOG Programming for Artificial Intelligence , 2000, ISBN 0-201-40375-7 . ایوان Bratko، برنامه PROLOG به هوش مصنوعی ، 2000، شابک 0-201-40375-7.
- Robert Kowalski, The Early Years of Logic Programming , CACM January 1988. رابرت Kowalski، در سالهای اولیه برنامه نویسی در منطق ، CACM ژانویه 1988.
- ISO/IEC 13211: Information technology — Programming languages — Prolog . International Organization for Standardization , Geneva. ایزو 13211 : فناوری اطلاعات -- زبانهای برنامه نویسی -- Prolog. سازمانهای بینالمللی استانداردسازی، ژنو.
- Alain Colmerauer and Philippe Roussel, The birth of Prolog , in The second ACM SIGPLAN conference on History of programming languages , p. آلن Colmerauer و فیلیپ Roussel، تولد Prolog، در این کنفرانس SIGPLAN دوم ACM در تاریخچه زبانهای برنامه نویسی، ص. 37-52, 1992. 37-52 ، 1992.
- Richard O'Keefe , The Craft of Prolog , ISBN 0-262-15039-5 . ریچارد O'Keefe، این پیشه از Prolog، شابک 0-262-15039-5.
- Patrick Blackburn, Johan Bos, Kristina Striegnitz, Learn Prolog Now! , 2006, ISBN 1-904987-17-6 . پاتریک بلک بورن ، Johan Bos، کریستینا Striegnitz، یادگیری Prolog کن! ، 2006، شابک 1-904987-17-6.
- David HD Warren, Luis M. Pereira and Fernando Pereira, Prolog - the language and its implementation compared with Lisp. دیوید HD وارن، لوئیس M. Pereira و فرناندو Pereira ، Prolog -- زبان و پیاده سازی آن در مقایسه با لیسپ. ACM SIGART Bulletin archive, Issue 64. ACM SIGART بایگانی نشریه، شماره 64. Proceedings of the 1977 symposium on Artificial intelligence and programming languages, pp 109 - 115. مجموعه مقالات کنفرانس در سال 1977 در سمپوزیوم هوش مصنوعی و زبانهای برنامه نویسی، ص 109 -- 115.
1. ^ Kowalski, RA. The early years of logic programming . ^ Kowalski، بعد. در سالهای اولیه برنامه نویسی منطق.
|
|||||||||||