Бақылау сұрақтары:
1. Тереңдікте іздестіру əдісі.
2. Сəтсіздіктен кейінгі шегіну.
3. Кесу жəне шегіну.
4. Қолданушымен анықталатын іздестіру əдісі.
5. Бэктрекинг не істейді?
6. Мақсатастынан мақсатастыға қалай өтуге болады?
7. Предикатты модификациялау қалай жүргізіледі?
Ұсынылған әдебиеттер
1. Терехов А.Н. Технология программирования БИНОМ. Лаборатория знаний, Интернет-университет информационных технологий - ИНТУИТ.ру, 2016
2. А.Н. Адаменко, А.М. Кучуков Логическое программирование и Visual Prolog СПб.: БХВ—Петербург, 2013
ЛЕКЦИЯ №6
6. Тақырыбы: Тізімдер
ЛЕКЦИЯ ЖОСПАРЫ
Тізімдер.
Тізімді рекрусивті анықтау.
Тізімдермен операция жасау.
ЛЕКЦИЯ МАЗМҰНЫ
Ереже бойынша ,императивті __________тілдерде негізгі құрылымы массивтер
болып табылады. Прологта да Лиспада сияқты мəліметтер түрінің негізгі құрамы тізім болып табылады. Бұл дəрісте тізімдерді меңгерумен айналысамыз. Бастапқыда тізімге формалды емес анықтама берейік.
Тізімді элементтер ұзындығының реттелген дəйектілігі деп атайық.
Төменде көрсетілген мысалдар сияқты тізімдер – тізімдердің элементтері үтір арқылы жазылып,тік жақшаның ішінде беріледі.
[monday, tuesday, wednesday, thursday, friday, saturday, sunday] — ағылшын тіліндегі аптадағы күндердің аты элементтерінің тізімі;
["понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"] — орыс тіліндегі аптадағы күндердің аты элементтерінің тізімі;
[1, 2, 3, 4, 5, 6, 7] — аптадағы күндердің номері элементтерінің тізімі;
['п', 'в', 'с', 'ч', 'п', 'с', 'в'] — орыс тіліндегі аптадағы күндер номерінің бірінші əріптерінің элементтерінің тізімі;
[] — бос тізім , яғни элементтерден тұрмайтын тізім.
Тізімдер элементі түрлі болуы мүмкін ,соның ішінде құрамды объекттер. Тізімдер элементтерінің өзі тізімдер болуы мүмкін.
Домендерді жазу бөлімінде тізімдер келесідей түрде жазылады:
DOMAINS
<домен тізімінің аты>=<домен тізімі элементінің аты>*
Домен атынан кейінгі қойылған жұлдызша, объекттердің сəйкес типінен құралған тізімді бейнелеуін көрсетеді.
Мысалы:
listI = integer* /*бүтін сандардан тұратын элементтер тізімі */
listR = real* /* материалдық сандардан тұратын тізім*/
listC = char* /* символдар тізімі*/
lists = string* /* жолдардан тұратын тізім*/
listL = listI* /* бүтін сандар тізімі элементтерінен тұратын тізім */
Соңғы мысалға сəйкес болатын тізім түрі:
[[1,3,7],[],[5,2,94],[–5,13]]
Классикалық Прологта тізімдер элементі түрлі домендерге жатуы мүмкін, мысалы: [monday, 1, "понедельник"]
Турбо Прологта ,қатал типизацияға байланысты барлық тізімдер элементі бір доменге жатуы керек. Доменге сəйкес альтернативаларды қолданып, түрлі табиғат объектлерін бір тізімге орналастыруға болады.
Мысалы, келесідей жазулар:
DOMAINS
element = i(integer); c(char); s(string)
listE = element*
тізімдер түрімен жұмыс істеуге мүмкіндік береді
[i(–15), s("Мама"),c('A'),s("мыла"),c('+'),s("раму"),
i(48),c('!')]
Тізімдерге рекурсивті анықтама берейік.
Тізім — бұл мəліметтер құрылымы, ол келесідей анықталады:
1. Бос тізім ([ ]) тізім болады;
2. [H|T] құрылым түрі тізім болады егер, H — тізімнің бірінші элементі , ал T — нəтижелі тізімде қалған элементтерден тұратын тізім Н-ді тізім басы деп ,ал Т-ны тізімнің аяғы деп айту қабылданған. Басы мен аяғын білдіру үшін айнымалыны таңдау кездейсоқ еместігін ескерейік. Head – ағылшын тілінде басы, ал Tail - аяғы.
(І) операциясы тізімді басы мен аяғы деп бөлуіне мүмкіндік береді , немесе керісінше объектті тізім басына жазуын.
Берілген анықтама бос емес тізімді басы мен аяғына бөліп ,тізімді рекурсивті өңдеуін ұйымдастыруға мүмкіндік береді. Аяғы да өз бетінше, нəтижелі тізімге қарағанда аз элементтерден тұратын тізім болып табылады .Егер аяғы бос болмаса , онда оны да басы мен аяғына бөлуге болады.Басы жоқ бос тізімге жеткенше осылай болады.
Мысалы, [1, 2, 3] тізімінде 1 элементі басы болады, ал [2, 3] тізімі — аяғы, яғни [1, 2, 3] =[1|[2, 3]].
Бұл тізімнің аяғы [2, 3] екенін ескерейік , жəне ол басы 2 ал аяғы [3] болып берілуі мүмкін, [3] тізімінде басы 3 жəне аяғы [2] деп қарастыруға болады. Келешекте бос тізім бөлінбейді.
Нəтижесінде [1, 2, 3] тізімі [1|[2, 3]] тізіміне эквивалентті, ал оның өзі [1|[2|[3]]] тізіміне эквивалентті. Соңғысын [1|[2|[3|[ ]]]] тізімімен салыстырайық.
Бұл тізімде екі бірінші элементті жəне [1,2|[3]] үшінші элементтің аяғын атап көрсетуге болады.
[1, 2, 3|[]] бос аяқ пен үш бірінші элементтің басын бөлу мүмкіндігі бар.
Жоғарыда көрсетілген рекурсивті анықтамаға сəйкес тізімді өңдеуді ұйымдастыру үшін рекурсияның базисі болатын сөйлемнің қойылымы жеткілікті жəне барлық бос емес тізімнен оның аяғын өңдеуге өту тəртібін орналастыратын рекурсивті ереже. Кейбір кезде базис рекурсиясы бос тізімге емес,тізімнің бір немесе екі элементін жазуға арналады.
Біздің пайымдауымызға байланысты резюме ретінде Бэкуса–Науэра нотациясында тізімге тағы бір анықтама берейік:
Тізім::= [ ]|[Элемент <,Элемент>*]|[Басы|Аяғы ]
Басы ::= Элемент <,Элемент>*
Аяғы ::= Тізім
Тізімдерді өңдеуін қарастырайық.
Достарыңызбен бөлісу: |