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

الحصة الخامسة : البحث الراجع ( Backtracking )



تتميز لغة البرولوج بإمكانية البحث الراجع ( Backtracking ) ، وهي طريقة من طرق البحث عن معلومات معينة داخل قاعدة المعرفة . والمثال التالي يوضح اهمية وجود هذه الخاصية .

اذا زودنا البرولوج بقاعدة المعرفة التالية :
.(Likes ( ali , mohamad
.(Likes ( ali , ahmad
.(Likes ( ali , omar
.(Likes ( ali , adel

.(Likes ( ahmad , mohamad


فإذا اردنا الإستفسار عن الاشخاص الذين يحبهم " علي " نكتب السؤال التالي :
?(Likes ( ali , People_Ali_Likes 


في هذه الحالة يبدأ البرولوج بالبحث في قاعدة المعرفة لإيجاد قيم المتغير (People_Ali_Likes) وهذا المتغير يسمى غير محدد ( uninstantiated ) وعندما يجد حقيقة ( أي عبارة ) تتفق مع السؤال ( وهي أول عبارة ) يقوم البرولوج بإسناد الإسم ( اي الشئ) المناظر لذلك المتغير اليه اي وضع ( People_Ali_Likes=Mohamad) . وفي هذه الحالة يقال ان المتغير تم تحديده ( instantiated ) بالعنصر ( أو الشئ او الثابت ) ( Mohamad )

والان دعنا نرى الإجابة على هذا السؤال وبعد ذلك نرى كيف توصل البرولوج الى هذه الاجابة . فالإجابة على السؤال السابق ستكون على الشكل التالي :


People_Ali_Like = mohamad

People_Ali_Like = ahmad

People_Ali_Like = omar

People_Ali_Like = adel


والذي حدث داخل البرولوج للوصول الى هذه النتيجة هو كالتالي:



يبدأ البرولوج في البحث داخل قاعة المعرفة من اول عبارة وعندما يجد اي توافق بين المسند والمعامل الأول في السؤال والمسند والمعامل الاول في الحقيقة يقوم بوضع علامة عند هذه الحقيقة ويحاول بعد ذلك البحث عن حقيقة اخرى تتفق مع السؤال وهكذا الى ان يتم البحث في قاعدة المعرفة كلها .



وعند الانتهاء من البحث في قاعدة المعرفة يعود البرنامج الى تلك المعاملات التي كان قد وضعها ، ومن ثم يقوم بإسناد المعاملات المقابلة للمتغير في تلك الحقائق الى المتغير ، ومع كل اسناد يقوم بالرد بقيم المتغير الذي وجدها في كل حقيقة بالصورة السابق توضيحها .


إضافة القواعد الى قاعدة المعرفة
يمكن إضافة القواعد (Rules) على قاعدة المعرفة بكتابتها بالشكل التالي:
-:P

,Q

,R

.

.

.

.Z


أو كتابتها بالشكل التالي :
P:-Q,R,...Z



وكما نرى تتكون القاعدة من قسمين هما العنوان (head) و الجسم(body) ويفصل كلا منهما العلامة (-).

ففي المثال السابق تمثل (P) العنوان وتمثل (Q,R,..,,Z) جسم القاعدة

وهذه القاعدة تعني أن (P) تتحقق (اى True ) إذا تحقق كل من (R..,..,..,(Z),(Q) ) لاحظ أن الفاصلة هنا تعني (and) ويمكن استخدام ( أى (or) داخل جسم القاعدة أيضا.

وتضاف القاعدة الجديدة إلى قاعدة المعرفة أو تكتب في صورة برنامج للتحكم في عملية البحث و استخراج البيانات المطلوبة ,والمثال التالي يوضح ذلك :

إذا أردنا البحث عن شخص ما (person 1) والذى يكون أخا لشخص معروف (person 2) نكتب القاعدة التالية :
-:(brother_of (Person1 , Person2

,(parent(X,Person 1
,(parent(X,Person 2
,(sex(Person 1,male

.(diff(Person 1, Person 2
diff (X , Y):- X /= Y


وهذا معناه أننا نحدد أن الشخص الاول (person 1) يكون أخا للشخص الثاني (person 2) إذا كان والد (parent) الشخص الاول هو نفسه والد الشخص الثاني ، وأن الشخص الاول ذكر (لأنه "أخ"الشخص الثاني)وكذلك الشخص الاول يختلف عن الشخص الثاني (وذلك لكي لا يرد علينا البرولوج بأن محمد أخو نفسه لأن لهم نفس الاب !) والقاعدة التي تفرق بين الشخصين تم كتابتها بعد القاعدة الاولى وهى تقول أن المتغير (X) لا يساوي (=/)المتغير(Y)

ولتوضيح هذه القاعدة نكتب قاعدة المعرفة الخاصة بالأسرة المكونة من (Ali) أب و (Fatma) أم و (Mona, Ahmad, Mohammad , Khalid ) أبناء .

وهي تكتب كالآتي:
.(Parent (ali,ahmad

.(parant (ali , mohammad

.(parant (ali , Khalid
.(parant (ali , mona

.(parant (fatma , mona

.(parant (fatma , mohammad

.(parant (fatma , Khalid

.(parant (fatma , ahmad

.(sex (ali , male

.(sex (fatma , female

.(sex (mona , female

.(sex (ahmad , male

.(sex (mohammad , male

.(sex (Khalid , male

وهذه التعبيرات أو الحقائق التي تكون قاعدة المعرفة للأسرة تمثل العلاقات التي تربط الأسماء ببعضها وهي أن (Ali) هو والد كل من (ahmad) و (mohammad) و (Khalid) وهو ذكر (male) وهم ذكور وهو أيضا والد (mona) وهي أنثى (female) وان (fatma) هي أم كل من (ahmad)و(Khalid)و(mohammad)و(mona)وهي أنثى (female) وبعد كتابة قاعدة المعرفة كما سبق الإيضاح يمكن أجراء الاستفسارات التالية:

1-هل (Khalid) أخو (mohammad) ويكون السؤال كالتالي :
?(brother_of( khalid , mohammad

وتكون الإجابة بالإيجاب
Yes

وذلك لان البرولوج تتبع الخطوات التي تحقق القاعدة (brother_of) وهي أن الشخص الأول والثاني لهما نفس الأبويين والأول ذكر ويختلف عن الثاني (أي أن Khalid لا يساوي mohammad).

2- من هم أخوة (ahmad), ويكون السؤال كالتالي:
?(Brother_of( X , ahmad 

وفي هذه الحالة يكون الرد بأسماء كل إخوة (ahmad) الذين يتفقون مع القاعدة ( brother_of ) ويكون الرد كالتالي
X=mohammad

X=Khalid

أي أن كل من (mohammad) و (Khalid) يتفق مع المتغير (X) والذي يمثل اسم اخوة ( ahmad) ويلاحظ انه لم يذكر (mona) وذلك لان نوعها (sex) يختلف عن النوع الموجود بالقاعدة (brother_of ).

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

اضافة تعليق

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