بسم الله الرحمن الرحيم
ساقدم موضوع في لغة prolog
يتحدث عن التوابع العودية
طبعا يلزم بقارئ هذا المقال معرفته بلغة prolog
على الاقل تطبيقاتها
لمحة موجزة: لغة مستخدمة في الذكاء الصنعي - تحتاج لمفسر لاضهار خرجها
التوابع
الكتابة في برلوغ
تتالف السينتاكس الخاص ببرلوغ من علاقات وحقائق يفصل بينها :-
نقطتين وداش مباشرة .
s(0):-nt(0).
2-المتغيرات تكتب ك capital letter for example X,Y,Z
3-يكتب برنامج برلوغ على محرر نصي كالمفكرة ويحفظ بلاحقة
pl
طبعا الهدف ليس تعليم سينتاكس برلوغ و التحدث عنها في هذا الموضوع
لهذا اختصرت قدر الامكان
هتالك تابع شهير وهو التابع s
حيث كل عدد في برلوغ يكتب بدلالة هذا التابع مثال
1=s(0).
2=s(s(0)).
3=s(s(s(0))).
7=s(s(s(s(s(s(s(0))))))).
ويعتبر تابعا مهما لانطلاق الحل !
يعرف العدد الطبيعي المحجوز ب العلاقة
nt(0)
العلاقة السابقة هي علاقة صحيحة لانو الصفر عبارة عن عدد طبيعي
وبالتالي كما اسلفنا يجب القارئ ان يعرف ان لغة برلوغ مؤلفة من حقائق و قواعد
لنبرهن ان كل عدد طبيعي هو من برلوغ
nt(s(X)):-nt(X).
كل عدد مهما كان هو عدد طبيعي
بنامج الكلي هو
nt(0).
nt(s(x):-nt(X).
برنامج برلوغ لحساب مجموع الاعدا
نفكر ما هو شرط محقق للبدا به هممممم
مجموع اي عدد مع الصفر هو نفس ذلك العدد هاد الشرط رقم واحد
sum(X,0,X).//------------1
بعدين لنرى انه لاي اعداد مجموع يحتاج
عدد اول x
عدد ثاني y
متحول و سيطي لتخزين النتيجة ليكن
z
وتتحقق العلاقة التالية ادناه
والتي يعبر عنها كما التالي
sum(s(X),Y,S(Z)):-sum(X,Y,Z).
البرنامج النهائي المعبر
sum(X,0,X).
sum(s(X),Y,S(Z)):-sum(X,Y,Z).
الضرب
قاعدة البداي=ضرب اي عدد بالصفر هو الصفر نعبر عنها
mult(0,X,0).//1
هنالك تاب اسمو مالت فيو و سيط اول الصفر وو سيط تاني اي عدد الوسيط التالت هو الصفر
لانو بالوسيط التالت منحط نتيجة الضرب و خلص
هلق العلاقة العامة
لنفكر قليلا علاقة ضرب اي عددين هي
نمشي العددمن الواحد الى ان يصبح مساويا للمضروب به
ونعمل جمع تراكمي للنتيجة مع y
ويخزن في x
مثال
2*3
ليكن x=2,
3=y
نبدا y=0
2+ mult(2,2),
2+2 +mult(2,1),
2+2+2+mult(2,0)
وصل لشرط التوقف يلي هو 6
عمليا هو وقف معناتو
عنا عملية ضرب و عملية جمع
بس مين مع مين
mult(x,y,z1),sum(z1,y,z)
mult(s(X),Y,Z):-mult(X,Y,Z1),sum(Z1,Y,Z).
التابع المعبر
mult(0,X,0).
mult(s(X),Y,Z):-mult(X,Y,Z1),sum(Z1,Y,Z).
اكتب تابع رفع اس لقوى
قاعدة البدا الحقيقية
اي عدد مرفوع لقوى الصفر ==1
power(x,0,s(0)).
لنفكر باالعلاقة العامة
بدنا نحسب عمليا اي عدد مرفوع لقوى
ممممم شو علاقة القوى بالجمع ؟
ممم منحط بعقلنا هالمثال
2اس 2 =4
اي
2+2=4;
2اس 3=8
يعني العدد منضربو بحالو 3 مرات بعطيك الناتج
اي
2+2+2=8
يعني العدد ضربو بنفسة اربع مرات بعطي
باختصار هو نتيجة استدعاء التابع نفسو مشان يتحقق من شرط التو قف
و عملية ضرب
power(X,s(Y),Z):-power(X,Y,Z1),mult(Z1,X,Z).
العدد الزوجي
even(0).
حقيقة ان الصفر زوجي
نبحث عن علاقة عامة يجب ان نفكر بشكل عودي
ممممممم
نمسك اي عدد ونطرح منو 2
ومنضل انقص حتي يوصل على الصفر
اي عدد مطروح منو 2 يعبر عنها
s(s(X))).
لانو متل ما اتفقنا
2=s(s(0)).
ومنستدي التابع نداء عودي مرة اخرى حتى نوصل
even (s(s(X))):-even(X).
العدد فردي
نبحث عن حقيقة عامة للانطلاق لتكن ان الواحد هو عدد فردي
odd(s(0)).
نطرح من اي عدد 2 و نضل نطرح مع كل استدعاء عودي حتى نصل للواحد متل ما عملنا هنيك
odd(s(s(X)):-odd(s(0).
مثلا
5=s(s(3)).
5=s(s(s(s(0).
فعلا وصلنا لشرط التو قف يلي هو s(0)
معناتو عنجد هو فردي
اكبر عدد و اصغر عدد
ازا كان الصفر مع اي عدد معناتو العدد اكبر من الصفر
على اعتبار نحذف القيم السالبة لانو انا بتعامل بلغة منطق ما تقبل علاقة سالبة
يا اما 1 او 0
يا اما
true or false
max(0,X,X).
max(S(X),s(Y),s(Z)):-max(x,y,z).
اصغر عدد بنفس الاسلوب
قاعدة البداي الصفر اصغر من اي عدد
min(0,X,0).
min(s(X),s(Y),s(Z)):-min(X,Y,Z).
العاملي
شرط الانطلاق عاملي الصفر 1
fact(0,s(0)).
لنحاول البحث عن علاقة عامة تشبك بين كل العلاقات السابقة من اجل اي عددين
x!=(x+1).x!
التعبير عنها يتم انه
نعمل استدعاء عودي من اجل x1
ونخزن النتيجة بالمتحول
z
وبعد نضربها
z1,s(X),z
fact(s(X),Z):-fact(X,Z1),mult(Z1,s(X),Z).
البرنامج الكلي
fact(0,s(0)).
fact(s(X),Z):-fact(X,Z1),mult(Z1,s(X),Z).
سلسلة فيبوناشي
تعتمد سلسلة فيبوناشي القواعد الرياضية التالية
fib(0)=1`;
fib(1)=1;
fib(n)=fib(n-1)+ fib(n-2);
لاحظ ان
fib (2)=fib(s(s(2)))=fib(s(0)),fib(0),sum(fib(0),fib(s(0))
هذه الحركة فقط لفهم كيفية كتابة السطر الاخير
شروط التوقف و العلاقة العامةواضحة من التعريف لكتابتها بلغة برلوغ و باسلوب عودي نقوم بالتالي
fib(0,s(0)).
fib(s(0),s(0)).
fib(s(s(N)),Z):-fib(s(N),Z1),fib(N,Z2),sum(Z1,Z2,Z).
بالمرفقات ملف نصي جاهز للتطبيق على كل ما سبق
بس غير لاحقتو الى
pl
وشغلووو من مفسر الخاص ب swi prolog
slaaaaaaam