«Пролог логикалық программалау тілі»



бет5/6
Дата01.07.2016
өлшемі458.5 Kb.
#169566
1   2   3   4   5   6

Қыстыру арқылы сұрыптау

Енді қыстыру сұрыптауын қарастырайық. Ол, егер тізім соңы сұрыпталған болса, онда тізімдегі бірінші элементті оның соңыдағы орнына қою жеткілікті жəне барлық тізім сұрыпталған болып шығады. Бұл ойды жүзеге асыру үшін екі предикат құрайық. Iinsert предикатының мəні – сұрыпталған тізімге ол реттелген күйде қалатындай мəнін қою. Оның бірінші аргументі қоспалы мəн болады, екіншісі - сұрыпталған тізім, үшіншісі-тізім, бірінші аргументтің қойылымы керек жерде екінші аргументтің реті өзгермейтіндей алынған.

ins_sort([ ],[ ]). /* сұрыпталған бос тізім - бос тізім болып қалады. * /

ins _sort([HIT],L):-

ins _ sort(T, Т _ Sort),

/* Т – алғашқы тізімнің соңы,

Т _ Sort – сұрыпталған алғашқы тізімнің соңы * /

inse~l·1-T.T _ Sort,L).

Н қоямыз (алғашқы тізімнің бірінші элементі) T_Sort, L аламыз (тізім , алғашқы тізімнің элементтерінен тұратын жəне кему бойынша емес тұрғандар.) */

insert(X,[],[X]). /* бос тізімге кез-келген мəнді қойсақ, бір элементті тізім аламыз. */

insert(X, [H��T], [H��Tl ]):-

Х>Н,!, /* егер қойылатын мəн тізімнің басынан үлкен болса, онда оны соңына қою керек. * /

insert(X,T,Tl).

/*Х-ті Т-нің соңына қойамыз, нəтижесі Т1 тізімін аламыз */

