Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

‫‪270‬‬

‫عملي‬
‫محتوى مجاني غير مخصص للبيع التجاري‬
‫‪00‬‬
‫‪7‬‬
‫‪Cut in prolog‬‬
‫‪07/06/2021‬‬ ‫ا ‪9‬‬ ‫عملي مشترك‬
‫الصفحا‬
‫ت‬ ‫مبادئ الذكاء الصنعي‬
‫محتويات المحاضرة‬

‫‪Dynamic and static facts‬‬ ‫تمارين‬ ‫‪Cut in prolog‬‬

‫ورد معنا سابقاً أن برولوغ يقوم بتجربة جميع الحلول الممكنة سواء كانت صحيحة أم خاطئة ضمن شجرة االستدعاءات‬
‫العودية (‪ )AOtree‬و يقوم بعرضها ‪.‬‬
‫وسنتعرف في هذه المحاضرة على طريقة لعدم عرض باقي الحلول بعد إيجاد أول حل صحيح و ذلك عن طريق القطع‬
‫(‪.)Cut‬‬

‫القطع في برولوغ (‪)Cut‬‬


‫يقوم القطع ضمن برولوغ بجلب أول حل صحيح وعدم تجربة جميع الحلول األخرى الممكنة و يعبر عن القطع (‪)Cut‬‬
‫بالرمز ”!“ حيث يتم وضعه بعد شرط القاعدة العامة على أنه معامل لـ ‪. and‬‬
‫‪ .1‬مثال‪:‬‬
‫لدينا قاعدة وردت سابقاً تقوم بحساب جميع عناصر سلسلة قد تحتوي على سالسل داخلية ‪.‬‬

‫‪nested_sum([H|T],S):-is_list(H),nested_sum(H,S1),nested_sum(T,S2),S is S1 + S2.‬‬
‫‪nested_sum([H|T],S):-not(is_list(H)),nested_sum(T,S1),S is S1 + H.‬‬
‫‪nested_sum([],0).‬‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪1‬‬
‫مبادئ ذكاء صنعي | عملي مشترك‬

‫عند تنفيذ الطلب التالي ‪:‬‬

‫‪?- nested_sum([1,[2,[2,5,6]]],Z).‬‬
‫; ‪Z = 16‬‬
‫‪false.‬‬

