تتميز لغة البرولوج بإمكانية البحث الراجع ( 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 ).

ليست هناك تعليقات:
اضافة تعليق