insert(X,T,[XI 1) ./*бұл ұсыныс егер қойылатын мəн Т тізімінің басынан үлкен болмаса, онда оны Т тізіміне бірінші элемент деп қояғанда ғана қоямыз. */

Таңдау арқылы сұрыптаймыз.

Алгоритм ойы таңдау арқылы сұрыптау өте қарапайым. Тізімде минималды элементті табамыз (осы лекция басында ойлап тапқан предикатты min_list пайдалана отырып). Оны тізімнен жоямыз (алдынғы лекцияда қарастырылған, delete _ one предикат көмегімен).

Қалған тізімді сұрыптаймыз. Сұрыпталған тізімге басы ретінде минималды элементті қосамыз. Себебі бұл элемент алғашқы тізімдегі барлық элементтерден кіші болды, жəне ол сұрыталған тізімнің барлық элементтерінен кіші болады.Жəне соған байланысты, егер оны тізімді сорттау басына қойсақ, онда тізбек өзгермейді:

Жазып алайық:

choice([ ],[ ]). /* сұрыпталған бос тізім - бос тізім болып қалады. * /

choice(L,[XIT]):- /* Х-ті сұрыпталған тізімге Т жазамыз.

(L-тізімінің минималды элементі) */

min _list(L,X), /* Х - L-тізімінің минималды элементі */

delete _ one(X,L,L 1),

/* L 1 - L тізімінен Х элементінің бірінші кірісінің нəтижесін өшіру * /

choi r(L 1, Т). /* L 1 тізімін сұрыптайық,

нəтижесін Т – деп белгілейік* /



Тез сұрыптау

“Тез сорттаудың” авторы Хоар болып табылады. Ол оны тез деп атады, өйткені жалпыжағдайда бұл алгоритмнің эффектілігі айтарлықтай жоғары. Əдіс ойы келесідей. Алғашқы тізімді екі жазылымға бөлеміз, ол кейбір кедергілі элемент қолданылады. Біріншісінде__________кедергі элементінен кіші элементті орналастырамыз, екіншісінде – үлкен не тең. Бұл тізімдердің əр қайсысын сол əдіспен сұрыптаймыз, одан кейін тізімге кедергіден кіші элементтерді қосамыз, ең бірінші кедергі элементтің өзін, одан кейін кедергіден кіші элементтердің тізімін. Нəтижесінде дұрыс тізімде тұрған элементтерден тұратын тізімді аламыз.

Бұл ойды программалық кодқа іске асыру үшін, бізге қарапайым предикат керек болады.

Рartition қосымша предикаты екі қосымша тізімшеге бөлінуіне жауапшы болады. Онда төрт аргумент болады. Бірінші екі элемент -енетін: біріншісі – алғашқы тізім, екіншісі –кедергілік элемент. Үшінші жəне төртінші элементтер –шығатын, соған байланысты кедергіден кіші алғашқы тізімнің элементтер тізімі, жəне кедергі элементтерінен кіші емес элементтерден тұратын тізім. Quick_sort предикаты Хоардың тез сұрыптау алгоритмымен жүзеге асырылады. Ол екі сөйлемнен құралатын болады. Мынаны жазып алайық:

quick_sort([],[]). /* Сортталған бос тізім бос болып қалады. */ quick_sort([H��T],C):-

partiton( T,H,L,G),

Т тізімін L(Н барьерлі элементінен кіші элементтер тізімі) жəне G (Н-тан кіші емес

элементтер тізіміне) тізімді бөлеміз. * /

quick _ sort(L,L _ s),

/* L_s тізімі – L тізімінің элементтерін реттеу нəтижесі */

quick. _sort(G,G _s),

Аналогты, G~s тізімі – G тізімдегі элементтердің реттелу нəтижесі. * /

conc(L _s,[H��G._s],O).

/* L_s тізімдерінің басы Н тізімімен қосылуы, ал G_s соңы. Нəтижесін О деп

белгілейміз * / .

partition([],_,[],[]). /* бос тізімдердің элементтерін қалай бөлсекте, бос тізімнен босқа еш

нəрсе алмаймыз*/

partition([XIT] Y,[X��T1 ],Bs):-

Х<У,!,

partition(T,Y,Tl,Bs).



/* егер Х элементі У кедергі элементінен кіші болса, онда оның үшінші аргументін

қосамыз. * /

partition([X��T У,Т1 ,[X��Bs ]):-

раrtition(Т, У, Тl ,Bs).

/* кері жағдайда оны төртінші аргументке жазамыз * /

Сұрттаудың келесі алгоритмін зерттеуге көшпей жатып, бір қосалқы есепті шығарайық.

Бізде реттелген екі тізім бар болсын, жəне біз олардың элементтерін қосылған тізім-сұртталған түрде қалатындай етіп олардың элементтерін қосқымыз.

Предикатты жүзеге асыру ойы , екі сортталған тізімнің тəртіпті сақтауымен қосуды орындауы айтарлықтай қарапайым. Əр қадамда реттелген тізімдердің бастарын салыстырып отырамыз, онда ең кішісін салдарлы тізімге көшіреміз. Солай тізімдердің бірі біткенше қыламыз. Тізімдердің біреуі босағанда, бос емес тізімдегі қалдықты жазу қалады. Нəтижесінде алғашқы екі тізімнен тұратын тізім аламыз,;, Жəне олардың элементтерінін орналасуы керек орында. Берілген сипаттаманы жүзеге асыратын предикат құрайық (оны fusion деп атайық). Тізімдердің қайсысы бірінші босайтынын білменгеннен кейін, бізге рекурсияны екі базалық тізім бойынша қуу керек. Бізде екі факт болады – рекурсия негізі егер біз кейбір тізімді бос тізіммен қоссақ, онда біз нəтижелінде сол тізімді аламыз. Бірінші тізім бос кезінде жəне екінші тізім бос кезінде бұл факт орын алады. Рекурсия қадамын екі ереже береді: біріншісі - егер бірінші тізімнің басы екінші тізімнің басынан кіші болса, онда дəл бірінші тізім басын салдарлайтын тізім ретінде жазу керек, одан кейін бірінші тізім соңының екіншісімен қосылуына көшу керек. Бұл қосылудың нəтижесі ақырғы тізімнің соңы болып келеді. Екінші ереже керісінше, салдарлы тізім басы ретінде екінші тізімнің басын толықтырып отырады жəне бірінші тізімді екінші тізім соңымен қосады.

fusion(Ll,[ ],Ll):-! /* Ll тізімі бос тізіммен

қосқанда L 1 тізімін аламыз * /

fusion([ ],L2,l '):-/* L2 тізімі бос тізіммен қосқанда

L2 тізімін аламыз * /

fusion([H1��T1],[H2��T2],[H1��T]):- Н1<Н2,!,

/* егер Нl бірінші Н2 тізімнің басынан кіші болса /

fusion(T1, [Н2��Т2],Т).

/* бірінші тізімнің Т1 аяқ жағын екінші тізіммен қосамыз [Н2��Т2] * /

fusion(L1, [Н2��T2],[Н2��Т]):-

fusion(L1,Т2,Т).

/ L 1 бірінші тізімді Т2 екінші тізім соңымен қосамыз * /

Енді қосу арқылы сорттау алгоритмін анықтауға көшуге болады.

Қосу арқылы сұрыптау

Қосылу əдісі – “ежелгі” сұрыптардың алгоримдерінің бірі. 1945 жылы Джон фон

Нейман ойлап тапқан. Бұл ой келесіде негізделген. Екі тізімге реттеу үшін тізімді бөлеміз.

Осы элементтердің əр-қайсысын сол əдіспен реттейік, одан кейін реттелген тізімшелерді қайта ортақ бір тізімге қосамыз. Алғашқы тізімді екіге бөлетін, бірінші предикат құраймыз. Ол екі факттен жəне ережелерден тұратын болады. Бірінші факт бос тізімді екі бос тізімге болады деп тұжырымдайды. Екінші факт бір элементті тізімнің сол бір элементті тізімге жəне бос тізімге бөлінуін тұжырымдайды.

splitting([],[],[])./* бос тізімді тек бос тізімшелерге бөлуге болады * /

sрlittiпg([Н],[Н],Ш. /* бір элементті тізімді тек бір элементті тізімге бөлуге болады * /

splitting([H1 ,Н2��Т],[Н1��Т1 ],[Н2��Т2]):-

splitting(T,Tl,T2).

/* Н1 элементті бірінші тізімшеге жібереміз, Н2 элементті – екінші тізімшеге жібереміз,

Т арт жағын Т1 жəне Т2 тізімшелерге бөлеміз.*/

Енді негізгі предикатты жазуға кірісуге болады жəне ол тізімді сорттауды жүзеге асырады. Ол үш ұсыныстан тұратын болады. Біріншісі анық фактті деклорациялайды. Бос тізімді сұрыптағанда, бос тізім шығады. Екіншісінде бір элементті тізім реттелген болып келеді дейді. Үшінші ережеде қосылу сұрыптаудың əдісінің мəні бар. Басында splitting предикатының көмегімен тізімшелер екіге бөлінеді, содан олардың əр-қайсысы fusion sort предикаты рекурсивті шақырумен сұрыпталады, жəне, соңында, fusion предикатын қолдану арқылы, алынған реттелген тізімшелерді бір тізімге қосамыз, жəне ол алғашқы тізім элементтерінің реттелу нəтижесі болып табылады. Бастағы түсініктің баяндамасын жазайық.

fusion_soгt([],[]):-!./* сортталған бос тізім бос болып қалады.

fusion soгt([H] [H]):-I. /* бірэлементті тізім реттелген*/

fusiоп_sоrt(L,L _s):-

splitting(L,L 1 ,L2),

/* L тізімін екі тізімшеге бөлеміз. * /

fusion _sort(Ll,Ll_s), /*

Ll_s - Ll сұрыптарын жүзеге асырады.*/

fusion sortCТ~2,L2 s),

