2-мысал. Кезекті элементтері болмайтын тізім есебін қарастырайық.
0,1,1,2,3,5,8,13,21,34,55,89,144,... ,
бұл белгілі Фибоначчи тізіміне ұқсас. Әрбір элементті келесі ереже бойынша анықтаңыз:
f0=0,
f1=1,
fn=fn-1+fn-2
Бірінші формула тұжырымдама бойынша нөлдік элементтің мәні кезекті 0-ге тең. Мұны мына факт түрінде жазуға болады:
Фиб(0,0);.
Екінші қатардың бірінші элементі тұжырымдама бойынша 1-ге тең. Пролог-Д жүйесінде мұны мына түрде жазамыз:
Фиб(1,1);.
Үшінші қатар рекурсивті қатынасты жазуға сәйкес келеді:
Фиб(N,X)<-Фиб(#N-2#,Y),Фиб(#N-1#,Z), СЛОЖЕНИЕ(Y,Z,X);
Бұл сөйлем Пролог-Д тілінде кезекті элементтер мәнін есептейтін мәліметтер базасын көрсетеді. Сұрақ мына түрде болады:
?Фиб(10,X);
Пролог-Д жүйесінде жауабы:
x=55
Басқа шешім жоқ.
Берілген есеп үшін бұл шешім жолы қанағаттанарлықтай емес. fn-1 –ді есептегеннен кейінгі келесі fn-2 есептеуде fn-1 –ді қайта есептеу қажет болады. N+1 санын табу үшін Фибоначчи 2*(N+1)-1 рекурсивті табуды қажет етеді. Бұдан құтылу басқа білім қорына өтуді қажет етеді, яғни «Фиб» аталатын предикат үш өлшем бойынша анықталады. Онда 3 аргумент бар N және N-1 мәндері кезекті элементтер. Мұндай білім қоры Пролог-Д жүйесінде нәтижесі ауысады.
0-ші элементтің кезекті 0 бар, ал (-1) элемент анықталмаған, яғни
Фиб(0,x,0);. Екінші аргумент х бейнеленген. Берілген жағдайда х мәні кез-келген болуы мүмкін.
Бірінші элементтің кезегі 1, ал нөлдік 0. Фиб(1,0,1);.
N-ші кезекті мүшесі Фибоначчидің кезекті N-1-ші элемент арқылы анықталады.
Фиб(N,F,f)<- Фиб(#N-1#,Ф,F),СЛОЖЕНИЕ(Ф,F,f);.
Бұл білім қорына келу келесі түрде болады:
?Фиб(10,F,f);.
Пролог-Д жүйесінің жауабы:
F=55,
f=34
Басқа шешім жоқ.
Бұл білім қорымен жұмыс жасау барысында Фибоначчидің N-ші элементін есептеу үшін бар болғаны N рекурсивті есептеу қажет. Жалпы жағдайда білім қорының кезекті сөйлемінде мән болмайды. Келесі мысалда бұлай емес:
родитель(X)<- родитель(Y),отец(Y,Z);
родитель(Коля);
отец(Коля,Петя);
родитель(Петя);.
Бірінші сөйлемде басы сол атқа және сол мақсатқа ие болады – «ата-ана». Бұл білім қорында жауапты іздеу барысында ереже қолданылуы мүмкін. Бұл жүйенің білім қорындағы бірінші сөйлеміне ғана келеді және сол арқылы ?родитель(Петя) сұрағы беріліп, бірақ оған жауап ешқашан табылмайды. Білім қорында екі сөйлемнің орнын ауыстыру шешімді табуға өзгеріс алып келеді.
родитель(Коля);
родитель(X)<-родитель(Y), отец(Y,X);
отец(Коля,Петя);
?родитель(Петя);.
Қайталап шектелмеген сөйлемге қарату мысалдағыдай сипатталған болуы мүмкін:
ВЫШЕ(А,В)<-НИЖЕ(В,А);
НИЖЕ(В,А)<-ВЫШЕ(А,В);
ВЫШЕ(Коля, Петя);
?НИЖЕ(Петя, Коля);.
Мұндай жағдай ілмек деп аталады. Бірақта, егер үшінші сөйлем бірінші орында тұрса, онда қайта қарату болмайды және жауап табылмауы мүмкін.
Фибоначчидің элементтер тізімін есептеуде программада шексіз ілмек кездесуі мүмкін. Егер сұрақ мына түрде болса:
?Фиб(0,x,y);,
онда бірінші мүмкін нәтиже
x=_0,
y=1
Келесі шешімді табуда шексіз ілмек болуы мүмкін, өйткені мынау есептеледі:
Фиб(-1,x,y), Фиб(-2,...),... .
Осыған ұқсас жағдайларды бақылауда білім қорының модификациясы қажет болады:
Фиб(N,F,f)<- БОЛЬШЕ(N,1),Фиб(#N-1#,Ф,F),
СЛОЖЕНИЕ(Ф,F,f);.
Сонда альтернативті шешімдерді іздеуде сұраққа жауап мына түрде:
?Фиб(0,x,y);
x=_0,
y=1
нәтиже алынады:
Басқа шешім жоқ.
Тағы да бір сөйлем. Пролог-Д жүйесінің білім қорында егер сөйлемде бірдей аттармен бір ғана орында жазылса дұрыс болады. Салыстыру үшін екі білім қоры келтірілген.
1. 2.
мама(Таня, Надя); мама(Таня, Надя);
бабушка(X,Y)<-мама(X,Z), мама(Надя, Катя);
мама(Z,Y), бабушка(X,Y)<- мама(X,Z),
мама(Надя, Катя); мама(Z,Y);.
Тапсырмалар
1. Білім қорының Пролог-Д тілінде факториалды есептеу жазыңыз.
2. Білім қорының Пролог-Д тілінде натурал сандардың қосындысын есептеңіз.
3. Білім қорының Пролог-Д жүйесінде натурал сандардың квадраттарын есептеңіз.
4. Ең кіші еселікті есептеуді жазыңыз.
5. Пролог-Д жүйесінде поптың иті бар туралы ертегі жазыңыз:
"У попа была собака,
Он ее любил,
Она съела кусок мяса,
Он ее убил
И на могиле написал...".
6. Пролог-Д жүйесінде репка туралы ертегіні жазыңыз.
"Посадил дед репку. Выросла репка ...".
Достарыңызбен бөлісу: |