الآن سوف نبدأ في لغة Prolog كلغة برمجة و على مستوى الكود, و لكن يجب أن أذكر ببعض الأمور من أهمها:
·
اسم لغة Prolog مأخوذ من Programming in Logic , أي البرمجة المنطقية لذلك يجب أن نبتعد بفكرنا عن طريقة التفكير كلغات برمجة عادية مثل سي, سي++, جافا ...
الخ.
·
لغة Prolog لغة علائقية أي تعتمد على العلاقات مثل علاقات الداتابيز و علاقات Is ... a يعني:
cat is..a animal.
tiger is..a animal.
·
ومن أهم
الفروق بين لغة Prolog و اللغات الأخرى هي أن لغة
Prolog هي لغة دينامكية Dynamic في مستوى كودها, حيث أن الكود ممكن أن يتغير مع تنفيذ البرنامج
وذلك ببساطة لأن البرنامج يتعلم و يطور من نفسه على عكس اللغات التقليدية مثل
السي, سي++, جافا ... هي لغات ثابتة Static على مستوى كودها.
بمعنى آخر لو وجد لدي
كود للغة Prolog مكون من 20 سطر مع التنفيذ
من الممكن أن يزيد إلى 25 أو أي عدد آخر على
حسب
التعلم, أي أن البرنامج
يضيف كود من عنده لمواجهة أمور و أحداث لم يبرمج لموجهتها.
بعكس لغات مثل السي عدد
سطور كودها لن يتغير مهما كان السبب و لو صادفها شيء لم تبرمج عليه لتوقف البرنامج
Crush.
·
البرنامج
المكتوب بلغة Prolog هو بسيط للغاية و يتكون في
الأساس من Facts و Rules أي حقائق و مسلمات و قواعد.
·
المتغيرات
في لغة Prolog تبدأ إما بحرف كبير مثل X,
Talal, Var... أو بعلامة (_) مثل x
, _Talal, _talal_
و ما عداها لا يعتبر
متغير.
____________________________________________________________________________________________________
1. الحقائق
Facts :
في هذا الجزء سوف نشرح الـ Facts في أبسط صورها و هي شبيهه بالسجلات في الداتابيز.
و الشكل العام للـ Facts هو:
pred(arg1,
arg2, ..., arg n).
حيث أن:
pred هو اسم الـ Facts
و arg1 , arg2, arg n هي الحقول التي تأخذها الـ Facts .
و النقطة التي في الأخير هي نهاية أي جملة في لغة Prolog.
و الحقول التي تأخذها الـ Facts هي أما أن تكون متغير من نوع integer أو atom وهو نص
إما أن يبدأ بحرف صغير أو يكون بين علامتي ' '
أو يكون من نوع متغير يبدأ بحرف كبير أو علامة (_) أو يكون عبارة عن
سجل.
عندما نكتب Fact معينه
فإنها سوف تخزن في الـ knowledge base - قاعدة المعارف - و سيكون تعامل البرنامج مع قاعدة المعارف هذه.
الآن لنأخذ برنامج بسيط يصف أن القط عبارة عن حيوان في البداية
نستطيع أن نقول :
cat is a animal
و الآن سنحول هذه الجملة إلى Facts في لغة Prolog بالشكل
التالي:
animal(cat).
يعني قلنا لبرنامج Prolog خزن في
قاعدة المعارف عندك أن الـ cat عبارة
عن animal.
و نستطيع أن نضيف من الحيوانات ما نشاء مثل:
animal(dog).
animal(tiger).
animal(bird).
الآن كل هذه الـ Facts قد
خُزنة في قاعدة المعارف لدينا, و الآن نريد استخراجها !! سيكون ذلك عن طريق عمل Query
لقاعدة المعارف لاستخراجها.
الآن سوف ننفذ البرنامج سوية, كود البرنامج سيكون:
animal(cat).
animal(dog).
animal(tiger).
animal(bird).
سوف نقوم بعمل
Listener -> Start.
Listener -> Consult.
ثم نختار الملف المراد تنفيذه
الآن لا يوجد في برنامجنا سوى Fact من نوع واحد و هي animal و الـ Query التي سوف نعملها على قاعدة المعارف لدينا هي
أن نسرد أنواع الـ animal التي
توجد في قاعدة معارفنا, و سيكون ذلك أن نكتب اسم الـ Fact التي نريد الاستعلام عنها و نرسل
لها متغير , لترجع لنا قاعدة المعارف أنواع الحيوانات في هذا
المتغير.
و سنكتب الاستعلام في الـ Listener بالشكل التالي:
animal(X).
لاحظ أن حرف X هو حرف
كبير أي متغير, الآن سوف يرسل الـ Listener هذا المتغير إلى قاعدة المعارف و سوف ترجع له قاعدة
المعارف أول نوع من الحيوانات - على حسب ترتيب الـ Fact -, في المتغير X و
سيكون أول حيوان هو الـ cat و سيظهر بالشكل
التالي:
X
= cat
ثم سينتظر الـ Listener لكي
أقرر أنا هل أريد المزيد أم لا ؟
إذا اكتفيت بأول ناتج سوف أضغط على مفتاح Enter للاكتفاء, أما إذا أردت المزيد سوف أضغط على ( ; ) لكي تظهر لي
المزيد من النتائج و أستمر على هذا الحال إلى أن لا يبقى لدي نتائج و
يكتب الـ Listener كلمة no أي أنه لم يعد هناك
نتائج لكي تظهر.
و ستكون النتائج على فرض أني أضغط على ( ; ) كالتالي:
X
= cat ;
X = dog ;
X = tiger ;
X = bird ;
no
X = dog ;
X = tiger ;
X = bird ;
no
هذا هو النوع الأول من سرد المعارف التي توجد لدي و لكن من الممكن
أيضاً أن أسئل قاعدة المعارف أسئلة الـ yes .. no
حيث أسألها إن كان يوجد لديك كذا مثلاً, وهي ترد بنعم أو لا.
الآن سوف نسألها هي الـ cat من نوع
animal لديها أم لا ؟
و سيكون ذلك بالشكل التالي:
animal(cat).
و من ثم سيرد علينا الـ Listener بنعم
أو لا , على حسب وجود هذه الـ Fact عنده
أم لا.
و لكن من الواضح أن هذه الـ Fact موجودة
لديه لذلك سيرد بنعم كما سيظهر لكم في الـ Listener
?- animal(cat).
yes
?-
yes
?-
و علامة -? تدل على أن الـ Listener ينتظرك لتدخل Query .
الآن سوف نستعلم عن شيء غير موجود في قاعدة المعارف مثلاً سوف نسألها
هل الكتاب عبارة عن حيوان أم لا ؟
طبعاً نحن لم ندخل الكتاب على أساس أنه حيوان في قاعدة معارفنا,
وسيكون شكل الاستعلام كالتالي:
animal(book).
و كما هو واضح لديكم أن الرد هو بالشكل التالي:
?-
animal(book).
no
?-
no
?-
و سيرد الـ Listener بـ no إذا استعلمت عن Fact غير
موجودة أصلاً مثلاً:
?-
person(mammal).
no
?-
no
?-
____________________________________________________________________________________________________
في هذا الجزء سوف نأخذ مثال عملي من واقع الحياة اليومية و نحوله إلى
برنامج مكتوب بلغة Prolog.
لو كان لدينا عائلة فيها:
محمد أب لـ عبدالله و صالح , و عبدالله أب لـ خالد و صالح أب لـ أحمد
و سلطان.
هذه عبارة عن حقائق نستطيع بالتأكيد تمثيلها بواسطة لغة Prolog, لنأخذ الجملة الأولى:
"محمد أب لـ عبدالله و صالح" .
نستطيع أن نحولها إلى :
"محمد أب لعبدالله" و "محمد أب لصالح".
عندئذ سوف نكتبها في Prolog كالتالي:
father(mohammad,
abdullah).
father(mohammad,
saleh).
أي أن محمد أب لعبدالله في الأولى و محمد أب لصالح في الثانية.
الآن لنأخذ الجملة الثانية:
"و عبدالله أب لـ خالد".
سوف نحولها في لغة Prolog بنفس
الشكل السابق و لكن الأب هنا ليس محمد بل عبدالله.
father(abdullah,
khalid).
أي أن عبدالله أب لخالد.
و لنأخذ الجملة الثالثة الآن:
"و صالح أب لـ أحمد و سلطان".
سنحول هذه الجملة إلى أبسط صورة لها وهي:
"صالح أب لأحمد" و "صالح أب لسلطان".
و سنحولها إلى لغة Prolog بنفس
الطريقة السابقة:
father(saleh,
ahmad).
father(saleh,
sultan).
الآن هذه المعلومات الـ Facts أصبحت
في قاعدة المعارف لدينا و لم يبقى لدينا إلا عمل بعض الـ Query
عليها.
الآن لو أردنا أن أن نعرف والد خالد ؟
نحن جعلنا في الـ Father أو
تعارفنا أن الحقل الأول هو الأب و الثاني هو ابنه, لذلك لو أردنا أن نعرف من هو أب
خالد سوف
نستعلم عن father و نجعل
الحقل الأول متغير ليعطينا الآباء و الحقل الثاني هو خالد لكي ينقي و ينقح لنا
الآباء و يعطينا أب خالد بالذات.
و ستكون الـ Query كالتالي:
father(X,
khalid).
و كما نلاحظ جميعاً أن أب خالد سوف يوضع في المتغير X و يطبع في الـ Listener كالتالي:
?-
father(X, khalid).
X = abdullah
yes
?-
X = abdullah
yes
?-
و لكن ماذا لو أردنا أن نعرف أولاد محمد ؟
سيكون نفس المثال السابق و لكن بالعكس أي سنضع في الحقل الأول محمد و
في الثاني متغير X أو أياً يكن ليسرد لنا
أولاد محمد
و ستكون الـ Query كالتالي:
father(mohammad,
X).
و كما نلاحظ أن النتائج ستكون كالشكل التالي:
?-
father(mohammad, X).
X = abdullah ;
X = saleh ;
no
?-
X = abdullah ;
X = saleh ;
no
?-
طبعاً إذا أردنا سرد جميع الآباء و الأبناء سنكتب هذا
الاستعلام:
father(Father,
Child).
لاحظ أننا أرسلنا في الحقلين متغيرات Father و Child لأن
أول حرف من كلاً منهم هو حرف كبير.
·
هذا هو
تقريباً كل ما في موضوع الـ Facts و
سيكون درسنا القادم عن الـ Rules, و سنطور فيه مثالنا
الحالي ليكون بشكل أفضل و أجمل و واقعي أكثر.
أتمنى أن يكون الدرس سهل, و إن أصبت فمن الله و إن أخطأت فمن نفسي و
الشيطان.
0 التعليقات:
إرسال تعليق