/* L2_s - L2 сұрыптарын жүзеге асырады. */

fusion(L 1_ s,L2 _ s,L _s).

/* L s тізіміне Ll s и L2 s қосамыз */

Келесі этапта екі элементті тізімдер т.б. қосылады. Соңғы қадамда екі тізімше

қосылады: нəтижелі, сұрыпталған.

Сұрыптау тақырыбын аяқтамасы ретінде, тізімнің реттелгендігендігін тексеретін предикатты өңдейік. Ол тіпті де қиын емес. Тізім реттелген болу үшін, ол немесе бос болуы керек, немесе бір элементті болуы керек, немесе кез-келген жақын элементтер дұрыс тізбекте болуы керек. Осы талқымаларды жазайық.

sorted([ ]). /* сұрыпталған бос тізім

* / sorted([_])./* бір элементті тізім реттелген * /

sorted( [Х, YI Т]):-

Х<=У, sorted([Y[T]).

/* тізім реттелген, егер бірінші екі элемент дұрыс тізімде орналасса жəне екінші элементпен тізім құрылса * /

Орташа жəне минималды мəнді тізімдегі элементтердің суммасын табу

қарастырылады;тізімдерді сұрыптау əдістері: көпіршіктік, таңдау арқылы , қыстыру арқылы, жылдам сорттау.



Негізгі əдебиет 1 [120-138]

Қосымша əдебиет 3 [15-29]

Бақылау сұрақтары:

1.Тізімдерді сұрыптау алгоритмдері- пузырьковый.

2.Тізімдерді сұрыптаутау алгоритмдері - таңдау арқылы

3.Тізімдерді сұрыптау алгоритмдері- қыстыру арқылы.

4.Тізімдерді сұрыптау алгоритмдері- бірігу арқылы.

5.Тізімдерді сұрыптау алгоритмдері – жылдам сорттау.__



3. Зертханалық сабақтар

2.3 Зертханалық сабақтардың жоспары.

1 зертханалық жұмыс. Резолюциялар

Тапсырма: үшінші дəрістегі мысалдың білім қорын қарастырып, төмендегідей кодты тереміз:

DOMAINS /* раздел описания доменов */

s=string /* вводим синоним для строкового типа данных */

PREDICATES /* раздел описания предикатов */

mother(s,s) /* предикат мама будет иметь два аргумента строкового типа */

grandmother(s,s) /* то же имеет место и для предиката бабушка */

CLAUSES /* раздел описания предложений */

mother("Наташа","Даша"). /* "Наташа" и "Даша" связаны отношением мама */

mother("Даша","Маша"). /* "Даша" и "Маша" также принадлежат отношению мама */

grandmother(X,Y):- /* X является бабушкой Y, если найдется такой Z, что */

mother(X,Z), /* X является мамой Z, а */

mother(Z,Y). /* Z является мамой Y */

Программаны жүргізіп нəтижені сұраулар қойып бақылау.

Негізгі əдебиет 1 [87-98]

Қосымша əдебиет 3 [17-25]

Бақылау сұрақтары:

1. Ендіру/шығару пердиккаттарының ерекшеліктері қандай?

2. Fail предикаты не үшін қолданылады?

3. bound предикат қандай жағдайда «шын» болады?

4. Ноль- орынды предикаттың функциясын түсіндіріңіз.

5. upper_lower предикатының қолдану варианттарын келтіріңіз.



