• 0
Guest ( HASSAN )

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

سؤال

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

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

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

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

post-168424-12664454556976_thumb.jpg

الدرس الأول

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

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

post-168424-12664451765355_thumb.gif

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

post-168424-1266445615219_thumb.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 ( القواعد)

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

post-168424-1266497326738_thumb.jpg

1:- جزء الشرط ----------> body of clause

2:- جزء الهدف ----------> head of clause

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

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

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

عندما يتم طرح سؤال في البرولوغ , يصار الى البحث في قاعدة البيانات والتي اشرنا انها تمثل الحقائق والعلاقات بنها ( القواعد) , ومن ثم

يبحث عن الحقائق التي تطابق الاستعلام في السؤال , لذا فاذا وجد هذه الحقائق التي تطابق فيكون الجواب بـــ " Yes " والعكس يكون "No " .

أمر مهم جدا :- اسماء المواضيع والعلاقات بينها يجب ان تبدأ بأحرف صغيره ( lowercase letter ).

والحقائق والجمل يجب ان تنتهي بــــ " . "

مثال :-

 father(khaled, mohammad).

----

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

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

----

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

 consult (filename). 

---

Prolog Syntax

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

post-168424-12664939614902_thumb.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 .

تم الدرس الاول بحمد الله .

القاكم في الدرس القادم ان شاء الله عز وجل .

تم تعديل بواسطه ( HASSAN )
4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

42 إجابة على هذا السؤال .

  • 0

اسم الملف عندك RAMO وانتي لم تحملي الملف المطلوب بل كان aml . يجب ان تحملي اللف نفسه ..

هذا ما اراه في الصور المرفقه

بالتوفيق

السلام عليكم

لالا هدا فقط لاني حاولت في الموضوع عدة مرات وبعدة تسميات ولكن اذا لاحظت في الصورة المرفقة الاولى اسفلها

cannot open for write

جزاك الله خيرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تابع 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].

وهنالك ادوات و اوامر اخرى اتمنى الاطلاع عليها من المراجع السابقه .

نعود لاحقا ان شاء الله ..

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لقد اكتشفت الخطا وهو اني لم اكن اعمل خيار

SAVE A BUFFER

بعد كتابة البرنامج

دمتم بحفظ الرحمن :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمة الله وبركاته ..

مثال لكتابة برنامج المضروب باستخدام البرلولغ .


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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

بارك الله فيك يا د حسان على هذا الشرح الوافي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ممكن أعرف كيف أعمل انترفيس سواء بالhtml أو VB

لبرنامج Amzi

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أحتاج الى برنامح يقوم بعكس عناصر قائمه معينه ،كيف أتمكن من كتابته كاملا؟؟؟؟ أرجو المساعده بسرعه

وأتمنى اذا كان هناك أي كتاب للغة prolog بالغة العربيه

تم تعديل بواسطه safiya
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ماشاء الله شرح مميز ومجهود عظيم جزاك الله خيرا ونفع بك الاسلام والمسلمين

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم اخي حسان اذا تكرمت بما انك متمكن ببرمجه برولوج مطلوب مني برنامج بسيط عن البورصه وتطبيق الرولز بالذكااالصناعي والوقت لا يسمح بتعلمها

فياريت اذا بامكانك اتساعدني او اكون شاكره بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

اشكركم على الشرح والتوضيح وجزاكم الله خير على تعبكم هذا

بس عندي سؤال انا لساتني مااشتغلت اصلا على برولوغ ولا عندي اي معرفة فيه هلاء جمعت كم معلومة وكم برنامج بس المشكلة مش عارفة كيف ومن وين بدي انزل البرنامج الي رح اكتب بداخلو الكود ....ياريت لو فيكم تساعدوني مع الشكر مقدما

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

اشكركم على الشرح والتوضيح وجزاكم الله خير على تعبكم هذا

بس عندي سؤال انا لساتني مااشتغلت اصلا على برولوغ ولا عندي اي معرفة فيه هلاء جمعت كم معلومة وكم برنامج بس المشكلة مش عارفة كيف ومن وين بدي انزل البرنامج الي رح اكتب بداخلو الكود ....ياريت لو فيكم تساعدوني مع الشكر مقدما

اقرا الموضوع من البدايه رح تستفيد ان شاء الله , والبرنامج موجود في المرفقات

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مجهود كبييييييييير    مشكور أخي حسان وربنا يجزيك ألف حسنه نظير مجهودك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكور دكتور عل المحاضرات شكرا جزيلا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

أشكركم جزيل الشكر على هذه الدروس الرائعة.

أن حقيقة مبتدىء ، وقد سعيت جاهدا لتطبيق هذا البرنامج البسيط على WinProlog ولكن دون جدوى !!!!

 

 

 

.(second_element([A,B,C|Rest],B

 

 

والنتيجة كما في الصورة

 

post-250427-0-92299500-1387223781_thumb.

 

 

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكووووووووووووووووووووووووووووووور
جزاك الله خير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكورعلى المجهود العظيم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا لك جزيل الشكر اخي الغالي HASSAN مجهود رائع

مشكور وماقصرت

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .