دوره في تعلم لغة PROLOG لجميع المستويات

الناقل : elmasry | الكاتب الأصلى : HASSAN | المصدر : www.arabteam2000-forum.com

بســـــم الله الرحمن الرحـــيم

اللهم صلي على سيدنا محمد وعلى آله وصحبه أجمعين

سنقدم في هذه الدوره ان شاء الله دروس لتعلم البرمجه بلغة البرولوغ ( PROLOG )

نبدأعلى بركة الله ..

ارفق صورة : monthly_02_2010/post-168424-12664454556976.jpg

الدرس الأول

النسخه التي اعتمدها في تطبيق هذه الدوره هي version 4.000 of WIN-PROLOG

ولتنصيب هذه النسخه ( وكذالك الامر لباقي النسخ ) من خلال النقر على SETUP.EXE

ارفق صورة : monthly_02_2010/post-168424-12664451765355.gif

ومن ثم تشغيل واجهة البرنامج ( المترجم ) ..

Resized to 75% (was 873 x 475) - Click image to enlargeارفق صورة : monthly_02_2010/post-168424-1266445615219.jpg


ثم بعد تشغيل المترجم يبدأ بقراءة ملفات البرامج و وقبول الاستفسارت والاسئله الخاصه بالبرنامج او الاستعلامات التي نريدها .

وللخروج من المترجم فقط قم بكتابة halt ويتبعها طبعا "."

  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 ( القواعد)

تحتوي على جزئيين هما :-

ارفق صورة : monthly_02_2010/post-168424-1266497326738.jpg

1:- جزء الشرط ----------> body of clause
2:- جزء الهدف ----------> head of clause

Queries ( الاستعلام )

الاستعلام او الاسئله حيث تكبت في المترجم فيقوم المحرك ( engine ) بتتبع الهدف من خلال الحقائق والقواعد الموجوده في قاعدة المعرفه ( ملاحظه مجموعة الحقائق والقواعد في البرولوغ تسمى قاعدة المعارف ) .

كيف يكون استخدام الاسئله او الاستعلام في البرولوغ ؟

عندما يتم طرح سؤال في البرولوغ , يصار الى البحث في قاعدة البيانات والتي اشرنا انها تمثل الحقائق والعلاقات بنها ( القواعد) , ومن ثم
يبحث عن الحقائق التي تطابق الاستعلام في السؤال , لذا فاذا وجد هذه الحقائق التي تطابق فيكون الجواب بـــ " Yes " والعكس يكون "No " .
أمر مهم جدا :- اسماء المواضيع والعلاقات بينها يجب ان تبدأ بأحرف صغيره ( lowercase letter ).
والحقائق والجمل يجب ان تنتهي بــــ " . "

مثال :-
 father(khaled, mohammad).


----
اين نكتب برنامج البرولوغ ؟

الحقائق والقواعد تخزن في ملفات تمثل ما يسمى قاعدة المعارف , ثم عندما نريد العمل عليها نقوم بتحميل هذه القاعدة من المعارف الى المترجم , وعندما نغير اي معلومه في هذه الملفات فيصار الى اعادة تحميلها مره اخرى الى المترجم ( لكي يتم تفعيلها مره اخرى ) .

----
قراءة ملفات البرامج

 consult (filename). 


---
Prolog Syntax

هنالك العديد من الشروط التي يجب مراعاتها عند كتابة الثوابت والمتغيرات بالاضافه الى الانواع :-

ارفق صورة : monthly_02_2010/post-168424-12664939614902.jpg

الــ Atoms يجب ان تتكون من الاحرف التاليه(شروط) :-

1:- The upper-case letters
2:- The lower-case letters
3:- The digits
4:-The special characters مثل
 +, -, *, /, <, >, =, :, ., &, ~,  _  

ولكن الشرط المهم هو انه عند كتابة ال Atoms لا يجب ان تبدأ بـــ upper-case letters او "_" .
امثله على الــ Atoms :-
 krrk, x15, x_, x___y, ahmad_khaled 

<---> , ==>, … , .:. , ::= 

باستثاء هذا الرمز " :- " لانه يمثل جزء من ادوات اللغه ( كما اشرنا سابقا من انه يفصل بين الشرط والهدف في القواعد ) .
ممكن ان تكتب هكذا لكن بشرط وجود ' '
 'Mohammad' , 'Othman Khaled ' 


الــ Numbers

أعداد صحيحه
 100 ,20 ,-90, 0 

أعداد حقيقيه
 3.99, -0.0001 , 10000.004 


الــ Variables

تتكون من احرف وارقام و ايظا " _ " , وتبدا بــ upper-case او " _ " .
ملاحظة :- عن استخدام " _ " بشكل فردي فلها معنى خاص حيث تسمى متغير مجهول .
ونطاق عمل الـــ Variables يكون في الـــ clause متظمنه داخلها ..
بمعنى اخر انه مثلا X16 يمثل متغير , وعندما يتواجد في 2 clause فهو يمثل متغيران اثنان مختلفان عن بعض , اما عندما يكون هتالك اكثر من X16 ولكن في نفس الــ clause فكلها تمثل نفس المتغير وتعود له .

الـــ Structures

 date (3, jan, 1982) 

وتحتوي على اكثر من عامل , ويمكن ان تكون هذه العوامل متغيرات مثل :-
 date (Day, jan, 1982) 

وهذا يعني ان اليوم اصبح متغير , وهذا يعطي اي يوم في شهر jan وفي سنة 1982 .


الدرس الثاني

كما قلنا سابقا قاعدة المعارف في البرولوغ تمثل Fact و Rules ..
سنضع مثال على هذه الحقائق والقواعد وكيف يتم تمثيلها بالشكل الطبيعي ( اللغة الانجليزيه ).
ارفق صورة : monthly_02_2010/post-168424-12665260740533.jpg

الحقائق تمثل التعريف بالعوامل ( اي تثبيت الحقائق التي ستبنى عليها القواعد ) ثم اعطاء كل شخص صلة قرابته بالاخر .

لنستطيع فهم المثال لاحظ التالي :-

ارفق صورة : monthly_02_2010/post-168424-12665270565419.jpg

اما كتابتها بصيغة لغة برولوغ فتكون كالتالي :-

ارفق صورة : monthly_02_2010/post-168424-12665275245084.jpg

هذا المثال فقط لتوضيح مبدأ الحقائق والقوعد بينها , وكيفية صياغتها بلغة البرولوغ .

====
نبدأ من هنا الشرح التطبيقي للغة برولوغ مع ذكر امثله .

1:- امتداد ملفات البرولوغ تكون pl.
2:- في حالة استدعاء المترجم تظهر اشارة
|?- 

وهي تعني ان المترجم جاهز لأي استعلام وسؤال , وفي حال لم تكن موجوده ( او انه تم مسح الشاشه ) قم بكتابة هذا الامر على شاشة المترجم
Sicstus. 

فيرجع المؤشر مره اخرى هكذا
Sicstus. 
~Z

| ?-

3:- ويتم استدعاء ملف البرنامج وتحميله في الذاكره ليكون جاهز للتفيذ من خلال احد هذه الاوامر :-
|?- consult(File name ).

او
[File name].

او
['folder/filename'].

او من خلال اختيار File الموجود في الشاشة ( واجهة المترجم ) ومن ثم اختيار load وبعدها اختيار الملف الذي نريد تحميله في الذاكره , وبعد التحميل والتفيذ قم بسؤال ما تريد عن الحقائق و القواعد الموجدوه في هذا الملف والذي يكون قد خزن في ذاكرة المترجم .
اما كتابة البرنامج ( ملف البرنامج ) بامتدداد pl , اختر من القائمه File ثم New ومن ثم قم بكتابة برنامجك وقم بتخزينه .
مثال :-
 
likes(sami, fish).
likes(sami, kaled).
likes(kaled, book).
likes(sami, book).