2 зертханалық жұмыс. Предикаттарды модификациялау

Тапсырма: Барлық қыздардың аттарын шығаратын предикатты енді ол аттардың барлығын емес тек белгілі бір атқа дейін ғана шығаратындай етіп тағы бір рет модификациялайық.

Предикатта қыздың аты ( бұл аттан кейін қыздардың аттарын экранға шығару үзілуі керек)

көрсетілген тек бір ғана кіретін аргумент қана болады. Ереженің денесіне ағымдағы қыздың атын предикаттың аргументі түрінде көрсетілген қыздың атымен салыстыратын мақсатастыны қосу керек. Бұл мақсат астыдан кейін:

show_names3(Daughter):–

mother(_,Name), /* Name айнымалысын қыздың атымен белгілейді */

write(" ", Name), nl, /*Name айнымалысының мəнін шығарады*/

Name=Daughter, /* Name жəне Daughter қыздар аттарының сəйкестігін тексереді. Сəйкес емес болғанда шегіну қайта оралу стекінде сілтеушісі сақталған жерге шақырылады.

Сəйкес болған жағдайда (кесудің бар болғанның арқасында) іздестіруді жəне қыздардың аттарын шығаруды аяқтайды*/

write("Ізделген адам табылды!"),!.

Бұл предикат Name айнымалысын біреудің қызының атымен нақтылайтын болады жəне бұл айнымалының мəнін экранға шығарады. Содан кейін Name айнымалының мəні Daughter айнымалының мəнісімен салыстырылатын болады. Сəйкес болмаған жағдайда бұл мақсат асты ереженің бірінші мақсатастысына шегінуді шақыра отырып, сəтсіздікке ұшырайды. Аттар сəйкес болған кезде мақсатасты сəтті болады да, басқару кесу предикатына ие болады. Ол əрдайым шынайы болады жəне сол жақта орналасқан мақсатастылар үшін шегінуді рұқсат етпейді. Осымен show_names3 предикатының жұмысы аяқталады. Яғни, бұл ережеде шегінулер Name айнымалысының ағымдағы мəні Daughter айнымалысының мəнімен

сəйкес келгенше дейін жалғаса береді.

Негізгі əдебиет 5 [20-38]

Қосымша əдебиет 1 [5-29]

Бақылау сұраулары:

1. GOAL сөзінің жұмысын тұсіндіріңіз.

2. Пролог жүйесінде ендірі/шығару қалай ұйымдастырылады?

3. Циклдік рекурсия қалай ұйымдастырылады?

4. Қайтару нүктесі қалай көрсетіледі?

5. Предиктты модификациялау дегеніміз не?



3 зертханалық жұмыс. Палиндромдар (тізіммен жұмыс істеу)

Тапсырма: Төмендегі мысалдарды қарастыру арқылы тақырыпты игеру. Мысалы. Тізімді қайтаруға болатын предикат өңдейік. Предикаттың екі аргументі болады: біріншісі бастапқы тізім, екіншісі —бірінші аргументтің элементтерін кері тəртіппен жазу нəтижесін алу кезіндегі тізім.

Бұл есепті шешу үшін рекурсияны қолданайық. Базис: егер бос тізімнің элементтерін кері тəртіппен жазсақ , онда қайтадан бос тізім аламыз. Рекурсия қадамы: «аударылған» тізімді алу үшін - оның аяғын аударуға жəне оған бастапқы тізімнің бірінші элементін жабыстыруға болады . Бұл ойды жазайық.

reverse([ ],[ ]). /* бос тізімді айналу бос тізімді береді */

reverse([X|T],Z):–

reverse(T,S), conc(S,[X],Z).

/* аяғын айналып оған бастапқы тізімнің оң бірінші элементін жазамыз */



Негізгі əдебиет 5 [20-38]

Қосымша əдебиет 1 [5-29]

Бақылау сұрақтары:

1. Палиндромдар дегеніміз не?

2. findall(N,mother(_,N),L) предикатының іске асу нəтижесі қалай болады?

3. Тізімнің элементін қалай өшіреміз?

4. Тізімді қалай толықтаймыз?

5. Тізімді қалай жоямыз?



4 зертханалық жұмыс. Циклдер

Тапсырма: Тізімдегі элементтер суммасын есептеуге мүмкіндік беретін предикат құру

Негізгі əдебиет 5 [20-38]

Қосымша əдебиет 1 [5-29]

Бақылау сұраулары;

Бақылау сұраулары;

1. Bubble предикаты не орындайды ?

2. Көпіршік сұрыптау əдісінің қызметін мақсатын түсіндіріңіз.

3. Сұрыптаудың қандай алгоритмдері бар?

4. Permutation предикатының қызметін түсіндіріңіз.

5. Сыртқы сұрыптау дегеніміз ен?

5 зертханалық жұмыс. Сыртқы мақсаттармен жұмыс істеу

Тапсырма: Берілген мағынаны екілік анықтамасынан жоятын предикатты қарастыру.Оның

үш параметірі болады. Екі кіріс (жойлатын мағына жəне бастапқы тал) жəне екінші

