You are on page 1of 7

‫‪315‬‬

‫عملي‬

‫العودية‬
‫‪3‬‬ ‫والعمليات الرياضية‬
‫‪7‬‬ ‫عملي مشترك‬

‫‪21/04/2022‬‬ ‫مبادئ الذكاء الصنعي‬


‫مقدمة‬
‫في المحاضرة السابقة تعرفنا على العالقات وشجرة العالقات وتم تمثيلها وتطبيقها على البرنامج وسنكمل في‬
‫هذه المحاضرة عن تتمة عالقات تشمل مدى أوسع ‪.‬‬

‫ليكن لدينا التمثيل التالي ‪:‬‬

‫ولنأخذ تمثيل عالقة ال )‪grandparent(X,Y‬‬ ‫‪1‬‬ ‫‪X‬‬


‫تقرأ ‪ grandparent X‬ل ‪Y‬‬
‫‪2‬‬ ‫‪Y‬‬

‫‪grandparent (X,Y) :- parent (Z,Y) , parent (X,Z).‬‬


‫‪Z‬‬‫‪3‬‬
‫لنعمم هذه العالقة بجعلها أعمق ‪ ،‬نريد تعريف عالقة السلف ‪:‬‬ ‫▪‬
‫‪ : Note‬السلف هو أب أو جد أو جد الجد أو‬
‫أب الجد و يكتب‪:‬‬ ‫لتكن لدينا الشجرة التالية ‪:‬‬ ‫▪‬
‫)‪ancestor (X,Y‬‬ ‫لتحقيق عالقة السلف ‪:‬‬ ‫‪1‬‬ ‫‪X‬‬
‫الخلف‪ :‬عكس عالقة السلف وهو الحفيد‬ ‫‪true‬‬ ‫يجب أن يكون بين ‪ 2‬و ‪5‬‬
‫ابن الحفيد وما يأتي بعد‪.‬‬
‫‪true‬‬ ‫و أن يكون بين ‪ 2‬و ‪3‬‬ ‫‪2‬‬ ‫‪Z1‬‬

‫وكلما صعدنا لألعلى يجب أن تكون القيمة ‪true‬‬


‫‪3‬‬ ‫‪Z2‬‬
‫لنعمم العالقة أكثر ‪ ،‬نفرض طرف ثالث وهو ‪ Z1‬؛ ‪ Z2‬يكون لدينا ‪:‬‬
‫)‪parent (Z2 , Y‬‬
‫‪4‬‬
‫)‪parent (Z1 , Z2‬‬
‫) ‪parent (X , Z1‬‬ ‫‪5‬‬ ‫‪Y‬‬
‫وفرضاً لدينا ‪Z20 , ..... , Z6 , Z5‬‬

‫‪1‬‬
‫العودية والعمليات الرياضية| عملي مشترك‬

‫لحل هذه المشكلة نستخدم إما ‪:‬‬


‫الطريقة التكراربة حلقات ‪ " for‬برولوغ ال تدعم هذه الطريقة "‬ ‫▪‬
‫الطريقة العودية ‪.‬‬ ‫▪‬
‫مالحظة ‪ :‬البرولوغ تعمل عمل خوارزمية ال ‪ backtrack‬لذا فهي باألصل عودية ‪.‬‬ ‫▪‬

‫شروط الطريقة العودية يعتمد على شقين ‪:‬‬


‫شرط الحالة العامة ‪ :‬يجب أن تحوي الشرط العودي " استدعاء نفسها " ‪.‬‬ ‫▪‬
‫شرط التوقف ‪ :‬هو دائماً أبسط حالة صحيحة في مثالنا هي عالقة األب وابنه ‪.‬‬ ‫▪‬

‫كما ذكرنا العالقة في المحاضرة السابقة‬ ‫‪1‬‬ ‫‪X‬‬


‫)‪ancestor (X,Y) :- parent (Z,Y) , ancestor (X,Z‬‬
‫لنأخذ العالقة بين ‪ 4‬و‪: 1‬‬ ‫‪2‬‬
‫نجد أن )‪parent (3,4) , ancestor (1,4‬‬
‫لنأخذ العالقة بين ‪ 3‬و‪: 1‬‬ ‫‪3‬‬
‫نجد أن )‪parent (2,3) , ancestor (1,3‬‬
‫لنأخذ العالقة بين ‪ 2‬و‪: 1‬‬ ‫‪4‬‬
‫ال يوجد ‪ Z‬بين ‪ Y‬و ‪ X‬سيعيد ‪ false‬ليست النتيجة المراد الوصول لها‬
‫لذا نضع شرط التوقف " أبسط حالة صحيحة ( أب وابنه ) "‬ ‫‪5‬‬ ‫‪Y‬‬
‫)‪ancestor (X,Y) :- parent (X,Y‬‬
‫الحالة العامة‬ ‫)‪ancestor (X,Y) :- parent (Z,Y) , ancestor (X,Z‬‬
‫شرط التوقف‬ ‫)‪ancestor (X,Y) :- parent (X,Y‬‬

‫مثال ‪:‬‬
‫لنأخذ ال ‪ fact‬التالية ‪:‬‬ ‫▪‬
‫يكون اليوم مشمس إذا كان اليوم مشمس ‪.‬‬
‫هي عبارة منطقية تماماً صحيحة ‪.‬‬

‫تعبر عنها ب ‪: prolog‬‬ ‫▪‬


‫‪ sunny (today) :- sunny (today).‬منطقياً صحيحة ‪ /‬عودياً خاطئة‬
‫سيحدث ‪ stack overflow‬ألنه سيتم إثبات الحقيقة في كل مرة إلى أن تمتلئ ال ‪stack‬‬

‫هام ‪ :‬ألن أي عالقة تستدعي نفسها بنفس الطريقة ال تتوقف ألنه ال يوجد فيها تغير بالمتحوالت‬

‫‪2‬‬
‫‪/ITE.RBCs‬‬
‫العودية والعمليات الرياضية| عملي مشترك‬

‫التعامل مع المتحوالت غير المستعملة‪:‬‬


‫مثال‪:‬‬
‫إذا أردنا كتابة عالقة ‪ is_father‬لتبين أن الشخص ‪ X‬هو أب باالعتماد على قاعدة )‪: father (X,Y‬‬
‫‪father(X,Y) :- male(X), parent(X,Y).‬‬
‫‪is_father (X) :- father(X,Y) .‬‬
‫‪ .1‬الحل‪:‬‬
‫نقول عن ‪ X‬أنه ‪ is_father‬إذا حقق قاعدة ‪. father‬‬
‫إذا تمت كتابة القاعدة السابقة في محرر ‪ prolog‬فسيظهر ‪ Y‬بالخط العريض و هي إشارة أننا صرحنا عن المتحول ‪ Y‬دون‬
‫استخدامه‪.‬‬

‫مالحظة‪ :‬التصريح عن المتحول يعني استخدامه مرتين على األقل ضمن القاعدة الواحدة سواء كان في‬
‫محتوى القاعدة أو تعريفها‪.‬‬

‫لتجنب ذلك نستخدم "_" عندها تكتب القاعدة على الشكل التالي‪:‬‬

‫‪𝑖𝑠_𝑓𝑎𝑡ℎ𝑒𝑟(𝑋): −𝑓𝑎𝑡ℎ𝑒𝑟(𝑋,_).‬‬

‫‪Data type in prolog‬‬


‫‪ " Atmos‬ثوابت "‪:‬‬ ‫▪‬
‫هي أي تتالي محارف تبدأ ب ‪ ، small later‬قد يحوي أرقام أو إشارات أو " _ "‬

‫مثال ‪:‬‬
‫‪ /‬أكبر < ‪ /‬أصغر > ‪+ /‬‬ ‫الفاصلة ‪،‬‬ ‫‪ (4‬النقطة ‪/ .‬‬ ‫‪ X )1‬حرف صغير‬
‫‪ (5‬األعداد ‪ :‬يمكن كتابة أرقام صحيحة أو كسرية‬ ‫‪ play_Football )2‬صحيحة ؛ بدأت بحرف صغير‬
‫‪7.22 / 3.5 /2‬‬ ‫‪ )3‬الكتابة كـ ‪ string‬مثال ‪" I like …. " :‬‬
‫( يمكن الكتابة مع الفراغات بداخل عالمتي التنصيص )‬

‫‪Fact‬‬
‫‪Rules‬‬
‫‪ : Complex-tirms‬ببساطة هي البرولوغ ‪:‬‬ ‫▪‬

‫مالحظة ‪ :‬ال ‪ srting‬في البرولوغ تطبيقه يختلف تماماُ عن استخدامه بلغات البرمجة ‪.‬‬

‫‪3‬‬
‫‪/ITE.RBCs‬‬
‫العودية والعمليات الرياضية| عملي مشترك‬

‫‪Rules‬‬

‫‪Simple Rules‬‬ ‫‪Complicated Rules‬‬


‫هي قواعد تكون‬
‫هي قواعد تكون‬
‫بارامتراتها عبارة عن‬
‫بارامتراتها عبارة عن‬
‫متحوالت فقط‬
‫متحوالت‪ /‬حقائق و ‪Rules‬‬
‫مثل ‪father(X,Y) :‬‬
‫)‪point(X,X‬‬ ‫متداخلة‬

‫مثال ‪ :‬نريد تعريف ‪line‬‬


‫يمكن كتابة )‪ ( line (1,2 , 3,4‬هي صحيحة ولكن برمجياً غير مرتبة وغير مفهومة )‬
‫‪line ( point (1,2) , point (3,4) ).‬‬
‫➢ ال داعي بأن تكون معرفة ال ‪ point‬من قبل ‪.‬‬

‫‪• ? – line (X,Y).‬‬ ‫لو قمنا باالستعالم التالي ‪:‬‬


‫; )‪X = point (1,2‬‬
‫‪Query -1-‬‬
‫‪Y = point (3,4) .‬‬
‫‪Result‬‬

‫‪• ? – line ((X1, X2), Z ).‬‬


‫‪Query -2-‬‬ ‫; ‪X1 = 1‬‬
‫; ‪X2 = 2‬‬
‫‪Z = point (3,4) .‬‬
‫‪Result‬‬

‫مثال‪ :‬نريد تعريف عالقة ‪ vertical‬تأخذ ‪ line‬و ال ‪ line‬يأخذ ‪ point‬أو ‪ vertical‬تأخذ ‪ point‬فقط ‪.‬‬
‫)يكون الخط عمودي أذا كانت قيمة ال ‪ X‬ثابتة (‬

‫صحيحة ولكن معقدة‬ ‫‪Vertical ( line ( point (X,Y1) , point (X,Y2) ).‬‬
‫أبسط‬ ‫‪Vertical ( point (X,Y1) , point (X,Y2) ).‬‬

‫‪4‬‬
‫‪/ITE.RBCs‬‬
‫العودية والعمليات الرياضية| عملي مشترك‬

‫مثال‪ :‬نريد تعريف عالقة ‪ horisantal‬بنفس الطريقة السابقة‬


‫)يكون الخط أفقي إذا كانت قيمة ‪ Y‬ثابتة (‬
‫‪Horizontal ( line ( point (X1,Y) , point (X2,Y) ).‬‬
‫‪Horizontal ( point (X1,Y) , point (X2,Y) ) .‬‬

‫نقوم باالستعالم التالي ‪:‬‬


‫‪• ? – vertical ( point (1 ,1) , point (1 ,3)).‬‬
‫‪= true‬‬

‫‪• ? – vertical ( point (1 ,1) , point (3,2)).‬‬


‫ال يطابق ‪= false‬‬
‫‪• ? – vertical ( point (1 ,2) , point (1 ,3)).‬‬ ‫‪Unification‬‬ ‫▪‬
‫‪X=1‬‬ ‫‪X1 = X 2‬‬
‫المساواة بال ‪ prolog‬تعمل عمل‬
‫(عنوان متحول ‪ Y2‬في الذاكرة ) ‪Y2 = 1-234‬‬
‫مطابقة وليست عملية رياضية أو إسناد‬
‫‪➢ ? – k (s(g) , Y) = k (X, t(k)).‬‬
‫;)‪X = s(g‬‬
‫‪Y = t(k).‬‬

‫‪➢ ? – k (s(g) , t(k)) = k (X , t(Y)).‬‬


‫;)‪X = s(g‬‬
‫‪Y = k.‬‬

‫العمليات الرياضية ب ‪.~ prolog‬‬

‫عملية ‪: is‬‬ ‫▪‬


‫أما في ‪ prolog‬تكتب ‪ 8 is 2+6‬ألن "=" هي مطابقة‬ ‫رياضيا تكتب ‪2+6 = 8 :‬‬
‫✓ إلجبار البرنامج على وضع أي عملية حسابية يجب وضع ‪is‬‬
‫‪x is 2+6‬‬ ‫لنأخذ العبارة ‪:‬‬
‫▪ هام‪:‬‬
‫الطرف األيمن من العبارة هو‬ ‫معنى هذه العبارة أنه قم بإيجاد قيمة ‪ x‬التي تجعل الجملة ‪ 2+6‬صحيحة‪.‬‬
‫الذي يحوي العملية المعقدة‬ ‫لدينا العمليات الرياضية األخرى مثل ‪:‬‬

‫➢ ‪ -‬الطرح‬ ‫➢ * الضرب‬
‫➢ ‪ /‬القسمة ( ‪ ← ) mod‬يشبه ال ‪function‬‬
‫مثال‪:‬‬
‫‪• ? – R is mod ( 7 , 2 ).‬‬
‫‪R=1‬‬

‫‪5‬‬
‫‪/ITE.RBCs‬‬
‫العودية والعمليات الرياضية| عملي مشترك‬

‫مثال‪ :‬تمثيل عالقة الضعف‪:‬‬


‫‪double ( X, Y ) : - Y is 2*X.‬‬

‫‪Query‬‬ ‫‪ ? – double ( 1, Y ).‬استعالم‬ ‫‪Query‬‬ ‫‪ ? – double ( 1 ,2 ).‬استعالم‬


‫‪2‬‬ ‫‪ Y = 2‬الجواب‬ ‫‪1‬‬ ‫الجواب‬ ‫‪= true‬‬

‫‪Query‬‬ ‫‪? – double ( X, 2 ).‬‬


‫‪3‬‬ ‫‪= error‬‬
‫ألنه سيقوم باستخدام متحول ال يحوي قيمة بعد‬

‫مالحظة‪:‬‬
‫‪? – 3 =:= 2+1‬‬ ‫يمكن االستعاضة عن العملية ‪ is‬بكتابة = ‪= :‬‬
‫‪true‬‬
‫‪? 3 = \ = 2+1‬‬ ‫ولكتابة عدم المساواة نستخدم = \ =‬
‫‪false‬‬
‫بحيث يكون ملخص العمليات ‪:‬‬
‫=‪ =:‬مساواة حسابية‬ ‫= مطابقة الطرفين‬
‫= \ = عدم مساواة حسابية‬ ‫= \ عدم مطابقة للطرفين‬

‫عمليات المقارنة‪\= ,=< ,>= ,< ,< :‬‬ ‫▪‬


‫لو قمنا باالستعالم التالي ‪:‬‬
‫‪ ? – X = b , X < 4.‬استعالم‬ ‫‪ ? – X = 3 , X < 4 .‬استعالم‬
‫‪and‬‬
‫ال ‪ b‬ليس أصغر من ‪ = false → 4‬الجواب‬ ‫‪ = true‬الجواب‬
‫مثال‪ :‬جمع عددين‬
‫عالقة ‪ add‬عالقة بين ثالث متحوالت أي ‪add (X,Y,Z) :- Z is X+Y. :‬‬
‫‪? – add ( 1,Y,3).‬‬ ‫‪? – add ( 1,2,3).‬‬ ‫‪?- add (1,2,Z).‬‬
‫‪ Y‬غير معرفة ‪= error‬‬ ‫‪= true‬‬ ‫‪Z=3‬‬
‫‪Query 3‬‬ ‫‪Query 2‬‬ ‫‪Query 1‬‬

‫▪ مالحظة‪:‬‬
‫إن القواعد في ‪ prolog‬ال ترد قيمة عند استدعائها باالسم كما في اللغات عالية المستوى لذلك يجب‬
‫تخزين الخرج في ‪ parameter‬إضافي ضمن القاعدة لذلك أضفنا ‪ Z‬في المثال السابق‬
‫وإليجاد خرج جمع الرقمين ندخل الرقمين ونضع البارمتر الثالث متحول كما في (‪)Query 1‬‬

‫‪6‬‬
‫‪/ITE.RBCs‬‬
‫العودية والعمليات الرياضية| عملي مشترك‬

‫مثال ‪ :‬مجموع األعداد من ‪ 1‬إلى ‪n‬‬


‫عالقة ‪ ← sum‬نقوم بإعطائها متحولين ‪ N <-- N,S‬قيم المجموع و ‪ S‬لتخزين الناتج‪.‬‬
‫لحل هذه المسألة نحتاج للتفكير بطريقة عودية لنصل إلى الحل‬
‫فكرة خاطئة للحل‪:‬‬
‫وجود متحول ثالث لنراكم به المجموع فهذه تعتبر طريقة تكرارية خاطئة بالنسبة للـ ‪prolog‬‬
‫𝑛‬
‫∑‬ ‫𝑥‬ ‫‪= 𝑛 + ∑𝑛−1‬‬
‫‪1‬‬ ‫← عملية الجمع من ‪ 1‬إلى ‪ n‬رياضياً‪ " :‬تكرارياً " ‪𝑥 = 𝑛 + (𝑛 − 1) + (𝑛 − 2) + ⋯ 1‬‬
‫‪𝑥=1‬‬
‫←عملية الجمع رياضياً‪ " :‬عودياً " أي بإعادة استخدام ‪ ، sum‬ومكونات أي حل عودي من هذا الشكل‪:‬‬
‫‪-1-‬‬ ‫إذا كان يوجد شروط ← نختبرها‬ ‫▪‬
‫إذا كان يوجد متحوالت ← نجهزها ‪-2-‬‬ ‫▪‬
‫‪-3-‬‬ ‫نطبق العودية‬ ‫▪‬
‫‪-1-‬‬ ‫‪-2-‬‬ ‫‪-3-‬‬ ‫‪-4-‬‬ ‫‪- 4-‬‬ ‫نكتب الجواب النهائي " القاعدة "‬ ‫▪‬
‫‪Sum ( N,S ) :- N > 1 , N1 is N-1 , sum ( N1,S1 ) , S is S1+N.‬‬
‫) ‪ ← sum ( 1,1‬شرط التوقف أبسط حالة صحيحة‪.‬‬
‫مثال‪ :‬حساب عاملي عدد !‪n‬‬
‫عاملي عدد ‪ n‬هو ضرب أو عداد من ‪ 1‬إلى ‪n‬‬
‫نالحظ أنه يشبه المثال السابق ( جمع أعداد من ‪ 1‬إلى ‪ ) n‬وذلك بإبدال عملية الجمع بضرب فيكون‪:‬‬
‫‪factorial ( N,S ) :- N > 1 , N1 is N-1 , factorial( N1,S1) , S is S1*N .‬‬
‫‪factorial ( 1,1 ) .‬‬
‫مثال‪ :‬حساب فيبوناتشي عدد ‪n‬‬
‫تذكرة‪:‬‬
‫سلسلة فيبوناتشي عبارة عن سلسلة أعداد بحيث مجموع كل عددين متتاليين يعطي العدد التالي … ‪0 1 1 2 3 5 8‬‬
‫سوف نقوم بحساب العملية بطريقة عودية ومنه يلزم تحديد‬
‫‪ .1‬القاعدة العامة‪ :‬تكون على الشكل التالي‪fib (N) = fib (N-1) + fib (N-2). :‬‬
‫‪ .2‬شروط التوقف‪f(0) = 0 , f(1) = 1 :‬‬
‫منه سوف نطبق القاعدة العامة عندما يكون العدد أكبر من ‪1‬‬
‫تطبيق أكواد المحاضرة‬ ‫وكما تحدثنا سابقاً أنه ال يمكن إيجاد قيمة مباشرة و يجب إضافة متحول ‪ Z‬للقاعدة فتصبح‬
‫لمسائل العودية‬ ‫‪fib ( X,Y) :- X > 1 , X1 is X-1 , X2 is X-2 , fib ( X1,Y1) , fib ( X2,Y2) , Y is Y1 + Y2.‬‬
‫‪fib (0,0).‬‬
‫‪fib (1,1).‬‬

‫_‪_Good Luck‬‬

‫‪7‬‬
‫‪/ITE.RBCs‬‬

You might also like