بعد ان قمنا بتخزين هذا الملف تحت اسم likes.pl , نعمل له تحميل الى الذاكره , وهنا يكون البرنامج جاهز لأي سؤال او استفسار
مثال على الاستعلام :-
LPA WIN-PROLOG 4.000 - S/N 0010165739 - 18 Mar 1999
Copyright (c) 1999 Logic Programming Associates Ltd
Licensed 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

| ?-


===

List of built-in operators in Prolog

ارفق صورة : monthly_02_2010/post-168424-12665895104074.jpg

وللمزيد من الامثله عن هذه الادوات الموجوده في الماتلاب حمل المرفق التالي :-

ملف مرفق  Arithmetic and Constructing Expressions In Prolog.rar (69.06كيلو )

الدرس الثالث

قبل البدء في هذا الدرس , يوجد في كل نسخة برولوغ امر مساعده تستطيع الرجوع له اثناء البرمحه , وما عليك الا كتابة help ( والامر الذي تريد استرجاع معلومه او تفصيل عنه ) مثال على ذالك :-
1 ?- help(atom).
true.

2 ?-

فتظهر لك الشاشه التاليه والتي تستطيع من خلالها مراجعة هذا الامر ( المساعده )

Resized to 56% (was 1177 x 515) - Click image to enlargeارفق صورة : monthly_03_2010/post-168424-1268221395204.jpg


=======

للننتقل الى بداية الدرس .
ذكرنا في الدروس السابقة مقدمه للبرولوغ وتم التطرق لبعض الاوامر و المواضيع التي يجب معرفتها عند بداية تعلم لغة البرولوغ , وفي هذا الدرس سنكمل ما بدأنا به ان شاء الله ..
من اهم مميزات البرمجه بلغة البرلولغ اننا نستطيع ان نكتب برامج صغيره ومختصره لمشاكل صعبه نسبيا وفي نفس الوقت سهلة القراءه والفهم , وكباقي لغات البرمجه تستطيع ان تكتب تعليقاتك الخاصه عن الاكواد التي تقوم بكتابتها و التي لن يقراها المترجم ويتجاوز عنها كما يلي :-
1 ?- /* اكتب تعليقك هنا . */

====
في الجزء التالي سنقوم بشرح Lists في البرولوغ والتي تعتبر من اهم هياكل البيانات في البرولوغ وسنقدم بعض الامثله عليها ان شاء الله ..

List Manipulation

تكتب القوائم في البرولوغ على شكل عناصر تفصل بينها فواصل داخل قوسين معقوفين كالتالي :-
[ khaled , omar , sami , yazan ] 

وبالامكان استخدام اي ارقام او متغيرات داخل هذه القوائم .
وتكون القائمه فارغة كالتالي :-
[] 

تحتوي القائمه على ما يسمى الرأس والذيل حيث يمثل اول عنصر بها الرأس والبقيه الذيل :-
1 ?- [1, 2, 3, 4, 5] = [Head | Tail].
Head = 1,
Tail = [2, 3, 4, 5].

2 ?-

ملاحظه الرأس والذيل للقائمه هما تمثلان تعبيرات ومسميات فقط , ولتمييز الذيل عن الرأس يتم استخدام الفارزه ( l ) فكل ما يأتي بعدها يمثل ذيل القائمه مثال على ذالك , لو اردنا معرفة العنصر الذي يقع بين الرأس والذيل لاحط المثال :-
4 ?- [khaled, sami , omar, adnan, yazan, slaem] = [_ ,  X  | _].
X = sami.

5 ?-

نلاحظ في المثال السابق ان الرأس كان ( khaled ) والذيل كأن بعد l وبالتالي هنالك قيمة X والتي تقع بين الرأس والذيل و وهي ( sami ).

ونستطيع الدمج بين قائمتين بشكل تسلسلي بناءاً على الداله concat_lists و يحتوي هذا الامر على قائمتين او اكثر يتم دمجهما و يوضع متغير في اخر الامر سيكون المتغير الذي يحتوي على القوائم المدموجه كالتالي :-
concat_lists([list1], [list2], Var ).


