الأحد، 11 يناير 2015

الحصة السابعة: القوائم(Lists)






كما في لغة ليسب فإن البرولوج توفر استخدام القوائم (Lists) والقائمة هي إما عنصر Atom)) يمثل قائمة فارغة ([]) وإما تركيب مكون من معاملين (Arguments Two) الرأس (Head) والذيل (Tail) محصورين داخل قوسين مربعين ([]) ويمثل الرأس العنصر الأول (First Element) والذيل باقي العناصر . فمثلا في القائمة [a , b , c , d ,e,]فإن العنصر (a) يمثل رأس القائمة وباقي العناصر تمثل ذيل القائمة .

والمثال التالي يمثل كيفية استخدام القوائم في البرولوج:



وإذا اعتبرنا الحقيقة التالية:

  ([ ,Friends([a ,b , c , d ,e


فإذا أردنا معرفة رأس القائمة و ذيلها نكتب السؤال التالي :


?([Friends([Head |Tail

Or

?([Friends([Head |...Tail


فيجب البرولوج بالآتي:
Head =a
[Tail=[b,c,d,e


أي أن ذيل القائمة هو أيضا قائمة فرعية



وبهذه الإمكانية يمكننا بناء الدوال الذاتية الموجودة في لغة ليسب ، مثل (car) و(cdr) و(member) في لغة البرولوج .فعلى سبيل المثال يمكن كتابة الدالة (member) في لغة البرولوج ، بتعريفها بالقاعدتين التاليتين :

1- العنصر (A) عضو(member) في القائمة (P) إذا كان (A) هو أول عنصر في (P).

2- إذا لم يكن (A) هو أول عنصر في (P) فإن (A) يكون عنصرا في(P) فقط إذا كان عنصر في ذيل القائمة (P) .



وتكتب هاتان القاعدتان في لغة البرولوج كالتالي :
.([_|member(A ,[A
.(member(A ,[_ |Y]):- member(A ,Y


ففي القاعدة (أو الحقيقة ) الأولى نعرف أن المسند (member) يتحقق إذا كان العنصر (A) هو أول عنصر في القائمة بغض النظر عن ذيل القائمة ( وتعرف هذه بوضع العلامة (_) وتسمى (Underscore) مكان ذيل القائمة )



اما في القاعدة الثانية فإن المسند (member) يتحقق إذا كان عنصرا في ذيل القائمة بغض النظر عن رأس القائمة وهذه القاعدة تسمى بالقاعدة التكرارية (Recursive) .

ليست هناك تعليقات:

اضافة تعليق

جميع الحقوق محفوظة © 2013 prolog