Программирование и комп-ры

Базы и банки знаний


         Санкт-Петербургский государственный технический университет
                   Кафедра системного анализа и управления



                              РАСЧЕТНОЕ ЗАДАНИЕ

                      Дисциплина: базы и банки знаний.
                             Тема: язык Пролог.



Выполнил студент группы 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 /*повтор*/
 nondeterm menu   /*основное меню*/
 nondeterm menu_modify /*меню модификации*/
 nondeterm process(integer) /*различные операции из перечня меню*/
 nondeterm proc(integer) /*различные операции из перечня меню модификации*/
 nondeterm do_dbase  /*цель*/
 nondeterm dbassert(dbasedom) /*добавление данных*/
 nondeterm dbass(dbasedom,string,string) /*модуль ввода данных*/
 nondeterm readlist(list) /*чтение списка*/
 nondeterm writelist(list) /*вывод списка*/
 nondeterm dbretract(dbasedom) /*удаление данных*/
 nondeterm dbret(dbasedom,string,string)/*модуль удаления данных*/
 nondeterm dbret1(dbasedom,real)/*вспомогательный модуль удаления данных*/
 nondeterm dbread(dbasedom)/*чтение данных*/
 nondeterm dbrd(dbasedom,string,string) /*модуль для выборки данных*/
  nondeterm  dbaaccess(dbasedom,real)/*вспомогательный  модуль   выборки   и
поиска данных*/
 nondeterm append(list,list,list) /*присоединение списка*/
 nondeterm delete_it(aut,list,list) /*удаление элемента списка*/

GOAL
  do_dbase.

CLAUSES
/*Диалог с этой базой данных осуществляется по принципу меню.
Основываясь на запросе пользователя, СУБД активизирует
соответствующие процессы для удовлетворения этого запроса.*/

/*задание цели в виде правила*/
  do_dbase :-
          menu.
  menu:-
     repeat,

     nl,
     write("***********************************"),nl,
     write(" 1.Add a 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("Please enter your choice,1,2,3,4,5: "),
     readint(Choice),nl,
     Choice>0,Choice<6,
     process(Choice),
     Choice=5,
     !.
  /*меню модификации*/
     menu_modify:-
     repeat,nl,
     write("***********************************"),nl,
     write(" 1.Modify name        "),nl,
     write(" 2.Add authors"),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("Please enter your choice,1,2,3,4,5,6: "),
     readint(C),nl,
     C>0,C<7,
     proc(C),
     menu.
 /* Добавление информации о книге */
process(1):-
     write("Enter name  "),
     readln(Name),
     write("Enter authors  "),
     readlist(List),
     write("Enter izdanie  "),
     readln(Izd),
     write("Enter god  "),
     readint(God),nl,
     dbassert(kniga(Name,List,Izd,God)),
     write(Name,"has been added to a database."),nl,!,
     write("Press space bar."),
     readchar(_),!.

 /* Удаление информации о книге */
 /*если запись существует*/
process(2):-

     write("Enter name  "),
     readln(Name),
     dbretract(kniga(Name,_,_,_)),
     write(Name,"has been deleted from the DATABASE."),
     nl,!,
     write("Press space bar."),
     readchar(_),!.

  /*если запись не существует*/
process(2):-
     write("Can't find that book in the database."),nl,
     closefile(datafile),
     closefile(indexfile),nl,!,
     write("Press space bar."),
     readchar(_),!.

  /* Просмотр информации о книге */
  /*если запись существует*/
 process(3):-

     write("Enter name  "),
     readln(Name),
     dbread(kniga(Name,List,Izd,God)),nl,
     write("  ",Name),nl,
     writelist(List),nl,
     write("  ",Izd),nl,
     write("  ",God),nl,!,
     write("Press space bar."),
     readchar(_),!.
  /*если запись не существует*/
 process(3):-

     write("Can't find that book in the database."),nl,
     closefile(datafile),
     closefile(indexfile),nl,!,
     write("Press space bar."),
     readchar(_),!.

/* Вызов меню модификации */
 process(4):-
     nl,
     menu_modify.

/* Выход из диалога */
 process(5):-
     write("Press space 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("Enter name  "),
     readln(Name1),
     dbretract(kniga(Name,_,_,_)),nl,
     dbassert(kniga(Name1,List,Izd,God)),
     write(Name,"has been modified in database."),nl,!,
     write("Press space bar."),
     readchar(_),!.

/*если запись не существует*/
proc(1):-

     write("Can't find that book in the database."),nl,
     closefile(datafile),
     closefile(indexfile),nl,!,
     write("Press space 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("Enter Izd  "),
     readln(Izd1),
     dbretract(kniga(Name,_,_,_)),nl,
     dbassert(kniga(Name,List,Izd1,God)),
     write(Name,"has been modified in database."),nl,!,
     write("Press space bar."),
     readchar(_),!.

/*если запись не существует*/
proc(4):-

     write("Can't find that book in the database."),nl,
     closefile(datafile),
     closefile(indexfile),nl,!,
     write("Press space 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("Enter God  "),
     readint(God1),
     dbretract(kniga(Name,_,_,_)),nl,
     dbassert(kniga(Name,List,Izd,God1)),
     write(Name,"has been modified in database."),nl,!,
     write("Press space bar."),
     readchar(_),!.

 /*если запись не существует*/
proc(5):-

     write("Can't find that book in the database."),nl,
     closefile(datafile),
     closefile(indexfile),nl,!,
     write("Press space 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("Enter authors: "),
     readlist(List1),
     append(List,List1,List2),
     dbretract(kniga(Name,_,_,_)),
     dbassert(kniga(Name,List2,Izd,God)),
     write(Name,"has been modified in database."),nl,!,
     write("Press space bar."),
     readchar(_),!.

/*если запись не существует*/
proc(2):-
     write("Can't find that book in the database."),nl,
     closefile(datafile),
     closefile(indexfile),nl,!,
     write("Press space 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("Enter author to delete: "),
     readln(Aut),
     delete_it(Aut,List,List1),
     dbretract(kniga(Name,_,_,_)),
     dbassert(kniga(Name,List1,Izd,God)),
     write(Name,"has been modified in database."),nl,!,
     write("Press space bar."),
     readchar(_),!.

/*если запись не существует*/
proc(3):-
     write("Can't find that book in the database."),nl,
     closefile(datafile),
     closefile(indexfile),nl,!,
     write("Press space 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).



                                   Выводы.

Была написана программа,  реализующая  поставленную  задачу.  При  написании
программы автор ознакомился с основными понятиями, касающимися  баз  данных,
использованием  предикатов  и  правил  для  работы  с   файлами,   списками,
элементами списков. Работа над  составлением  программы  позволила  детально
ознакомиться с вопросами  организации  данных  в  БД  и  извлечения  из  неё
необходимой пользователю информации.



                                 Литература.

Ц. Ин, Д. Соломон  «Использование Турбо-Пролога» , Издательство «Мир»



смотреть на рефераты похожие на "Базы и банки знаний"