در این مطلب با مقاله معرفی زبان برنامه نویسی Prolog از وب سایت آموزش برنامه نویسی سورس باران در خدمت شما هستیم. Prolog (پرولوگ) مخفف عبارت Programming Logic، یک زبان برنامه نویسی سطح بالا مبتنی بر منطق رسمی است. پرولوگ گاهی اوقات یک زبان رسمی یا یک زبان مبتنی بر قانون نامیده می شود، زیرا برنامه های آن شامل یک لیست از حقایق و قوانین است. Prolog به طور گسترده ای برای اپلیکیشن های هوش مصنوعی، به ویژه سیستم های متخصص استفاده می شود.
معرفی زبان برنامه نویسی Prolog
Prolog چیست؟
پرولوگ یک زبان برنامه نویسی منطقی چند منظوره مبتنی بر مفاهیم هوش مصنوعی و زبان شناسی محاسباتی است. این زبان بر پایه منطق ریاضی بنا نهاده شده و آن را به عنوان زبان کاملاً منطقی میشناسند و حتی به آن پرلوگ خالص نیز اطلاق میشود و میتوان گفت متفاوت از سایر زبانهای برنامه نویسی است. این زبان، ریشه خود را بر خلاف بسیاری از زبانهای برنامه نویسی دیگر از منطق صوری گرفتهاست. پس منطق برنامه را از لحاظ روابط بیان کرده و اجرای آنها بیشتر از طریق پرس و جوها حول این روابط انجام میشود. باید توجه داشت که این پرس و جوها از دادههای مجزایی ساخته میشوند. منطق گرا بودن این زبان، آن را برای بکارگیری در بانکهای اطلاعاتی، ریاضیات نمادین، زبان تجزیه و کاربردهای دیگر سودمند ساخته است.
- یادگیری ماشینی
- برنامه ریزی ربات
- استدلال خودکار
- حل مشکل
- بازیابی پایگاه داده هوشمند
- فهم زبان طبیعی
- زبان مشخصات
تاریخچه زبان برنامه نویسی Prolog
این زبان برای اولین بار در اوایل ۱۹۷۰ توسط گروهی به سرپرستی «آلن کلمرار» در مارسی فرانسه به وجود آمد و اولین سیستم Prolog در سال ۱۹۷۲ توسط کلمرار و فیلیپ راسل توسعه داده شد. با این حال، دیوید اچ دی وارن با ایجاد ماشین خلاصه وارن در اوایل کامپایلر Prolog با نفوذ را نوشت و «Edinburgh Prolog» را تعریف نمود که گویشی است که اساس برای نحو بسیاری از پیادهسازی مدرن است. Prolog یکی از زبانهای برنامه نویسی منطق مرتبه اول بود، و امروزه رایجترین این گونه زبانها باقی ماندهاست، همراه با تعداد زیادی از پیادهسازیهای آن که به صورت رایگان و تجاری در دسترس هستند. در حالی که در ابتدا با هدف پردازش زبان طبیعی ساخته شد اما به تدریج بخاطر استفاده و پشتیبانی سیستمهای خبره، بازیها، سیستم پاسخ خودکار، ontologies و سیستمهای کنترل پیچیده، تغییر کرد و محیطهای Prolog مدرن و با حمایت از ایجاد واسط کاربر گرافیکی، به عنوان برنامههای اداری و شبکه.. معرفی گردید و الحاقات بعدی از Prolog که توسط تیم اصلی ایجاد گشت محدودیت توانایی در منطق برنامهنویسی را در پیادهسازی از بین بردند. زمزمههای ایجاد یک زبان منطق گرا از دهه ۷۰ میلادی از شمال آمریکا شکل گرفت. بعداً در نسل پنجم رایانهها نیز از پرولوگ برای نوشتن کرنل سیستمعامل نیز در ایجاد پروژه سیستم FGCS استفاده شد.
انواع داده در برنامه نویسی Prolog
نوع داده در پرلوگ به صورت ترمها تعریف میشود که این ترمها میتوانند اتم، اعداد، متغیرها یا ترکیبی از ترمهای دیگر باشند.
- اتمها به طور کلی هیچ معنای ذاتی ندارند و یک سری رشته از حروف یا اعداد هستند که خواننده پرلوگ آنها را تجزیه کردهاست. اتم کلمات آشکار در کد میباشند که هیچ نحو خاصی برای آنها در نظر گرفته نشدهاست مثل: x, blue,some,atom
- اعداد که میتوانند به صورت اعداد شناور یا صحیح باشند و حتی اعدا گویا.
- متغیر که یک رشتهٔ متشکل از حروف است که میتواند نشان دهندهٔ یک واژه باشند و ارزش آنها با توجه به Prolog مقداردهی داده میشود.
- یک ترم مرکب (عملکننده یا functor) ترکیبی از اتمها است که به صورت یک متغیر با آن رفتار میکنیم و نیز مجموعهای از استدلال هاست که یک نتیجه نهایی درست یا غلط را دربرمی گیرد. . واژههای مرکب در یک پرانتز تعریف میشوند و به آنها عبارتهای مرکب نیز اطلاق میشود. مثل
truck_year('Mazda', 1986) 'Person_Friends'(zelda, [tom,jim])
لیستها که یک حالت خاص عبارتها ترکیبی هستند و ساختمان داده ایی پیشرفته برای نگهداشت استدلالها و منطق هاست و بهطور کلی لیستی از اتمها هستندو به وسیلهٔ پرانتز، نقطه و کاما نشان داده میشود. رشتهها که مجموعه ایی از کارکترها هستند برای نگهداری یونیکدها و نامهای شخصیتهای محلی.
ماژول ها در برنامه نویسی Prolog
برای برنامه ریزیهای بزرگ، Prolog یک سیستم ماژول فراهم میکند. این سیستم ماژول توسط ISO استاندارد شدهاست. با این وجود، تمام کامپایلرهای Prolog از ماژول پشتیبانی نمیکنند و مشکلات سازگاری بین سیستمهای ماژول از کامپایلرهای بزرگ Prolog وجود دارد. در نتیجه، ماژولهای نوشته شده در یک کامپایلر Prolog لزوما بر روی دیگری کار نمیکنند.
برنامه نویسی در پرولوگ
برنامه پرلوگ مجموعهای از روابط است که توسط بندهای خاص تعریف شدهاند. این بندها محدود به بندهای horn و تورینگ است که زیر مجموعه کاملی از منطق منظور اول است (first-order predicate logic). بندها به دو دستهٔ قوانین و حقیقتها تقسیم میشوند. یک مثال از قانون: Head :- Body. سر: — بدن است. سر یک عضوی از بدن است؛ و بعد با پرس و جوهای انجام شده با توجه به قوانین موجود و حقایق اولیه نتایج ثانویه که حقایق جدیدی هستند شکل میگیرد. پرس و جوها میتوانند براساس لیستهای پیوندی نیز باشد و طبق قوانین از پیش تعیین شده نتایجی را در اختیار کاربر گذاشت. مثل اندازه لیست. عنصر آخر لیست و … . به همین خاطر مجموعهای از کتابخانههای این زبان شکل گرفتهاست و در راستای آن هم دستورهایی برای چاپ دادهها و امثال آن شکل گرفتهاست.
بررسی در برنامه نویسی Prolog
بررسی ابتدا با یک پرس و جو شروع میشود و با توجه به حقایق موجود که درست یا غلط است نتیجه منتقل میشود. اساس کار بدین گونه است که بهدنبال اولین غلط یا تکذیب مسئله مییابد و با توجه به نوع مسئله در صورت نیافتن آن همین روال را برای دیگر دادهها نیز انجام میدهد و در صورت حصول نتیجه حقیقت دادههای قبلی به صورت بازگشتی معلوم میگردد. با این استراتژی که 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
طبق قانون وقتی دونفر خواهر و برادرند که والدین آنها یکی باشد پس زبان به دنبال والدین میگردد و آنها را برمیگرداند و جواب را به جای گزارههای مذکور میگذارد و طبق قانون اگر دو گزاره یکی باشند درست برمیگرداند. پس روش کلی روشی بازگشتی اثبات بندهاست و جایگزینی نتایج آنها.
حلقه ها و بازگشت در برنامه نویسی Prolog
الگوریتمهای Iterative (پشت سرهمی) میتوانید به وسیلهٔ predicates بازگشتی به اجرا درآیند. سیستمهای Prolog معمولاً به روش بهینهسازی معروفی به نام تماس دم (tco) پایبندند که ملتزم به بازگشت قطعی است و حتماً در این روش بهینهسازی میبایست به دم برسد. به همین خاطر در روش بازگشتی از یک پشته با یک نوع محدودیت بهره میگیرد و بدین وسیله میتواند حلقههای متعدد و بازگشتی را با اطمینان به بازگشت به جواب را جوابگو باشد.
خنثی سازی در برنامه نویسی Prolog
ایجاد یک مسند نفی و شکست باعث خنثی کردن یک استدلال میشود. حالت دیگری نیز در بردارد بدینگونه که برای اثبات یک استدلال دنباله بازگشتی آن را تا رسیدن به یک دم یا انتها میرود و در صورتی که نتواند حقیقتی برای آن پیدا کند در حقیقت نتوانسته آن را اثبات کند اما شاید هم حقیقتی مربوط به نفی آن پیدا شود که در صورت آن را نفی میکند.
ملاحضات عملیاتی در برنامه نویسی Prolog
یکسری قوانینی تعبیه شدهاست که در آن کاربر با استفاده از آن میتواند از ایجاد لوپهای تودرتو جلوگیری کند؛ و البته با نظم دادن به دستورها میتوان از ایجاد آنها جلوگیری کرد به طور مثال:
predicate1(X) :- predicate2(X,X). predicate2(X,Y) :- predicate1(X), X \= Y.برای پرسش
?- predicate1(atom).
ایجاد یک حلقه بینهایت توسط کاربر میکند ولی اگر دستورها را اینگونه نظم دهیم چنین اتفاقی نمیافتد
predicate2(X,Y) :- X \= Y, predicate1(X).
تجزیه در برنامه نویسی Prolog
یک نماد ویژهبه نام گرامرهای قطعی (DCGs) وجود دارد. یک قاعده تعریف شده به عنوان -> به جای -: که با استفاده از آن میتوان به تجزیه کردن و ایجاد یک رابط مناسب برای یک لیست بکار گرفت. DCGها اغلب برای نوشتن پارسرها یا ژنراتورهای لیست استفاده میشوند، زیرا آنها همچنین یک رابط کاربری مناسب برای لیستهای متفاوت فراهم میکنند. در زیر یک مثال از این مورد را میبینید:
<sentence> ::= <stat_part> <stat_part> ::= <statement> | <stat_part> <statement> <statement> ::= <id> = <expression> ; <expression> ::= <operand> | <expression> <operator> <operand> <operand> ::= <id> | <digit> <id> ::= a | b <digit> ::= ۰..۹ <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].
برنامه نویسی سفارشی Prolog
یکی دیگر امکاناتی که در پرلوگ با توجه به ماهیت آن به وجود آمدهاست برنامهنویسی سفارشی است. با توجه به روند 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).
استفاده از برنامه نویسی Prolog در صنعت
Prolog در Watson مورد استفاده قرار گرفتهاست. Watson از نرم افزار DeepQA IBM و Apache UIMA استفاده میکند. این سیستم در زبانهای مختلف نوشته شده بود، از جمله Java، C ++ و Prolog . این زبان برای تطبیق الگو با درختان تجزیه طبیعی استفاده میشود.توسعه دهندگان اظهار داشتند: “ما نیاز به یک زبان داشتیم که میتوانستیم به راحتی قوانین تطبیق الگوی بر روی درختان تجزیه و سایر حاشیه نویسیها (مانند نتایج نامفهوم نامیده شده) را بیان کنیم و یک تکنولوژی که بتواند این قوانین را بسیار مؤثر اجرا کند. توسعه دهندگان اظهار داشتند: “ما نیاز به یک زبان داشتیم که میتوانستیم به راحتی قوانین تطبیق الگوی بر روی درختان تجزیه و سایر حاشیه نویسیها (مانند نتایج نامفهوم نامیده شده) را بیان کنیم و یک تکنولوژی که بتواند این قوانین را بسیار مؤثر اجرا کند.
مثالی از برنامه نویسی Prolog
الگوریتم مرتبسازی سریع
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<span class="o">(</span>q0, <span class="m">1</span>, q0, <span class="m">1</span>, right<span class="o">)</span>.
rule<span class="o">(</span>q0, b, qf, <span class="m">1</span>, stay<span class="o">)</span>.
?- turing<span class="o">([</span><span class="m">1</span>,1،1<span class="o">]</span>, Ts<span class="o">)</span>.
<span class="nv">Ts</span> <span class="o">=</span> <span class="o">[</span><span class="m">1</span>, <span class="m">1</span>, <span class="m">1</span>, <span class="m">1</span><span class="o">]</span> <span class="p">;</span>
برنامه نویسی پویا در پرولوگ
برنامه 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]
زبانهای مرتبط با برنامه نویسی پرولوگ
- زبان Gödel یک پیادهسازی شدید از برنامهریزی منطقی محدودیت است. این زبان بر روی SICSless Prolog ساخته شدهاست.
- Visual Prolog، که قبلاً به نام PDC Prolog و Turbo Prolog شناخته میشد، Prolog شی گرا است و بسیار متفاوت از Prolog استاندارد است.
- Datalog یک زیر مجموعه از Prolog است. این محدود به روابطی است که ممکن است طبقهبندی شوند و شرایط ترکیب را اجازه ندهند. در مقایسه با Prolog، Datalog تورینگ کامل نیست.
- GraphTalk یک پیادهسازی اختصاصی ماشین Abstract Machine است که خواصیت شی گرایی دارد.
- در برخی موارد [که؟] Prolog یک زیر مجموعه از Planner است. ایدهها در Planner بعدها در متافور علمی جامعه گسترش یافت.
- AgentSpeak یک نوع از Prolog برای رفتار برنامه نویسان در سیستمهای چند عامل است.
- Erlang با پیادهسازی مبتنی بر Prolog آغاز شد و بسیاری از نحوهای مبتنی بر متحد کردن Prolog را حفظ میکند.
Prolog از زبان های برنامه نویسی هوش مصنوعی در سال ۲۰۱۹
توسعه دهندگان هوش مصنوعی از زبان پرولوگ به دلیل سطح بالای انتزاع ، موتور جستجو درونی و غیره قدردانی میکنند. زبان پرولوگ یکی از معدود زبانهایی است که از الگوی برنامهنویسی اعلانی استفاده مینماید. منحنی یادگیری برای این زبان بسیار بالا است. Prolog زبانی برای اجرای الگوریتم ها با یک جستجوی ضمنی بزرگ از گزینهها (استنتاج منطقی، یافتن وابستگی، حرکتهای جستجو ) است که آن را به گزینه خوبی برای هوش مصنوعی تبدیل کرده است. و دارای ویژگی های زیر را دارا می باشد:
- ساختار برنامه نویسی انعطافپذیر و قدرتمند ؛
- ساختاربندی اطلاعات براساس ساختار درختی ؛
- گزینه خودکار rollback؛
برگرفته از wikipedia
مشاهده جلسات قبل معرفی زبان های برنامه نویسی
- زبان برنامه نویسی سی و سی پلاس پلاس
- معرفی زبان برنامه نویسی پایتون
- Ruby چیست؟ بررسی زبان برنامه نویسی روبی
- زبان برنامه نویسی PHP چیست؟
- زبان برنامه نویسی Lua چیست؟
- کاتلین (Kotlin) چیست؟ توضیح زبان برنامه نویسی کاتلین
- Ada چیست؟ معرفی زبان برنامه نویسی Ada
- زبان برنامه نویسی COBOL چیست؟ شرح کامل COBOL
- معرفی زبان برنامه نویسی Cython
- زبان برنامه نویسی Elixir چیست؟ معرفی کامل Elixir (الیکسیر)
- کاملترین معرفی زبان برنامه نویسی Groovy
- زبان برنامه نویسی Rust چیست؟ کاملترین معرفی زبان برنامه نویسی Rust
- زبان برنامه نویسی Scala چیست؟ معرفی،ویژگی ها و کاربرد Scala
- معرفی زبان برنامه نویسی Haskell
- معرفی زبان برنامه نویسی Lisp (لیسپ)
The post معرفی زبان برنامه نویسی Prolog appeared first on آموزش برنامه نویسی.