Санкт-Петербурзький державний технічний університет
Кафедра системного аналізу та управління
РОЗРАХУНКОВЕ ЗАВДАННЯ
Дисципліна: бази і банки знань.
Тема: мова Пролог.
Виконав студент групи 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).
Висновки.
Була написана програма, що реалізує поставлену задачу. При написанні програми автор ознайомився з основними поняттями, що стосуються баз даних, використанням предикатів і правил для роботи з файлами, списками, елементами списків. Робота над складанням програми дозволила детально ознайомитися з питаннями організації даних у БД і вилучення з її необхідної користувачу інформації.
Література.
Ц. Ін, Д. Соломон «Використання Турбо-Прологу», Видавництво «Світ»