بســـــم الله الرحمن الرحـــيم اللهم صلي على سيدنا محمد وعلى آله وصحبه أجمعين سنقدم في هذه الدوره ان شاء الله دروس لتعلم البرمجه بلغة البرولوغ ( PROLOG ) نبدأعلى بركة الله .. الدرس الأول النسخه التي اعتمدها في تطبيق هذه الدوره هي version 4.000 of WIN-PROLOG ولتنصيب هذه النسخه ( وكذالك الامر لباقي النسخ ) من خلال النقر على SETUP.EXE ومن ثم تشغيل واجهة البرنامج ( المترجم ) .. Resized to 75% (was 873 x 475) - Click image to enlarge ثم بعد تشغيل المترجم يبدأ بقراءة ملفات البرامج و وقبول الاستفسارت والاسئله الخاصه بالبرنامج او الاستعلامات التي نريدها . وللخروج من المترجم فقط قم بكتابة halt ويتبعها طبعا "." plain text halt. طبعا ملفات البرولوغ دائما تكون بامتداد pl. او pro. مقدمه :- لغة البرولوغ تسمى لغة تعريفيه واجرائيه ( تعريفيه بمعنى انها تعرف وتحدد ما يجب ان تكون عليه المخرجات واجرائيه بمعنى انها تعرف كيف يتم الحصول على المخرجات ) مكونات لغة البرولوغ :- 1:- declaring :- بعض الحقائق عن المواضيع(العوامل ) والعلاقات بينها . 2:- defining :- تعريف القواعد والشروط بين المواضيع والعلاقات بينها . 3:- asking :- اسئله عن هذه المواضيع وعن العلاقات بينها . مكونات الجمل كما اشرنا لها سابقا :- 1:- Fact :- الحقائق والمعارف . 2:- Rules :- العلاقات والقواعد بينها وتشبه عمل ال Function في لغات البرمجه الاخرى مثل الجافا والسي ++ وتحتوي على If/then . 3:- Queries :- الاسئله والاستعلامات في المترجم والتي يتم العبور بها الى الحقائق والقواعد ومن ثم بداية البرامج التي قمنا بها . بكل بساطه لغة البرولوغ تجعل جهاز الحاسوب يستخدم كمستودع للحقائق والعلاقات بينها , وتوفر سبل للوصول للاستنتاجات . الحقائق ( Fact ) الحقائق في لغة البرولوغ تعبر عن العلاقات بين المواضيع( العوامل) من خلال المعطى الذي يمثل المعرفه . Live(monkey,forest وهنا في الجمله السابقه Live تمثل العلاقه بين monkey و forest ... ( اي ان القرد يعيش في الغابه ) والجمله كامله بكل محتوياها تسمى clause يطلق على المواضيع ( العوامل ) بــــ arguments ويطلق على العلاقات بينها بـــــ predicate Rules ( القواعد) تحتوي على جزئيين هما :- 1:- جزء الشرط ----------> body of clause 2:- جزء الهدف ----------> head of clause Queries ( الاستعلام ) الاستعلام او الاسئله حيث تكبت في المترجم فيقوم المحرك ( engine ) بتتبع الهدف من خلال الحقائق والقواعد الموجوده في قاعدة المعرفه ( ملاحظه مجموعة الحقائق والقواعد في البرولوغ تسمى قاعدة المعارف ) . كيف يكون استخدام الاسئله او الاستعلام في البرولوغ ؟ عندما يتم طرح سؤال في البرولوغ , يصار الى البحث في قاعدة البيانات والتي اشرنا انها تمثل الحقائق والعلاقات بنها ( القواعد) , ومن ثم يبحث عن الحقائق التي تطابق الاستعلام في السؤال , لذا فاذا وجد هذه الحقائق التي تطابق فيكون الجواب بـــ " Yes " والعكس يكون "No " . أمر مهم جدا :- اسماء المواضيع والعلاقات بينها يجب ان تبدأ بأحرف صغيره ( lowercase letter ). والحقائق والجمل يجب ان تنتهي بــــ " . " مثال :- plain text father(khaled, mohammad). ---- اين نكتب برنامج البرولوغ ؟ الحقائق والقواعد تخزن في ملفات تمثل ما يسمى قاعدة المعارف , ثم عندما نريد العمل عليها نقوم بتحميل هذه القاعدة من المعارف الى المترجم , وعندما نغير اي معلومه في هذه الملفات فيصار الى اعادة تحميلها مره اخرى الى المترجم ( لكي يتم تفعيلها مره اخرى ) . ---- قراءة ملفات البرامج plain text consult (filename). --- Prolog Syntax هنالك العديد من الشروط التي يجب مراعاتها عند كتابة الثوابت والمتغيرات بالاضافه الى الانواع :- الــ Atoms يجب ان تتكون من الاحرف التاليه(شروط) :- 1:- The upper-case letters 2:- The lower-case letters 3:- The digits 4:-The special characters مثل plain text +, -, *, /, <, >, =, :, ., &, ~, _ ولكن الشرط المهم هو انه عند كتابة ال Atoms لا يجب ان تبدأ بـــ upper-case letters او "_" . امثله على الــ Atoms :- plain text krrk, x15, x_, x___y, ahmad_khaled plain text <---> , ==>, … , .:. , ::= باستثاء هذا الرمز " :- " لانه يمثل جزء من ادوات اللغه ( كما اشرنا سابقا من انه يفصل بين الشرط والهدف في القواعد ) . ممكن ان تكتب هكذا لكن بشرط وجود ' ' plain text 'Mohammad' , 'Othman Khaled ' الــ Numbers أعداد صحيحه plain text 100 ,20 ,-90, 0 أعداد حقيقيه plain text 3.99, -0.0001 , 10000.004 الــ Variables تتكون من احرف وارقام و ايظا " _ " , وتبدا بــ upper-case او " _ " . ملاحظة :- عن استخدام " _ " بشكل فردي فلها معنى خاص حيث تسمى متغير مجهول . ونطاق عمل الـــ Variables يكون في الـــ clause متظمنه داخلها .. بمعنى اخر انه مثلا X16 يمثل متغير , وعندما يتواجد في 2 clause فهو يمثل متغيران اثنان مختلفان عن بعض , اما عندما يكون هتالك اكثر من X16 ولكن في نفس الــ clause فكلها تمثل نفس المتغير وتعود له . الـــ Structures plain text date (3, jan, 1982) وتحتوي على اكثر من عامل , ويمكن ان تكون هذه العوامل متغيرات مثل :- plain text date (Day, jan, 1982) وهذا يعني ان اليوم اصبح متغير , وهذا يعطي اي يوم في شهر jan وفي سنة 1982 . الدرس الثاني كما قلنا سابقا قاعدة المعارف في البرولوغ تمثل Fact و Rules .. سنضع مثال على هذه الحقائق والقواعد وكيف يتم تمثيلها بالشكل الطبيعي ( اللغة الانجليزيه ). الحقائق تمثل التعريف بالعوامل ( اي تثبيت الحقائق التي ستبنى عليها القواعد ) ثم اعطاء كل شخص صلة قرابته بالاخر . لنستطيع فهم المثال لاحظ التالي :- اما كتابتها بصيغة لغة برولوغ فتكون كالتالي :- هذا المثال فقط لتوضيح مبدأ الحقائق والقوعد بينها , وكيفية صياغتها بلغة البرولوغ . ==== نبدأ من هنا الشرح التطبيقي للغة برولوغ مع ذكر امثله . 1:- امتداد ملفات البرولوغ تكون pl. 2:- في حالة استدعاء المترجم تظهر اشارة
halt.
father(khaled, mohammad).
consult (filename).
+, -, *, /, <, >, =, :, ., &, ~, _
krrk, x15, x_, x___y, ahmad_khaled
<---> , ==>, … , .:. , ::=
'Mohammad' , 'Othman Khaled '
100 ,20 ,-90, 0
3.99, -0.0001 , 10000.004
date (3, jan, 1982)
date (Day, jan, 1982)
|?-
Sicstus.
Sicstus. ~Z| ?-
|?- consult(File name ).
[File name].
['folder/filename'].
likes(sami, fish).likes(sami, kaled).likes(kaled, book).likes(sami, book).
LPA WIN-PROLOG 4.000 - S/N 0010165739 - 18 Mar 1999Copyright (c) 1999 Logic Programming Associates LtdLicensed To: HASSAN | ?- # Abolishing likes.pl [c:\documents and settings\compaq\desktop\] # 0.00 seconds to consult likes.pl [c:\documents and settings\compaq\desktop\] | ?- likes(sami,kaled).yes| ?- likes(kaled, book).yes| ?- likes(kaled, fish).no| ?-
1 ?- help(atom).true.2 ?-
1 ?- /* اكتب تعليقك هنا . */
[ khaled , omar , sami , yazan ]
[]
1 ?- [1, 2, 3, 4, 5] = [Head | Tail].Head = 1,Tail = [2, 3, 4, 5].2 ?-
4 ?- [khaled, sami , omar, adnan, yazan, slaem] = [_ , X | _].X = sami.5 ?-
concat_lists([list1], [list2], Var ).
?- concat_lists([1, 2, 3], [d, e, f, g], X).X = [1, 2, 3, d, e, f, g]Yes
likes( sami , chocolate, milk, bred)
Likes ( sami,chocolate).
Likes( sami,what) .
likes( sami,[chocolate, milk,bred]) .
9 ?- likes(sami,What). What = [chocolate, milk, bred].10 ?-
0 ?- likes(sami,[X,Y,Z|W]).X = chocolate,Y = milk,Z = bred,W = [].
second_element([A,B,C|Rest],B).
15 ?- second_elemet([a,b,c,d,e,f],X).X = b
17 ?- second_elemet([r,n,j,k,f,z],Y).Y = n.18 ?-
| second_elemet(X,m).X = [_G7778, m, _G7784|_G7785].20 ?-
length([Ali, Rami,Banana, [], [10, 21, 3, 100]], L).
11 ?- length([Ali, Rami,Banana, [], [10, 21, 3, 100]], L).L = 5.
length(New_list, 5).
length(New_list, 5).New_list = [_G869, _G872, _G875, _G878, _G881].
member(sami, [ali, rami, khaled, sami, hassan]).
6 ?- member(sami, [ali, rami, khaled, sami, hassan]).true
append([a,b,c],[d,e,f],New_list).
15 ?- append([a,b,c],[d,e,f],New_list).New_list = [a, b, c, d, e, f].
reverse([hassan,omar,khaled], Reverse_list).
reverse([hassan,omar,khaled], Reverse_list).Reverse_list = [khaled, omar, hassan].
factorial(0,1).factorial(X,Y) :- X1 is X - 1,factorial(X1,Z),Y is Z*X.
factorial(0,1).
factorial(6,Y).
factorial(6,Y).Y = 720
factorial(N,FactN):- fact_inter(N,FactN,0,1). fact_inter(N,FactN,I,J):- I=N,FactN is J. fact_inter(N,FactN,I,J):- I<N, NewI is I+1, NewJ is J*NewI, fact_inter(N,FactN,NewI,NewJ).
factorial(6,FactN).
6 ?- factorial(6,FactN).FactN = 720