параметірден біріншісінен жойлуынан пайда болған нəтиже.



Негізгі əдебиет 5 [20-38]

Қосымша əдебиет 1 [5-29]

Бақылау сұраулары:

1. Сəтсіздіктен кейінгі кері қайтару не үшін қажет?

2. Предикаттар қалай біріктіріледі?

3. Қарастырылған мысалдардағы программаның мақсаты мен ішкі мақсатын атаңыз.

4. Жасанды кері қайтару дегеніміз не,

5. Стандартты предикаттар не үшін керек?



6 зертханалық жұмыс. Тізімдерді түрлендіру

Тапсырма: Екілік анықтама болып табылатын қалпына келтіруші тармақ предикатының жасап шығару, онда кездейсоқ бүтін сандар орналасқан, шыңдардың қосындысынан құралған.

Негізгі əдебиет 1 [20-38]

Қосымша əдебиет 5 [5-29]

Бақылау сұраулары:

1. Програманың нəтижесі қай жерде құрастырылады?

2. Тізімдермен жұмыс істеудің айырықшылығы неде

3. GOAL секциясында не істелінеді?

4. Рекурсии қадамы не істейді?

5. Бастапқы тіщзім қай жерде орналасқан?



7 зертханалық жұмыс. Тізімдерді өңдеу

1-мысал. Қарапайым орысша – қазақша сөздігін дайындау керек. Фактілер aud (<орысша сөз>, <қазақша аудармасы>) түрінде берілсін: Турбо Прологта берілгендер қорын мынадай түрде дайындауға болады.

Predicates

Aud (string, string)

Clouses


Aud(голова, бас)

Aud(нос, мұрын)

Aud(рот, ауыз)

Aud(тело, дене)

Aud(человек, адам)

Aud


…………………

Цель: Aud (голова,X)

X=бас

2-мысал. Адамдардың қарапайым телефон анықтамалығын құрып, сұрақ бойынша жауап шығару керек.

Оның мақсаты predicates бөліміне енгізген түрде құрылуы:

Predicates

Tel(string, string)

Goal

Write (“фамилия”-?),



Readln(Fam),

Tel(fam, telef_Nom)

Write (“телефон нөмірі “ telef_Nom”), n1.

Clauses


Tel(“Үмбетов. О”, “52-21-60”)

Tel(“Сүлтанов.М”, “55-32-14”)

Tel(“Ержан.К”, “52-21-36”).

Программа іске қосылған кезде бірден фамилия сұралады:

Fam-? Үмбетов.О

Телефон нөмірі=52-21-60

Программаға енгізілген n1-келесі жазуды жаңа жолдан бастау (курсорды жаңа жолдың басына орналастыру) стандартты операторы, Write-стандартты предикат (оператор).

Прологта пайдаланылатын айнымалылар әдеттегі программалау тілдеріндегі айнымалылардай емес. Олар үшін жадтан арнайы орын бөлінбейді. Олардың мәндері - берілгендер қорында сақталған нысандар атаулары.

Коньюнкциялы сұрақтың жазылуы да коньюнкциялы фактінің жазылуы сияқты: әр мақсат үтір арқылы бөлініп жазылады. Мысалы, сәйкес білім қоры дайындалып, Нұрғали да, Баян да ұнататын нысан сұралса, оны жазылуы:

?- unatedy (nurgali,X), unatedy (baian,X).

Мұнда Пролог берілгендер қорынан алдымен сұраққа енгізілген бірінші мақсатқа сәйкес фактіні іздейді. Егер берілгендер қорында бірінші болып «ұнатады (Нұрғали,ыстық)» фактісі кездессе, жүйе Х айнымалысына «ыстық» мәнін меншіктеп (Х=ыстық), оның мәнін басқа мақсаттарда кездесетін осындай айнымалылардың орнына қойып шығады. Одан әрі берілгендер қорынан «ұнатады (баян, ыстық)» мақсатын іздейді. Ол табылса, оған белгі қойып, екі мақсатты да қанағаттандыратын жауапты басып шығарады. Әйтпесе, Пролог іздеуді берілгендер қорыны басынан бастап қайта жүргізеді. Мұндай процесті қайту процесі не қайту механизмі деп атайды.

Сұрақта белгісіз аргументтер саны бірнеше болуы да мүмкін.



3-мысал. 7-мысал. «Жәмиляның анасы мен оның анасы кімдер-?» сұрағы берілсін, берілетін сұрақ пен шығатын жауаптың түрі:

?-ana(X,Y), ana(Y,jamilia).

X=xadisha Y=baian

Мұнда берілген сұрақ берілгендер қорымен үйлесімді болуы үшін қор мынадай түрде құрылған болуы тиіс.

ana (xadisha baian)

ana (gulnar,nurlan)

ana (baian jamilia)

………………….. т.с.с

Турбо Прологта программаны сақтап, іске қосу командасын берген кезде экранның оң жағында көрінген Dialog терезесінде берілетін команда:

Мақсат: ana(X,Y), ana(Y,jamilia)

Мұнда да, Пролог жауапты алдымен бірінші мақсатқа сәйкес іздейді, т.с.с.

