Реферат: Тізімдер файл және графиканы қолдану
Турбо Прологта тізімнен бірінші элементті бөліп алып, жеке өңдесе болады. Бұл тәсіл тізімнің ұзындығына қарамастан, тізім біткенше жұмыс істей береді. Тізімнің басына еркін өту әдісі-тізімді басына және соңына бөлу тәсілі деп аталады.
Тізімді басына және соңына бөлу операциясы вертикаль (|) түзудің көмегімен іске асады.
[Head|Tail].
Head мұнда тізімнің басын белгілеу үшін арналған айнымалы,Tail тізімнің соңын білдіреді. (Тізімнің басының және соңының аттары үшін Турбо-Прологта кез келген атты алуға болады.)
domains
number_list = integer
animal_list = symbol
predicates
print_list(number_list)
print_list(animal_list)
clauses
print_list([]).
print_list([Head|Tail]) :-
write(Head),nl,
print_list(Tail).
Мысалы:
[1, 2, 3] немесе [1 | [2, 3]] немесе [1 | [2| [3]]] немесе [1 | [2 | [3 | [ ]]]]
[1] немесе [1 | [ ]]
Вертикалды түзу сызықты тізімдің басы мен денесін бөлу үшін ғана емес, бірақ тізімдің басқы элементтерін бөлу үшін де қолданылады:
[1, 2, 3] немесе [1, 2 | [3]] немесе [1, 2, 3 | [ ]]
Бұл мысалда екі тізімнің қосылуы туралы қарастырамыз, ал екі тізімді қалай қосуға болатынын қарастырайық. Екі элементті екі тізім берілсін делік: [1, 2] және [3, 4]. Қосылуды бірінші тізімнің басынан бастап бастап бөлуден бастау, ол тізім бос болып қалғанша. Ал тізім бос болған кезде оны екінші тізіммен қосу оңай болады.
Нәтижесінде, шыныменде, екіншісіне ұқсас сондай тізім шығады.Мұнда тек қалғаны басын қосу керек және біріншісінен екіншісін бөлу керек. Бұны қадаммен көрсететін болсақ ол былай болады:
• – [1, 2] –> [1 | [2]] (басы– 1, денесі – [2])
• – [ 2] –> [2 | [ ]] (басы – 2, денесі – [ ])
• Екінші тізіммен бос тізімді қосу [ ] және бос емес екінші тізім [3, 4] – сол бос емес тізім шығады – [3, 4], енді тізім ді қосуды бастауға болады, денесі сияқты – [3, 4]
1. тізімнің денесінен шыққан [3, 4] бірінші тізімнен шыққан денесі қосылады 2, келесі тізім бізге не береді – [2, 3, 4]
2. енді бар қалғаны екінші тізімге қосу [2, 3, 4], денесі 1, бұл бірінші тізімнен бөлінген және екеуінің қосылғаны[1, 2, 3, 4]
Сол программаның тексті:
PREDICATES
append (intlist, intlist)
CLAUSES
%бос және бос емес тізімдердің қосылуы
append ([ ], List, List):- !.
%бос емес екі тізімдің қосылуы
append ([H | T], List, [H | App_T]):- append (T, List, App_T).
GOAL
append ([1, 2], [3, 4], App_List), write(“App_List=”, App_List).
Программаның шешуі :
App_List=[1, 2, 3, 4]
Файлдарды өңдеу
Енгізу / шығару предикаттары терминалдағы (считывание) және жаз-баны іске асырады. Клавиатура стандартты кіріс ағынымен, ал экран стан-дартты шығыс ағынымен байланысады. Кіріс және шығыс ағындары Пролог – жүйемен жұмыс жасаған кезінде қажет ететін әр түрлі файлдарды қолдану-шымен байланыс жасай алады. Ол үшін файл стандартты кіріс ағыны ретінде қарастырылады және жоғарыда қарастырылған енгізуге арналған предикат-тар клавиатурадан емес, файлдан (считывание) шығарады. Қажетті жағдайда файл стандартты шығыс ағыны ретінде белгіленеді. Мұндай жағдайда шыға-руға арналған предикаттар жазбаны экранда емес, файлда іске асырады. Стандартты ағындарды анықтау үшін келесі предикаттар қолданылады:
See(F) – F файлды стандартты кіріс ағыны ретінде анықтайды.
seen(F) – бұл предикат F файлдан клавиатураға стандартты кіріс ағынын қай-та анықтайды. see(F2) предикаты көмегімен F2 файлдың стандартты кіріс ағыны ретінде анықтамас бұрын seen(F1) предикаты көмегімен F1 файлдың стандартты кіріс ағынымен байланысын өзгерту қажет (отменить).
tell(F) – мақсатты тұжырым файлдың стандартты шығыс ағынымен анық-талады.
told(F) – мақсатты тұжырым F файлдан экранға стандартты шығыс ағынын қайта анықтайды, tell(F2) предикатының көмегімен жаңа файлдың F2 шығыс ағыны ретінде анықтамас бұрын, told(F1) предикатының көмегімен файлдан F1 ағымдағы шығыс ағынын өшіру қажет.
Прологта стандартты ағымдар қандай файлмен байланысты екенін анықтауға мүмкіндік беретін екі предикат бар.
Seeing(F) – F стандартты кіріс ағынымен байланысты файлдың атымен тұжы-рымдалады.
telling(F) — F стандартты шығыс ағынымен байланысты файлдың атымен тұ-жырымдалады.
Егер предикаттарды орындау кезінде файл F – тің жоқ екені немесе F айнымалысы нақтыланбағаны белгілі болса, қате шығарады. Стандартты кі-ріс және шығыс ағындарынан басқа файлмен байланыс жасау үшін басқа да ағындар қолданылады.
open(F,S,A) – бұл предикат S ағындағы F файлын ашады. Егер A – мәні read болса, онда файлды оқу үшін ашылады, A – мәні write қабылдаса, онда файл жазу үшін ашылады.
close(S) – бұл предикат S ағынын жабады. Қарастырылған мақсатты тұжы-рымдарды орындау кезінде айнымалылары нақтылану қажет. S – ағынның аты, F – файлдың аты, A – режим доступа.
Егер ағыны ашық болса, бірінші аргумент ретінде ағының атын көрсету отырып, енгізу – шығарудың барлық предикаттарын қолдануымыз қажет. Мысалы, тұжырымдарды кезектілігімен (последовательности)орындау нәтижесінде,
? – open(тестфайл, элемент,write),
write(элемент, тестпоток),
nl(элемент), close(элемент).
тестфайл файлында ‘тестпоток’ жазбасы және жаңа қатардың себебі (признак) енгізіледі.
Файлдардағы мәліметтермен жұмыс істеу файлдық өндеу деп аталады. Файлдарға келесі негізгі операциялар қолданылады:
— файлдарды құру;
— файлға тұжырымды жазу;
— файлдан тұжырымды оқу;
— файлды модификациялау.
Турбо-Прологта файлдармен жұмыс істеу үшін келесі стандартты предикаттар пайдаланады.
Openread() — оқу үшін файлды ашу;
Openmodify() — оқу/жазу үшін файлды ашу;
Openwrite() – жазу үшін файлды ашу;
Openappend() — толықтыру үшін файлды ашу;
Closefile() – файлды жабу;
Readdevice() – енгізудің логикалық құрылғысын қайта мекендетудіжүзеге асыру;
Writedevice() — шығарудың логикалық құрылғысын қайта мекендетуді жүзеге асырады.
Турбо-Прологта графиктік режимде жұмыс істеу үшін төменде негізгі стандартты предикаттар қолданылады:
graphics(режим, палитра, фон) — графиктік режимді орнату;
dot(қатар, баған, түсі) — берілген координата бойынша нүктелердің түсін орнату немесе оқу;
line (қат1, бағ1, қат2, бағ2, түсі) — графиктік режимде сызық сызу және т.б.
Программаны Прологта редактілеу
Пролог жүйеде программамен жұмыс кезінде программаға өзгерістер енгізуге рұқсат ететін редактор бар. Егер мұндай мүмкіншіліктер болмаса, Пролог ортасынан шығу, программаны редактілеу және қайтадан Пролог – жүйге қайта келу қажет,
еdit(F)
F – файл аты
Файл редактіленгеннен кейін ол автоматты түрде Прологты актілеу күйде ұстау үшін Прологтың деректер базасына қайта енгізіледі.
Предикаттарды баспаға шығару
Прологта қандай тұжырымдар кіргенін тексеру үшін келесі предикаттарды қолдануға болады:
Listing
Бұл предикат стандартты шығару ағынындағы Прологтың деректер базасындағы барлық тұжырымдарды шығарады.
listing(C)
Егер С атом болса, онда стандартты шығару ағыныда C барлық процедуралар функтормен басылады (печатаються). Егер C F арностілі функторы бар терм болса, онда F функторлы және A арностілі процедуралар ғана басылады.
Предикатты орындау нәтижесінде
Listing(фред/2)
Функторы ‘фред’, ал арності 2 – ге тең барлық тұжырымдар тізімі басылады.
Файлдармен байланыс
Осыған дейін біз қолданушының программамен байланысының бір әдісін қолдандық – қолданушы программаға сұрақ қояды, ал программа айнымалыларды нақтылап, жауап береді. Байланыстың мұндай механизмі өте қарапайым және ыңғайлы, өзінің қарапайымдылығына қарамастан ақпаратты енгізу мен шығаруды қамтамасыз етіп тұрады. Бірақ оның иілгіштігі төмен, сондықтан келесі жағдайларда бұл байланыс механизмін кеңейту керек:
• мәліметтерді сұрақ түрінде емес, басқа формада енгізу. Мысалға, ағылшын тілінде жазылған сөйлем түрінде
• ақпаратты кездейсоқ форматта енгізу
• ақпаратты тек қолданушы терминалымен ғана емес, сонымен қатар файлмен де айырбастау
Пролог-программа жұмыс істеп жатқан кезде екі файл «активті» болады: біреуі — енгізу үшін, екіншісі – шығару үшін. Бұл екі файлдар ағымды кіріс ағыны және ағымды шығыс ағыны деп аталады. Басында бұл екі ағын терминалға сәйкес болады. Ағымды кіріс ағыны see(ФайлАты) мақсатымен басқа файлға алмастырылуы мүмкін. See предикатына мысал:
…
see(файл1), (user-қолданушы)
файлдан_оқу(ақпарат),
see(user),
…
мұнда ақпарат файл1-ден оқылып, терминалға жіберіледі.
Ағымды шығыс ағыны келесі мақсатпен ауыстырылады:
tell(ФайлАты)
Мысал:
…
tell(файл3), (хабарлау(ФайлАты))
файға_жазу(ақпарат),
tell(user),
…
мұнда кейбір ақпаратты файл3-ке шығарылып, одан кейін келесі шығыс терминалға жіберіледі.
Мақсат
seen (оқудың соңы)
ағымды шығыс файлын жабады.
Мақсат
told (жазудың соңы)
ағымды шығыс файлын жабады.
Файлдар тек тізбекті түрде өнделеді. Мұнда файлдар терминал секілді болады. Кіріс файлының оқылуы туралы сұраныс ағымды кіріс ағынын оқуға алып келеді. Егер оқу туралы сұраныс файдың соңында болса, онда жауап ретінде end_of_file (файл соңы) деген атом шығады. Бір рет оқылған ақпарат екінші рет оқылмайды.
Барлық файл «тексттік» болады, яғни олар символдардан тұрады.
Ақпараттың жазылу формасына қарай Прологта файлдардың қарастырылуы екі тәсілмен жүреді. Бірінші тәсіл – символды файлдың негізгі элементі ретінде қарастыру. Сәйкесінше енгізуге немесе шығаруға жасалған сұраныс бір символдың оқылуына немесе жазылуына әкеледі. Бұл мақсат үшін get, get0, put (алу, 0-ді алу, шығару) предикаттары пайдаланылады.
Екінші тәсіл – файлдың негізгі элементі ретінде тексттің үлкенірек бірлігі алынып отыр деп қарастыру. Мұндағы үлкенірек бірлік дегеніміз прологтік терм. Сондықтан енгізу-шығаруға жасалған сұраныс толық термнің ағымды кіріс ағынынан немесе ағымды шығыс ағынына ауысуына әкеледі. Бұл мақсат үшін read және write предикаттары қолданылады. Мұнда файлдағы ақпарат формасы бойынша термдер синтаксисіне сай болу керек.
Файлды ұйымдастырудың формасы тапсырмаға байланысты болады. Егер тапсырма ақпаратты термдер синтаксисіне сәйкес оқуға рұқсат етсе, онда термдерден тұратын файлдарды таңдаған жөн. Нәтижесінде, бір үндеу арқылы енгізу немесе шығаруға толық мағыналы фрагменті бар ақпаратты жіберуге болады. Ал, жүйе мен қолданушы арасында ағылшын тілінде диалогты орнату тапсырмасы болса, онда файлдары термдер синтаксисіне сай емес символдар қатары ретінде қарастырған жөн.
read және write
read орнатылған предикат ағымды кіріс ағынынан термдерді оқуға арналған. Мақсат
Read(Х)
келесі Т термін оқу және Х-пен салыстыру үшін керек. Егер Х – айнымалы болса, онда нәтижесінде Х нақтыланып, Т-ға тең болады. Егер беттесу орындалмаса, онда Read(Х) мақсаты да орындалмайды. Read предикаты – детерминирленген, яғни ол орындалмаған кезде келесі термді енгізуге қайтып келу болмайды. Файлдағы әрбір термнен кейін нүкте немесе пробел, немесе каретканы қайтару символы болу керек.
Егер Read(Х) файлдың соңы болған кезде анықталса, онда Х end_of_file (файл соңы) атомымен нақтыланады.
write орнатылған предикат термді шығарады. Сондықтан мақсат
Write(Х)
Х термін ағымды шығыс файлына шығарады. Прологтың ерекшелігі write
процедурасының термді (қиындығына қарамастан) қалай шығару керектігін «білуі».
Графикамен жұмыс жасау
Формат: back (Қадам)
Қадам: integer (0-ден 31999-ға дейін)
Пероны кері бағытта ығыстырады.
Түсініктеме: Пероны берілген қадамдар санына байланысты кері ығыстырады. Бағыт left немесе right предикаттарымен алдын ала анықталған болуы мүмкін, экран графиктік режимде болуы керек. Экран мөлшері – көлденең және тігінен бойынша 3200 қадам. Егер мүмкін емес орынға қозғалыс берілген болса, онда back предикаты орындалмайды. penup предикатымен активтенбейінше перо сызықты сызып отырады. Сызықтың түсі pencolor предикатымен орнатылады.
Мысал: back (500)
Перо 500 қадамға кері ығыстырылатын болады.
Формат: forward (Қадам)
Қадам: integer (0-ден 31999-ға дейін)
Пероны алға ығыстырады.
Түсініктеме: Пероны берілген қадамдар санына байланысты алға ығыстырады. Графиктік режим орнатылуы керек. Егер мүмкін емес берілген болса, онда forward предикаты орындалмайды. Перо активті болғанша, алға қарай қозғалыс кезінде сызылып отырады. Сызықтың түсі pencolor предикатымен орнатылады.
Формат: left (Бұрыш)
Бұрыш: integer
Пероны солға айналдырады.
Түсініктеме: Пероны сағат тіліне қарсы көрсетілген бұрышқа айналдырады. Экран графиктік режимде болуы керек.
Мысал: left (90)
Перо 90 градус солға қарай айналады.
Формат: line (Жол1, Баған1, Жол2, Баған2, түсі)
Жол1: integer
Баған1: integer
Жол2: integer
Баған2: integer
Түсі: integer
Сызықты сызады.
Түсініктеме: Графикалық режим жұмысы кезінде сызықты сызады. Бірінші нүктенің координаталары бірінші екі параметрлермен беріледі, ал екінші нүктенің координаталары – үшінші және төртінші параметрлермен беріледі. «Түсі» мәні төменде келтірілген кестеге сәйкес беріледі. Жолдардың және бағандардың нөмірлері 0-ден 31999-ға дейінгі диапазон аралығында болуы керек. Егер мүмкін емес орындар берілген болса, онда line предикаты орындалмайды.
Мысал: line (500, 800, 500, 3000, 2)
Қызыл немесе алқызыл көлденең сызық салынады. Бұл бұрын орындалған graphies предикатында қандай палитраның таңдалғанына байланысты айқындалады. Режим 1 орнатылды деп қарастыруға болады. Нүктенің (500,800) және (500,3000) координаталарын сызықтар қосады.
Формат: right (Бұрыш)
Бұрыш: integer
Пероны оңға қарай айналдырады.
Түсініктеме: Пероны сағат тілі бағытымен көрсетілген бұрышқа айналдырады. Экран графиктік режимде болуы керек.
Мысал: right (45)
Перо сағат тілі бағытымен 45 градусқа айналады.
Формат: dot(жол, баған, түс)
жол: integer
баған: integer
түс: integer
нүктенің түсін орнатады немесе оқиды;
Түсініктеме: жол және баған нөмірлері арқылы берілген нүктенің түсін орнатады. Экран графикалық режимде болуы керек. Жол мен баған нөмірлері үшін 0 − 31999 аралығындағы сандар қолданылады. Предикат, егер нүктенің рұқсат етілмеген позициясы берілген болса, орындалмайды.
Мысал: dot(300, 700, 2)
(300, 700) позициясында нүкте 1-режимінде 1 палитрасына сәйкес түске ие болады.
Түсініктеме: нүктенің түсінің мәнін «түс» параметрімен байланыстырады.
Мысал: dot(500, 800, х)
Бұл мысалдың нәтижесі х=1 болады, егер нүкте (500, 800) позициясында жасыл түске ие болса және 1 режимінде 0 палитра орнатылған болса.
Формат: pendown
қылқаламды активизациялайды.
Мысал: pendown
Қылқалам активизацияланып, әрі қарай forward және back предикаттары көмегімен сурет салуға болады. Қылқалам арқылы жүргізілетін сызықтың түсі pencolor предикатымен беріледі.
Формат: penрos( жол, баған, бағыт)
жол: integer
баған: integer
бағыт: integer
Қылқаламның орнын оқиды немесе орнатады….