Константы режимов драйвера




ПРОГРАММИРОВАНИЕ В СРЕДЕ 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-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: