Лабораторные работы. Ерофеев / Разработка ИИ. Отчет №5
.pdfМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)
Факультет Информационных технологий и программной инженерии Кафедра Программной инженерии
Лабораторная работа №4
По дисциплине: Разработка приложений искусственного интеллекта в киберфизических системах
Выполнил:
Студент 3 курса группы ИКПИ – 32 Яковлев М. А.
___________________
(подпись)
Проверил:
Ерофеев С. А.
___________________
(подпись)
г. Санкт-Петербург
2025 г.
Постановка задачи
Целью данной работы является разработка программы, обеспечивающей создание, хранение и управление базой данных. Разрабатываемая программа должна предоставлять пользователю базовые функции работы с данными, включая добавление новых записей, удаление и редактирование существующих, просмотр информации, а также возможность экспорта данных.
Для достижения этой цели необходимо выполнить следующие задачи: 1. Определить домены и предикаты для хранения информации; 2. Реализовать загрузку и сохранение базы данных из файла;
3. Организовать взаимодействие пользователя с базой данных через меню; 4. Реализовать операции добавления, удаления и редактирования элементов базы;
5. Обеспечить возможность подсчёта количества элементов и экспорта данных в CSVфайл;
6. Протестировать программу на различных наборах данных.
Входные данные:
Входными данными являются:
Файл базы данных (по умолчанию bicycles.txt), содержащий записи о велосипедах в формате:
bicycle(“Brand”, “Type”, “Color”, “Frame”, Dia, Price, Qty)
Пользовательский ввод для взаимодействия с меню программы: выбор опций, ввод значений для добавления или редактирования элементов.
Выходные данные:
Программа формирует следующие результаты: 1. Отображение базы данных в консоли:
полный вывод всех элементов базы;пошаговый вывод с ожиданием ввода пользователя;
2. Информация о конкретном велосипеде;
3. Подсчёт количества элементов в базе;
4. Файл базы данных после сохранения;
5. CSV-файл с экспортированными данными;
6. Сообщения о выполненных действиях (добавление, удаление, редактирование, ошибки).
Суть алгоритма заключается в следующем:
Программа организована как интерактивная система управления базой данных, состоящая из следующих модулей:
1. Модуль загрузки и сохранения базы данных.
Проверяет существование файла базы данных и загружает записи;
Обеспечивает сохранение текущего состояния базы в файл и экспорт в CSV;Позволяет изменять имя текущего файла базы данных.
2. Модуль управления записями базы данных.
Добавление новой записи с проверкой корректности введённых данных;Удаление записи по имени;Редактирование существующей записи;
Подсчёт количества элементов в базе. 3. Модуль пользовательского меню.
Отображает список возможных действий;Обеспечивает обработку выбора пользователя и вызов соответствующих
функций;
2
Поддерживает рекурсивное возвращение в меню после выполнения действия. 4. Вспомогательные модули
Проверка корректности ввода положительных чисел;Вывод информации в консоль и управление ожиданием ввода пользователя.
Программа гарантирует целостность данных, корректную обработку ошибок и взаимодействие с пользователем.
Перечень предикатов
Для реализации программы базы данных были определены следующие предикаты: 1. load_database_from_file — загружает базу данных из текущего файла (по
умолчанию или указанного).
2. load_database_from_file(Filename) — загружает базу данных из указанного файла. 3. save_database_to_file — сохраняет базу данных в текущий файл.
4. save_database_to_file(Filename) — сохраняет базу данных в указанный файл. 5. save_database_to_csv — сохраняет базу данных в CSV-файл.
именем6.. save_database_to_csv(Filename) — сохраняет базу данных в CSV-файл с заданным 7. show_current_filename — выводит текущее имя файла базы данных.
8. set_current_filename(Filename) — устанавливает текущее имя файла. 9. change_filename — изменяет имя текущего файла базы данных.
10. reload_database — перезагружает базу данных из файла.
11. ensure_database_loaded — проверяет наличие загруженной базы и при необходимости загружает её.
12. print_all_bicycles — выводит все записи базы данных.
13. print_all_bicycles_stepwise — выводит записи базы данных по одной с ожиданием
14.print_bicycles(Brand) — выводит информацию об одной записи.
15.add_bicycle — добавляет новую запись в базу данных.
16.delete_bicycle — удаляет запись по имени.
17.delete_bicycle_by_brand(Name) — удаляет запись с заданным именем.
18.edit_bicycle — редактирует существующую запись по имени.
19.edit_bicycle_by_brand(Brand) — редактирует конкретную запись с указанным
именем.
20.read_positive_integer(Prompt, Value) — считывает положительное целое число с проверкой.
21.menu — отображает меню программы и ожидает выбор пользователя.
22.action(Option) — выполняет действие, соответствующее выбранному пункту
меню. 23. wait_for_enter — ожидание нажатия клавиши Enter для продолжения.
24. get_current_filename(Filename) — получает текущее имя файла базы данных.
25. save_all_bicycles — сохраняет все записи в открытый файл (для внутреннего использования).
26. save_all_bicycles_csv — сохраняет все записи в CSV-формате.
3
Блок-схемы
Рисунок 1. Общая структура программы |
Рисунок 2. Изменение имени файла |
4
Рисунок 3. Загрузка данных из файла
Рисунок 4. Вывод данных из БД
5
Рисунок 5. Добавление новой записи
Рисунок 6. Удаление записи из БД
6
Рисунок 7. Редактирование записи
Тестирование
Для проверки работоспособности программы были выполнены тестовые запросы к базе знаний в среде Prolog. Результаты выполнения запросов приведены ниже в виде скриншотов, подтверждающих корректность работы предикатов и правил.
Рисунок 8. Меню
7
Рисунок 9. Вывод записей
Рисунок 10. Последовательный вывод записей
Рисунок 11. Редактирование записи
Программа
NOWARNINGS
DOMAINS
name, brand, type, color, material = string
8
price, quantity, diameter = integer file = file_pointer
bicycle_domain = bicycle(brand, type, color, material, diameter, price, quantity) menu_option = integer
DATABASE bicycle(
brand,
type,
color,
material,
diameter,
price,
) quantity current_filename(string)
PREDICATES load_database_from_file load_database_from_file(string)
print_all_bicycles print_all_bicycles_stepwise print_bicycle(bicycle_domain) wait_for_enter
menu action(menu_option)
add_bicycle delete_bicycle
delete_bicycle_by_brand(string)
edit_bicycle edit_bicycle_by_brand(string) edit_bicycle_menu(bicycle_domain)
edit_bicycle_field(integer, bicycle_domain) save_all_bicycles
save_database_to_file save_database_to_file(string) ensure_database_loaded get_current_filename(string) set_current_filename(string) change_filename show_current_filename reload_database
add_bicycle_fact(brand, type, color, material, diameter, price, quantity) % helper insert read_positive_integer(string, integer)
save_all_bicycles_csv save_database_to_csv save_database_to_csv(string)
CLAUSES
get_current_filename(Filename) :- current_filename(Filename), !. get_current_filename("bicycles.txt").
set_current_filename(Filename) :- retractall(current_filename(_)), assertz(current_filename(Filename)).
show_current_filename :- get_current_filename(Filename),
9
write("Current database file: ", Filename), nl.
% Загрузка базы данных load_database_from_file :-
get_current_filename(Filename), load_database_from_file(Filename).
load_database_from_file(Filename) :- existfile(Filename), !,
write("Loading bicycle database from file: ", Filename), nl, retractall(bicycle(_, _, _, _, _, _, _)),
consult(Filename),
write("Database loaded successfully!"), nl.
load_database_from_file(Filename) :-
write("File ", Filename, " not found. Creating empty bicycle database."), nl, retractall(bicycle(_, _, _, _, _, _, _)).
reload_database :- get_current_filename(Filename), retractall(bicycle(_, _, _, _, _, _, _)), load_database_from_file(Filename), write("Database reloaded from file!"), nl, wait_for_enter.
%Проверка загрузки ensure_database_loaded :-
bicycle(_, _, _, _, _, _, _), !. ensure_database_loaded :-
load_database_from_file.
%Сохранение базы данных save_database_to_file :-
get_current_filename(Filename), save_database_to_file(Filename).
save_database_to_file(Filename) :-
write("Saving bicycle database to file: ", Filename), nl, openwrite(file_pointer, Filename), writedevice(file_pointer),
save_all_bicycles, closefile(file_pointer), writedevice(screen),
write("Database saved successfully!"), nl.
save_all_bicycles :-
bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity), write("bicycle(\"", Brand, "\",\"", Type, "\",\"", Color, "\",\"", Material, "\",", nl, Diameter, ",", Price, ",", Quantity, ")"),
fail. save_all_bicycles.
% Сохранение в csv save_database_to_csv :-
ensure_database_loaded, write("Enter CSV filename: "), readln(Filename), nl, save_database_to_csv(Filename).
save_database_to_csv(Filename) :- ensure_database_loaded,
write("Saving bicycle database to CSV file: ", Filename), nl,
10