Сонымен, сұрақ берілсе, Пролог оның мазмұнын берілгендер қорында сақталуы фактілермен салыстырады да, мазмұнының дұрыстығын дәлелдеуге болатынын не болмайтынын анықтайды және сәйкес жауап шығарады. Яғни, Прологта сұраққа жауап беру мақсатты ұйғарымдарды дәлелдеумен бірдей. Дәлелдеу- мақсаттың берілгендер қорымен үйлесімділігін анықтау деген ұғым. Егер сұраққа енгізілген мақсаттар бірнеше болса, Пролог алдымен бірінші мақсатты дәлелдеуге кіріседі, ол дәлелденсе, оның оң жағына енгізілген мақсаттың үйлесімділігін тексеруге кіріседі, т.с.с. Үйлесімділік болмаса, қайту процесі орындалады.

Прологта бірден бірнеше фактінің бар не жоғын тексеру сұрағы құрылымды сұрақ делінеді. Мысалы, мынадай берілгендер және т.с.с берілгендер қоры дайындалған болсын:

ushady(ushakh).

ushady(tyrna).

Khanaty_bar(tyrna).

Khanaty_bar(karlygash).

................................. .

Қорға сәйкес мынадай құрылымды сұрақ беруге болады:

?- ushady(Х), кhanaty_bar(Х).

Х= tyrna

Берілгендер қорына енгізілген қанаты бар құс екеу, екіншісі қарлығаш. Бірақ, жүйе х=karlygash жауабын шығармайды, себебі «ushady» предикаты бар мұндай факт берілгендер қорына енгізілмеген.



Тапсырма: Телефондық анықтаманың компьютерлік нұсқасын реализациялайтын

программаны жазу.



Негізгі əдебиет 5 [20-38]

Қосымша əдебиет 1 [5-29]

Бақылау сұрақтары:

1. Start операторы не істейді?

2. Gроекттің терезесін қалай тазалаймыз?

3. Программа қандай операцияларды жүзеге асырады?

4. Базаға жаңа жазбаны қосуға болады ма?

5. Пролог- программада көпшілікпен жұмыс ұйымдастырылуы қалай?



8-зертханалық жұмыс. Прологта логикалық программалау. Білімдер базасы.

Мақсаты: Прологтағы ереже және үйлесімділік ұғымдарын қарастыру. Мысалдар қарастыру.

Пролог сөйлемдері(ұйғарымдары) үш типті: фактілер, ережелер және сұрақтар. Факт – сөзсіз ақиқат болатын жеке мақсат. Мысалы, ұнатады(Ахмет, абай_жолы) фактісінде Ахметтің бір ғана «Абай жолы» кітабын ұнататыны мәлімделген. Егер Ахметтің ұнататын кітаптары көп болса, онда оның бәрін атап шықпай-ақ, қысқаша Unatadi(axmet, kitap) фактісі түрінде жазуға болады. Мұндай факт ереже деп аталады. Яғни, ереже мен фактінің айырмашылығы сөз мәнінде ғана.

Жалы, Прологта ережелер деп көбінесе бір фактінің басқа фактілер тобына байланыстылығы көрсетіліп, жасанды интелектіде пайдаланатын егер ... онда командаса арқылы жазылған сөйлемдерді айтады. Мысалы, табиғи тілде жазылған ережелер:

Егер жаңбыр жауып тұрса, онда дала дымқыл.

Егер жәндік үлкен және қанаттары бар болса, онда ол –құс.

Сонымен, ереже –нысандар және олардың арасындағы қатыстар жөнінде біршама ұйғарым(сөйлем). Ол Прологта басы мен денеден тұратын етіп жазылады:



<басы>:-<дене>.

Дене –ереженің егер бөлімі (мақсат пен мақсаттар). Ол кейбір жағдайларда ақиқат болатын конъюнкциядан не жеке мақсаттан тұруы мүмкін. Конъюнкцияға енген жеке мақсаттар үтір (,) арқылы бөлініп жазылады.

Басы-ереженің онда бөлімі (-негізгі мақсат (негізгі мақсат ереже тақырыбы деп те аталады)).

:- - ереженің басы мен денесінің арасына қойылатын қос нүкте мен сызықшадан тұратын белгі. Ол ережеге енгізілетін егер қызметші сөзін алмастырады (Турбо Прологта:- белгісінің орнына if кілттік сөзін жазуға да болады).

.(нүкте)- ереже соңына қойылатын белгі.

Жалпы, факт- ақиқат болатын жеке мақсат (фактіні мақсаты жоқ ақиқат ереже деп қарастыруға болады), ал ереже- мақсат пен тақырыбын логикалық түрде байланыстыратын сөйлем. Ереженің толық ақиқаттық пікір болмауы да мүмкін.



  1. мысал: құс (Х) :- үлкен_жәндік(Х), /* нысанды тану */

қанаты_бар(Х).

Ит(Х) :- әке (Х,У), ит (У)

Соңғы ереженің оқылуы: егер У-тің әкесі Х, ал У ит болса, онда Х-ит (Х,У- байланыстырылған айнымалылар). Түсінікті болу үшін ережені ағаш түрінде бейнелеп көрсетуге де болады:

