Тақырып №10: Турбо Пролог тілінде программаларды басқару.
Тереңге іздеу тәсілі–бэктрекинг (откат).
Пролог программасының көлемі үлкен бомас үшін және бірнеше варианттан таңдау таңдау процесі ұйымдастырылуы үшін Откат немесе тереңге іздеу және қайталабалы іздеу операциялары қолданылады. Бэктрекинг әдісінің орындалу механизмі: программаның таңдалатын бірнеше варианты жүргізу үшін арнайы белгіленген бар орнында пролог осы позицияға қайта оралып, іздеу процедурасын нүкте сақтап қояды. Бұл қайтару нүктесі откат болған жағдайда қайта болжау қажеттілігі жөнінде ақпарат сақтайды. Есептің жауабы болуы мүмкін варианттарының бірі таңдалғаннан кейін де программаның орындалуы жалғаса береді. Программаның альтернативалары бар нүктелерінде стекке көрсеткіш қойылады. Егер программаның орындалу нәтижесінде таңдалған вариант дұрыс шешімге , яғни табысқа әкелмесе программа стектері нүктелерінің ең соңғысына қайта оралады да, осы нүктедегі басқа вариант таңдалып, программа жұмысын жалғастырады. Егер бұл нүктедегі барлық варианттар бойынша жүргізілген операциялар дұрыс нәтиже бермесе программада сәтсіздік туралы ақпарат тіркеледі. Егер басқа нүктелер бар болса, тексеріліп болған стек нүктесінің алдындағы нүктеге қайтарылу операциясы орындалады және іздеу процесі жалғастырылады. Бэктрекинг әдісіне лабиринттен жол іздеу мысал бола алады. Лабиринттен жол іздеуде әрбір қиылыста тек бір бағытқа ғана бұрылу керек, егер тұйыққа тірелсе, жол қиылысына қайта келу және келесі жолды(бағытты) таңдау процесі дұрыс жол тауып лабиринттен шыққанша қайталана береді.
Туысқандық мысалын қайта қарастырайық.
Domains /*домендерді сипаттау бөлімі*/
S=string /*қатар типті мәлімет енгізу*/
Predicates /* предикаттарды сипаттау бөлімі*/
Mother(s,s) /*мама предикаты қатар типті екі аргументтен тұрады*/
Grandmother(s,s)
Clauses /*сөйлемдерді сипаттау бөлімі*/
Mother(“Наташа”,”Даша”).
Mother(“Наташа”,”Глаша”).
Mother(“Даша”,”Саша”).
Grandmother(x,y):-
Mother(x,z),
Mother(z,y).
Программа мақсаты барлық әжелер мен немерелерді анықтау болсын (Grandmother(а,в)). Сәйкесті түрде Mother(а,z) және и Mother(z,в) орындалу керек. Алғашқы қадам бойынша нәтиже а= Даша, z =Маша болады. Экранда RETURN сөзінен кейін * белгісі орналасады, ол басқа да варианттардың бар екендігін көрсетеді. Бұл стектегі қайтарылымы бар нүкте екендігін білдіреді. Келесі қадам Mother(z,в) ішкі мақсатын, оның ішінде z =Маша болатын шартты қанағаттандыратын мағлұматтарды іздейді. Іздеу процесі нәтиже бермейді. Сәтсіз нәтиже екендігін FAIL хабарламасы білдіреді. Стектегі нүкте белгіленген позицияға қайта оралып, іздеу процесі қайта басталады және осы мезетте а және z айнымалыларының мәндері жойылып, бос болады. Екінші альтернатива таңдалады. а= Наташа, z=Даша, осы жолы в=Маша болады. Тағы да пайда болған * белгісі қосымша варианттар бар екендігін білдіреді.А=Наташа, в=Маша мағлұматтары сұхбат терезесіде хабарланады да, стектегі қайтару нүктесіне қайта оралады. Енді В айнымалысы бос болады. Келесі нәтиже А=Наташа, В=Саша болады. Трассировка нәтижесінде * белгісінің болмауы альтернативті шешімдердің жоқтығын көрсетеді. Айнымалыларды бос мәнге меншіктеп Пролог жүйесі откатты, яғни оралу операциясын орындайды. Үшінші факті тексеріледі: Mother(“Наташа”,”Глаша”). Трассировка терезесіндегі * тағы да варианттар бар екендігін білдіреді. Бірақ Mother(Глаша,В) сәтсіз аяқталады. Программа сщңғы қайтару нүктесіне оралады. а=Даша, z= Саша. Бірінші мақсатқа сәйкес келетін басқа вварианттар жоқ, нүктелер стегі бос, Mother(Саша,В) процесі де сәтсіз аяқталадыда программа жұмысын тоқтатады. Сұхбат терезесінде екі жауап орналасады:
А=Наташа, в=Маша
А=Наташа, в=Саша
2 Solutions
Тереңге іздеу механизмінде бір жауап емес барлық альтернативаларды анықтау қажет болған жағдайда сәтсіздіктен кейінгі откат әдісі қолданылады. Бұл жағдайда қойылған сұрақ ішкі мақсат болса, алғашқы мақсатқа жеткізген жауапты береді де жұмысты тоқтатады.
Енді бұл мысалға ішкі мақсат кірістірейік:
goal
Grandmother(А,В)
Нәтижесінде Пролог ешқандай жауап бермейді, яғни сұхбат терезесі бос болады. Бұл ішкі мақсат пен сыртқы мақсаттың айырмашылығы. Сыртқы мақсатта Турбо Пролог сұраққа сәйкес келетін жауаптарды сұхбат терезесіне шығарады. Ішкі мақсатта нәтижені шығаруды былайша ұйымдастыруға болады:
goal
Grandmother(А,В), write(“Имя бабушки –”,А), write(“, имя внучки–”,В), nl
Нәтижесі
Имя бабушки–Наташа, имя внучки–Маша болады.
Ішкі мақсаттың сыртқы мақсаттан екінші ерекшелігі–табылған алғашқы жауаптан кейін іздеу процесін тоқтатуы, яғни мүмкін жауаптарды іздемейді. Егер барлық мүмкін жауаптарды алу керек болса, оны өзіміз ұйымдастыруымыз керек. Ол үшін қандай да бір орындалмайтын предикатты кірістіруіміз керек. Откат әдісінде сәтсіздіктен кейін fail жалған предикаты қолданылады, немесе 1=2 сияқты жалған өрнек алынса да болады. Нәтижесінде
Имя бабушки–Наташа, имя внучки–Маша
Имя бабушки–Наташа, имя внучки–Саша
жауаптары алынады.
Мысал. Алдыңғы программаға барлық қыздардың атын шығаруды ұйымдастыратын предикат жазу керек болсын. Write стандарт передикатын қолданамыз.
Show_names:-
Mother( _,name) /* name қыздың атын көрсететін айнымалы*/
Write(“ ”,name), nl /*name мәнін экранға шығарады*/
Fail. /*стектегі қайтару нүктесіне оралуды қамтамасыз етеді*/
Бұл предикатты программаның predicates бөліміне кірістіреміз. Ішкі мақсатқа
Goal
Write(“имена дочек:”), nl,
Show_names.
Программа нәтижесі:
Имена дочек:
Маша
Даша
Глаша
Саша
Бақылау сұрақтары
Пролог программасында таңдау процесі қалай ұйымдастырылады?
Бэктрекинг тәсілінің мақсаты қандай?
Неліктен тереңге іздеу әдісі деп аталады?
Программадағы мүмкін шешімдердің барлығын анықтау мүмкіндігін қалай ұйымдастыруға болады?
Ішкі және сыртқы мақсат деген не? Олардың қандай айырмашылықтары мен ерекшеліктері бар?
Достарыңызбен бөлісу: |