Скачиваний:
0
Добавлен:
12.01.2026
Размер:
1.53 Mб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Федеральное государственное бюджетное образовательное учреждение Высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. Проф. М. А. Бонч-Бруевича» (СПбГУТ)

Факультет Информационных технологий и программной инженерии Кафедра Программной инженерии

Лабораторная работа №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