Мысалға енгізілген ережелерге және дайындалған фактлерге сәйкес Турбо Прологта программаның құрылуы:

domains


S=string

predicates

kus(S) ulken_jandik(S)

kanaty_bar(S)

it(S) ake(S,S)

clauset


kus(X) :- ulken_jandik(X), kanaty_bar(X).

It1(X):-ake(X,Y), it(Y).

Ulken_jandik(tyrna).

Kanaty_bar(tyrna).

It(bars).

Ake(moinak,bars).

…………………….

Ережелер мен фактілер сақталған соң сәйкес сұрақтар арқылы қажетті жауаптарды шығару қиын емес. Сұрақ белгісі теріліп алынған соң, ал Турбо Прологта іске қосу командасын берген соң сұхбат терезесінде көрінген. Цель: сөзінен кейін ереженің басы жазылуы тиіс. Мысалы:

Цель: it1(X)

X=moynak


Цель: кus(X)

X=turna


Ереже басы бірнеше сөз тіркесіне тұрса, араларына астын сызу (_) белгісін қойып кеткен жөн, оның ешқандай түсінігі жоқ, тек сөздерді біріктіріп жазуға ыңғайлы, мысалы: ата_ана. Асты сызу белгісін жасырын (анонимдік) айнымалы деп те атайды.

Егер ереже денесіне нақты мәндер енгізілсе, аргументтері айнымалылар болатын сұраққа жауап ретінде айнымалылардың нақты мәндері шығады: Мысал: ? – unaidy(axmet,X) &-kyz(X), unaidy(X,kitap).

Сұрағы берілген кезде Пролог сұрақ денесінің сол жағында бірінші болып жазылған kyz(Х) мақсатын берілген қорымен салыстырады да, қыз(Х) [kyz(X)] мақсатына үйлесімді факт табылса, оның аргументі Х-ке меншіктеп, Х айнымалысы кездесетін барлық жерге осы мәнді қойып шығады, т.с.с. Айнымалыны сәйкес мәнімен алмастыру айнымалыны нақтылау делінеді.

Ескертетін жайт: сұрақ беру кезінде ереже денесіне енгізілген мақсаттардың жазылу реті өте маңызды. Себебі, Пролог оларды тек солдан оңға реті бойынша қабылдап алып, іздеу жүргізеді. Жазылу реті бұзылса, шығатын жауаптың бөлек болып шығуы мүмкін.

Жүйеге фактілерге қосып ережелер де енгізілсе, оларды білім қоры деп, ал, біршама фактілер мен ережелер тобын процедура деп те атайды. Нақты фактілер мен ережелер жиыны- сұраққа жауап дайындалатын қарапайым программада. Яғни, Прологта берілгендер қоры, білім қоры және программалар бір түрлес. Оларды тек Пролог нысандарына екі түрлі көзқарас деп түсінуге болады. Бірақ, программалардың көпшілігі, мысалы, сараптаушы жүйелерді дайындау программаларының үлкен және олар мақсаттарды дәлелдеуді қажет ететін логикалық ұйғарымдар түрінде құрылады. Фактілер жиынтығы логикалық программалаудың қарапайым түрі. Күрделі программаға жаңа сөйлемдер және өңдеуді қажет ететін процедураларды қосып программаны кеңейту де мүмкін.

Прологта фактілерге енгізілетін айнымалылар жалпылық квантормен айқын емес түрде байланысты, мысалы, ұнатады (Х,алма) фактісі кез-клген Х-тің алманы ұнататынын білдіреді. Барлық айнымалылар жалпылық кванторлы болғандықтан программаларда оның белгісі енгізілмей тастап кетеді.

Сонымен, программа Пролог- жүйе ішіне сақталып қойылады. Сұрақ берілген кезде Пролог талқылаудың кері тізбегін пайдаланып, әр мақсатты дәлелдеуге тырысады. Егер бір мақсат дәлелденбесе (үйлесімді болмаса), Пролог өзі белгіленген айнымалы мәндерін өшіріп, дәлелдеуді қор басынан бастап қайта жүргізеді. Яғни, іздеу тереңдетіліп және қайту механизмі қолданылып жүргізіледі.

2-мысал. Табиғи тілде мынадай ереже берілсін: егер Х атаулы ер кісінің әкесі А және У атаулы әйелдің әкесі де А болса, онда Х-пен У – бір туыс.

Ерлер мен әйелдердің әкелері жөнінде екі тізім дайындалған болсын:


1-тізім(ерлер)

2-тізім (әйелдер)

әке 1 (Оспан,Марат)

әке 1 (Нұрлан, Болат)

әке 1 (Ержан, Қажым)

әке 1 (Мұрат, Сұлтан)



әке 2 (Мұстафа, Айгүл)

әке 2 (Мұрат, Шолпан)

әке 2 (Нұрлан, Маржан)

әке 2 (Бахыт, Жәния)


Тізімдерді қарап шығып, әкелері бір ерлер мен әйелдерді анықтау керек.

Жоғарғы тізімдерде олар:

