پرولوگ

از ویکی‌پدیا، دانشنامهٔ آزاد

پرش به: ناوبری, جستجو

پرولوگ Prolog یک برنامه نویسی منطقی است که هدف کلی زبان نسل پنجم مرتبط با هوش مصنوعی و زبانشناسی محاسباتی می باشد و دارای ویژگی های پشتیبانی زبان منطقی تا حد بسیار بالا را دارد که شامل تایپ داده ایی سمبلیک و لیست های پیوندی است. بهمین خاطر این زبان را به عنوان زبان کاملا منطقی می شناسند و حتی به آن پرلوگ خالص نیز اطلاق می شود.

Prologریشه خود را بر خلاف بسیاری از زبان های برنامه نویسی دیگر از منطق صوری گرفته است. Prolog اعلانی است بدین منطورکه منطق برنامه را از لحاظ روابط بیان کرده است ، و اجرایش را بیشتر از پرس و جوها به این روابط موجب شده است. روابط و پرس و جوها با استفاده از یک نوع داده مجزا در Prolog ساخته شده است .روابط ها به این صورت تعریف می شوند که با توجه به پرس و جو ، موتور Prolog تلاش می کند برای یافتن یک تکذیب قطعنامه از پرس و جو اگر پرس و جو تکذیب می شود ، برای مثال ، یک متغیر را در نظر گرفته با یافتن خلاف حقیقت آن یا عدم یافت آن یک نتیجه ی منطقی بر می گرداند. منطق گرا بودن این زبان موجب شده است که بسیار سودمند باشد برای بانک های اطلاعاتی و ریاضیات نمادین ، زبان تجزیه و برنامه های دیگر.. از آنجا که Prolog اجازه می دهد که بررسی ارزش حقیقت predicates خاص ممکن باشد برخی از اثرات جانبی عمدی ، که از جمله چاپ یک مقدار را به روی صفحه نمایش را نیز اجازه می دهد. این اجازه از برنامه به استفاده از برخی از مقدار برنامه نویسی متعارف امری باعث می شود که الگوی منطقی خوبی در ذهن ما نسازد. 

این زبان برای اولین بار در اوایل 1970 توسط یک گروه دربرگرفته شده توسط آلن کلمرار در مارسی فرانسه بوده است. به گفته رابرت کوالسکی ، اولین سیستم Prolog در سال 1972 توسط آلن فیلیپ راسل توسعه داده شدو پیاده سازان اولین مترجم Prolog بودند ، با این حال ، دیوید اچ دی وارن با ایجاد ماشین خلاصه وارن در اوایل کامپایلر Prolog با نفوذ را نوشت و "Edinburgh Prolog" را تعریف نمود که گویشی است که اساس برای نحو بسیاری از پیاده سازی مدرن است., Prolog یکی از زبان های برنامه نویسی به منطق اول بود ، و باقی مانده است در میان از رایج ترین زبانها مانند امروز ،بخاطر پیاده سازی آزاد و تجاری به وجود آمده است. در حالی که در ابتدا در با هدف پردازش زبان طبیعی ساخته شد اما به تدریج بخاطر استفاده و پشتیبانی سیستم های خبره ، بازی ها ، سیستم پاسخ خودکار ، ontologies و سیستم های کنترل پیچیده ، تغییر کرد و محیط های Prolog مدرن و با حمایت از ایجاد واسط کاربر گرافیکی ، به عنوان برنامه های اداری و شبکه.. معرفی گردید و الحاقات بعدی از Prolog که توسط تیم اصلی ایجاد گشت محدودیت توانایی در منطق برنامه نویسی را در پیاده سازی از بین بردند.

فهرست

• 1 تاریخچه

• 2 انواع دادهها

• 3 برنامه نویسی در Prolog

• 4 بررسی

• 5 حلقه و بازگشتی

• 6 خنثی

• 7 عملیاتی ملاحظات

• 8 DCGs و تجزیه

o 8.1 مثال تجزیه کننده

• 9 عالی برنامهنویسی سفارش

• 10 متا ، مترجم و انعکاس

• 11 روش های پیاده سازی


• 12 نمونه

o 12.1 QuickSort o 12.2 تورینگ ماشین

o 12.3 پویا برنامه نویسی

• 13 ضمیمه ها

• 14 زبان های مرتبط

• 15 Prolog GNU

• 16 پیوند به بیرون




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 بند تصریح شده ، و یک سیستم عامل و رابط را داراست. کامپایلر تبدیل کد منبع را تبدیل به بایت کد می کند که می تواند توسط یک دستگاه مترجم و یا مفسر وارون انتزاعی آن را به کد اجرایی رایج تبدیل کند.


16. پیوند به بیرون

• ویلیام اف. Clocksin ، کریستوفر S. Mellish : برنامه نویسی در Prolog : با استفاده از استاندارد ایزو. Springer, 5th ed., 2003, ISBN 978-3540006787 . (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-3540629719 . کمند انداز ، 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 ، بعد. در سالهای اولیه برنامه نویسی منطق.