مثال :-
?- concat_lists([1, 2, 3], [d, e, f, g], X).
X = [1, 2, 3, d, e, f, g]
Yes


سنكمل الـــList وبعض الدوال والادوات الخاصه بها لاحقا ان شاء الله ..

اعذروني للتاخير والبطء في الدروس ولكن الانشغالات هي التي تمنع , ان شاء الله ما ان انتهي من هذه الانشغالات سأكثف الدروس ان شاء الله بشكل متقارب لتعم الفائده ..

وهذا رابط يحتوي على شروحات وامثله جيده للبرولوغ ارجو الاطلاع عليه ..
The Prolog Dictionary

تكمله لل LIST

ماهي فائدة الـــ LIST بشكل عام .
لنعد للهدف العام من لغة برولوغ , لغة البرلوغ والتي تمثل التعامل مع المنطق والمنطق يحتاج للحقائق والقواعد لتحقيق الاستنتاجات و التحقق من النتائج , فكما قلنا مثلا :-
ارجع مره اخرى لكتابة البرنامج لاحظ الصوره التاليه .
Resized to 94% (was 696 x 481) - Click image to enlargeارفق صورة : monthly_03_2010/post-168424-12687616576613.jpg

اذا ثم نقوم بكتابة بمايلي :-
likes( sami , chocolate, milk, bred)

من خلال الحقائق السابقه نقول ان سامي يفضل الــ chocolate و milk و bred
والان لو قمنا بالسؤال هل sami يفضل chocolate
Likes ( sami,chocolate). 

يكون الجواب NO
ولو سألنا ما هو الذي يفضله sami بشكل عام .
Likes( sami,what) .

فيكون الجواب ايضا ب NO

ما هو السر ؟ السبب بسيط جدا فالسؤال المفروض ان يتعامل مع 2 arg ( هكذا يقرا البرولوغ الحائق ) لكنه لدينا 4 arg في حالتنا هذه ..
اذا ما هو حلها ؟ الحل الامثل لها هو استخدام ال LIST من خلال وضع هذه القيم داخلها :-
likes( sami,[chocolate, milk,bred]) .


لنفرض اننا سألنا :-
9 ?- likes(sami,What). What = [chocolate, milk, bred].10 ?- 


نلاحظ ان What نستخدمها للاستدلال , بالحاله هذه اعطتنا مالذي يفضله sami
ملاحظه :- W في What يجب ان تكتب بحرف كبير ( Capital )
اذا هنا نلاحظ ان الاستدعاء اعطى جميع قيم القائمه LIST والذي يمثل مالذي يفضله sami , حيث ان البرولوغ هنا تعامل مع القائمه على اساس انها 1 arg .
ومن ثم نستخدم هذه القائمه لمساعدتنا على استدعاء ومعرفة كل عنصر على حده مثل :-
0 ?- likes(sami,[X,Y,Z|W]).
X = chocolate,Y = milk,Z = bred,W = [].

فكما لاحظنا في المثال السابق قمنا باستدعاء محتويات القائمه كلُ على حده من خلال المتغيرات التي قمت بوضعها X وY و Z وW مثلت قيمه فارغه واشرنا لها بانها هي ذيل القائمه .

الان اتضح لنا بعض من وضائف القوائم والتي سيكون لها دور مهم في تطبيقاتنا فيما بعد ان شاء الله .

امر مهم :- القوائم يتم قرائتها بشكل خانات بمعنى , لاحظنا في المثال السابق انه تم تعويض واستدعاء القيم بــ Xو Y و Z على التوالي , وعندما وصل الى الذيل والذي لا يحتوي على قيمة يرجع بالقيمه فارغه بــ W

لنذكر بعض الامثل :-
نقوم هنا بعمل برنامج بحيث يعمل على استدعاء قيمة العنصر الثاني في القائمه :-
second_element([A,B,C|Rest],B).


