Лабораторные работы. Ерофеев / Разработка ИИ. Отчет №5
.pdf
openwrite(file_pointer, Filename), writedevice(file_pointer),
write("\"Brand\",\"Type\",\"Color\",\"FrameMaterial\",\"WheelDiameter\",\"Price\",\"Quantity\""), nl, save_all_bicycles_csv,
closefile(file_pointer), writedevice(screen), write("CSV file saved"), nl.
save_all_bicycles_csv :-
bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity), write("\"", Brand, "\",\"", Type, "\",\"", Color, "\",\"", Material, "\",", nl, Diameter, ",", Price, ",", Quantity),
fail. save_all_bicycles_csv.
% Добавление записи
add_bicycle_fact(Brand, Type, Color, Material, Diameter, Price, Quantity) :- assertz(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)).
% Редактирование записи edit_bicycle :-
ensure_database_loaded,
write("Enter brand of bicycle to edit: "), readln(Brand), nl, edit_bicycle_by_brand(Brand).
edit_bicycle_by_brand(Brand) :-
bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity), !, retract(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), write("Found bicycle: "), nl,
print_bicycle(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), nl,
edit_bicycle_menu(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), write("Bicycle updated successfully!"), nl,
wait_for_enter.
edit_bicycle_by_brand(Brand) :- write("Bicycle '", Brand, "' not found."), nl, wait_for_enter.
% Меню редактирования
edit_bicycle_menu(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)) :- write("=== EDIT BICYCLE ==="), nl,
write("1. Brand: ", Brand), nl, write("2. Type: ", Type), nl, write("3. Color: ", Color), nl,
write("4. Frame Material: ", Material), nl, write("5. Wheel Diameter: ", Diameter), nl, write("6. Price: ", Price), nl,
write("7. Quantity: ", Quantity), nl, write("8. Save and exit"), nl,
write("0. Cancel (restore original)"), nl, nl, write("Select field to edit (0-8): "), readint(Choice), nl,
edit_bicycle_field(Choice, bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)).
edit_bicycle_field(0, bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)) :- assertz(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)),
write("Edit cancelled. Original bicycle restored."), nl.
edit_bicycle_field(8, bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)) :- assertz(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), write("Changes saved."), nl.
11
edit_bicycle_field(1, bicycle(_, Type, Color, Material, Diameter, Price, Quantity)) :- write("Enter new brand: "),
readln(NewBrand), nl,
edit_bicycle_menu(bicycle(NewBrand, Type, Color, Material, Diameter, Price, Quantity)).
edit_bicycle_field(2, bicycle(Brand, _, Color, Material, Diameter, Price, Quantity)) :- write("Enter new type: "),
readln(NewType), nl,
edit_bicycle_menu(bicycle(Brand, NewType, Color, Material, Diameter, Price, Quantity)).
edit_bicycle_field(3, bicycle(Brand, Type, _, Material, Diameter, Price, Quantity)) :- write("Enter new color: "),
readln(NewColor), nl,
edit_bicycle_menu(bicycle(Brand, Type, NewColor, Material, Diameter, Price, Quantity)).
edit_bicycle_field(4, bicycle(Brand, Type, Color, _, Diameter, Price, Quantity)) :- write("Enter new frame material: "),
readln(NewMaterial), nl,
edit_bicycle_menu(bicycle(Brand, Type, Color, NewMaterial, Diameter, Price, Quantity)).
edit_bicycle_field(5, bicycle(Brand, Type, Color, Material, _, Price, Quantity)) :- read_positive_integer("Enter new wheel diameter (inches): ", NewDiameter), nl, edit_bicycle_menu(bicycle(Brand, Type, Color, Material, NewDiameter, Price, Quantity)).
edit_bicycle_field(6, bicycle(Brand, Type, Color, Material, Diameter, _, Quantity)) :- read_positive_integer("Enter new price: ", NewPrice), nl, edit_bicycle_menu(bicycle(Brand, Type, Color, Material, Diameter, NewPrice, Quantity)).
edit_bicycle_field(7, bicycle(Brand, Type, Color, Material, Diameter, Price, _)) :- read_positive_integer("Enter new quantity: ", NewQuantity), nl, edit_bicycle_menu(bicycle(Brand, Type, Color, Material, Diameter, Price, NewQuantity)).
edit_bicycle_field(_, Bike) :-
write("Invalid choice. Please try again."), nl, edit_bicycle_menu(Bike).
% Вывод print_all_bicycles :-
ensure_database_loaded,
write("=== BICYCLES DATABASE ==="), nl, nl, bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity),
print_bicycle(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), fail.
print_all_bicycles :-
write("=== END OF DATABASE ==="), nl.
print_all_bicycles_stepwise :- ensure_database_loaded,
write("=== BICYCLES DATABASE ==="), nl, nl, bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity),
print_bicycle(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), wait_for_enter,
fail. print_all_bicycles_stepwise :-
write("=== END OF DATABASE ==="), nl.
print_bicycle(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)) :- write("Brand: ", Brand), nl,
write("Type: ", Type), nl, write("Color: ", Color), nl, write("Frame Material: ", Material), nl,
write("Wheel Diameter: ", Diameter, "\""), nl,
12
write("Price: ", Price, " rub"), nl, |
|
write("Quantity: ", Quantity), nl, |
"), nl. |
write("----------------------------------- |
% Чтение числа read_positive_integer(Prompt, Value) :-
write(Prompt),
readint(Value), Value > 0, !.
read_positive_integer(Prompt, Value) :-
write("Error: Value must be greater than 0. Please try again."), nl, read_positive_integer(Prompt, Value).
% Добавление записи add_bicycle :-
ensure_database_loaded, write("Enter bicycle brand: "), readln(Brand), nl, write("Enter bicycle type: "), readln(Type), nl, write("Enter color: "), readln(Color), nl,
write("Enter frame material: "), readln(Material), nl,
read_positive_integer("Enter wheel diameter (inches): ", Diameter), nl, read_positive_integer("Enter price: ", Price), nl, read_positive_integer("Enter quantity: ", Quantity), nl,
assertz(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), write("Bicycle added successfully!"), nl,
wait_for_enter. % Удаление записи delete_bicycle :-
ensure_database_loaded,
write("Enter brand of bicycle to delete: "), readln(Brand), nl, delete_bicycle_by_brand(Brand).
delete_bicycle_by_brand(Brand) :-
retract(bicycle(Brand, Type, Color, Material, Diameter, Price, Quantity)), !, write("Bicycle '", Brand, "' deleted successfully!"), nl,
wait_for_enter.
delete_bicycle_by_brand(Brand) :- write("Bicycle '", Brand, "' not found."), nl, wait_for_enter.
change_filename :-
write("Enter new filename (e.g. bikes.txt): "), readln(NewFilename), set_current_filename(NewFilename),
write("Current filename changed to: ", NewFilename), nl, wait_for_enter.
% Ожидание enter wait_for_enter :-
write("Press Enter to continue..."), readchar(_),
nl.
% Меню menu :-
clearwindow,
13
makewindow(1, 2, 11, "Bicycle Database", 0, 0, 25, 80), show_current_filename, write("========================================="), nl, write(" BICYCLE DATABASE MENU "), nl, write("========================================="), nl, nl, write("1. Change database filename"), nl,
write("2. Reload database from file"), nl, write("3. Show all bicycles"), nl, write("4. Show bicycles step by step"), nl, write("5. Save database to file"), nl, write("6. Add new bicycle"), nl, write("7. Delete bicycle"), nl,
write("8. Edit bicycle"), nl,
write("9. Export database to CSV"), nl, write("0. Exit program"), nl, nl, write("Select option (0-9): "), readint(N), nl,
action(N).
action(1) :- change_filename, menu. action(2) :- reload_database, menu.
action(3) :- print_all_bicycles, wait_for_enter, menu. action(4) :- print_all_bicycles_stepwise, wait_for_enter, menu. action(5) :- save_database_to_file, wait_for_enter, menu. action(6) :- add_bicycle, menu.
action(7) :- delete_bicycle, menu. action(8) :- edit_bicycle, menu.
action(9) :- save_database_to_csv, wait_for_enter, menu. action(0) :-
write("Exiting Bicycle Database..."), nl, write("Goodbye!"), nl.
action(_) :-
write("Invalid option. Please try again."), nl, wait_for_enter,
menu.
GOAL clearwindow,
set_current_filename("bicycles.txt"), load_database_from_file,
menu.
Выводы
В ходе выполнения лабораторной работы была разработана функциональная база данных на языке логического программирования Prolog (Turbo Prolog 2.0) для управления базой данных.
14