‫‪ -‬بينما لو أردنا استعمال الـ ‪ cut‬لرد أول حل صحيح فقط دون تجربة باقي الحلول ‪ ،‬نستعمل الـ ‪ cut‬بعد شرط‬
‫القاعدة العامة )‪( is_list(H‬الرأس عبارة عن سلسلة )‪.‬‬
‫‪ -‬وفي حال تم رد ‪ false‬نضع ‪ cut‬أخرى بعد القاعدة الثانية‪.‬‬

‫مبدأ عمل القطع‪:‬‬

‫إن مبدأ عمل القطع هو عندما يكون الشرط الذي يسبقه صحيح يقوم بقطع جميع استدعاءات األفرع األخرى أي ال يقوم‬
‫باستدعاء القاعدة الثانية والثالثة عند هذا االستدعاء أو الفرع لذلك نستطيع التأكد عند تحقيق شرط أن الرأس هو سلسلة‬
‫فال يقوم باالستدعاء من أجل الرأس نفسه عند القاعدة الثانية (أي عندما يكون الرأس ليس سلسلة) لذلك ال داعي لشرط‬
‫القاعدة الثانية ‪.‬‬
‫وتكون القاعدة من الشكل ‪:‬‬

‫‪cut_nested([H|T],Z):-is_list(H), ! ,cut_nested(H,Z1),cut_nested(T,Z2),Z is Z1+Z2 .‬‬


‫‪cut_nested([H|T],Z):-cut_nested(T,Z1),Z is Z1+H.‬‬
‫‪cut_nested([],0).‬‬

‫التنفيذ‪:‬‬

‫‪?- cut_nested([1,[2,[2,5,6]]],Z).‬‬
‫‪Z = 16.‬‬

‫‪ -‬نالحظ أن النتيجة خالية من ‪ false‬أي عند أول حل صحيح تم إيقاف تجربة باقي الحلول‪.‬‬
‫‪ -‬وتكون شجرة االستدعاءات هي ‪:‬‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪2‬‬
‫‪/ITE.RBCs‬‬
‫مبادئ ذكاء صنعي | عملي مشترك‬

cut_nested() L=[1,[2,[2,5,6]]]

or

H=1
T=[[2,[2,5,6]]]

cut_nested(L,Z) cut_nested(L,Z) cut_nested([],0)

And And
false

T=[[2,[2,5,6]]] H=1

is_list(H) cut_nested(T,Z1) Z is Z1+H


‫بما أن الحد األول‬
‫ فال داعي‬false
‫الختبار األفرع‬ or
false
and ‫األخرى للـ‬

H=[2,[2,5,6]]
T=[]

cut_nested(L,Z) cut_nested(L,Z) cut_nested([],0)

‫ نفذت ضمن االستدعاء الثاني‬cut ‫بما أن الـ‬


And
‫ الموازية لن تنفذ‬or ‫فإن أفرع الـ‬

is_list(H) ! cut_nested(H,Z1) cut_nested(T,Z2)

true excute ………. ……….

‫محتوى مجاني غير مخصص للبيع التجاري‬


3
/ITE.RBCs
‫مبادئ ذكاء صنعي | عملي مشترك‬

‫‪ -‬نالحظ عندما تتحقق الـ ‪ cut‬تلغي جميع أفرع الـ ‪ or‬التي تليها و التي تكون مرتبة حسب ورود القواعد ضمن ملف‬
‫أو واجهة القواعد ‪،‬و منه يكون ترتيب القواعد ضروري عند وجود الـ ‪. cut‬‬

‫و غالبا يكون ترتيب القواعد عند وجود الـ ‪ cut‬هو ‪:‬‬

‫‪ ‬القاعدة التي تحتوي الشرط العام وتحتوي على ‪.cut‬‬


‫‪ ‬القاعدة التي تخالف الشرط العام‪.‬‬
‫‪ ‬القاعدة التي تحتوي شرط التوقف‪.‬‬
‫‪ .2‬مثال‪:‬‬
‫اكتب قاعدة تقوم بإيجاد سلسلة فرعية من سلسلة ما حيث هذه السلسلة الفرعية جميع عناصرها هي أكبر من رقم معين‬
‫مع استخدام ‪.cut‬‬

‫‪bigger([H|T],X,[H|T1]):-H>X, ! ,bigger(T,X,T1).‬‬
‫‪bigger([_|T],X,L):-bigger(T,X,L).‬‬
‫‪bigger([],_,[]).‬‬

‫‪ ‬حيث كتابة الـ ‪ cut‬تكون بعد شرط القاعدة العامة ‪.‬‬


‫‪ ‬نحذف الشرط المعاكس لشرط القاعدة العامة الموجود في القاعدة الثانية‪.‬‬

‫تمارين عن ‪cut‬‬
‫‪ .1‬اكتب قاعدة إلضافة عنصر ‪ E‬إلى سلسلة عند موقع معين (‪.)index‬‬

‫‪append_at([H|T],E,I,[H|L]):-I>1, ! , I1 is I-1,append_at(T,E,I1,L).‬‬
‫‪append_at(L,E,1,[E|L]).‬‬

‫التنفيذ‪:‬‬

‫‪?- append_at([1,2,3,4,5,6],2,2,L).‬‬
‫‪L = [1, 2, 2, 3, 4, 5, 6].‬‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪4‬‬
‫‪/ITE.RBCs‬‬
‫مبادئ ذكاء صنعي | عملي مشترك‬

‫‪ .2‬اكتب قاعدة تقوم بحذف التكرارت الموجودة ضمن سلسلة ما‪.‬‬

‫‪remove_double([H|T],L):-member(H,T),!,remove_double(T,L).‬‬
‫‪remove_double([H|T],[H|L]):-remove_double(T,L).‬‬
‫‪remove_double([],[]).‬‬

‫التنفيذ‪:‬‬

‫‪?- remove_double([1,2,2,1,3,4,2,2,4,4],Z) .‬‬


‫‪Z = [1, 3, 2, 4].‬‬

‫‪ .3‬اكتب قاعدة تقوم بحذف العناصر المشتركة بين سلسلتين من السلسلة األولى‪.‬‬
‫‪ ‬بمعنى أخر أوجد السلسلة األولى فرق السلسلة الثانية ‪:‬‬

‫‪list_diff([H|T],L2,L):-member(H,L2),!,list_diff(T,L2,L).‬‬
‫‪list_diff([H|T],L2,[H|L]):-list_diff(T,L2,L).‬‬
‫‪list_diff([],_,[]).‬‬

‫التنفيذ‪:‬‬

‫‪?- list_diff([1,2,3],[3,5],Z).‬‬
‫‪Z = [1, 2].‬‬

‫مالحظة ‪:1‬‬ ‫▪‬


‫)‪ : member(H,L‬تقوم بالتحقق من العنصر اذا كان موجود ضمن السلسلة أم ال‪.‬‬ ‫▪‬
‫مثال ‪:‬‬ ‫▪‬
‫‪Member(2,[1,2,3,4]). ⇒ true.‬‬ ‫▪‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪5‬‬
‫‪/ITE.RBCs‬‬
‫مبادئ ذكاء صنعي | عملي مشترك‬

‫‪ .4‬اكتب قاعدة تقوم بجمع سلسلتين‪.‬‬

‫‪union([H|T],L,M):-member(H,L),!,union(T,L,M).‬‬
‫‪?- union([1,2,3],[4,5,6],Z).‬‬
‫‪union([H|T],L,M):-union(T,[H|L],M).‬‬
‫‪Z = [3, 2, 1, 4, 5, 6].‬‬
‫‪union([],L,L).‬‬

‫مالحظة ‪:2‬‬ ‫▪‬


‫)‪ : append(L1,L2,L3‬تقوم بوضع عناصر السلسلة األولى والثانية ووضعهم في السلسة الثالثة‪.‬‬ ‫▪‬
‫مثال ‪:‬‬ ‫▪‬
‫‪append([1,2,3],[4,5],L). ⇒ L=[1,2,3,4,5].‬‬ ‫▪‬
‫‪ .5‬اكتب قاعدة تقوم بتحويل سلسلة تحتوي على سالسل داخلية إلى سلسلة ال تحوي أي سلسلة‬
‫داخلية مع الحفاظ على جميع عناصر هذه السالسل الداخلية ‪.‬‬

‫‪nested_to_list([H|T],L):-is_list(H),!,nested_to_list(H,L1),nested_to_list(T,L2),append(L1,L2,L).‬‬
‫‪nested_to_list([H|T],[H|L]):- nested_to_list(T,L),!.‬‬
‫‪nested_to_list([],[]).‬‬

‫التنفيذ‪:‬‬

‫‪?- nested_to_list([1,[1,[1]],[1,5,4]],Z).‬‬
‫‪Z = [1, 1, 1, 1, 5, 4].‬‬

‫مالحظة ‪ :‬تم رفع ملف ‪ Pl‬يرجى االطالع عليه‪😄.‬‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪6‬‬
‫‪/ITE.RBCs‬‬
‫مبادئ ذكاء صنعي | عملي مشترك‬

‫‪Dynamic facts‬‬
‫لقد اعتدنا كتابة ‪ facts‬ضمن ملف وتخزينها و قراءة الملف من خالل تعليمة الـ ‪ consult‬ضمن واجهة االستعالمات‬
‫و هذه ‪ facts‬تدعى بالـ ‪.static facts‬‬
‫مثال‪:‬‬

‫ولكن يوجد طريقة ثانية لكتابة القواعد ضمن واجهة االستعالمات مباشرة وتسمى الـ ‪ facts‬حينها بالـ ‪dynamic facts‬‬
‫حيث يمكن إضافة و حذف القواعد المضافة بشكل ‪ dynamic‬و تخزن القواعد ضمن الـ ‪ runtime‬وتزول في حال إغالق‬
‫البرنامج‪.‬‬

‫توجد عدة توابع تساعد في كتابة وحذف الـ ‪ facts‬بهذه الطريقة و هي‪:‬‬

‫‪assert(factname(value)).‬‬ ‫يخزن الحقيقة في النهاية‬


‫‪asserta(factname(value)).‬‬ ‫يخزن الحقيقة في البداية‬
‫‪retract(factname(value)).‬‬ ‫يحذف الحقيقة‬
‫‪retractall(factname(_)).‬‬ ‫يحذف جميع الحقائق‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪7‬‬
‫‪/ITE.RBCs‬‬
‫مبادئ ذكاء صنعي | عملي مشترك‬

‫أمثلة ‪:‬‬
‫نضيف الحقائق التالية ضمن واجهة االستعالمات ‪:‬‬

‫‪assert(a(1)).‬‬
‫‪assert(a(2)).‬‬
‫‪assert(a(3)).‬‬
‫‪-?a(X).‬‬
‫‪X = 1; X = 2; X = 3 .‬‬

‫‪ ‬كما نالحظ يقوم ‪ assert‬باإلضافة في النهاية وعند استعمال اإلضافة في البداية يكون الخرج‪:‬‬

‫‪asserta(a(4)).‬‬
‫‪?- a(X).‬‬
‫‪X = 4 ;X = 1 ;X = 2 ;X = 3.‬‬

‫‪retract (a(3)).‬‬
‫‪?- a(X).‬‬ ‫‪ ‬نريد حذف )‪:a(3‬‬
‫‪X = 4 ;X = 1 ;X = 2.‬‬

‫‪retractall(a(_)).‬‬ ‫‪ ‬حذف جميع الحقائق ‪:a‬‬


‫‪?- a(X).‬‬
‫‪false.‬‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪8‬‬
‫‪/ITE.RBCs‬‬
‫مبادئ ذكاء صنعي | عملي مشترك‬

‫مالحظة‪:‬‬
‫يمكننا االستفادة من التوابع السابقة لكتابة قواعد أيضا وليس فقط حقائق‪.‬‬
‫ال يمكننا إضافة حقيقة موجودة مسبقاً في مجال الحقائق الثابتة بغض النظر عن القيمة التي‬
‫تحملها ‪.‬‬
‫‪ .1‬مثال‪:‬‬
‫لقد عرفنا مسبقا أن )‪ female(rama‬ضمن ملف ‪ ،RBCs.pl‬وفي حال أردنا إضافة حقيقة جديدة بنفس االسم تكون‬
‫النتيجة أنه ال يمكننا التعديل عليها ألنها حقيقة ثابتة‪.‬‬

‫حيث يجب جعل هذه الحقيقة ديناميكية من خالل إضافة تعليمة أول ملف القواعد بالشكل التالي‪:‬‬
‫‪:- dynamic factname/numparameter.‬‬
‫ومنه‪:‬‬
‫‪:- dynamic female/1.‬‬

‫مالحظة‪:‬‬ ‫▪‬
‫يمكننا االستفادة من الـ ‪ dynamic facts‬في توظيفها مثل توظيف الذاكرة في ‪.dp‬‬ ‫▪‬
‫‪ .2‬مثال‪:‬‬
‫لدينا قاعدة لحساب فيبوناتشي رقم ما عوديًا‪.‬‬

‫)‪Fib(n)=fib(n-1)+fib(n-2‬‬
‫)‪Fib(n-1)=fib(n-2)+fib(n-3‬‬

‫نالحظ أن )‪ fib(n-2‬يتم حسابه مرتين ‪،‬في حال تم تخزينه في الذاكرة أثناء االستدعاءات فإن هذا سوف يقلل من استهالك‬
‫المعالج ‪،‬و منه نحصل على معالجة أسرع لحساب رقم فيبوناتشي عدد ما‪.‬‬

‫انتهت املحاضرة 😄‬

‫محتوى مجاني غير مخصص للبيع التجاري‬


‫‪9‬‬
‫‪/ITE.RBCs‬‬

You might also like