ПРОГРАММИРОВАНИЕ В СРЕДЕ Turbo Prolog 2.0
Лабораторный практикум по дисциплине «Алгоритмические языки
Систем искусственного интеллекта»
Для студентов специальности
"Интеллектуальные системы принятия решений"
Утверждено редакционно-издательским
советом университета,
протокол № 2 от 22.06.2006
Харьков НТУ “ХПИ” 2006
ПРОГРАММИРОВАНИЕ В СРЕДЕ Turbo Prolog 2.0. Лабораторный практикум по дисциплине «Алгоритмические языки систем искусственного интеллекта» для студентов специальности "Интеллектуальные системы принятия решений" / Сост. - Л.А. Никитина, А.Э. Заволодько, И.П. Хавина,. – Харьков: НТУ “ХПИ”, 2006. - 92с.
Авторы: Л.А. Никитина,
А.Э. Заволодько,
И.П. Хавина.
Рецензент: В.М. Поштаренко.
Кафедра “Системы информации”
Предисловие
Язык логического программирования Пролог используется преимущественно специалистами, решающими задачи искусственного интеллекта: для разработки экспертных систем, систем поддержки принятия решений, систем автоматизированного проектирования, выполнения символьных вычислений, при реализации задач, связанных с определением грамматик формальных языков, обработкой текста на естественном языке.
Лабораторный практикум состоит из семи лабораторных работ, ориентированных на решение различных задач – от разработки базы данных и выполнения запросов к ней до рекурсивной обработки древовидных структур данных и текстовой информации.
В приложениях практикума содержится справочная информация о назначении и применении встроенных предикатов языка Turbo Prolog. Каждая лабораторная работа ориентирована на изучение и применение определенного блока предикатов. В описаниях лабораторных работ приводятся примеры выполнения типичных заданий, программы-примеры снабжены комментариями, позволяющими понять смысл каждой строки программного кода.
В результате выполнения лабораторных работ студенты должны освоить принципы логического программирования, основные приемы программирования с использованием встроенных предикатов языка Turbo Prolog, уметь разрабатывать собственные предикаты для решения поставленных задач.
Лабораторная работа 1
Тема работы: ознакомление со средой программирования Turbo Prolog, организация ввода-вывода в Turbo Prolog.
Цель работы: получение практических навыков работы в среде программирования Turbo Prolog 2.0.
Темы для предварительной проработки
§ Среда программирования Turbo Prolog 2.0.
§ Структура Prolog-программы.
§ Типы данных.
§ Факты и предикаты Prolog-программы.
§ Предикаты ввода-вывода.
Постановка задачи: Для выполнения лабораторной работы необходимо написать простую программу на языке Turbo Prolog, реализующую индивидуальное задание, и протрассировать ее выполнение.
1.1. Порядок выполнения работы
1.Выбрать индивидуальное задание согласно номеру по журналу.
2.Разработать метод решения задачи и предикаты для его реализации на языке Turbo Prolog.
3.Используя Приложение 1Г, выбрать стандартные предикаты, требуемые для решения задачи.
4.Загрузить Turbo Prolog.
5.В окне редактора написать текст программы, отладить и выполнить ее.
6.С помощью средств трассирования просмотреть в окне трассировки результаты пошагового выполнения программы.
7.Определить, какие из используемых переменных являются входными и выходными.
8.Показать преподавателю результаты работы программы.
1.2. Содержание отчета
1. Тема лабораторной работы.
2. Цель работы.
3. Описание применяемых стандартных и разработанных предикатов.
4. Текст программы.
5. Результаты выполнения и трассировки программы.
6. Выводы.
1.3. Индивидуальные задания
Знания о заданной предметной области представить в виде фактов, имеющих не менее трех параметров. Вывести факты на экран в виде таблиц.
Выбрать предметную область согласно номеру в списке журнала группы:
1. Студенты группы.
2. Книги.
3. Генеалогическое дерево.
4. Государства и столицы.
5. Автомобили.
6. Лекарства.
7. Штатное расписание организации.
8. Компьютерная техника.
9. Спортсмены.
10. Животные.
11. Птицы.
12. Военная техника.
13. Самолеты.
14. Сделки фирмы по продаже товаров.
15. Поставщики товаров.
16. Клиенты фирмы.
17. Спортивная одежда.
18. Косметика.
19. Пациенты поликлиники.
20. Web-сайты.
21. Мебель.
22. Автопарк.
23. Зеленые насаждения.
24. Мобильные телефоны.
25. Плейеры.
26. Фотоаппараты.
27. Склад продуктов питания.
28. Ведомость зарплаты.
29. Компоненты компьютера.
30. Учебные группы факультета.
1.4. Пример решения задачи
1. Тема работы: Ознакомление со средой программирования Turbo Prolog. Организация ввода-вывода в Turbo Prolog.
2. Цель работы: Получение практических навыков работы в среде программирования Turbo Prolog 2.0.
3. Индивидуальное задание: Знания о заданной предметной области представить в виде фактов. Вывести факты на экран в виде таблиц. Предметная область: предикаты ввода-вывода в языке Turbo Prolog.
4. Разработка метода решения задачи.
Знания о предикатах ввода-вывода (Приложение Г) представим с помощью фактов, имеющих имя IO_predicates. Вывод значений фактов на экран организуем с помощью предиката vivod. С помощью этого предиката будет выполнен полный перебор имеющихся фактов и вывод значений на экран в виде таблицы.
5. Описание предикатов, разработанных для реализации метода решения задачи на языке Turbo Prolog.
Для реализации метода решения задачи разработаны следующие предикаты:
IO_predicates(INTEGER номер_предиката, STRING имя_предиката,
STRING назначение_предиката)
Предикат представляет знания о предикатах ввода-вывода Пролога. В скобках указан тип параметра и его смысл.
vivod Предикат vivod будет иметь две формулировки –
правило vivod для обращения к базе фактов и вывода на экран значений аргументов очередного факта, и факта vivod, который ничего не значит, но обращение к нему всегда завершается успехом.
header Вывод заголовка таблицы
6. Стандартные предикаты, используемые для решения задачи:
Предикат | Цель использования |
fail | Выполнение возврата и перебора всех значений базы фактов |
makewindow | Создание окна для вывода значений |
writef | Форматированный вывод |
readchar | Ввод символа |
7. Текст программы.
predicates
IO_predicates(integer, string, string)
vivod
header
clauses
IO_predicates(1,"readln(string)","Ввод строки символов").
IO_predicates(2,"readreal(real)","Ввод вещественного числа").
IO_predicates(3,"readint(integer)","Ввод целого числа").
IO_predicates(4,"readchar(char)","Ввод одного символа").
IO_predicates(5,"file_str(string,string)","Преобр. файла в строку или строки в файл").
IO_predicates(6,"write(спис_знач)","Вывод значений на экран").
IO_predicates(7,"writef(формат,спис_знач)","Форматированный вывод").
IO_predicates(8,"nl","Перевод курсора на новую строку").
header:-write("№пп\t Предикат \t Назначение"),
write("\n-----------------------------------------------------------\n").
vivod:-IO_predicates(X,Y,Z),
writef(" %-3%-25\t%s\n",X,Y,Z),
fail.
vivod.
goal
makewindow(1,120,2,"Предикаты ввода-вывода",2,2,15,75),
header,vivod,write("-------------------------------------------------------"),
readchar(_).
8. Результаты выполнения программы.
------------------------------------Предикаты ввода-вывода-------------------------------------------
| №пп Предикат Назначение |
| ----------------------------------------------------------------------------------------------------------------|
| 1 readln(string) Ввод строки символов |
| 2 readreal(real) Ввод вещественного числа |
| 3 readint(integer) Ввод целого числа |
| 4 readchar(char) Ввод одного символа |
| 5 file_str(string,string) Преобр. файла в строку или строки в файл |
| 6 write(спис_знач) Вывод значений на экран
| 7 writef(формат,спис_знач) Форматированный вывод |
| 8 nl Перевод курсора на новую строку |
| ----------------------------------------------------------------------------------------------------------------|
9. Результаты трассировки программы.
Для выполнения трассировки программы следует вставить в первую строку программы вызов предиката trace. Фрагмент трассировки программы:
CALL: goal()
CALL: makewindow(1,120,2,"Предикаты ввода-вывода",2,2,15,75)
RETURN: makewindow(1,120,2,"Предикаты ввода-вывода",2,2,15,75)
CALL: header()
write("№пп Предикат Назначение"),
write("\n------------------------------------------------------------\n")
RETURN: header()
CALL: vivod()
io_predicates(_,_,_)
write(1)
write(“readln(string)”)
write(“Ввод строки символов”)
REDO: *io_predicates(_,_,_)
Звездочкой помечается точка возврата на дереве решения.
10. Выводы
При выполнении лабораторной работы ознакомились со следующими темами и средствами:
§ Среда программирования Turbo Prolog 2.0.
§ Структура Prolog-программы.
§ Типы данных.
§ Факты и предикаты Prolog-программы.
§ Предикаты ввода-вывода.
Контрольные вопросы
1. Назначение разделов программы.
2. Что такое факт и что такое правило? Какова разница между ними?
3. В каком разделе программы могут размещаться предикаты?
4. Что такое унификация переменных?
5. Что такое анонимная переменная?
6. Что такое бэктрекинг?
7. Как получить значения всех фактов, имеющихся в программе?
8. Что такое дерево решения?
9. Что такое машина логического вывода Пролога?
10. Какие стандартные предикаты используются для ввода информации?
11. Какие стандартные предикаты используются для вывода информации?
12. Как перенаправить входной/выходной потоки данных?
13. Объясните правила использования предикатов для работы с окнами.
Приложение 1А
Среда программирования Turbo Prolog 2.0
Таблица 1А.1 – Основные команды Turbo Prolog 2.0
Цель | Действие | Горячие клавиши |
Запуск среды Turbo Prolog 2.0 | Tprolog\BIN\prolog.exe | |
Переход в режим редактирования программы | Esc ->Edit | |
Компиляция программы | Esc -> Compile | |
Выполнение программы | Esc -> Run | |
Загрузка программы | Esc -> Files -> Load | F3 |
Отображение в окне редактора текста программы, которая уже была загружена в текущем сеансе работы | Esc -> Files -> Pick | |
Сохранение программы под текущим именем | Esc -> Files -> Save | F2 |
Сохранение программы под новым именем | Esc -> Files -> Write to | |
Смена текущего каталога | Esc -> Files -> Directory | |
Завершение работы | Esc -> Files -> Quit | Alt-X |
Таблица 1А.2 – Команды работы с блоками текста при редактировании программы
Цель | Действие |
Начало отметки блока текста | Ctrl-K-B |
Завершение отметки блока текста | Ctrl-K-К |
Копирование выделенного блока текста | Ctrl-K-С |
Перемещение выделенного блока текста | Ctrl-K-V |
Продолжение табл. 1А.2
Цель | Действие |
Удаление выделенного блока текста | Ctrl-K-Y |
Копирование блока текста из Pick-файла | Ctrl-K-R Выбрать имя файла из списка, выделить блок и нажать Enter |
Запись выделенного блока текста в файл | Ctrl-K-W |
Приложение 1Б
Структура Prolog-программы
Пролог-программа может состоять из ряда разделов (секций), ни один из которых не является обязательным. Каждый раздел озаглавливается. В качестве заголовков разделов выступают DOMAINS, CLAUSES, PREDICATES, CONSTANTS, GOAL.
DOMAINS – объявление областей определения (доменов). Объявления нескольких доменов не разделяются никакими знаками.
Способы объявления областей определения:
1. имя_домена = d
где d – область определения. Областью определения может являться один из стандартных типов – char, string, symbol, integer, real.
Пример:
i=integer
s=string
2. имя_домена = d*
где d – область определения. Знак * означает, что такой домен определяет список.
Примеры:
ii = integer* % Определяет список целых чисел;
список_строк = string* % Определяет список строк.
3. имя_домена=имя_выражения1(арг1_1,арг1_2,…);
имя_выражения2(арг2_1,арг2_2,…)
Такое объявление используется для объявления областей определения составных объектов.
Пример:
oбъект=цел(integer);стр(string)
pol=left;right
4. file=имя1, имя2, …
Задаются символические имена файлов, которые в программе будут связаны с физическими именами.
Пример:
file=in_file, out_file
CONSTANTS – объявление констант, используемых в программе.
DATABASE – объявление оперативной базы данных. Факты объявленной базы данных будут оперативно читаться во время выполнения программы, например, из файла. Типы аргументов всех читаемых фактов должны соответствовать объявлению. Предикаты, объявленные в этом разделе, не должны объявляться в разделе PREDICATES.
Пример:
mybase(integer,string,integer*)
Здесь объявляется база данных mybase. Первый аргумент имеет целый тип, второй – строковый, третий – список целых чисел.
PREDICATES –объявление предикатов. Указываются имена всех предикатов с областями определения их аргументов.
Пример:
любит(string,string)
p1(i,s) % В данном случае i и s воспринимаются
% как объявленные ранее домены
CLAUSES – запись всех предикатов, т.е. фактов и правил. Этот раздел представляет собой базу знаний Пролога или тело программы. Особенностью записи базы знаний является то, что одноименные факты и правила должны быть сгруппированы.
GOAL –раздел, который инициирует выполнение всей программы. В нем через запятую перечисляются все главные цели программы. Раздел завершается точкой.
Если раздел GOAL отсутствует, то после нажатия клавиши Esc и выбора команды Run в меню в стандартном диалоговом окне появляется слово Цель:. В этом случае Пролог ждет от пользователя вопроса. Вопрос задается путем ввода выражений загруженной Пролог-программы, и Пролог пытается найти ответ, если он существует.
Приложение 1В
Стандартные типы данных (предопределенные домены)
Тип | Описание |
char | Один знак в двойных кавычках |
string | Последовательность знаков в двойных кавычках размером до 64К |
symbol | Последовательность знаков без кавычек, начинающаяся с маленькой буквы, или последовательность знаков в двойных кавычках. Типы symbol и string отличаются тем, что имеют различное внутреннее представление. Для типа symbol есть таблицы указателей, обеспечивающие быструю обработку этих данных, но требующие больших объемов памяти. При считывании данных типа symbol из файла эти данные следует заключать в двойные кавычки |
real | Вещественные числа из диапазона ±(1Е-307 ÷ 1Е+308) |
integer | Целые числа из диапазона –32768 ÷ +32768 |
file | Текстовый файл |
dbasedom | Сгенерированный домен для термов внешней базы данных |
bt_selector | Возвращаемый селектор двоичного дерева |
db_selector | Селекторы внешней базы данных, определенной пользователем |
place | Домен размещения, принимающий значения in_memory – в памяти; in_ems – в расширенной памяти; in_file – в файле |
reg | Домен процессорных регистров reg(AX,BX,CX,DX,SI,DI,DS,ES) |
bgi_ilist | Список целых чисел, используемый в BGI-предикатах |
Составные типы данных (структуры) составляются на основе стандартных или на основе других составных типов.
Приложение 1Г
Предикаты ввода-вывода
Таблица 1Г.1 – Предикаты ввода
Предикат | Описание |
readdevice(символическое_имя) (file):(i)(o) | Устанавливается текущее устройство ввода с заданным символическим именем или возвращается символическое имя текущего устройства ввода. По умолчанию – readdevice(keyboard). Если устройством ввода назначается файл, то он должен быть открытым для чтения или модификации. |
readint(целое_число) (integer):(o) | Ввод целого числа с текущего устройства ввода. |
readreal(вещественное_число) (real):(o) | Ввод вещественного числа с текущего устройства ввода. |
readchar(знак) (char):(o) | Ввод символа с текущего устройства ввода. |
readln(строка) (string):(o) | Ввод строки символов с текущего устройства чтения. |
file_str(имя_файла,строка) (string,string):(i,o)(i,i) | Ввод символов (до 64К) из файла с указанным именем, в строку до EOF, или пишет из строки в файл. |
inkey | Считывание символа с клавиатуры |
keypressed | Ожидание нажатия клавиши клавиатуры |
Таблица 1Г.2 – Предикаты вывода
Предикат | Описание |
writedevice(символическое_имя) (file):(i)(o) | Устанавливается текущее устройство вывода с заданным символическим именем или возвращается символическое имя текущего устройства вывода. По умолчанию – writedevice(screen). |
Продолжение табл. 1Г.2
Предикат | Описание |
Если устройством ввода назначается файл, то он должен быть открытым для записи или модификации. | |
write(Х1,Х2,...) (переменные и константы): (i,i,...) | Вывод значений переменных и констант на текущее устройство вывода |
nl | Перевод курсора на новую строку |
writef(формат_строка,Х1,Х2,...) (string, переменные и константы): (i,i,i,...) | Форматный вывод значений констант и переменных. Формат_строка задается в виде “%-m.pw”, где: % – признак форматного вывода; - – знаки в поле вывода будут выравниваться по левому краю; m – указание длины поля вывода; p – при выводе чисел указывается количество цифр после точки; w – указание нотации чисел: Х – длинное целое (строки, указатели базы данных); х – шестнадцатеричный формат (данные типа char,integer); s – строки; с – символы (данные типа char,integer); g – вещественное число в коротком формате; f – вещественное число в форме с фиксированной точкой; e – вещественное число в экспоненциальном виде; \n – перевод курсора на новую строку; \t – табулирование курсора; \nnn – вывод символа с кодом nnn |
Продолдение прил. 1Г
Таблица 1Г.3 - Система окон
Предикат | Описание |
attribute(Атрибут) | Устанавливает или возвращает значение атрибута для всех позиций вывода: Атрибут=Ф+Т, где Ф – номер цвета фона; Т – номер цвета текста. Возможные значения Ф: 0 – черный; 72 – розовый; 8 – серый; 80 – лиловый; 16 – синий; 88 – малиновый; 32 – зеленый; 96– коричневый; 40 – салатный; 104 – желтый; 48 – бирюзовый; 112 – белый; 64 – красный; 120– ярко-белый. Возможные значения Т: 0 – черный; 4 – красный; 1 – синий; 5 – лиловый; 2 – зеленый; 6 – коричневый; 3 – голубой; 7 – белый |
makewindow(№_окна,Атрибут, Рамка,Заголовок, Строка,Столбец, Высота,Ширина) (integer,integer,integer, string,integer,integer, integer,integer) - (i,i,i,i,i,i,i,i) (o,o,o,o,o,o,o,o) | Создается окно с параметрами: №_окна – номер окна; Атрибут – атрибут экрана (см. предикат attribute); Рамка – номер цвета рамки; 0 – рамки нет; Заголовок – заголовок окна, если есть рамка; Строка,Столбец – координаты верхнего левого угла окна (номер строки и столбца); Высота,Ширина – количество строк и столбцов в окне |
shiftwindow(№_окна) (integer) - (i) (o) | Установить текущим окно с заданным номером или получить номер текущего окна |
Продолжение табл. 1Г.3
Предикат | Описание |
existwindow(№_окна) (integer) - (i) | Предикат завершается успехом, если окно с указанным номером существует |
removewindow | Удаляет текущее окно |
removewindow(№_окна,Обнов) (Integer,Integer) – (i,i) | Удаляет текущее окно с заданным номером. Параметр Обнов задает режим обновления окна: Обнов=0 Фон под окном не обновляется; Обнов=1 Фон под окном обновляется |
clearwindow | Текущее окно очищается |
Лабораторная работа 2
Тема работы: элементы логического программирования в среде Turbo Prolog, работа с внутренней базой данных
Цель работы: о знакомление с приемами логического программирования; создание базы данных во внешнем файле, освоение возможностей использования предикатов работы с базой данных; разработка простых запросов к базе данных в среде Turbo Prolog 2.0.
Темы для предварительной проработки
§ Логика предикатов первого порядка.
§ Факты и правила Пролог-программ.
§ Предикаты для работы с внутренней базой данных.
§ Идентификация и связывание переменных.
Постановка задачи: написать программу на языке Prolog, содержащую факты и правила для загрузки базы данных и выполнения запросов к ней; отладить и выполнить программу.
2.1. Порядок выполнения работы
1. Выбрать индивидуальное задание согласно номеру по журналу.
2. Загрузить Turbo Prolog.
3. Создать базу данных во внешнем текстовом файле.
4. Загрузить базу данных в оперативную память. Вывести любую таблицу на экран, добавить и удалить из нее факты. Проверить результат добавления и удаления фактов.
5. Разработать предикаты для выполнения запросов.
6. Определить, какие переменные, используемые в предикатах, являются входными и выходными.
7. Показать преподавателю результаты работы программы.
2.2. Содержание отчета
1. Тема лабораторной работы.
2. Цель работы.
3. Описание применяемых стандартных и разработанных предикатов.
4. Текст программы и результаты ее выполнения.
2.3. Индивидуальные задания
Создать базу данных (Приложение 2А), выполнить операции удаления и добавления записей в таблицы. Проверить результат. Выполнить запрос к базе данных. Запрос выбрать согласно номеру фамилии в журнале группы из списка, приведенного ниже.
1. Какую должность занимает сотрудник, имя которого вводится с клавиатуры?
2. Вывести фамилии и должности сотрудников, работающих в отделе, номер которого вводится с клавиатуры.
3. Ввести с клавиатуры фамилию сотрудника, определить его должность и оклад.
4. Ввести с клавиатуры фамилию сотрудника, определить, в каких проектах он участвует.
5. Ввести номер проекта и вывести фамилии и должности всех его участников.
6. Ввести фамилию сотрудника и номер проекта, определить его должность и задания, которые он выполняет в данном проекте.
7. Определить номера отделов, сотрудники которых участвуют в заданном проекте.
8. Определить, какие ресурсы и в каком количестве задействованы в заданном проекте.
9. Определить фамилию начальника заданного отдела.
10. Ввести фамилию руководителя отдела и вывести фамилии и должности его подчиненных.
11. Ввести фамилию сотрудника и определить, какие ресурсы он использует.
12. Определить, какие должности задействованы в заданном проекте.
13. Определить, какие задания выполняют в проектах инженеры.
14. В какие сроки и в каком количестве задействован заданный ресурс?
15. Какие отделы используют названный ресурс?
16. Какие сотрудники участвуют в проектах в заданный период времени?
17. Вывести фамилии и должности сотрудников, имеющих оклад более 500.
18. Вывести номера проектов, в которых заданный ресурс используется в количестве более 5.
19. Вывести оклады и должности сотрудников, участвующих в проекте.
20. Вывести названия Ресурсов, задействованных в проектах в заданный период времени.
21. Какие ресурсы используются механиками?
22. В каких заданиях участвуют операторы?
23. Какие оклады имеют операторы, участвующие в заданном проекте?
24. В каких проектах ресурс заказан в большем количестве, чем есть в наличии?
25. Какие ресурсы и в каком количестве освобождаются после даты 06.30.06?
26. Какие ресурсы использует заданный отдел?
27. Какие отделы не участвуют в заданном проекте?
28. Какие сотрудники заканчивают выполнение заданий после даты 06.30.06?
29. Какие оклады имеют сотрудники, выполняющие задания начиная с даты 06.30.06?
30. Вывести фамилии и должности сотрудников, использующих заданный ресурс.
2.4. Пример решения задачи
8.1. Тема работы: Элементы логического программирования в среде Turbo Prolog. Работа с внутренней базой данных
8.2. Цель работы: Ознакомление с приемами логического программирования. Создание базы данных во внешнем файле. Освоение предикатов работы с базой данных. Разработка простых запросов к базе данных в среде Turbo Prolog 2.0.
8.3. Индивидуальное задание: Создать базу данных (Приложение 2А), выполнить операции удаления и добавления записей в таблицы. Проверить результат. Выполнить запрос к базе данных: вывести фамилии и должности сотрудников, использующих заданный с клавиатуры ресурс.
8.4. Разработка метода решения задачи.
Программа будет загружать базу данных из внешнего файла. В программе должны выполняться вызовы предикатов добавления и удаления фактов базы данных и вывод на экран фактов таблицы Сотрудники.
При выполнении запроса необходимо последовательно обращаться к таблицам базы данных с целью унификации неизвестных переменных по известным значениям других переменных.
8.5. Описание предикатов, разработанных для реализации метода решения задачи на языке 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 | Вывод значений таблицы Сотрудники |
8.6. Стандартные предикаты, используемые для решения задачи:
Предикат | Цель использования |
retractall(_) | Удаление всех фактов из оперативной памяти |
consult | Загрузка таблиц базы данных |
makewindow | Создание окна |
retract | Удаление конкретного факта |
readchar | Ввод символ с клавиатуры |
assertz | Добавление факта в конец таблицы |
8.7. Текст программы.
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)
8.8. Результаты выполнения программы.
Приведем возможные результаты выполнения запроса.
Тест 1.
Введите название ресурса из списка:
["станок_сверл","станок_деревообр","компьютер"]
компьютер
Ресурс компьютер используют:
механик Лещенко в проекте 2
оператор1 Кочубеев в проекте 3
инженер1 Абрамович в проекте 3
Конец вывода
Тест 2.
Введите название ресурса из списка:
["станок_сверл","станок_деревообр","компьютер"]
доильный аппарат
Такого ресурса нет!
Конец вывода
8.9. Выводы
В ходе выполнения лабораторной работы были изучены возможности создания базы данных во внешнем текстовом файле и предикаты для выполнения запросов к базе данных.
Контрольные вопросы
1. Что такое предикат, факт, правило?
2. Как создать базу данных во внешнем текстовом файле?
3. Как загрузить таблицы базы данных в оперативную память во время выполнения программы?
4. Назовите способы добавления новых фактов в оперативную память.
5. Как удалить факты из оперативной памяти?
6. Как очистить от фактов оперативную память?
7. Как сохранить во внешнем файле факты, находящиеся в оперативной памяти?
8. Как объявить в программе об использовании базы данных?
9. Как можно просмотреть все факты базы данных?
Приложение 2А
База данных Сотрудники фирмы
Таблица 2А.1 - Сотрудники
№сотрудника | №должности | №отдела | Фамилия |
s1 | Петров | ||
s2 | Коломоец | ||
s3 | Панова | ||
s4 | Рузин | ||
s5 | Лещенко | ||
s6 | Лашина | ||
s7 | Крокодилов | ||
s8 | Харченко | ||
s9 | Абрамович | ||
s10 | Путинский | ||
s11 | Кочубеев | ||
s12 | Капустина | ||
s13 | Хаханов |
Продолжение прил. 2А
Таблица 2А.2 – Штатное расписание
№ отдела | № должности | Название должности | Количество штатных единиц | Оклад |
инженер1 | ||||
оператор1 | ||||
нач_отдела | ||||
механик | ||||
инженер2 | ||||
нач_отдела | ||||
экономист | ||||
оператор2 | ||||
нач_отдела |
Таблица 2А.3 – Проекты
№ про-екта | № сотруд-ника | № задания | Начало выполнения задания | Завершение выполнения задания | № ресурса | Коли-чество единиц ресурса |
s1 | 01.03.06 | 03.06.06 | ||||
s2 | 01.01.06 | 01.04.06 | ||||
s3 | 01.03.06 | 01.04.06 | ||||
s1 | 05.02.06 | 01.07.06 | ||||
s5 | 06.15.06 | 08.10.06 | ||||
s6 | 02.01.06 | 05.20.06 | ||||
s12 | 04.15.06 | 08.30.06 | ||||
s11 | 03.15.06 | 09.15.06 | ||||
s12 | 07.01.06 | 09.30.06 | ||||
s10 | 11.01.06 | 12.30.06 |
Продолжение табл. 2А.3
№ про-екта | № сотруд-ника | № задания | Начало выполнения задания | Завершение выполнения задания | № ресурса | Коли-чество единиц ресурса |
s9 | 09.01.06 | 12.30.06 | ||||
s8 | 08.01.06 | 12.30.06 | ||||
s7 | 03.01.06 | 19.30.06 |
Таблица 2А.4 – Ресурсы
№ ресурса | Название ресурса | Наличие единиц ресурса |
станок_сверл | ||
станок_деревообр | ||
компьютер |
Приложение 2Б
Предикаты для работы с внутренней базой данных
Предикат | Назначение |
consult(Имя_Файла) (string) - (i) | Загрузка в оперативную память всех баз данных, хранящихся в файле |
consult(Имя_Файла, Имя_БД) (string, Имя_БД) - (i,i) | Загрузка в оперативную память указанной базы данных, хранящейся в файле |
save(Имя_Файла) (string) - (i) | Сохранение в файле всех баз данных, находящихся в оперативной памяти |
save(Имя_Файла, Имя_БД) (string, Имя_БД) - (i,i) | Сохранение в файле указанной базы данных, находящейся в оперативной памяти |
assert(Факт) (Факт_БД) - (i) | Добавление в оперативную память нового факта указанной БД |
asserta(Факт) (Факт_БД) - (i) | Добавление в оперативную память нового факта указанной БД. Факт помещается перед всеми фактами БД. |
assertz(Факт) (Факт_БД) - (i) | Добавление в оперативную память нового факта указанной БД. Факт добавляется после всех фактов БД. |
Продолжение прил. 2Б
Предикат | Назначение | ||
retract(Факт) (Факт_БД) - (_) | Удаление указанного факта БД. При задании факта можно использовать анонимные переменные в качестве параметров. В этом случае удаляются все факты по указанному шаблону комбинации аргументов. | ||
retractall(_, Факт_БД) (_,Имя_БД) - (_,i) | Удаление из оперативной памяти всех фактов указанной базы данных. | ||
retractall(_) (Имя_БД) - (_) | Удаление из оперативной памяти всех фактов всех баз данных. | ||
findall(Переменная,Предикат,
Поиск по сайту©2015-2025 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование. Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных |
Поиск по сайту: Читайте также: Деталирование сборочного чертежа Когда производственнику особенно важно наличие гибких производственных мощностей? Собственные движения и пространственные скорости звезд |