
- •Предисловие
- •Лабораторная работа 1
- •Темы для предварительной проработки
- •1.1. Порядок выполнения работы
- •1.2. Содержание отчета
- •1.3. Индивидуальные задания
- •1.4. Пример решения задачи
- •Контрольные вопросы
- •Приложение 1а
- •Приложение 1б
- •Приложение 1в
- •Приложение 1г
- •Лабораторная работа 2
- •Темы для предварительной проработки
- •2.1. Порядок выполнения работы
- •2.2. Содержание отчета
- •2.3. Индивидуальные задания
- •2.4. Пример решения задачи
- •Контрольные вопросы
- •Приложение 2а
- •Приложение 2б
- •Лабораторная работа 3
- •1.4. Пример решения задачи
- •Контрольные вопросы
- •Приложение 3а
- •Приложение 3б
- •Приложение 3в
- •Приложение 3г
- •Лабораторная работа 4
- •4.4. Пример решения задачи
- •Контрольные вопросы
- •Лабораторная работа 5
- •Темы для предварительной проработки
- •5.1. Порядок выполнения работы
- •5.2. Содержание отчета
- •5.3. Индивидуальные задания
- •5.4. Пример решения задачи
- •Контрольные вопросы
- •Приложение 5а
- •Лабораторная работа 6
- •Темы для предварительной проработки
- •6.1. Порядок выполнения работы
- •6.2. Содержание отчета
- •6.3. Индивидуальные задания
- •6.4. Пример решения задачи
- •Контрольные вопросы
- •Приложение 6а
- •Приложение 6б
- •Константы типа драйвера
- •Константы режимов драйвера
- •Константы цветов
- •Константы стиля и толщины линий (для предикатов GetLineStyle, SetLineStyle)
- •Константы типа шрифта (задаются в предикате settextstyle(Font,Direction,Charsize))
- •Лабораторная работа 7
- •Темы для предварительной проработки
- •7.1. Порядок выполнения работы
- •7.2. Содержание отчета
- •7.3. Индивидуальные задания
- •7.4. Пример решения задачи
- •Контрольные вопросы
- •Приложение 7а
- •Приложение б
- •Редактор о.І. Шпільова
- •61002 Харків, вул. Фрунзе, 21
2.4. Пример решения задачи
Тема работы: Элементы логического программирования в среде Turbo Prolog. Работа с внутренней базой данных
Цель работы: Ознакомление с приемами логического программирования. Создание базы данных во внешнем файле. Освоение предикатов работы с базой данных. Разработка простых запросов к базе данных в среде Turbo Prolog 2.0.
Индивидуальное задание: Создать базу данных (Приложение 2А), выполнить операции удаления и добавления записей в таблицы. Проверить результат. Выполнить запрос к базе данных: вывести фамилии и должности сотрудников, использующих заданный с клавиатуры ресурс.
Разработка метода решения задачи.
Программа будет загружать базу данных из внешнего файла. В программе должны выполняться вызовы предикатов добавления и удаления фактов базы данных и вывод на экран фактов таблицы Сотрудники.
При выполнении запроса необходимо последовательно обращаться к таблицам базы данных с целью унификации неизвестных переменных по известным значениям других переменных.
Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.
Предикат
Цель использования
sotr(string,integer,
integer,string)
Таблица Сотрудники
shtat(integer,integer,
string,integer,integer)
Таблица Штатное расписание
proj(integer,string,integer,
string,string,integer,integer)
Таблица Проекты
res(integer,string,integer)
Таблица Ресурсы
zapros
Инициация запроса
opr_res(string)
(i) – название ресурса
Определение номера ресурса по названию
viv(integer)
(i) – номер ресурса
Идентификация и вывод значений
viv_tabl
Вывод значений таблицы Сотрудники
Стандартные предикаты, используемые для решения задачи:
Предикат
Цель использования
retractall(_)
Удаление всех фактов из оперативной памяти
consult
Загрузка таблиц базы данных
makewindow
Создание окна
retract
Удаление конкретного факта
readchar
Ввод символ с клавиатуры
assertz
Добавление факта в конец таблицы
Текст программы.
domains
i=integer % Домен целых чисел
s=string % Домен строк
ss=s* % Домен списка строк
database
sotr(s,i,i,s) % Таблица Сотрудники
shtat(i,i,s,i,i) % Таблица Штатное расписание
proj(i,s,i,s,s,i,i) % Таблица Проекты
res(i,s,i) % Таблица Ресурсы
predicates
zapros % Инициация запроса
viv(i) %Идентификация и вывод значений
opr_res(s) % Определение ид.номера ресурса по названию
viv_tabl % Вывод значений таблицы Сотрудники
clauses
zapros:-
makewindow(2,124,1,"Использование ресурса",2,2,15,60),
findall(X,res(_,X,_),S), %Составляется список названий ресурсов
write("Введите название ресурса из списка:\n"),
write(S,"\n"),
readln(N), % Считывается название ресурса
opr_res(N).
opr_res(N):- % Эта версия предиката работает, если ресурс есть
res(Y,N,_), % По названию ресурса N определяется его номер Y
write("Ресурс ",N," используют: \n"),
viv(Y). % Поскольку ресурс существует, вызывается предикат viv
opr_res(_):-
write("Такого ресурса нет!"). % Эта версия предиката работает, если
% ресурса нет
viv(Y):-
proj(P,Id,_,_,_,Y,_), % По номеру ресурса определяется проект и
% ИД_сотрудника
sotr(Id,D,_,F), % По ИД_сотрудника определяется его №_должности
% и ФИО
shtat(_,D,D1,_,_), % По №_должности определяется название
% должности
writef("%-10s %-15s в проекте %d\n",D1,F,P),
fail. % Обеспечивает возврат и поиск новых решений
viv(_). % Позволяет завершить предикат viv после вывода
% всех значений
viv_tabl:- % Выводит все значения фактов табл. Сотрудники
sotr(X,Y,Z,F),
writef("%3s %3d %3d, %-15s\n",X,Y,Z,F),
fail.
viv_tabl.
goal
retractall(_), % Очищает оперативную память
consult("prim_lb2.pro"), % Загружает таблицы базы данных
makewindow(1,126,1,"Сотрудники фирмы",2,2,20,60),
viv_tabl, % Выводит табл. Сотрудники на экран
write("\nВведите ид.номер записи для удаления: "),
readln(ID),
retract(sotr(ID,_,_,_)), % Удаляет запись о сотруднике из табл. Сотрудники
viv_tabl, % Выводит табл. Сотрудники на экран
readchar(_), % Задержка до нажатия любой клавиши
write("\nВведите ид.номер, ид.должности, №отдела, ФИО нового сотрудника\n"),
readln(I),readint(D),readint(T),readln(F),
assertz(sotr(I,D,T,F)), % Добавление новой записи в табл. Сотрудники
viv_tabl, % Выводит табл. Сотрудники на экран
readchar(_),
zapros,write("\nКонец вывода").
В файле prim_lb2.pro хранятся факты таблиц базы данных в следующем виде:
sotr("s1",1,1,"Петров")
sotr("s2",2,1,"Коломоец")
sotr("s3",5,1,"Панова")
sotr("s4",5,2,"Рузин")
sotr("s5",3,2,"Лещенко")
sotr("s6",3,2,"Лашина")
sotr("s7",1,2,"Крокодилов")
sotr("s8",1,3,"Харченко")
sotr("s9",1,3,"Абрамович")
sotr("s10",2,3,"Путинский")
sotr("s11",2,3,"Кочубеев")
sotr("s12",4,3,"Капустина")
sotr("s13",5,3,"Хаханов")
shtat(1,1,"инженер1",3,700)
shtat(1,2,"оператор1",3,450)
shtat(1,5,"нач_отдела",1,1250)
shtat(2,3,"механик",2,650)
shtat(2,6,"инженер2",2,750)
shtat(2,5,"нач_отдела",1,1100)
shtat(3,4,"экономист",1,800)
shtat(3,7,"оператор2",3,550)
shtat(3,5,"нач_отдела",1,1000)
proj(1,"s1",1,"01.03.06","03.06.06",1,1)
proj(1,"s2",2,"01.01.06","01.04.06",2,1)
proj(1,"s3",3,"01.03.06","01.04.06",1,2)
proj(2,"s1",1,"05.02.06","01.07.06",2,3)
proj(2,"s5",1,"06.15.06","08.10.06",3,2)
proj(2,"s6",3,"02.01.06","05.20.06",2,2)
proj(2,"s12",2,"04.15.06","08.30.06",1,3)
proj(3,"s11",1,"03.15.06","09.15.06",3,1)
proj(3,"s12",1,"07.01.06","09.30.06",2,1)
proj(3,"s10",2,"11.01.06","12.30.06",1,3)
proj(3,"s9",2,"09.01.06","12.30.06",3,1)
proj(3,"s8",3,"08.01.06","12.30.06",2,1)
proj(3,"s7",3,"03.01.06","19.30.06",1,3)
res(1,"станок_сверл",10)
res(2,"станок_деревообр",5)
res(3,"компьютер",20)
Результаты выполнения программы.
Приведем возможные результаты выполнения запроса.
Тест 1.
Введите название ресурса из списка:
["станок_сверл","станок_деревообр","компьютер"]
компьютер
Ресурс компьютер используют:
механик Лещенко в проекте 2
оператор1 Кочубеев в проекте 3
инженер1 Абрамович в проекте 3
Конец вывода
Тест 2.
Введите название ресурса из списка:
["станок_сверл","станок_деревообр","компьютер"]
доильный аппарат
Такого ресурса нет!
Конец вывода
Выводы
В ходе выполнения лабораторной работы были изучены возможности создания базы данных во внешнем текстовом файле и предикаты для выполнения запросов к базе данных.