Professional Documents
Culture Documents
Artificial Intelligence Practical Lec 7
Artificial Intelligence Practical Lec 7
عملي
محتوى مجاني غير مخصص للبيع التجاري
00
7
Cut in prolog
07/06/2021 ا 9 عملي مشترك
الصفحا
ت مبادئ الذكاء الصنعي
محتويات المحاضرة
ورد معنا سابقاً أن برولوغ يقوم بتجربة جميع الحلول الممكنة سواء كانت صحيحة أم خاطئة ضمن شجرة االستدعاءات
العودية ( )AOtreeو يقوم بعرضها .
وسنتعرف في هذه المحاضرة على طريقة لعدم عرض باقي الحلول بعد إيجاد أول حل صحيح و ذلك عن طريق القطع
(.)Cut
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).
?- nested_sum([1,[2,[2,5,6]]],Z).
; Z = 16
false.
-بينما لو أردنا استعمال الـ cutلرد أول حل صحيح فقط دون تجربة باقي الحلول ،نستعمل الـ cutبعد شرط
القاعدة العامة )( is_list(Hالرأس عبارة عن سلسلة ).
-وفي حال تم رد falseنضع cutأخرى بعد القاعدة الثانية.
إن مبدأ عمل القطع هو عندما يكون الشرط الذي يسبقه صحيح يقوم بقطع جميع استدعاءات األفرع األخرى أي ال يقوم
باستدعاء القاعدة الثانية والثالثة عند هذا االستدعاء أو الفرع لذلك نستطيع التأكد عند تحقيق شرط أن الرأس هو سلسلة
فال يقوم باالستدعاء من أجل الرأس نفسه عند القاعدة الثانية (أي عندما يكون الرأس ليس سلسلة) لذلك ال داعي لشرط
القاعدة الثانية .
وتكون القاعدة من الشكل :
التنفيذ:
?- cut_nested([1,[2,[2,5,6]]],Z).
Z = 16.
-نالحظ أن النتيجة خالية من falseأي عند أول حل صحيح تم إيقاف تجربة باقي الحلول.
-وتكون شجرة االستدعاءات هي :
cut_nested() L=[1,[2,[2,5,6]]]
or
H=1
T=[[2,[2,5,6]]]
And And
false
T=[[2,[2,5,6]]] H=1
H=[2,[2,5,6]]
T=[]
-نالحظ عندما تتحقق الـ cutتلغي جميع أفرع الـ orالتي تليها و التي تكون مرتبة حسب ورود القواعد ضمن ملف
أو واجهة القواعد ،و منه يكون ترتيب القواعد ضروري عند وجود الـ . cut
bigger([H|T],X,[H|T1]):-H>X, ! ,bigger(T,X,T1).
bigger([_|T],X,L):-bigger(T,X,L).
bigger([],_,[]).
تمارين عن 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].
remove_double([H|T],L):-member(H,T),!,remove_double(T,L).
remove_double([H|T],[H|L]):-remove_double(T,L).
remove_double([],[]).
التنفيذ:
.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].
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).
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].
Dynamic facts
لقد اعتدنا كتابة factsضمن ملف وتخزينها و قراءة الملف من خالل تعليمة الـ consultضمن واجهة االستعالمات
و هذه factsتدعى بالـ .static facts
مثال:
ولكن يوجد طريقة ثانية لكتابة القواعد ضمن واجهة االستعالمات مباشرة وتسمى الـ factsحينها بالـ dynamic facts
حيث يمكن إضافة و حذف القواعد المضافة بشكل dynamicو تخزن القواعد ضمن الـ runtimeوتزول في حال إغالق
البرنامج.
توجد عدة توابع تساعد في كتابة وحذف الـ factsبهذه الطريقة و هي:
أمثلة :
نضيف الحقائق التالية ضمن واجهة االستعالمات :
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.
مالحظة:
يمكننا االستفادة من التوابع السابقة لكتابة قواعد أيضا وليس فقط حقائق.
ال يمكننا إضافة حقيقة موجودة مسبقاً في مجال الحقائق الثابتة بغض النظر عن القيمة التي
تحملها .
.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يتم حسابه مرتين ،في حال تم تخزينه في الذاكرة أثناء االستدعاءات فإن هذا سوف يقلل من استهالك
المعالج ،و منه نحصل على معالجة أسرع لحساب رقم فيبوناتشي عدد ما.
انتهت املحاضرة 😄