هنا يقوم البرنامج بعمل فحص للقائمه فيتوقف عند العنصر الثاني بها ومن ثم يرجع بقيمته حيث اننا وضحنا ماهو العنصر الذي نريد ان نستدعيه من خلال وضعنا له في اخر القائمه وبعد Rest ( Result) :-
امثله على الاسئله :-
second_elemet([a,b,c,d,e,f],X).
15 ?- second_elemet([a,b,c,d,e,f],X).
X = b


مثال اخر :-
second_elemet([r,n,j,k,f,z],Y).
17 ?- second_elemet([r,n,j,k,f,z],Y)
.Y = n.18 ?-

يكون الجواب كما نلاحظ ان Y=n
مثال اخر :-
second_elemet(X,m).
|       second_elemet(X,m).
X = [_G7778, m, _G7784|_G7785].20 ?-
 


لاحقا سنكمل القوائم وشرح بعض العمليات عليها ..

بالتوفيق ان شاء الله .



 
ملف مرفق(ملفات)
 
ملف مرفق  example.rar (244بايتات )

تابع LIST

بعض الادوات والاوامر التي تستخدم في LIST

Length
length ( [arg1,arg2,...,argn],Output_Name) ....
مثال:-
length([Ali, Rami,Banana, [], [10, 21, 3, 100]], L).

يكون الجواب 5 وهذا يدل على طول القائمه وكم تحتوي على عناصر كما لاحظنا انه كانت هنالك انواع مختلفه من العناصر مثل Ali و [] و قائمه تحتوي على ارقام داخل القائمه الام
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].

فيضهر لنا انه تم انشاء قائمه تحتوي على 5 arg , وبما اننا لم نحدد هذه العناصر فتقوم البرولولغ بانشاء ارقام من تلقاء نفسها بدل اماكن هذه العناصر .

member
member(Element,list). هذا يعني اننا نريد ان نسأل هل العنصر Element موجود او احد عناصر القائمه list
مثال :-
member(sami, [ali, rami, khaled, sami, hassan]).

فيكون الجواب True اذا كان موجود و False اذا لم يكن .
6 ?- member(sami, [ali, rami, khaled, sami, hassan]).
true


append
هنا يعمل ربط ودمج بين قائمتين او اكثر
الصيغه العامه :-
append( first_list,second_list,new_list).
مثال :-
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].

ملاحظه مهمه :- اتمنى ان لا تقع في هذا الخطأ , اسم القائمه الجديده او قائمة الربط يجب ان تبدأ باحرف كبيره Capital , بمعنى New وليس new

reverse
هذا الامر او الداله تعمل على تغير ترتيب القائمه بشكل عكسي .
 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).

وهذا يعني اننا نعمل رجوع للقيمه عندما نصل للقيمه 0 وهي اخر رقم في المضروب وتكون قيمته دائما صفر ( factorial(0,1)
اذا في هذه الحاله ماعلينا الا كتابة الامر في شاشة البرنامج كالتالي :-
 factorial(6,Y).

او اي رقم او متغير تريد . فيكون الناتج هنا :-
 factorial(6,Y).
Y = 720

يقوم البرنامج بجمع 6! و 5! و 4! و 3! و 2! و 1! وحتى يصل الى 0! والذي تكون قيمته 0
6!+5!+4!+3!+2!+1! = 720

هنالك اكثر من طريقه لكتابة المضروب.
في المرفقات ستجد برنامجين الاول باسم factorial وهو الذي ذكرته و الثاني ياسم factorial program وهو يشرح طريقه ثانيه لحساب المضروب وستلاحظ من خلال حجم الكود المكتوب ما هو الفرق بين الطريقه الاعتياديه لكتابة المضروب وطريقة recursivelly التي شرحتها في اول طريقه لكتابة المضروب ..

كود الطريقه الثانيه :-
factorial program.pl

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


بالتوفيق .



 
ملف مرفق(ملفات)
 
ملف مرفق  factorial programs.rar (422بايتات )