Реферат: Базы и банки знаний
Санкт-Петербургскийгосударственныйтехническийуниверситет
Кафедрасистемногоанализа и управления
РАСЧЕТНОЕЗАДАНИЕ
Дисциплина: базы и банкизнаний.
Тема: язык Пролог.
Выполнилстудент группы3082/2 Торопов.К.Д.
Проверил
“__”___________2001г.
Санкт-Петербург
2001
Содержание.
1.Теоретическаячасть……………………………………………………………3.
2.Постановказадачи...........................................................................................…4.
3.Текстпрограммы..................................................................................................4.
4.Выводы.................................................................................................................13.
5.Литература............................................................................................................13.
Теоретическаячасть.
Prologявляетсякомпиляторно-ориентированнымязыком программированиявысокого уровняи предназначендля программированиязадач из областиискусственногоинтеллекта(ИИ). Как язык программированияИИ он особеннохорош для созданияэкспертныхсистем, динамическихбаз данных, программ сприменениеместественно-языковыхконструкций; он также можетбыть использовандля другихзадач общегохарактера.Prologимеет окна, цветную графикуи интерактивныесредстваввода-вывода, что свидетельствуето его максимальномудобстве дляпользователяприкладныхпрограмм.
Prolog– это декларативныйязык, программына которомсодержат объявлениялогическихвзаимосвязей, необходимыхдля решениязадачи. Обозначения, используемыев Prologдля выражениялогическихвзаимосвязей, унаследованыиз логики предикатов.
Prologимеет внутренниеподпрограммыдля выполнениясопоставленияи связанныхс ним процессов.Они являютсянеотъемлемойчастью языкаи называютсявнутреннимиподпрограммамиунификации.Эти подпрограммывыполняютсопоставлениецелей и подцелейс фактами иголовами правилдля того, чтобыдоказать (иливычислить) этицели или подцели.Эти же подпрограммыопределяют, сгенерированыли новые подцелиправой частиправила. Программиств соответствиис логическимсинтаксисомPrologобъявляет, какие фактыи правила даюттот или инойрезультат приразличныхподцелях, авнутренниеподпрограммыунификациивыполняютоставшуюсячасть работы.
Фактыи правила являютсяутверждениями, которые образуютданные программына Prolog.Правила имеютлевую частьи правую часть.Левая частьправила истинна, если истиннаправая частьправила. Правилагенерируютновые факты, когда все утвержденияв теле оказываютсявычисленными.
Prologиспользуетоткаты дляопределенияальтернативныхпутей вычисленияцели или подцели.Если подцельоказаласьнеуспешной, а указателиотката былиустановлены, то для предыдущейподцели будетсделана попыткадобиться успеха, начиная с точкиотката.
Prologпозволяетвыполнять целыйряд операцийсо списками.Их переченьвключает: доступк объектамсписка, проверкана принадлежностьк списку, разделениесписка на два, слияние двухсписков, сортировкуэлементовсписка в порядкевозрастанияили убывания.
Prologобеспечиваетвозможностидля удобнойи эффективнойобработкифайлов. Сюдаможно включитьвстроенныепредикаты дляобработки изакрытия файлов, чтения из файлаи записи в файл, измененияданных в файле, а также дозаписьв уже существующийфайл. Данныеиз файла могутобрабатыватьсялибо как непрерывныйпоток символов, либо как структурированныеобъекты типазаписей базыданных.
ВPrologимеются специальныесредства дляорганизациибаз данных. Этисредства рассчитанына работу среляционнымибазами данных, так как Prologособенно хорошдля написаниядиалоговойсистемы именнодля реляционнойБД: внутренниеунификационныепроцедуры языкаосуществляютавтоматическуювыборку фактовс нужными значениямиизвестныхпараметрови присваиваютзначения ещёне определённым.К тому же механизмотката позволяетнаходить всеимеющиесяответы на сделанныйвопрос.
Постановказадачи.
Требуетсянаписать программуучёта книг –название, автор(илисписок авторов), год выпуска, издательство.Программадолжна позволятьнайти нужнуюкнигу, добавить/удалитькнигу, изменитьсодержимоенужной записии сохранитьвсё в файл.
Текстпрограммы.
DOMAINS
name,izd,aut=string
list=aut*
god=integer
file=datafile;
indexfile
GLOBAL DATABASE
kniga(name,list,izd,god)
PREDICATES
nondeterm repeat/*повтор*/
nondetermmenu /*основное меню*/
nondetermmenu_modify /*меню модификации*/
nondetermprocess(integer)/*различныеоперации изперечня меню*/
nondetermproc(integer)/*различныеоперации изперечня менюмодификации*/
nondetermdo_dbase /*цель*/
nondetermdbassert(dbasedom) /*добавлениеданных*/
nondetermdbass(dbasedom,string,string) /*модульввода данных*/
nondetermreadlist(list) /*чтение списка*/
nondetermwritelist(list) /*вывод списка*/
nondetermdbretract(dbasedom) /*удалениеданных*/
nondetermdbret(dbasedom,string,string)/*модульудаления данных*/
nondetermdbret1(dbasedom,real)/*вспомогательныймодуль удаленияданных*/
nondetermdbread(dbasedom)/*чтение данных*/
nondetermdbrd(dbasedom,string,string) /*модульдля выборкиданных*/
nondetermdbaaccess(dbasedom,real)/*вспомогательныймодуль выборкии поиска данных*/
nondetermappend(list,list,list) /*присоединениесписка*/
nondetermdelete_it(aut,list,list) /*удалениеэлемента списка*/
GOAL
do_dbase.
CLAUSES
/*Диалогс этой базойданных осуществляетсяпо принципуменю.
Основываясьна запросепользователя, СУБД активизирует
соответствующиепроцессы дляудовлетворенияэтого запроса.*/
/*заданиецели в видеправила*/
do_dbase:-
menu.
menu:-
repeat,
nl,
write("***********************************"),nl,
write(" 1.Adda book to database "),nl,
write("2.Delete a book from database"),nl,
write("3.View a book from database "),nl,
write("4.Modify a book in database "),nl,
write("5.Quit from this program "),nl,
write("***********************************"),nl,
nl,
write(«Pleaseenter your choice,1,2,3,4,5: „),
readint(Choice),nl,
Choice>0,Choice
process(Choice),
Choice=5,
!.
/*менюмодификации*/
menu_modify:-
repeat,nl,
write(“***********************************»),nl,
write("1.Modify name "),nl,
write(" 2.Addauthors"),nl,
write("3.Delete authors"),nl,
write("4.Modify izdanie"),nl,
write("5.Modify god "),nl,
write("6.Return to main menu."),nl,
write("***********************************"),nl,
nl,
write(«Pleaseenter your choice,1,2,3,4,5,6: „),
readint(C),nl,
C>0,C
proc(C),
menu.
/*Добавлениеинформациио книге */
process(1):-
write(“Entername „),
readln(Name),
write(“Enterauthors „),
readlist(List),
write(“Enterizdanie „),
readln(Izd),
write(“Entergod „),
readint(God),nl,
dbassert(kniga(Name,List,Izd,God)),
write(Name,“hasbeen added to a database.»),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*Удаление информациио книге */
/*еслизапись существует*/
process(2):-
write(«Entername „),
readln(Name),
dbretract(kniga(Name,_,_,_)),
write(Name,“hasbeen deleted from the DATABASE.»),
nl,!,
write(«Pressspace bar.»),
readchar(_),!..
/*еслизапись несуществует*/
process(2):-
write(«Can'tfind that book in the database.»),nl,
closefile(datafile),
closefile(indexfile),nl,!,
write(«Pressspace bar.»),
readchar(_),!..
/*Просмотр информациио книге */
/*еслизапись существует*/
process(3):-
write(«Entername „),
readln(Name),
dbread(kniga(Name,List,Izd,God)),nl,
write(“ »,Name),nl,
writelist(List),nl,
write(" ",Izd),nl,
write(" ",God),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*еслизапись несуществует*/
process(3):-
write(«Can'tfind that book in the database.»),nl,
closefile(datafile),
closefile(indexfile),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/* Вызовменю модификации*/
process(4):-
nl,
menu_modify.
/* Выходиз диалога */
process(5):-
write(«Pressspace bar.»),
readchar(_),
exit.
/*Просессы менюмодификации*/
/*Изменениеназвания книги*/
/*еслизапись уществует*/
proc(1):-
nl,write(«Запрос:»),nl,
write(" Название книги:"),
readln(Name),
dbread(kniga(Name,List,Izd,God)),nl,
write(" ",Name),nl,
writelist(List),nl,
write(" ",Izd),nl,
write(" ",God),nl,!,
write(«Entername „),
readln(Name1),
dbretract(kniga(Name,_,_,_)),nl,
dbassert(kniga(Name1,List,Izd,God)),
write(Name,“hasbeen modified in database.»),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*еслизапись несуществует*/
proc(1):-
write(«Can'tfind that book in the database.»),nl,
closefile(datafile),
closefile(indexfile),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*изменениеиздания*/
/*еслизапись существует*/
proc(4):-
nl,write(«Запрос:»),nl,
write(" Название книги:"),
readln(Name),
dbread(kniga(Name,List,Izd,God)),nl,
write(" ",Name),nl,
writelist(List),nl,
write(" ",God," ",Izd),nl,!,
write(«EnterIzd „),
readln(Izd1),
dbretract(kniga(Name,_,_,_)),nl,
dbassert(kniga(Name,List,Izd1,God)),
write(Name,“hasbeen modified in database.»),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*еслизапись несуществует*/
proc(4):-
write(«Can'tfind that book in the database.»),nl,
closefile(datafile),
closefile(indexfile),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*изменениегода выпуска*/
/*еслизапись сущесвует*/
proc(5):-
nl,write(«Запрос:»),nl,
write(" Название книги:"),
readln(Name),
dbread(kniga(Name,List,Izd,God)),nl,
write(" ",Name),nl,
writelist(List),nl,
write(" ",God," ",Izd),nl,!,
write(«EnterGod „),
readint(God1),
dbretract(kniga(Name,_,_,_)),nl,
dbassert(kniga(Name,List,Izd,God1)),
write(Name,“hasbeen modified in database.»),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*еслизапись несуществует*/
proc(5):-
write(«Can'tfind that book in the database.»),nl,
closefile(datafile),
closefile(indexfile),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*добавлениесписка авторов*/
/*еслизапись существует*/
proc(2):-
nl,write(«Запрос:»),nl,
write(" Название книги:"),
readln(Name),
dbread(kniga(Name,List,Izd,God)),nl,
write(" ",Name),nl,
writelist(List),nl,
write(" ",Izd),nl,
write(" ",God),nl,!,
write(«Enterauthors: „),
readlist(List1),
append(List,List1,List2),
dbretract(kniga(Name,_,_,_)),
dbassert(kniga(Name,List2,Izd,God)),
write(Name,“hasbeen modified in database.»),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*еслизапись несуществует*/
proc(2):-
write(«Can'tfind that book in the database.»),nl,
closefile(datafile),
closefile(indexfile),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*удалениеавтора*/
/*еслизапись существует*/
proc(3):-
nl,write(«Запрос:»),nl,
write(" Название книги:"),
readln(Name),
dbread(kniga(Name,List,Izd,God)),nl,
write(" ",Name),nl,
writelist(List),nl,
write(" ",God," ",Izd),nl,!,
write(«Enterauthor to delete: „),
readln(Aut),
delete_it(Aut,List,List1),
dbretract(kniga(Name,_,_,_)),
dbassert(kniga(Name,List1,Izd,God)),
write(Name,“hasbeen modified in database.»),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*еслизапись несуществует*/
proc(3):-
write(«Can'tfind that book in the database.»),nl,
closefile(datafile),
closefile(indexfile),nl,!,
write(«Pressspace bar.»),
readchar(_),!.
/*возвратв основноеменю*/
proc(6).
/*Повтор*/
repeat.
repeat:-repeat.
/* Правиладля работы сБД */
dbassert(Term):-
dbass(Term,«cbook.ind»,«cbook.dba»).
dbretract(Term):-
dbret(Term,«cbook.ind»,«cbook.dba»).
dbread(Term):-
dbrd(Term,«cbook.ind»,«cbook.dba»).
/*Правило dbassзаписываетинформациюв файл datafileи модифицируетфайл indexfile*/
/*записьданных в ужесуществующийфайл*/
dbass(Term,Indexfile,Datafile):-
/*проверкасуществованияфайлов*/
existfile(Indexfile),
existfile(Datafile),
/*открываетфайл данныхна добавление*/
openappend(datafile,Datafile),
writedevice(datafile),
/*зпоминаетпозицию*/
filepos(datafile,Pos,0),
/*добавлениезаписи*/
write(Term),nl,
/*закрыватфайл данных*/
closefile(datafile),
/*открываетиндексный файлна добавление*/
openappend(indexfile,Indexfile),
writedevice(indexfile),
/*Записьзначения индекса, задаваемогопеременнойPos.
Длязаписи индексаотводится поле, состоящее из7 позиций.*/
writef("%7.0\n",Pos),
/*закрываетиндексныйфайл*/
closefile(indexfile).
/*еслифайлы не существуют*/
dbass(Term,Indexfile,Datafile):-
/*создаётфайл данныхдля записи*/
openwrite(datafile,Datafile),
writedevice(datafile),
/*запоминаетпозицию*/
filepos(datafile,Pos,0),
/*добавлениезаписи*/
write(Term),nl,
/*закрываетфайл данных*/
closefile(datafile),
/*создаётиндексный файлдля записи*/
openwrite(indexfile,Indexfile),
writedevice(indexfile),
/*Записьзначения индекса, задаваемогопеременнойPos.
Длязаписи индексаотводится поле, состоящее из7 позиций.*/
writef("%7.0\n",Pos),
/*закрываетиндексныйфайл*/
closefile(indexfile).
/*Правило dbretудаляет данныеиз БД */
dbret(Term,Indexfile,Datafile):-
/*открываетфайл данныхна чтение*/
openread(datafile,Datafile),
/*открываетиндексный файлна модификацию*/
openmodify(indexfile,Indexfile),
/*испльзуетсявспомогательныймодуль, которыйосуществляетпоиск
нужнойзаписи и еёудаление */
dbret1(Term,-1),
/*закрываетфайл данных*/
closefile(datafile),
/*закрываетиндексныйфайл*/
closefile(indexfile).
dbret1(Term,Datpos):-
Datpos>=0,
filepos(datafile,Datpos,0),
readdevice(datafile),
readterm(dbasedom,Term),!,
filepos(indexfile,-9,1),
/*Этотпредикат вызываетзапись на дисксодержимоговнутреннего буфера индексногофайла. Такимобразом dbret1предотвращаетвозможностьработы с
данными, которые былиудалены доэтого.*/
flush(indexfile),
writedevice(indexfile),
writef("%7.0\n",-1),
readdevice(keyboard),
writedevice(screen).
/*осуществляетпоиск нужногоиндекса в индексномфайле*/
dbret1(Term,_):-
readdevice(indexfile),
readreal(Datpos1),
dbret1(Term,Datpos1).
/*Правило dbrdизвлекаетинформациюиз файла datafile*/
dbrd(Term,Indexfile,Datafile):-
openread(datafile,Datafile),
openread(indexfile,Indexfile),
/*испльзуетсявспомогательныймодуль dbaaccess, осуществляющий
поиски выборку данныхиз файла БД*/
dbaaccess(Term,-1),
closefile(datafile),
closefile(indexfile).
/*Этотпредикат читаетданные, логическисвязанные созначениеминдекса,
задаваемымпеременнойDatapos.*/
dbaaccess(Term,Datpos):-
Datpos>=0,
filepos(datafile,Datpos,0),
readdevice(datafile),
readterm(dbasedom,Term).
/*Этоправило пытаетсянайти в базетакую запись, индекс которой присутствует в индексномфайле. Еслииндекс находится, то правилоуспешно; еслинет, то неуспешно.Вслучае успехапеременнаяTermполучает нужныепользователюзначения*/
dbaaccess(Term,_):-
readdevice(indexfile),
readreal(Datpos1),
dbaaccess(Term,Datpos1).
/*Правила работысо списками*/
/*Чтениесписка*/
readlist([H|T]):-
write(">"),nl,
readln(H),!,
readlist(T).
readlist([]).
/*Выводсписка*/
writelist([H|T]):-
write(H," "),
writelist(T).
writelist([]).
/*Присоединениесписка*/
append([],L,L).
append([N|L1],L2,[N|L3]):-
append(L1,L2,L3).
/*Удалениеэлемента списка*/
delete_it(_,[],[]).
delete_it(X,[H|T],L):-H=X,!,delete_it(X,T,L).
delete_it(X,[H|T],[H|L]):-delete_it(X,T,L).
Выводы.
Быланаписана программа, реализующаяпоставленнуюзадачу. Принаписаниипрограммы авторознакомилсяс основнымипонятиями, касающимисябаз данных, использованиемпредикатови правил дляработы с файлами, списками, элементамисписков. Работанад составлениемпрограммыпозволиладетально ознакомитьсяс вопросамиорганизацииданных в БД иизвлеченияиз неё необходимойпользователюинформации.
Литература.
Ц. Ин, Д.Соломон «ИспользованиеТурбо-Пролога», Издательство«Мир»