Сұрақ – программа орындауда шығатын логикалық қорытындының негізі. Кез – келген сұраққа компьютер «иә» немесе «жоқ» деп, білімдер қорындағы дәйектер мен ережелерге сай жауап береді. Мысалы, білімдер жүйесін құрайық:
ұнайды (назия, рэп)
ұнайды (айжан, джаз)
киеді (назия, көйлек)
киеді (айжан, жейде)
әдемі қыз (Х): - ұнайды (Х, рэп), киеді (Х, жейде)
Енді сұрақ қояйық:
? - әдемі қыз (Айжан)
Компьютер бізге «жоқ» деп жауап береді. Себебі ереже бойынша Айжанға ұнау керек болатын рэп, алайда Айжан джазды ұнатады.
Егерде сұрақ былай қойылса!
? - әдемі қыз (Назия), онда жауап «иә» болады, себебі дәйектемеде қайшылық жоқ.
5. Пролог тіліндегі негізгі операция салыстыру немесе келісу операциясы, операция нәтижесі табысты немесе табысты емес болуы мүмкін. Салыстыру операциясы төмендегідей анықталады:
тұрақты шама өзіне тең тұрақтымен салыстырылады.
сайма сай құрылымдар бір – бірімен салыстырылады.
айнымалы тұрақтымен немесе бұрынғы айнымалымен салыстырылады.
екі бос айнымалы өзара салыстырылады.
Мысалдар, 5 салыстырылады 5, «бар» салыстырылады «бар», «қайрат» салыстырылмайды «қанат», «ұнайды (айжан, джаз)» салыстырылады «ұнайды (Х, джаз)».
Тағы бір айта кететін жайт компьютер программадағы «ұнайды», «киеді», «назия», «айжан» сияқты есімдерді «түсінбейді», сондықтан бізге оларды басқаша белгілеуге болар еді. Алайда Пролог тілінде енгізілген предикаттар бар, олар арифметикалық амалдарды графиктік салуларды, енгізу – шығару және де басқа да пайдалы операцияларды программаның туынды өнімі ретінде пайдалануға мүмкіндік береді.
Arity – Prolog енгізілген предикаты программалау жүйесі бойынша анықтамаларда жазылған және де оны Ғ1 батырмасы арқылы шақыруға болады. Пролог тілінің басқа нұсқаларында да осы сияқты енгізген предикаттар түрлері болады.
Ғылымда объектілердің арасындағы қатынастарды анықталатын қатыстар мен анықтайтын бүтін бір сала бар. Оларды реттейтін ережені рекурсивті деп атайды. Мысалы, натурал сандардың рекурсивтік анықтамасын жазыңдар:
1 – натурал сан
натурал саннан 1 артық сан да натурал.
Бұл мысалда сандар арасындағы белгілі қатыс арқылы, яғни «1 артық», келесі сандарды анықтауға болады: 2; 3; 4...
Логикалық программалау жүйесінде рекурсивтік ережелерді циклды, қайталану алгоритмдерін жазуға кеңінен пайдалануға болады, сондықтан бұл әдіс программалаудың маңызды құрал болып табылады. Мысал қарастырайық:
Натурал санның факториалын есептеу (n!), есептеу шарттарын анықтайық,
1)1!=1
2) n1=(n - 1)1*n, яғни, сандар арасындағы қатынас «көрші сандардың көбейтіндісі» қатысы арқылы анықталады, сондықтан натурал сандардың факториалы рекурсивті.
Бұл есептің программасын жазу үшін екі орынды предикат пайдаланып оны сұраулар мен байланыстырайық, сонда программа төмендегі түрде жазылады:
Программа 2;
факт (1,1).
факт (N.X): - факт (N – 1, Y), Х is Y*N .
? – факт (3,А);
Бұл программада «факт» ережесі өзін - өзі анықтайды, яғни берілген мәндер бойынша санның факториалын есептейді, сондықтан ереже рекурия болады, ал is Y*N жазуы «бар» предикатына арифметикалық амалды орындау үшін сұрау жасайды. Программаның жұмыс процесін төмендегідей бейнелеуге болады.
? факт (3,АО).
Жауап: А=6
? факт (2, А1).
Х1=2*3 =6
? факт (1, А2).
Х2=1*2=2
факт (1,1).
Программаның орындалу барысында «факт» ережесі өзін - өзі шақырып, қатыстар бойынша жұмыс жүргізеді. Сондықтан пайда болатын айнымалылар үшін ЭЕМ жадысында А, АО,А1, А2, және де N, NO, N1, N2 айнымалылры үшін орын, яғни, стэк бөлінеді. Сұрақты факт (1,1) предикаты мен келістіру барысында рекурсия тоқталады да кейін жүру басталады – түзу бойында қалған келісімдерді орындау. Бұл тәртіп шексіз қайталанбас үшін факт (1,1) предикатының ролі ерекше – ол рекурсияны шектеулі, яғни, аяқтау шарты.
Программаның орындалуын басқару Пролог жұмысының негізі болып табылады және де бұл арнайы енгізілген « кесу» функциясымен іске асырылады. «Кесу» функциясының белгісі «!» бұл енгізілген функция төмендегідей мақсаттарды орындауға пайдаланылады:
Программаны орындау барысында шексіз қайталауды болдырмау.
Бір – бірін қайталамайтын сөйлемдер құру.
Мақсаттарды көруді шектеу.
Осы мақсаттарды мысал арқылы тексерейік.
Мысал 1; Шексіз қайталануды жою. Фибоначчи сандарының анықтамасын тексерейік.
Программа 3;
fib (0, ,1).
fib (1,1,1).
fib (N,G,H): - fib (N –1,F,G), H is F+G.
? – fib (0, ,F).
Бұл сұраққа Ғ=1 деген жауап алынады, сондықтан Пролог екінші дәйекті салыстыруға кіріседі, алайда бұл операция табыссыз болады, енді үшінші сөйлемге жауап іздей отырып fib (-1, ҒО, Ғ1) мақсатын дәлелдеу әрекеті орындалады және де ол fib (-2,..,..) мақсатына әкеледі, сөйтіп келесі мақсатты дәлелдеу қажет болды, яғни, шексіз қайталануды орындау қажет болады.
Алайда, мұндай жағдайды болдырмау үшін кесуді пайдаланып, біз Прологқа шешім іздеу барысында алғашқы табысты шешімнен басқа келісімнің болмайтындығын көрсетеміз және де программаның орындалуы төмендегідей болады:
Программа 3А;
fib (0, ,1): - !
fib (1,1,1): -!
fib (N, G, H): - fib (N – 1, F,G), H is F+G
Сондықтан, ? – fib (0, ,Ғ) жауап F=1 болады және де басқа шешім болмайды.
Мысал 2; бір – бірін қайталамайтын сөйлемдер құру. «Екі санның үлкенін табу» ережесінің орындалуын қарастырайық. Бұл қатынас төмендегідей жасалады max (X,Y,M), сондықтан сәйкес ережелер төмендегі түрде жазылады:
«Егер x>=Y, онда М=X және де егер X
Прологта бұл ережені max (X,Y,X): - X>=y;
max (X,Y,Y): -X=Y, онда M=X әйтпесе M=Y, бұл ереже әрі ұғымды, әрі ықшамды және де Пролог тілінде кесуді пайдаланып төмендегідей программа жазуға болады.
max ( X,Y,X) : - >=Y,1.
max (X,Y,Y).
Үшінші мақсат бойынша қарастыруды шектеу үшін төмендегі программаны қарастырайық.
Программа 4;
b.
d.
A: -B,C. (1)
C: -D,1,E. (2)
E: -F, S, H. (3)
? A.
Бұл программаның орындалу барысында бірінші ережеден (1) екінші ереже (2) туындайды, себебі С айнымалысы екі сөйлемде де кездеседі және де бірінші сөйлемдегі С орнына мәндері қойылуы қажет. Осы тәртіппен екінші ережеден (2) үшінші ереже (3) туындайды және де егерде үшінші ереже табыссыз болса, онда екінші ережеде кесу операциясы орындалады, сөйтіп программадағы сұраққа шешім ізделінеді.
Қорыта келе, «кесу» функциясы Пролог тілінде программаны орындау процесін басқарып, шешімдерін анықтауда өте пайдалы құрал екендігіне көзіміз жетті.
Достарыңызбен бөлісу: |