2.9. Зертханлық жұмыс № 9.Visual Prolog файл жүйесi.
Бұл бөлiмде Visual Prolog файл жүйесiн жəне файлдармен айналып тұрған
стандарттык предикаттарды көрсетіледі. Енгiзу /шығару қайта
тағайындалумен - əр түрлi құрылымдарымен енгiзу /шығару тиiмдi байланыс
əдiсiмен таныстыру.
Файл жүйесi ептеген ерекшелiктерiмен Visual Prolog əр түрлi версияларында
бiрдей жұмыс iстейдi
Visual Prolog current_read_device (оқығанның ағымды құрылымы), оған
енгiзу оқылады жəне жазғанның ағымды құрылымы current_write_ device,
(одан шығару жіберіледі) қолданылады.
Əдеттегiдей, оқығанның ағымдағы құрылымы клавиатура болып
табылады, ал ағымдағы жазу құрылымы - дисплейдiң пердесi. Дегенімен
басқа құрылымдарды тағайындай аласыз
Мысалы, енгiзу сыртқы жадта сақталған (мүмкiн дискте) файлдан
оқыла алады. Тiптi мүмкiн бағдарламаны орындағанда ағымдағы енгiзу мен
шығару құрылымдарды қайта анықтау болады. Оқудын жəне жазудың
құрылымдарына қолданылғанына қарамаай, Prolog Visual бағдарламада
оқу мен жазу ұқсас етіледі. Файлға оны ашу керек. Файл келесілерге
ашылады .
•
Оқу үшін ;
•
Жазу үшін ;
•
Қосу үшін;
•
Модификацияға үшін.
58
Кез келген əсер ету үшін ашық файл, оқудан айырмашылығы бар
болатын, операция аяқтаудан кейін жабылу болуға тиісті. Жағымсыз
жағдайда өзгерістер енгізген файлға жоғалтуға бола алады. Бір уақытта
бірнеше файлдарды ашуға болады.
Ашық файлдардың арасында енгiзу мен шығару жылдам қайта
белгіленеді.
Файлдарды ашу мен жабуы көбірек уақыт алады, əлдеқайда
деректердің ағындарын қайта тағайындалулары қарағанда
Visual Prolog файл ашқан жатқан кезде, ол операциялық жүйенің файлдын
бейнелі түрде атын нақты атымен байланыстырады жəне осы бейнелі
түрде аты енгiзу мен шығаруға бағыттылынады.
Файлдардың бейнелі түрде атылары кішкентай əріптен бастауға тиісті
жəне file доменды сипатталғанда хабарландыруға болу тиісті. Мысалы: file
= file1; source; auxiliary; somethingElse
Кез келген бағдарламада тек қана бір file домен рұқсат берілген.
1 кестеде қөрсетілген бес кірістірілген file альтернативтерді Visual Prolog
айырылып танады
1 кесте. File доменның кірістірілген альтернативтер
Альтернатива Сипаттама
keyboard
Клавитатурадан оқу (Үндемеу бойынша )
screen
Мониторға жазу
stdin
Стандарттық еңгізуден оқу
stdout
Стандарттық шығуын жазу
stderr
Қателерды шығару үшін стандарттық құрылымға жазу
Бұл кірістірілген альтернативтер file сипатталғанда кездесуге тиісті
емес
Ашумен жабуға оларды керек емес болмайды.
Файлдарды ашу мен жабу
Файлдарды ашу мен жабу үшін стандарттық предикаттар туралы
келесі бөлімдер сипаталады
Ескерту
Файлды ашқанда ескеру сақтау керек, кері слэш (\), дискінің
подкаталогың
белгілеу
үшін
қолданатында
DOS-бағдарларынған
болжамдарда Visual Prolog ESC-символ (бағдарлаушысымен) боп келеді
Сондықтан бағдарламада файлға белгіленген жөлды рұқсаттылғанда екі
(\\)кері слэш əрдайым көрсету маңызды болады.
Мысалы, жөл:
"с:\\prolog\\include\\iodec1.con"
файлға рұқсаттың жолын ұсынады:
с:\prolog\include\iodec1.con
Предикат openread/2
Предикат openread оқу үшін OSFileName файл ашады, келесі формат
қолдана:
openread(SymbolicFileName, OSFileName)
% (i, i)
59
Visual Prolog file домен хабарандырылған, SymbolicFileName
бейнелі түрде аты бойынша ашық файлға айналады. Егер файл ашылмаса,
Visual Prolog қателек туралы хабарландырады
Предикат openwrite/2
Предикат openwrite жазу үшін OSFileName файл ашады, келсі
формат қолдана:
openwrite(SymbolicFileName, OSFileName) % (i, i)
Егер файл болса, онда оны жояды. Басқа жағдайда Visual Prolog жаңа
файлды құрады жəне оның тиiстi тiзбесiнде сыйғызып салады. Егер файл
жасалмаса, Visual Prolog қателiк туралы хабарды бередi.
Предикат openappend/2
Предикат openappend файлдың соңына жазу үшін OSFileName файл
ашады
Сонымен бiргекелесі формат қолданылады:
openappend(SymbolicFileName, OSFileName) % (i, i)
Егер файл жазуға ашыла алмаса, Visual Prolog қателiк туралы
хабарландырады.
Предикат openmodify/2
Предикат openmodify жазу мен оқу үшін OSFileName ашады, Егер
файл болса, ол қайта жазылмайды, openmodify келесі формат:
openmodify (SymbolicFileName, OSFileName) % (i, i)
Егер жүйе OSFileName аша алмаса, Visual Prolog қателiк туралы
хабарландырады. Оpenmodify
Предикат кез келген рұқсаты бар файлының толтырулары үшiн
стандарттық filepos.
предикатпен бiрге қолданыла алады
Предикат filemode/2
предикат filemode мəтіндік режимде файлды ашқан кезде предикат
filemode мəтiндiк немесе екiлiк режимде көрcетiлген файлды орнатады,
келесі формат қолдана:
filemode(SymbolicFileName, FileMode) % (i, i)
Если FileMode = 0, SymbolicFileName файл екiлiк режимге келеді
если FileMode = 1, онда ол мəтіндік режимге келеді.
Мəтіндік режимде жазғанда жана жөлдарға "Келесi жолға өту" /
"Енгiзу пернесi" символдар қосылады , ал оқығанда бұл екі символдар
жаңа жол сияқты түсiндiрiледі
Carriage return (возврат каретки) = ASCII 13
Line feed (перевод строки) = ASCII 10
Екілік режимде ешқандай да өзгерістер болмайды
60
Екілік файлды оқу үшін сəз тек қана readchar немесе екiлiк
файлдарға рұқсат үшiн предикаттар. кқолданады .
Предикат closefile/1
closefile предикат белгіленген файлды жабады, ол келесі
форматты қолданады:
closefile(SymbolicFileName) % (i)
Егер файлы ашық болмаса бұл предикатты əрдайым ойдағыдай бiтедi
Предикат readdevice/1
readdevice предикат readdevice current_read_device (оқудын ағымды
құрылымы) қайта анықтайды немесе оған атын қайтарады .
Предикаттың форматы
readdevice(SymbolicFileName)
% (i), (о)
Предикат writedevice/1
readdevice предикат оқудын ағымды құрылымын қайта анықтайды,
егер SymbolicFileName айнымалысы анықталса жəне файл оқуға ашық
болса. Егер SymbolicFileName айнымалысы бос болса, онда readdevice
оқудын белсенді ағымды құрылымның атын береді
Предикат writedevice/1
writedevice предикат не тағайындайды немесе current write_device
(жазудың ағымды құрылымы) ат алуға рұқсат береді. Оның форматты
writedevice(SymbolicFileName)
% (i), (о)
Егер көрcетiлген файл жазғанға немесе қосқанға ашылса, writedevice
предикат жазу құрылымын қайта анықтайды. Егер SymbolicFileName
айнымалысы бос болса, онда writedevice жазудың белсенді ағымды
құрылымның атын береді.
Файлды жабуының, файлға жазуы жəне файлды ашуы үлгілер
1. Келесi тiзбектігі жазу үшiн MYDATA.FILнiң файлды ашады,
writedeviceнiң
екi
предикаттарының
арасындағы
тудырылатыны
операторлармен,содан соң барлық шығаруды ы MYDATA.FILнiң файлға бұл
destinationнiң file доменiнiң сипаттама пайда болатын бейнелi түрде атына
сəйкес келетіне бағыттайды,
domains
file = destination
goal
openwrite(destination, "MYDATA.FIL"),
writedevice(OldOut),
%Шығарудын ағымды құрылымы аламыз
writedevice(destination), % Файлға шығаруды қайта жібереміз
writedevice(OldOut), %Шығарудын ағымды құрылымын налпына келтiремiз
2.
Бағдарлама ch2е09.рго (листинг 1) символдарды тіркелген
клавиатурада TRYFILE.ONE файлға ағымдағы дисктегі салады, read и
write стандарттык предикаттарды қолданады
61
Тіркелген символдар дисплейдің экранына шығарылмайды. Сiздере
жақсы жаттығу болады, егер осы символдарды экранға шығару
бағдарламаны жазғанда. Клавишаны басқанда файл жабылады.
Бағдарлама ch12e09.pro
domains
file = myfile
predicates
readloop - procedure ()
run - procedure ()
clauses
readloop:-
readchar(X),
X<>'#',!,
write(X),
readloop.
readloop.
run:-
write("This program reads your input and writes it to"),nl,
write("tryfile.one\n"),
write("For stop press #"),nl,
openwrite(myfile,"tryfile.one"),
writedevice(myfile),
readloop,
closefile(myfile),
writedevice(screen),
write("Your input has been transferred to the file tryfile.one"),nl.
goal
run.
Стандарттык еңгізу/ шығару ды қайта анықтауы
file доменда stdin, stdout, stderr үш қосымша опциялар бар. Бұл
файлдық ағындарының артықшылығы келесіде: сiз командалық жолында
стандарттык еңгізу / шығару қайта тағайындауға болады (кесте2)
Кесте
2. Файлдық ағындар мен сипаттамалар
•
stdin Стандарттык енгiзу, файл болып келеді, тек қана оқу үшiн. Бұл
(stdin ) readdeviceнiң клавиатуралары үндемеу бойынша stdin енгiзу
құрылымымен тағайындайды
•
. stdout Стандарттык шығару файл болып келеді, тек қана жазу үшiн.
62
Бұл (stdout ) writedeviceнiң терминалының перделерiн үндеу бойынша stdoutт
енгiзу құрылымымен тағайындайды
•
stderr Стандарттык шығару қателер файл болып келеді, тек қана
жазу үшiнге қол жететiн. Үндеу бойынша бұл терминалдын экраны.
Writedevice (stderr) қателерi туралы stderr.шығару үшiн құрылымен
тағайындайды.
Файлдармен жұмыс істеу
Бұл бөлiмде файлдармен жұмыс істеу үшiн бiрнеше басқа предикаттар
сипаттаймыз Бұл келесі предикаттар filepos, eof, flush, existfile, deletefile,
renamefile, disk и copyfile.
Мысалдардың бірнешеуін келтірейік:
1. Келесі кіріспе тізбегіне somefile.pro файлға Text мəні жазып
алынады(myfile сияқты айналып жатыр), 100 позициядан бастап файлдын
бастауынан бойынша.
Text = "A text to be written in the file",
openmodifу(myfile, "somefile.pro"),
writedevice(myfile),
filepos(myfile, 100, 0),
write(Text),
closeflie(myfile).
Листинг бағдарламасында бұл істеп жасалынғандарды, байттың
артында байт файлдың ішіндегісін қолданып filepos тексеруге болады. Бұл
бағдарлама файлдың атын сұрайды, файлдың позициялардың ішіндегісін
содан соңын көрсетіп отыр, позициялардың нөмерлері клавиатурамен
жүргізіліп отырады.
2 листинг. ch12e09.pro бағдарламасы
domains
file = input
predicates
inspect_positions(file) - determ (i)
clauses
inspect_positions(UserInput):-
readdevice(UserInput),
nl,write("Position No? "),
readln(X),
term_str(ulong,Posn,X),
readdevice(input),
filepos(input,Posn,0),
63
readchar(Y),nl,
write("Char is: ",Y),
inspect_positions(UserInput).
goal
write("Which file do you want to work with ?"),nl,
readln(FileName),
openread(input, FileName),
readdevice(UserInput),
inspect_positions(UserInput).
Eof/1 предикаты
eof перидикатын тексеріп жатыр, процессте алған оқуларға файлдың
соңымен позиция келіп жатыр. Мұндай жағдайда eof табысты болады.
Қарсы жағдайда ол жағымсыз жағдайға да шыдайды. Eof перидикатының
түрлері:.
eof(SymbolicFileName) % (i)
Егер файл құқықтармен орындаулар уақыты тек қана жазуға ашық
болса қатені eof беріп береді. Назар аудараыыңыз, предикат ( +
комбинациялы пернелер) DOS файлдың аяқталуының нышанына ерекше мəн
туғызбайды.
Предикат пайдалы файлдармен жұмыс істеуінде предикатты анықтау
үшін қолдануға пайдалы, мысалы, файлдың аяғына жете болмайтын кезде
Вile нүктені сол мезгілдерге дейін қайтарады.
Предикат repfile predicates файлдармен жұмыста
repfile(FILE)
clauses
repfile(_).
repfile(F):-not (eof (F)), repfile(F).
Келесі бағдарламада басқа біреу файл өзгертеді, барлық əріптер
бастапқы болып келеді. Листинг 3. Программа ch12e11.pro
omains
file = input; output
predicates
convert_file - procedure ()
repfile(FILE) - nondeterm (i)
run - determ ()
clauses
convert_file :-
repfile(input),
readln(Ln),
upper_lower(LnInUpper,Ln), /* converts the string to uppercase */
write(LnInUpper),nl,
fail.
64
convert_file.
repfile(_).
repfile(F):-
not(eof(F)),
repfile(F).
run:-
write("Which file do you want convert ?"),
readln(InputFileName),nl,
write("What is the name of the output file ?"),
readln(OutputFileName),nl,
openread(input, InputFileName),
readdevice(input),
openwrite(output, OutputFileName),
writedevice(output),
convert_file,
closefile(input),
closefile(output).
goal
run.
Предикат flush/1
Передикат аталған файлға ішкі буферлер flush ішіндегісін жазып
отырады.
flush(SymbolicFileName)
% (i)
Ол буфер «барлық құлату жүйесін» сұрап жатыр.
Предикат existtile/1
Егер передикат existfile программасын табысты орындаса, онда
OSFileName файлы табылады. Предикат OSFileName тізбе бола алады, ал
сияқты, \psys\ *.cfg аты алмастырулар таңбалары бола алады: Егер файлдың
аты тізбеге белгі қойылған жолда емес предикат жетіспеушілігі existfile те
бітіп жатыр. Бірақ, байқаң, "system" (Жүйелік) қойылған атрибуттармен
барлық файлдарды, файлдарды қоса existfile де табады, жəне "hidden" де
(Бүркеме), ол тізбелерді таппайды. Суреттеп айтылған төмендегі тізбелерді
іздестірулер предикаттардың қолдануымен істелінген болу мүмкін.
Тексеру үшін файл дискіде болған жағдайда ғана (оны ашпастан
алдын) пайдалана аласыз open(File, Name) :-
existfile(Name),
openread(File, Name).
open(_, Name) :-
write("Error: the file ", Name," is not found").
Предикат searchfile/3
Предикат тізім жолдарында файлды табу үшін searchfile қолданылады.
65
searchfile(PathList, Name, FoundName) % (i, i, o)Егер дискке түбірде
autoexec.bat орналасқан :, C тең FoundName орнайды : \AUTOEXEC.BAT.
Файлдың аты алмастырулар нышандары бола алады. Бұл жағдайда
алмастырулар нышандары болатын файлдан толық атымен сабақтас
FoundName болады, жəне төменде суреттеп айтылған тізбелер іздестіру
предикаттар үшін дəлелді сапада қолданылуы бұдан əрі мүмкін болу керек.
Егер алдыңғы мысалдың файлдың атының тап қалған сияқты *.bat орнына
мысалы autoexec.bat, сабақтас FoundName көрсетеді : \ *.ВАТ.
Предикат deletefile /1
Предикат deletefile оның берілген аргументтері мен формалары мен
берілген файлдарфн өшіріп тастайды. deletefile(OSFileName) % (1)
Егер файл алып тастай алмаса предикат қатені береді. OSFileName
біржолдық нышандар бола алмайды.
Предикат renamefile/1
Предикат renamefile NewOSFileName атынан OldOSFileName атын
өзгертіп жатыр. Ол өз формасын алады.
renamefile(OldOSFileName, NewOSFileName) % (i, i)
Егер NewOSFileName атымен файл болмаса предикат табысты
renamefile болып қалады, жəне екеуіде файлдық өзгерген аттармен сақталып
қалады. Жағымсыз жағдайда қате берған болады.
Предикат disk/1
Предикат ағымдағы диск өзгеруі үшін disk қолданып жатыр немесе
каталогта/подкаталота өз қалыпын алады :
disk(Path) % (i), (о)
Еркін айнымалы шақыруда параметрге сапада, ағымдағы тізбеге disk
қайтарылады. Бұл дискте қазіргі ағымдағы тізбесіз өзгеріссіз басқа дискке
ауыстырып қосу үшін DOS-Бағдарлаған болжамдарда D қолданылады:. D бұл
жерде – құрылым таңбалаушы əріп.
Предикат copyfile/2
Предикатта файлдың көшірмесін алу үшін copyfile қолданылады. Ол
екі параметрді қабылдайды :.copyfile(SourceName, DestinationName)
% (i,
i)
Файлдардың аттары толық немесе ішінара беріле алады, жəне бұл
файлдарға жолдар дисктер жəне тізбелерді қоса. Қайта құрылмалы
нышандарға тыйым салынған. Көшіріп алған атрибуттарын жəне құқықтарын
бастапқы файл алады.
2.10. Зертханлық жұмыс № 10.Visual- ға кiрiспе iшкi деректер базасы.
66
(internal fact databases ) iшкi деректер базасы сiз оны орындалуы
барысында Prologты сiздiң Visualдар тiлiндегi программасынан уақытында
тiкелей толықсытып алып тастай алатын айғақтардан тұрады. Сiз
бағдарламаның factsтың бөлiмiндегi iшкi деректер қорын жəне predicatesтiң
бөлiм суреттеп айтылған предикаттарды қолданылатын осы сияқты бұл
предикаттарды қолдануға суреттейтiн предикаттар жариялай аласыз.
Деректер қорына жаңа айғақтарының қосымшалары үшiн Visual Prolog
assert, asserta, assertzдың предикаттарын қолданылады, retract жəне
retractallдiң предикаттары қазiргi айғақтарды алып тастауы үшiн қызмет
көрсетедi. Сiз деректер базасындағы мазмұнын, сначасы айғақ (немесе бөп-
бөлiк айғақ) бұл айғақтың жаңа болжамын сонан соң қойылып алып тасталып
өзгерте аласыз. Consult/1 жəне consult/2 предикаттар файлдан айғақтары
оқиды жəне олардың iшкi деректер қор, a save/1 жəне save/2лерiне
толықсытады файлдағы iшiндегi iшкi деректер базаларын сақтайды.
Visual Prolog деректер қорына, кəдiмгi предикат с тəуелдi болып
фактiлердi түсiндiредi. Iшкi деректер базасының предикаттарының айғақтары
оңай өзгертуге болатын кестеде максимал жылдамдығының табысы үшiн
сонда кəдiмгi предикаттар екiлiк кодтарға құрастырады сақталады.
Iшкi деректер базасының хабарлауы(бұл əлдеқашанғы databaseның
сөзiнiң синонимы) facts маңызды сөз factsтың бөлiмдi тануын басты
анықтайды. Facts бөлiм тиiстi iшкi деректер база суреттейтiн предикаттарды
тiзбектен тұрады. Орындаулар уақытында assertaлары предикаттары арқылы
жəне assertz деректер базасына (бiрақ ереже емес) айғақтар толықсытуға
болады. Немесе, сiз дисктегi файлдан толықсытылатын айғақтары consultтың
үйреншiктi предикаты шақырып ала аласыз. Facts бөлiм ғибраттанушыда
көрiне алады
domainsname, address = stringage = integergender = male femalefacts(name,
address, age, gender) person
predicates(name, address, age) male
(name, address, age) female
(name, age, gender) child
clauses(Name, Address, Age) male:-
(Name, Address, Age, male) person.
Сiз мысал бұл (male, female, child) басқа предикаттарды қолданылатын
осы сияқтымен person предикатты пайдалана аласыз. Сiз бағдарлама
personның предикаты үшiн айғақтар жұмыс уақытында толықсытып алып
тастай алатын жалғыз айырмашылық.
Айғақтардың бөлiм жариялалған предикаттарға келесi екi шектеу атап өту
керек:
•
тек қана айғақтар деректер қорына толықсытуға рұқсат етiледi, бiрақ
ереже емес;
•
базасының айғақтары еркiн айнымалы бола алмайды.
67
Factsтың бiрнеше бөлiмдерiнiң бар болуына рұқсат етiледi, бiрақ ол үшiн
factsтың əрбiр бөлiмiнiң аты анық көрсетуi керек.
(integer ) myFirstRelation
mySecondRelationfreal, string
(string ) myThirdRelation
/* etc. */
Mydatabaseның аты бар factsтың бөлiмiнiң сипаттамасы mydatabaseның
аты бар айғақтардың деректер қорын құрады. Егер сiз iшкi деректер базасына
ат қоймасаңыз, онда ол үндемеу бойыншаға dbasedomның үйреншiктi атын
тағайындайды. Ол егер тек қана жобаның бiр бөлiгi сияқты жарияламайтын
тамырлы модулдың единстiнен тұрады бағдарлама айғақтардың жергiлiктi
атаусыз бөлiмдерi бола алатынын көңiл аударыңыз.
Деректер базасының предикаттарының аттары сирек кездесетiн
(бастапқы файл ) модул болуы керек; facts екi əр түрлi тараулардаларға
дикатов бiрдей аттар өте қолдануға болмайды. Дəл осылай facts жəне
predicatesтiң тараулардасына предикаттарының бiрдей аттары қолдануға
болмайды. Тарауларданың жергiлiктi facts нақтылы предикаттарының аттары
дегенмен, олар жариялайтын, жəне предикатов/фактовтың жергiлiктi
аттарымен қақтықпайды басқа модул жариялалған модул үшiн жергiлiктi
болып табылады.
Достарыңызбен бөлісу: |