68
сiз ("Maggie \" \, \ F \) personнiң барлық əйелдерiн табылу үшiн (Name, \ F \)
personның мақсаты бар person шақыра аласыз, немесе Maggieнiң аты
бойынша əйел сiздiң деректер қорыңызға бар болатын тексеру үшiн.
Factsтың бөлiмiндегi предикаттарын беттерiнше табиғатына əрдайым
детерминация жасамалған. Айғақтар өйткенi бағдарламаның орындауы,
компилятор уақытында кез келген уақытта қосыла алады əрдайым iздестiру
барысында қайтарумен талғаулы шешiмдерi табу мүмкiндiгi бар болатынын
есепке алуы керек. Егер бөлiмде үшiн бiр айғақтан астам болмайтын
предикат facts барып тұр, онда сiз бұл (егер предикат əрдайым бiр-ақ айғақ
алуы керек немесе singleнiң маңызды сөзi) determнiң маңызды сөзiнiң
айғағының предикатты тануын алдыңызда жазып декларация жасай аласыз.
facts
determ daylight_saving(integer)
Айғақты алып үлгеретiн деректер базасының детерминделген
предикаты үшiн жаңа айғақ сiз қатенi алыңыз талпынғанда қосылғанын
байқаймыз.
Iшк i деректер базасының жаңартуы
Деректер базасының предикаттары үшiн айғақтар бұл соңғы мысалда
көрсетiлетiн clausesтiң бөлiмiндегi компиляция уақытында анықтала алады.
Фак сенi орындаулар уақытында қосылуға жəне предикаттар төменде
айтылған қолдана алып тастала аласың. Сонымен бiрге айғақ clausesтың
бөлiмiндегi компиляция нақтылы уақытында алып тасталуға болады, олар
орындау уақытында қосылған айғақтардан негізгі айырмашылығы бола
алады.
Айғақтары бар жұмыс үшiн үйреншiктi предикаттар Visual Prolog:
assert, asserts, assertz, retract, retractall, consult жəне save - бiр немесе екi
дəлелдердi иемдене алады. Мiндеттi емес екiншi дəлел iшкi деректер
базасының аты болады.
/1 жəне /2 белгi предикаттың осы болжамы үшiн дəлелдердiң керек санын
предикаттың əрбiр атынан кейiн көрсетедi. ((i ) */ жəне (o, i ) */) /*) сондай
/*лар) түсiнiктер предикат ол үшiн параметрлердiң (жəне ) ағындарының
көрсетедi.
Бағдарламаның орындауы айғақтардың енгiзуi уақытында
Айғақтар орындаулар уақытында предикаттардың арқылылардың
айғақтарының iшкi деректер қорына қосыла алады: assert, assertaлар жəне
assertz, немесе файлдан айғақтардың жүктеуi жолымен consultтар арқылы.
Орындау бiр айғақтың қосымшасы үшiн үш предикат уақытында бар
болады:
asserta( )
% (i)
asserta(, facts_sectionName)
% (i, i)
assertz()
% (i)
assertz(, facts_sectionName)
% (i, i)
assert()
% (i)
69
assert(, facts_sectionName)
% (i, i)
Asserta предикат осы предикат, assertz үшiн бар айғақтардың алдында
айғақтарының деректер қорына жаңа айғаққа қыстыртады айғақтар осы
предикаттың бар айғақтарынан кейiн қыстыртады. Қолдануы assertтың
предикаттары нəтиже бередi, assertzдың қолдануын ыңғайлы
Деректер
базасының
предикаттарының
аттары
болғандықтан
бағдарламаның iшi сирек кездесетiн немесе (жергiлiктi айғақтардың
бөлiмдерi үшiн) модул, asserta жəне айғақтардың деректер қорына айғақ
толықсытуы керек болатын assertzдың игi үшiн əрдайым белгiлi. Дегенмен
түрдiң тексеруi айғақтардың деректер қор тиiстi мақсаттарындағымен
жұмысын мiндеттi емес екiншi дəлелдi қолдануға боладуға қамтамасыз етiлу
үшiн сол үшiн.
Ғибраттанушыны бiрiншi предикат Suzanne туралы personның предикат
суреттеп айтылған айғақ personның қазiргi мезет жад сақталған барлық
айғақтарынан кейiн қояды. Екiншi - personның предикатының барлық бар
айғақтарының алдында Michael туралы айғақ. үшiншi - John туралы айғақ
likesDatabaseнiң айғақтарының деректер қорына likesтiң барлық басқа
айғақтарынан кейiн, төртiншi Shannon туралы айғақты қояды
assertz(person("Suzanne", "New Haven", 35)).
asserta(person("Michael", "New York", 26)).
assertz(likes("John", "money"), likesDatabase).
asserta(likes("Shannon", "hard work"), likesDatabase).
Деректер базасының бұл предикаттардың шақыруынан кейiн көрiне сiз
басталған жұмыссыз келесi айғақтармен сияқты сияқты:
% Iшкi деректер базасы - dbasedom
("Michael \" \, "New York \" \, 26) person.
%.0.... person.... басқа айғақтар.
("Suzanne \" \, "New Haven \" \, 35) person.
% Iшкi деректер базасы - likesDatabase
("Shannon \" \, "Hard work \" \) likes.
%.0.... likes.. басқа айғақтар.
("John \" \, "Money \" \) likes.
Ылғи бiр айғақ екi рет бекитiн кодқа жазуға қапылыста сақтаныңыз. Iшкiсi
деректер базалары ешқандай да қайталанбаушылықтарды ескермейдi,
сондықтан ылғи бiр айғақ айғақтардың iшкi деректер қорында сан рет көрiнiп
қала алады. Қайталанбаушылыққа тексеруi бар assertтың болжамын дегенмен
өте оңай жазу:
facts – people
person(string, string)
predicates
uassert(people)
70
clauses
uassert(person(Name, Address)):-
person(Name, Address),
!
; % OR
assert(person(Name, Address)).
Файлдан айғақтарының оқуы
Consult предикат factsтың бөлiм суреттеп айтылған айғақтар fileNameнiң
файлынан оқиды, жəне олардың соңында тиiстi деректер базасының сiздiң
бағдарламаңызына қыстыртады. Consult предикат бiр немесе екi дəлелдi
алады:
consult(fileName)
% (i)
consult(fileName, databaseName)
% (i, i)
Егер сiз тек қана (деректер базасының атысыз) бiр дəлелмен consult
шақырсақ, дегенмен assertzдарға қарағанда, онда тек қана бөлiмде
(dbasedomның үндемеу бойыншасына) атсыз сипатталған айғақтар саналады.
Егер сiз (деректер базасының файл аты жəне аты) екi дəлелдерi бар consult
шақырсаңыз, онда көрcетiлген деректер базасынан тек қана айғақтары
тексерiледi. Егер файл бiрдеңенi көрcетiлген базасының айғақтарынан басқа
əлi болса, онда ол бұл жолға дейiн жеткенде consultтiң предикаты қатенi
қайтарады.
Consultтың предикаты айғаққа бiр-бiрдендерi оқитынын көңiл аударыңыз.
Егер файл он айғақтарда болса, жетiншi айғақта қандай болмасын
синтаксистiк қателiк, consultте болады айғақтардың деректер қорына алты
бiрiншi айғақтарын енгiзiледi, кейiн қателiк туралы хабар сiз не бередi.
Consultтың предикаты тек қана сол saveны құратын қалыптағы файлдары оқи
алатынын атап өтемiз. Файлдар болуы керек:
•
екi тырнақшалардағы жолдары iшiнде отыратын жоғарғы регистрдiң
нышандары, ерекшелiкке;
•
жолдар екi есе шығын iшiнде отыратын кемшiлiктер, ерекшелiкке;
•
түсiнiктер;
•
бос жолдар;
•
(symbol ) идентификаторлар екi тырнақшаларсыз.
Əскерилiк Аққу редакторда жасау немесе айғақтары бар файлдың өзгерiсiнде
сақтауы керек.
Бағдарламаның орындауы айғақтардың алып тастауы уақытында
Retract предикат айғақтар бiр iзге салады жəне олардың iшкi деректер
базасынан алып тастайды. Ол келесi қалыбы болады:
retract()
%(i)
retract(, databaseName) % (i, i)
Retract предикат айғақпен бағдарламаның орындалуы
еркiн айнымалы уақытында ұластыра дəл келетiн сiздiң деректер қорыңыз
бiрiншi айғағы алып тастайды. Бiр iзге салынған айғақтардың алып тастауын
Достарыңызбен бөлісу: |