Болат пен Маржан (әкелері-Нұрлан),

Сұлтан мен Шолпан (әкелері - Мұрат )

Есепті шешу үшін алдымен екі тізімді бір білім қоры түрінде дайындап, арнайы атаумен сақтау керек (мысалы, Туыстар). Ол – дайындалған программада:

Tuis (X, Y, A): -ake1 (A,X), ake2 (A,Y).

Ake1 (ospan, marat).

Ake1 (nurlan, bolat).

……………………


Ake2 (baxit,jania).
Берілетін сұрақ ?-tuis (X,Y,A).

Білім қорында әкелері бір туыстардың бар екені ақиқат түрінде алынып, ережеге енгізілген әр мақсаттың ақиқаттығы дәлелденеді. Бұл талқылаудың кері тізбегі.

Сұрақ беріліп программа іске қосылған кезде Пролог алдымен ереже денесінің сол жағында бірінші болып жазылған аke1(А,Х) мақсатын дәлелдеуге кіріседі. Дәлелдеу берілгендер қорының басынан бастап жүргізілетіндіктен, мақсаттың бірінші фактіге сәйкес келетінін анықтап, жүйе мынадай меншіктеу командаларын орындайды:

A=ospan, X=marat

Одан әрі, жүйе ережеге енгізілген барлық А және Х айнымалыларының орнына осы мәндерді қойып шығарды да, келесі әке2 (Оспан,У) мақсатын дәлелдеуге кіріседі. Бірақ берілгендер қорында «Оспан» аргументі бірінші болып жазылған басқа факт жоқ. Сондықтан, Пролог берілгендер қорының басына қайтып өтеді де, баламалы дәлелдеуге қайта кіріседі. Мұнда Пролог алдымен бірінші фактіге сәйкес А, Х айнымалыларына меншіктелген мәндерді өшіріп тастайды да, келесі фактіні тексеруге көшеді. Келесі факті әке1 (А,Х) мақсатына салыстырмалы болғандықтан, жаңа меншіктеу командасын орындайды: А= Нұрлан, Х=Болат. Одан әрі әке2 (нұрлан, У) мақсатына салыстырмалы фактіні іздеу барысында Пролог сәйкес фактіні табады да, У=Маржан меншіктеуін орындап, сәйкес мәндерді басып шығарады: X=bolat Y=marjan A=nurlan

Сұраққа сәйкес келесі мәндерді шығару үшін клавиатура арқылы «;» пернесін басу керек (Турбо Прологта олар автоматты түрде көрінеді, пернені басу қажет емес).

Сонымен, егер сұраққа енгізілген ұйғарымның бір ғана мақсаты дәлелденбесе де, берілгендер қорында сұраққа үйлесімді ұйғарым жоқ (сұрақ үйлесімсіз) деп есептелінеді. Яғни, сұрақ үшін барлық мақсаттардың дәлелденуі міндетті. Ал, Прологта сұраққа енгізілген айнымалылардың бәріне «барлығы үшін» (жалпылау) кванторы әсер етеді.

Жоғарыдағы мысалға сәйкес білім қорының (программаның) Турбо Прологта жазылуы:

Predicates

Tuis (string, string, string)

Ake1(string, string)

Ake2(string, string)

Clauses

Tuis(X,Y,A): - ake1(A,X), ake2(A,Y).



Ake1(ospan,marat)

Ake1(nurlan,bolat).

………….

Ake2(baxit,jania)



Прологта программаның орындалу жолын (М мақсатын іздеуді) іздеу ағашы түрінде бейнелеп көрсетуге болады. Мұнда М ағаштың негізгі түбірі ретінде алынады да, ереже денесіне енгізілген мақсаттар ағаштың келесі түбірлері ретінде алынады. Әр түбірдің өзінен шығатын қырлары болуы мүмкін, олар берілген программаға сәйкес М мақсатын дәлелдеуге пайдаланылады. Кейбір түбірлер мақсатқа үйлесімсіз болуы мүмкін, бұл кезде қайту механизмі орындалады.

Мысалы, жоғарыда берілген программаның орындау сұрағын қарастырайық: tuis(X,Y,A): - ake1(A,X), ake2(A,Y) оны орындау жолын ағаш түрінде бейнелеуге болады:



Прологтан әр қатардан тұратын жазбаларды (тізімді) да ашуға болады:



3-мысал. Студенттердің математика мен информатикадан алған бағалары көрсетілген мынадай тізімнің әрқайсысын жолдық типке алып, Турбо Пролог терезесінен алу керек:

1.ахметов О. 4 4

2.Ермеков Н. 4 3

3.Нұрланова Н. 5 5
Программаны мынадай түрде құруға болады:

Domains


T=string

Predicates

tizim(T)

clauses


tizim(“1.Ахметов О. 4 4”)

tizim(“2.Ермеков Н. 4 3”)

tizim(“3.Нұрланова М. 5 5 ”)
Компиляциялап, іске қосу командасын берген соң сұхбаттық терезеде берілетін команда – цель : tizim(T).



Достарыңызбен бөлісу:
1   2   3   4   5   6




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет