Разработка информационно-справочной системы "Технический паспорт автомобиля" Prolog
Задание N П-14
P
На курсовое проектирование по дисциплине
"Логическое программирование" студенту
Липаткину Дмитрию Вячеславовичу гр. ИИ-1-95.
1. Тема:
разработка информационно-справочной системы.
2. Исходные данные:
Разработать информационно-справочную систему, обеспечиваю-
щую работу с базой данных BT, включающей записи вида:
╔═══════════════════════════════════════════════════════════╗
║ TEХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║
╠═════╦═════╦══════╦═════╦════╦══════╦══════════╦═════╦═════╣
║ ║Год ║ Nо ║ No ║ ║номер.║Паспорт ║ ФИО ║Район║
║Марка║выпу-║ Дви- ║шасси║цвет║знак ╠═════╦════╬═╦═╦═╣Учёта║
║авт. ║ ска ║гателя║ ║ ║ ║Серия║ No ║Ф║И║О║ ║
╠═════╬═════╬══════╬═════╬════╬══════╬═════╬════╬═╬═╬═╬═════╣
Меню системы должно включать режимы:cохранения, загрузки,
просмотра-добавления, корректировки, создания из базы ВТ
новых баз данных по задаваемым пользователем признакам.
Язык программирования Пролог.
3. Перечень вопросов, подлежащих разработке:
3.1 Разработка меню, обеспечивающее взаимодействие пользо-
вателя с системой, в соответствии с заданием, предус-
мотрев режимы:
- корректировки данных,
- просмотра-добавления данных,
- просмотра базы,
- загрузки базы,
- сохранения базы,
- создания новой базы.
3.2 Разработка процедур:
- корректировки данных,
- просмотра-добавления данных,
- просмотра базы,
- загрузки базы,
- сохранения базы,
- создания новой базы.
4. Перечень графических материалов:
4.1 структурная схема меню
4.2 структурная схема программы.
5. Календарный план-график работы над курсовой работой:
1. Получение задания
4.10.96
2. Анализ задания, постановка задачи, подбор и изучение
литературы
18.10.96
3. Разработка меню и структуры программы
25.10.96
4. Разработка процедур информационно-справочной системы
15.11.96
5. Отладка программы
29.11.96
6. Оформление пояснительной записки и сдача работы на про-
верку
24.12.96
7. Защита курсовой работы
25.12.96
Руководитель /Холкин И.И./
Студент /Липаткин Д.В., ИИ-1-95/
aСодержание
@стр.
Введение ....................................
1. Понятие об информационных системах и их
программной реализации ...................
2. База данных и способы ее представления ...
3. Разработка системного меню ...............
4. Разработка структуры программы ...........
5. Разработка процедур:
5.1 Основной процедуры Start .............
5.2 Вывода главного меню Patch ...........
5.3 Вывода информации о системе
Process(0) ...........................
5.4 Вывода меню корректировки Process(1) .
5.5 Удаления записей Process(2) ..........
5.6 Вывода меню просмотра Process(3) .....
5.7 Вывода меню загрузки Process(4) .....
5.8 Вывода меню сохранения Process(5) ...
5.9 Создания новой БД Process(6) ........
5.10 Ввода новых данных Process(7) ......
5.11 Просмотра-добавления Process(8) ....
5.12 Выхода из программы Process(9) .....
5.13 Процедура выбора записи Select(_) ..
5.14 Загрузки БД с диска Lod ............
5.15 Сохранения БД на диске Sve .........
6. Листинг программы .......................
7. Отладка программы .......................
8. Инструкция пользователя и решение
контрольных примеров: ...................
Заключение .................................
Список литературы ..........................
@
@Введение
Данная курсовая написана на языке Пролог в среде Turbo Prolog
v 2.0 (русифицированная версия). В структуре языка заложены воз-
можности простой и черезвычайно эффективной работы с базами дан-
ных, что позволяет на его основе создавать различного рода инфор-
мационно - справочные системы. Структура языка Пролог соответ-
ствует структуре реляционных баз данных. Так отношению в РБД
соответствует предикат в Прологе, элементу - факт, атрибуту отно-
шения - аргумент предиката и т.д. Встроенные в Пролог предикаты
работы с окнами позволяют создать дружественный интерфейс для ра-
боты пользователя с информационно - справочной системой.
@ 1. Понятие об информационно-справочных
@системах и @их программной реализации
Информационно-справочные системы - это программы-оболочки,
служащие для управления массивами и базами данных. В наш век
всеобщей компьютеризации информационно-справочные системы значи-
тельно облегчают труд человека во всех отраслях народного хозяй-
ства. Значительно упростилась работа московской милиции по обна-
ружению угнаного транспорта после создания в Москве компьютерных
баз данных по угнаным автомобилям. Бухгалтерам предприятий и фирм
теперь не нужно перебирать горы бумаг, чтобы получить все данные
о сотруднике: достаточно загрузить информационно-справочную сис-
тему и она в удобной форме выдаст всю необходимую информацию.
Области применения информационно-справочных систем воистину
безграничны: это ведение статистики удоя скота на ферме, состав-
ление каталогов книг в библиотеках и произведений искусства в му-
зеях, сбор данных о наличии рабочих вакансий в данном регеоне и
многие другие.
Одним из способов програмной реализации информационно-спра-
вочной системы является использование для ее создания языка логи-
ческого программирования Пролог. В данной реализации языка содер-
жится множество встроенных предикатов, существенно облегчающих
написание таких систем.
@2. База данных и способы ее представления
База данных в простейшем случае - упорядоченная структура
данных в виде таблицы, каждая запись которой может объединять
разнотипные данные, причем все записи одной базы имеют одинако-
вую структуру. Существуют три модели представления баз данных:
иерархическая, сетевая и реляционная. В силу особенностей языка
Пролог, с его помощью реализуется реляционная модель. Каждая
строка в базе данных называется элементом отношения, каждая ко-
лонка - атрибутом отношения, колличество колонок - арностью, а
колличество строк - мощностью. В языке программирования Пролог
атрибуту отношения соответствует аргумент предиката, арности -
колличество аргументов в предикате, отношению - предикат, элемен-
ту - факт, и мощности - число фактов. Исходя из вышеперечислен-
ных соответствий Пролог является прекрасным средством для реали-
зации реляционных баз данных.
@3. Разработка системного меню
Все режимы программы активизируются с помощью меню, которое
реализовано с помощью процедуры patch. Для активизации какого ли-
бо режима пользователю следует нажать цифровую клавишу, соответ-
ствующую выбранному пункту меню.
Меню данной программы состоит из девяти пунктов:
0 - О системе... - вывод данных о системе
1 - Корректировка данных - режим корректировки данных
2 - Уничтожение данных - режим удаления данных
3 - Просмотр базы - режим просмотра базы
4 - Загрузка базы - режим загрузки базы
5 - Сохранение базы - режим сохранения базы
6 - Создание новой базы - режим создания новой базы
7 - Ввод новых данных - режим ввода новых данных
8 - Просмотр-добавления - режим просмотра-добавления
9 - Выход из программы - выход из программы
@5. Разработка процедур
Процедуры создавались на основе требований, изложенных в за-
дании к курсовой работе.
@ 5.1 Основная процедура Start.
С помощью процедуры Start в разделе GOAL инициируется нача-
ло выполнения программы. Эта процедура загружает начальную базу
данных , после чего передает управление процедуре вывода главно-
го меню Patch.
@ 5.2 Процедура вывода главного меню Patch.
Эта процедура выводит список пунктов главного меню и ожи-
дает от пользователя ввода числа, которое будет занесено в пере-
менную C. После этого вызывается процедура обработки основных ре-
жимов Process, в которую переменная C передается в качестве аргу-
мента. В процедуре использован предикат Repeat, в связи с этим
после возврата из процедуры Process в случае, если C не равно 9
происходит повторный вывод пунктов меню и ожидание ввода числа.
@5.3 Процедура вывода информации о системе Process(0).
Данная процедура выводит информацию о языке, на котором на-
писана система и данные о создателе.
@5.4 Процедура вывода меню коррекции данных Process(1).
Процедура Process(1) служит для вывода меню режима коррек-
ции данных, находящихся в БД, и внесения новых записей. После ак-
тивизации процедура выводит меню в котором имеются режимы,с по-
мощью которых надо выбрать интересующий вас объект изменения.
Активизация режимов происходит аналогично главному меню с по-
мощью нажатия соответствующей цифровой клавиши. Считанное с кла-
виатуры число заносится в переменную X, после чего вызывается
процедура Select, аргументом которой служит X. С помощью процеду-
ры Select , описанной ниже, собственно и реализуетcя режим кор-
рекции. В процедуре Process(1) также применен предикат Repeat, с
помощью которого реализован повторный вывод меню в случае ошибки
ввода.
@5.5 Процедура удаления записей Process(2).
Данная процедура предназначена для удаления записей из базы
данных. В программе предусмотрена возможность задания либо мар-
кой автомобиля, либо годом ее выпуска,либо ее цвету или по райо-
ну учё- та для удаления данной записи. Эта возможность реализует-
ся процедурой Select,описанной ниже. Процедура Select возвращает
номер выбранной записи и с помощью встроенного предиката retract
запись удаляется из базы данных. В случае ошибки (отсутствия за-
писи, выбранной пользователем для удаления) выводится соответ-
ствующее сообщение (процедура Error).
@5.6 Процедура вывода меню просмотра БД Process(3).
Процедура Process(3) выводит cодержимое базы данных.Для вы-
хода в главное меню надо нажать любую клавишу.
@5.7 Процедура вывода меню загрузки БД Process(4).
Данная процедура выводит меню, содержащее следующие пункты:
"Загрузить основную базу из выбранного файла", " Загрузить основ-
ную базу из файла dima.dat", "Выход в главное меню". Собственно
загрузка баз данных осуществляется процедурой Lod, аргументом ко-
торой служит переменная C, считанная с клавиатуры при вводе
пользователем номера желаемого пункта меню. В процедуре
Process(4) также применена процедура Repeat.
@5.8 Процедура вывода меню сохранения БД Process(5).
Процедура Working(5) аналогична process(4). Для сохранения
баз данных применяется процедура Save, рассмотренная ниже, аргу-
ментом которой является переменная I.
@5.9 Процедура создания новой БД Process(6).
Данная процедура служит для создания новой базы данных. Про-
цедура работает следующим образом: из базы, все записи рассматри-
ваются по заданому вами признаку и записи, имеющие этот признак,
выводятся на экран в виде другой базы данных и записываются в
файл "not.dat".В этой процедуре используется процедура Procedure,
которая имеет переменную С, которая описана ниже.
@ 5.10 Процедура ввода новых данных Process(7).
@
Данная прооцедура служит для ввода новой записи в БД.После
активизации надо поочерёдно вводить все данные о автомобиле,пос-
ле чего она их заносит в БД и вы выходите в главное меню.
@
@ 5.11 Процедура просмотра-добавления Process(8).
Данная процедура cлужитдля просмотра или добавления новых
данных. Процедура работает так: надо ввести марку автомобиля и
появятся все данные про этот автомобиль и при нажатии клавиши бу-
дет осуществлен выход в главное меню, если вы ввели не существую-
щую марку то потребуют повторить ввод, но для добавления записи к
БД, после чего будет осуществлен выход в главное меню.
@5.12 Процедура выхода из программы Process(9).
@
@ Данная служит для выхода из программы. она происходит при на-
жатии клавиши 9.
@ 5.13 Процедура выбора записи Select(_).
Данная процедура выводит несколько признаков по одному из
которых вы хотите изменить запись. Вы набираете номер признака, а
потом и вводите его. Дальше выполняется процедура Sel(M,N). C пе-
ременной М (признак, который вы ввели) вы входите в эту процеду-
ру. Процедура по признаку М находит номер записи N и отсылает об-
ратно в процедуру Select.
@5.14 Процедура загрузки БД с диска Lod.
Данная процедура осуществляет загрузку баз данных из фай-
лов на диске по признакам, зависящим от аргумента процедуры:
lod(1) загружает основную БД из файла, заданного
пользователем,lod(2) - из файла dima.dat. В данных процедурах
проверяется наличие файла на диске с помощью предиката existfile
и загрузка БД в память с помощью предиката consult. В случае от-
сутствия файла на диске, выдается соответствующее сообщение (про-
цедура Io_error).
@5.15 @Процедура сохранения БД на диске Sve.
Данная процедура осуществляет сохранение баз данных в фай-
лах на диске по признакам, зависящим от аргумента процедуры:
Sve(1) сохраняет основную БД в файле, заданном пользователем,
Sve(2) - в файле dima.dat. Сохранение БД осуществляется с по-
мощью встроенного предиката save. В случае ошибки выдается соот-
ветствующее сообщение (процедура Error).
@6. Листинг программы.
/* **************************
* КУРСОВАЯ РАБОТА *
* *
* *
* *
**************************
*/
domains
b,c,d,m,r,z,i,n,n1,ko,ob,pl=integer
t,a,f,s,l,p,u,na,j=symbol
database -svod1
svod1(a,b,c,d,f,m,t,r,s,l,p,u)
database -lolo
lolo(a,b,c,d,f,m,t,r,s,l,p,u)
database -kuku
kuku(a,b,c,d,f,m,t,r,s,l,p,u)
database
svod(a,b,c,d,f,m,t,r,s,l,p,u)
predicates
start
patch
load
select(i)
sel(i,i)
process(i)
procedure(i)
sve(i)
lod(i)
repeat
goal
start.
clauses
/*Процедура создания основного меню и загрузки базы данных,стр. */
start:-
makewindow(1,10,0,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80),
clearwindow,
load,
patch.
/*Процедура управления основным меню,стр. */
patch:-
repeat,
cursor(7,0),
write(" 0 - О пpогpамме... "),nl,
write(" 1 - коррекция данных"),nl,
write(" 2 - удаление данных"),nl,
write(" 3 - просмотр базы"),nl,
write(" 4 - загрузка базы"),nl,
write(" 5 - сохранение базы"),nl,
write(" 6 - создание новой базы"),nl,
write(" 7 - ввод новых данных"),nl,
write(" 8 - просмотр-добавление"),nl,
write(" 9 - выход из программы"),nl,
write(" =>"),
readint(Choice),
Choice >= 0,
Choice < 10,
clearwindow,
process(Choice),
clearwindow,
Choice = 9,
retractall(_),
removewindow.
/*Процедура поиска и загрузки файла содержащего базу данных,стр. */
load:-
existfile("dima.dat"),
consult("dima.dat"),
cursor(1,2),
write("База загружена").
load:-
cursor(1,2),
write("Нет базы на диске").
/*Пpоцедуpа ввода новых данных,стр. */
process(7):-
makewindow(1,2,7,"Ввод новых данных",0,0,25,80),
nl,
write("Введите марку автомобиля :"),readln(K),nl,
write("Введите год выпуска :"),readint(O),nl,
write("Введите номер двигателя :"),readint(I),nl,
write("Введите номер шасси :"),readint(Y),nl,
write("Введите цвет :"),readln(T),nl,
write("Введите номерной знак :"),readint(FF),nl,
write("Введите серию паспорта :"),readln(OO),nl,
write("Введите номер паспорта :"),readint(YY),nl,
write("Введите фамилию :"),readln(KK),nl,
write("Введите инициалы имени :"),readln(II),nl,
write(" oтчества :"),readln(TT),nl,
write("Введите район учета :"),readln(HH),nl,
N1=K,NA1=O,KO1=I,OB1=Y,PL1=T,FF1=FF,OO1=OO,
YY1=YY,KK1=KK,II1=II,TT1=TT,HH1=HH,
assertz(svod(N1,NA1,KO1,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
removewindow,
fail.
/*Процедура просмотра-добавления,стр. */
process(8):-
makewindow(1,2,7,"Просмотр-добавление",0,0,25,80),
nl,
write("Введите марку автомобиля:"),readln(A),nl,nl,
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
A=KY,
write("Марка автомобиля :"),write(A),nl,
write("Год выпуска :"),write(NA),nl,
write("Номер двигателя :"),write(KO),nl,
write("Номер шасси :"),write(
write("Цвет автомобиля :"),write(PL),nl,
write("Номерной знак :"),write(N),nl,
write("Cерия паспорта :"),write(OOO),nl,
write("Номер паспорта :"),write(YYY),nl,
write("Фамилия :"),write(KKK),nl,
write("Инициалы имени :"),write(III),nl,
write(" отчества :"),write(TTT),nl,
write("район учета :"),write(HHH),nl, nl,nl,
write("Нажмите на любую клавишу"),
readchar(_),
removewindow,
!.
process(8):-
write("Этой марки автомобиля нет в базе."),
write("Повторите введенную марку автомобиля "),
write("и продолжайте ввод данных"),nl,nl,nl,
write("Введите марку автомобиля:"),
readln(A),nl,
A=N1,
write("Введите год выпуска :"),readint(F),nl,
write("Введите номер двигателя :"),readint(Y),nl,
write("Введите номер шасси :"),readint(J),nl,
write("Введите цвет :"),readln(G),nl,
write("Введите номерной знак :"),readint(FFFF),nl,
write("Введите серию паспорта :"),readln(OOOO),nl,
write("Введите номер паспорта :"),readint(IIII),nl,
write("Введите фамилию :"),readln(KKKK),nl,
write("Введите инициалы имени :"),readln(TTTT),nl,
write(" отчества :"),readln(MMMM),nl,
write("Введите район учета :"),readln(GGGG),nl,
NA1=F,KO1=Y,OB1=J,PL1=G,FF1=FFFF,OO1=OOOO,
YY1=IIII,KK1=KKKK,II1=TTTT,TT1=MMMM,HH1=GGGG,
assertz(svod(N1,NA1,KO1,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
removewindow,
fail.
/*Пpоцедуpа вывода данных о пpогpамме,стр. */
process(0):-
makewindow(1,2,7,"О пpогpамме...",0,0,25,80),
write(" Инфоpмационно-спpавочная система"),nl,nl,
write(" -технический паспорт автолюбителя."),
nl,nl,
write(" Язык-TURBO-PROLOG v.2.0. "),nl,nl,
write(" автоp: ЛИПАТКИН ДМИТРИЙ "),nl,nl,
write(" МИРЭА, гp. ИИ-1-95 (с) 1996 г. "),
nl,nl,nl,nl,
write("Нажмите на любую клавишу"),
readchar(_),
removewindow.
/*Процедура изменения содержимого записей базы данных,стр. */
process(1):-
makewindow(1,2,7,"Коppекция данных",0,0,25,80),
nl,
select(N),
RR=N,
svod(KY,NA,KO,OB,PL,RR,OOO,YYY,KKK,III,TTT,HHH),
write("Марка автомобиля :"),write(KY),nl,
write("Год выпуска :"),write(NA),nl,
write("Номер двигателя :"),write(KO),nl,
write("Номер шасси :"),write(
write("Цвет автомобиля :"),write(PL),nl,
write("Номерной знак :"),write(RR),nl,
write("Серия паспорта :"),write(OOO),nl,
write("Номер паспорта :"),write(YYY),nl,
write("Фамилия :"),write(KKK),nl,
write("Инициалы имени :"),write(III),nl,
write(" oтчества :"),write(TTT),nl,
write("Район учета :"),write(HHH),nl,
nl,
write("Введите марку автомобиля :"),readln(N1),nl,
write("Введите год выпуска :"),readint(NA1),nl,
write("Введите номер двигателя :"),readint(KO1),nl,
write("Введите номер шасси :"),readint(OB1),nl,
write("Введите цвет :"),readln(PL1),nl,
write("Введите номерной знак :"),readint(RR1),nl,
write("Введите серию паспорта :"),readln(OO1),nl,
write("Введите номер паспорта :"),readint(YY1),nl,
write("Введите фамилию :"),readln(KK1),nl,
write("Введите инициалы имени :"),readln(II1),nl,
write(" отчества :"),readln(TT1),nl,
write("Введите район учета :"),readln(HH1),nl,
retract(svod(KY,NA,KO,OB,PL,RR,OOO,YYY,KKK,III,TTT,HHH)),
assert(svod(N1,NA1,KO1,OB1,PL1,RR1,OO1,YY1,KK1,II1,TT1,HH1)),
!,
removewindow.
/*Процедура удаления записей из базы данных,стр. */
process(2):-
makewindow(1,2,7,"Удаление записей",0,0,25,80),
nl,
select(N),
X=N,
svod(KY,NA,KO,OB,PL,X,OOO,YYY,KKK,III,TTT,HHH),
retract(svod(KY,NA,KO,OB,PL,X,OOO,YYY,KKK,III,TTT,HHH)),!,
removewindow.
/*Процедура просмотра содержимого базы данных,стр. */
process(3):-
makewindow(1,2,7,"Просмотp базы",0,0,25,80),
nl,
write("╔═════════════════════════════════════════════════════════╗"),
write("║ ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦════╦══════╦════════╦═════╦═════╣"),
write("║марка║ год ║ No ║ No ║ ║номер-║паспорт ║ ФИО ║ ║"),
write("║авт. ║выпу-║двига-║шасси║цвет║ ной ║═════╦══╬═╦═╦═╣район║"),
write("║ ║ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬════╬══════╬═════╬══╬═╬═╬═╬═════╣"),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(KY),
cursor(Z,8),write(NA),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(PL),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
process(3):-
write("╚═════════════════════════════════════════════════════════╝
nl,
write("Нажмите на любую клавишу"),
readchar(_),
removewindow.
/*Процедура загрузки в память базы данных,стр. */
process(4):-
nl,
makewindow(2,15,4,"Загрузка",5,5,20,70),
write("1 - База будет загружена из указанного файла"),nl,
write("2 - База будет загружена из файла dima.dat"),nl,
write("3 - Выход в основное меню"),nl,
write("==>"),
readint(C),
C>0,C<4,
lod(C),
!,
removewindow.
/*Процедура сохранения базы данных,стр. */
process(5):-
nl,
makewindow(2,15,4,"Запись",5,5,20,70),
write("1 - База будет записана в указанный файл"),nl,
write("2 - База будет записана в файл dima.dat"),nl,
write("3 - Выход в основное меню"),nl,
write("==>"),
readint(I),
I>0,I<4,
sve(I),!,
removewindow.
/*Процедура выбора создания новой базы,стр. */
process(6):-
nl,
makewindow(3,2,7,"Создание новой базы",0,0,25,80),
write("1 - База будет создана по марке автомобиля "),nl,
write("2 - База будет создана по году выпуска"),nl,
write("3 - База будет создана по цвету"),nl,
write("4 - Выход в основное меню"),nl,
write("==>"),
readint(O),
O>0,O<5,
procedure(O),
removewindow.
process(_).
/*Процедура создания новой базы данных и ее сохранения,стр. */
procedure(1):-
makewindow(1,2,7,"Создание новой базы по марке автомобиля",0,0,25,80),
nl,
cursor(7,10),
retractall(_,svod1),
nl,
write("Если вы хотите узнать данные о автомобилe , то"),
nl,
write("Введите марку автомобиля:"),
readln(X),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
S=KY,
S=X,
NA1=NA,KO1=KO,OB1=
KK1=KKK,II1=III,TT1=TTT,HH1=HHH,
assert(svod1(S,NA1,KO1,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
fail.
procedure(1):-
write("База создана"),nl,
write("╔═════════════════════════════════════════════════════════╗"),
write("║ TEXНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦════╦══════╦══════════════╦═════╣"),
write("║марка║ год ║ No ║ No ║ ║номер-║ паспорт! ФИО ║ ║"),
write("║авт. ║выпу-║двига-║шасси║цвет║ ной ╠═════╦══╦═╦═╦═╣район║"),
write("║ ║ ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬════╬══════╬═════╬══╬═╬═╬═╬═════╣"),
svod1(S,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(S),
cursor(Z,8),write(NA),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(PL),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
procedure(1):-
write("═══════════════════════════════════════════════════════════"),
save("not.dat",svod1), nl,
write("База сохранена в файле not.dat"),
nl, write("Нажмите любую клавишу"),
readchar(_), removewindow,
!.
procedure(1):-
write("═══════════════════════════════════════════════════════════"),
nl, write("Невозможно сохранить созданную базу"),
nl, write("Нажмите любую клавишу"), readchar(_),
makewindow(1,2,7,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80).
procedure(2):-
makewindow(1,2,7,"Создание новой базы по году выпуска",0,0,25,80),
nl,
cursor(7,10),
retractall(_,lolo),
nl,
write("Если вы хотите узнать данные о годе выпуска , то"),nl,
write("Введите год:"),
readint(X),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
S=NA,
S=X,
N1=KY,KO1=KO,OB1=
KK1=KKK,II1=III,TT1=TTT,HH1=HHH,
assert(lolo(N1,S,KO,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
fail.
procedure(2):-
write("База создана"),nl,
write("╔═════════════════════════════════════════════════════════╗"),
write("║ ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦════╦══════╦════════╦═════╦═════╣"),
write("║марка║ год ║ No ║ No ║ ║номер-║паспорт ║ ФИО ║район║"),
write("║автю.║выпу-║двига-║шасси║цвет║ ной ╠═════╦══╬═╦═╦═╣ ║"),
write("║ ║ ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬════╬══════║═════╬══╬═╬═╬═╬═════╣"),
lolo(KY,S,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(KY),
cursor(Z,8),write(S),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(PL),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
procedure(2):-
write("═══════════════════════════════════════════════════════════"),
save("not1.dat",lolo),
nl,
write("База сохранена в файле not1.dat"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
removewindow,
!.
procedure(2):-
write("═══════════════════════════════════════════════════════════"),
nl,
write("Невозможно сохранить созданную базу"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
makewindow(1,2,7,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80).
procedure(3):-
makewindow(1,2,7,"Создание базы данных по цвету автомобилей",0,0,25,80),
nl,
cursor(7,10),
retractall(_,kuku),
nl,
write("Если вы хотите узнать данные об автомобиле , то"),
nl,
write("Введите интересующий цвет :"),
readln(X),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
S=PL,
S=X,
N1=KY,NA1=NA,KO1=KO,OB1=
KK1=KKK,II1=III,TT1=TTT,HH1=HHH,FF1=N,
assert(kuku(N1,NA1,KO1,OB1,S,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
fail.
procedure(3):-
write("База создана"),nl,
write("╔═══════════════════════════════════════════════════════════╗"),
write("║ ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦══════╦══════╦════════╦═════╦═════╣"),
write("║марка║ год ║ No ║ No ║ цвет ║номер-║ паспорт║ ФИО ║район║"),
write("║авт. ║выпу-║двига-║шасси║ ║ ной ╠═════╦══╬═╦═╦═╣ ║"),
write("║ ║ ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬══════╬══════╬═════╬══╬═╬═╬═╬═════╣"),
kuku(KY,NA,KO,OB,S,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(KY),
cursor(Z,8),write(NA),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(S),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
procedure(3):-
write("═══════════════════════════════════════════════════════════"),
save("not2.dat",kuku),
nl,
write("База сохранена в файле not.dat"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
removewindow,
!.
procedure(3):-
write("═══════════════════════════════════════════════════════════"),
nl,
write("Невозможно сохранить созданную базу"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
makewindow(1,2,7,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80).
/*Процедура записи на диск,стр. */
sve(1):-
write("Введите имя файла :"),
readln(N),
save(N),
write("Все в порядке"),
beep,
!.
sve(1):-
write("Ошибка обмена, нажмите любую клавишу"),
readchar(_).
sve(2):-
save("dima.dat").
sve(3).
/*Процедура чтения с диска,стр. */
lod(1):-
retractall(_),
write("Введите имя файла :"),
readln(N),
existfile(N),
consult(N),
write("Все в порядке"),
beep,
!.
lod(1):-
nl,
write("Данного файла нет на диске"),nl,
write("Нажмите любую клавишу"),
readchar(_).
lod(2):-
retractall(_),
existfile("dima.dat"),
consult("dima.dat"),
write("Все в порядке"),
beep,
!.
lod(2):-
write("Файла dima.dat нет на диске"),nl,
write("нажмите любую клавишу"),
readchar(_).
lod(3).
repeat.
repeat:- repeat.
/*Выбор записи,стр. */
select(N):-
nl,
write("1 - известна марка автомобиля"),nl,
write("2 - известен год выпуска"),nl,
write("3 - известен цвет автомобиля"),nl,
write("4 - известен район учета"),nl,
write("5 - известен номер двигателя"),nl,
write("==>"),
readint(X),
sel(X,N).
sel(1,N):-
nl,
write("Введите марку автомобиля :"),
readln(KY),
svod(KY,_,_,_,_,Z,_,_,_,_,_,_),
N=Z.
sel(1,N):-
N=0.
sel(2,N):-
nl,
write("Введите год выпуска :"),
readint(L),
svod(_,L,_,_,_,Z,_,_,_,_,_,_),
N=Z.
sel(2,N):-
N=0.
sel(3,N):-
nl,
write("Введите цвет : "),
readln(F),
svod(_,_,_,_,F,Z,_,_,_,_,_,_),
N=Z.
sel(3,N):-
N=0.
sel(4,N):-
nl,
write("Введите район учета :"),
readln(Q),
svod(_,_,_,_,_,Z,_,_,_,_,_,Q),
N=Z.
sel(4,N):-
N=0.
sel(5,N):-
nl,
write("Введите номер двигателя :"),
readint(PPPP),
svod(_,_,PPPP,_,_,Z,_,_,_,_,_,_),
N=Z.
sel(5,N):-
N=0.
@7. Отладка программы
При отладке программы ошибки устранялись в два этапа. На
первом этапе интерпритатор языка Пролог сам указывал на синтакси-
ческие ошибки. Такие ошибки возникали при неправильном написании
имен встроенных предикатов или пунктуации и т.д.. Когда пуктуация
прошла успешно,
но программа работала некорректно, приходилось переходить ко вто-
рому этапу - просмотру текста программы и логическому осмыслению
ошибки. На этом этапе были устранены ошибки неправильного вывода
записи БД и кривое построение таблицы .
@8. Инструкция пользователя и решение контрольных примеров
Программа "Технический паспорт автолюбителя" представ-
ляет собой информационно-справочную систему. В данной программе
имеется возможность создания новой базы данных. В основной БД
присутствуют данные о марке автомобиля, его года выпуска, его но-
мера двигателя и шасси, цвете автомобиля,районе учета,номерном
знаке,серии и номере паспорта и фамилию,имя и отчество.
При запуске программы на экран выводится главное меню:
0 - О системе...
1 - Корректировка данных
2 - Уничтожение данных
3 - Просмотр базы
4 - Загрузка базы
5 - Сохранение базы
6 - Создание новой базы
7 - Ввод новых данных
8 - Просмотр-добавление
9 - Выход из программы
Для выбора какого-либо пункта следует нажать соответ-
ствующую цифровую клавишу. Ниже приводится описание каждого из
пунктов.
@8.1 О системе...
При выборе данного пункта на экран выводятся данные о
системе и ее авторе. После нажатия на любую клавишу происходит
выход в главное меню.
@8.2 Корректировка данных.
При входе в этот пункт на экран выводится подменю:
1 - Известна марка автомобиля
2 - Известен год выпуска
3 - Известен цвет автомобиля
4 - Известен район учета
Если известна марка автомобиля, то следует ввести цифру
1, если известен год выпуска-цифру 2 и т.д.. После этого система
запросит соответственно марку или год или т.д.. Марку следует
вводить в том же виде (сочетание заглавных и строчных букв) в ка-
ком она имеется в базе данных. После определения корректируемой
записи система выводит на экран все данные об этом автомобиле и
позволяет их отредактировать, последовательно распечатывая поля
записи. Если данные в текущем поле исправлять не требуется, сле-
дует нажать клавишу <Enter>.
@8.3 Уничтожение записей.
Данный режим служит для удаления записей из базы данных.
Как и в подпункте "Изменение данных" режима "Корректировка дан-
ных" пользователю предоставляется возможность ввести либо марку,
либо год выпуска удаляемого автомобиля. После ввода этих данных
произойдет удаление выбранной записи и вывод сообщения, подтвер-
ждающего выполнение данной операции.
@8.4 Просмотр базы.
Данный режим предназначен для просмотра содержимого имею-
щихся баз данных. При входе в этот режим просмотривается основ-
ная база данных,содержимое которой подгружается автоматически
(при наличии на диске файла dima.dat) при запуске информацион-
но-справочной системы. После выбора этого пункта, на экран выво-
дятся записи основной БД в виде таблицы. Для возвращения в меню
следует нажать любую клавишу.
@8.5 Загрузка базы.
Данный режим предназначен для загрузки баз данных из фай-
лов. При входе в этот пункт выводится меню:
1 - Загрузить основную базу из выбранного файла
2 - Загрузить основную базу из файла dima.dat
3 - Выход в основное меню
При выборе пункта 2 произойдет загрузка соответственно ос-
новной базы из стандартного файла dima.dat , в случае удачной
загрузки будет выдано соответствующее сообщение. После нажатия на
любую клавишу произойдет выход в главное меню.
При выборе пунктов 1 система запросит имя файла, в кото-
ром содержится соответствующая БД. При успешной загрузке появит-
ся соответствующее сообщение, при сбое появится сообщение об
ошибке.
Пункт 3 предназначен для выхода в главное меню.
@8.6 Сохранение базы.
Данный режим предназначен для сохранения баз данных. При
входе в данный режим выводится следующее меню:
1 - Сохранить основную базу в указанном файле
2 - Сохранить основную базу в файле dima.dat
3 - Выход в основное меню
Работа с его пунктами полностью аналогична работе с подме-
ню режима "Загрузка базы".
@8.7 Создание новой базы.
Данный режим предназначен для создания дочерней базы дан-
ных. При запуске этого режима выводится следующее меню:
1 - База будет сохранена по марке автомобиля
2 - База будет сохранена по году впуска
3 - База будет сохранена по цвету
4 - Выход в основное меню
При нажатии 1,2,3 вам надо будет ввести соответственно
марку автомобиля, год выпуска или цвет, после чего будет создана
соответствующая база данных и сохранена в файле "not.dat". При
выборе 4 будет совершен выход в основное меню.
@8.8 Ввод новых данных.
Данный режим преедназначен для создания новой записи, пу-
тем поочередного ввода данных о автомобиле,после чего запись бу-
дет помещена в БД.
@8.9 Просмотр-добавление.
Данный режим предназначен для просмотра записи и добав-
ления новой записи.При запуске этого режима выводится следущее
требование:
Введите марку автомобиля
после введенной марки вам выведут все данные о этом автомобиле,
если вы ввели неверное марку, то тогда начнет работать режим до-
бавления такой же как ввод новых данных.
@8.10 Выход из пограммы.
@ Данный режим предназначен для выхода из программыв ДОС.
@8.9 Решение контрольных примеров.
В целях конечной отладки программы и устранения скрытых
ошибок было решено несколько контрольных примеров по работе с
системой во всех режимах. Была создана и отредактирована основ-
ная база данных. с ее помощью были опробованы режимы удаления,
корректировки, создания новой БД, загрузки и сохранения БД. При
решении контрольных примеров ошибок в программе не обнаружено.
@Заключение
В данной курсовой работе были исследованы возможности
языка программирования Пролог для создания информационно-справоч-
ных систем. Можно сделать вывод, что Пролог представляет богатые
возможности для реализации таких систем и написания дружественно-
го интерфейса для общения пользователя с программой.
@Список литературы
И.Братко "Программирование на языке Пролог для
искусственного интеллекта"
Дж.Доорс "Пролог - язык программирования будущего"
Ю.Тихонов "МПролог - язык логического
программирования. Версия 2.3"
CODE=12050
/* **************************
* КУРСОВАЯ РАБОТА *
* *
* *
* *
**************************
*/
domains
b,c,d,m,r,z,i,n,n1,ko,ob,pl=integer
t,a,f,s,l,p,u,na,j=symbol
database -svod1
svod1(a,b,c,d,f,m,t,r,s,l,p,u)
database -lolo
lolo(a,b,c,d,f,m,t,r,s,l,p,u)
database -kuku
kuku(a,b,c,d,f,m,t,r,s,l,p,u)
database
svod(a,b,c,d,f,m,t,r,s,l,p,u)
predicates
start
patch
load
select(i)
sel(i,i)
process(i)
procedure(i)
sve(i)
lod(i)
repeat
goal
start.
clauses
/*Процедура создания основного меню и загрузки базы данных*/
start:-
makewindow(1,10,0,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80),
clearwindow,
load,
patch.
/*Процедура управления основным меню*/
patch:-
repeat,
cursor(7,0),
write(" 0 - О пpогpамме... "),nl,
write(" 1 - коррекция данных"),nl,
write(" 2 - удаление данных"),nl,
write(" 3 - просмотр базы"),nl,
write(" 4 - загрузка базы"),nl,
write(" 5 - сохранение базы"),nl,
write(" 6 - создание новой базы"),nl,
write(" 7 - ввод новых данных"),nl,
write(" 8 - просмотр-добавление"),nl,
write(" 9 - выход из программы"),nl,
write(" =>"),
readint(Choice),
Choice >= 0,
Choice < 10,
clearwindow,
process(Choice),
clearwindow,
Choice = 9,
retractall(_),
removewindow.
/*Процедура поиска и загрузки файла содержащего базу данных*/
load:-
existfile("dima.dat"),
consult("dima.dat"),
cursor(1,2),
write("База загружена").
load:-
cursor(1,2),
write("Нет базы на диске").
/*Пpоцедуpа ввода новых данных*/
process(7):-
makewindow(1,2,7,"Ввод новых данных",0,0,25,80),
nl,
write("Введите марку автомобиля :"),readln(K),nl,
write("Введите год выпуска :"),readint(O),nl,
write("Введите номер двигателя :"),readint(I),nl,
write("Введите номер шасси :"),readint(Y),nl,
write("Введите цвет :"),readln(T),nl,
write("Введите номерной знак :"),readint(FF),nl,
write("Введите серию паспорта :"),readln(OO),nl,
write("Введите номер паспорта :"),readint(YY),nl,
write("Введите фамилию :"),readln(KK),nl,
write("Введите инициалы имени :"),readln(II),nl,
write(" oтчества :"),readln(TT),nl,
write("Введите район учета :"),readln(HH),nl,
N1=K,NA1=O,KO1=I,OB1=Y,PL1=T,FF1=FF,OO1=OO,
YY1=YY,KK1=KK,II1=II,TT1=TT,HH1=HH,
assertz(svod(N1,NA1,KO1,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
removewindow,
fail.
/*Процедура просмотра-добавления*/
process(8):-
makewindow(1,2,7,"Просмотр-добавление",0,0,25,80),
nl,
write("Введите марку автомобиля:"),readln(A),nl,nl,
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
A=KY,
write("Марка автомобиля :"),write(A),nl,
write("Год выпуска :"),write(NA),nl,
write("Номер двигателя :"),write(KO),nl,
write("Номер шасси :"),write(
write("Цвет автомобиля :"),write(PL),nl,
write("Номерной знак :"),write(N),nl,
write("Cерия паспорта :"),write(OOO),nl,
write("Номер паспорта :"),write(YYY),nl,
write("Фамилия :"),write(KKK),nl,
write("Инициалы имени :"),write(III),nl,
write(" отчества :"),write(TTT),nl,
write("район учета :"),write(HHH),nl, nl,nl,
write("Нажмите на любую клавишу"),
readchar(_),
removewindow,
!.
process(8):-
write("Этой марки автомобиля нет в базе."),
write("Повторите введенную марку автомобиля "),
write("и продолжайте ввод данных"),nl,nl,nl,
write("Введите марку автомобиля:"),
readln(A),nl,
A=N1,
write("Введите год выпуска :"),readint(F),nl,
write("Введите номер двигателя :"),readint(Y),nl,
write("Введите номер шасси :"),readint(J),nl,
write("Введите цвет :"),readln(G),nl,
write("Введите номерной знак :"),readint(FFFF),nl,
write("Введите серию паспорта :"),readln(OOOO),nl,
write("Введите номер паспорта :"),readint(IIII),nl,
write("Введите фамилию :"),readln(KKKK),nl,
write("Введите инициалы имени :"),readln(TTTT),nl,
write(" отчества :"),readln(MMMM),nl,
write("Введите район учета :"),readln(GGGG),nl,
NA1=F,KO1=Y,OB1=J,PL1=G,FF1=FFFF,OO1=OOOO,
YY1=IIII,KK1=KKKK,II1=TTTT,TT1=MMMM,HH1=GGGG,
assertz(svod(N1,NA1,KO1,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
removewindow,
fail.
/*Пpоцедуpа вывода данных о пpогpамме*/
process(0):-
makewindow(1,2,7,"О пpогpамме...",0,0,25,80),
write(" Инфоpмационно-спpавочная система"),nl,nl,
write(" -технический паспорт автолюбителя."),
nl,nl,
write(" Язык-TURBO-PROLOG v.2.0. "),nl,nl,
write(" автоp: ЛИПАТКИН ДМИТРИЙ "),nl,nl,
write(" МИРЭА, гp. ИИ-1-95 (с) 1996 г. "),
nl,nl,nl,nl,
write("Нажмите на любую клавишу"),
readchar(_),
removewindow.
/*Процедура изменения содержимого записей базы данных*/
process(1):-
makewindow(1,2,7,"Коppекция данных",0,0,25,80),
nl,
select(N),
RR=N,
svod(KY,NA,KO,OB,PL,RR,OOO,YYY,KKK,III,TTT,HHH),
write("Марка автомобиля :"),write(KY),nl,
write("Год выпуска :"),write(NA),nl,
write("Номер двигателя :"),write(KO),nl,
write("Номер шасси :"),write(
write("Цвет автомобиля :"),write(PL),nl,
write("Номерной знак :"),write(RR),nl,
write("Серия паспорта :"),write(OOO),nl,
write("Номер паспорта :"),write(YYY),nl,
write("Фамилия :"),write(KKK),nl,
write("Инициалы имени :"),write(III),nl,
write(" oтчества :"),write(TTT),nl,
write("Район учета :"),write(HHH),nl,
nl,
write("Введите марку автомобиля :"),readln(N1),nl,
write("Введите год выпуска :"),readint(NA1),nl,
write("Введите номер двигателя :"),readint(KO1),nl,
write("Введите номер шасси :"),readint(OB1),nl,
write("Введите цвет :"),readln(PL1),nl,
write("Введите номерной знак :"),readint(RR1),nl,
write("Введите серию паспорта :"),readln(OO1),nl,
write("Введите номер паспорта :"),readint(YY1),nl,
write("Введите фамилию :"),readln(KK1),nl,
write("Введите инициалы имени :"),readln(II1),nl,
write(" отчества :"),readln(TT1),nl,
write("Введите район учета :"),readln(HH1),nl,
retract(svod(KY,NA,KO,OB,PL,RR,OOO,YYY,KKK,III,TTT,HHH)),
assert(svod(N1,NA1,KO1,OB1,PL1,RR1,OO1,YY1,KK1,II1,TT1,HH1)),
!,
removewindow.
/*Процедура удаления записей из базы данных*/
process(2):-
makewindow(1,2,7,"Удаление записей",0,0,25,80),
nl,
select(N),
X=N,
svod(KY,NA,KO,OB,PL,X,OOO,YYY,KKK,III,TTT,HHH),
retract(svod(KY,NA,KO,OB,PL,X,OOO,YYY,KKK,III,TTT,HHH)),!,
removewindow.
/*Процедура просмотра содержимого базы данных*/
process(3):-
makewindow(1,2,7,"Просмотp базы",0,0,25,80),
nl,
write("╔═════════════════════════════════════════════════════════╗"),
write("║ ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦════╦══════╦════════╦═════╦═════╣"),
write("║марка║ год ║ No ║ No ║ ║номер-║паспорт ║ ФИО ║ ║"),
write("║авт. ║выпу-║двига-║шасси║цвет║ ной ║═════╦══╬═╦═╦═╣район║"),
write("║ ║ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬════╬══════╬═════╬══╬═╬═╬═╬═════╣"),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(KY),
cursor(Z,8),write(NA),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(PL),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
process(3):-
write("╚═════════════════════════════════════════════════════════╝
nl,
write("Нажмите на любую клавишу"),
readchar(_),
removewindow.
/*Процедура загрузки в память базы данных*/
process(4):-
nl,
makewindow(2,15,4,"Загрузка",5,5,20,70),
write("1 - База будет загружена из указанного файла"),nl,
write("2 - База будет загружена из файла dima.dat"),nl,
write("3 - Выход в основное меню"),nl,
write("==>"),
readint(C),
C>0,C<4,
lod(C),
!,
removewindow.
/*Процедура сохранения базы данных*/
process(5):-
nl,
makewindow(2,15,4,"Запись",5,5,20,70),
write("1 - База будет записана в указанный файл"),nl,
write("2 - База будет записана в файл dima.dat"),nl,
write("3 - Выход в основное меню"),nl,
write("==>"),
readint(I),
I>0,I<4,
sve(I),!,
removewindow.
/*Процедура выбора создания новой базы*/
process(6):-
nl,
makewindow(3,2,7,"Создание новой базы",0,0,25,80),
write("1 - База будет создана по марке автомобиля "),nl,
write("2 - База будет создана по году выпуска"),nl,
write("3 - База будет создана по цвету"),nl,
write("4 - Выход в основное меню"),nl,
write("==>"),
readint(O),
O>0,O<5,
procedure(O),
removewindow.
process(_).
/*Процедура создания новой базы данных и ее сохранения*/
procedure(1):-
makewindow(1,2,7,"Создание новой базы по марке автомобиля",0,0,25,80),
nl,
cursor(7,10),
retractall(_,svod1),
nl,
write("Если вы хотите узнать данные о автомобилe , то"),
nl,
write("Введите марку автомобиля:"),
readln(X),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
S=KY,
S=X,
NA1=NA,KO1=KO,OB1=
KK1=KKK,II1=III,TT1=TTT,HH1=HHH,
assert(svod1(S,NA1,KO1,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
fail.
procedure(1):-
write("База создана"),nl,
write("╔═════════════════════════════════════════════════════════╗"),
write("║ TEXНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦════╦══════╦══════════════╦═════╣"),
write("║марка║ год ║ No ║ No ║ ║номер-║ паспорт! ФИО ║ ║"),
write("║авт. ║выпу-║двига-║шасси║цвет║ ной ╠═════╦══╦═╦═╦═╣район║"),
write("║ ║ ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬════╬══════╬═════╬══╬═╬═╬═╬═════╣"),
svod1(S,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(S),
cursor(Z,8),write(NA),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(PL),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
procedure(1):-
write("═══════════════════════════════════════════════════════════"),
save("not.dat",svod1), nl,
write("База сохранена в файле not.dat"),
nl, write("Нажмите любую клавишу"),
readchar(_), removewindow,
!.
procedure(1):-
write("═══════════════════════════════════════════════════════════"),
nl, write("Невозможно сохранить созданную базу"),
nl, write("Нажмите любую клавишу"), readchar(_),
makewindow(1,2,7,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80).
procedure(2):-
makewindow(1,2,7,"Создание новой базы по году выпуска",0,0,25,80),
nl,
cursor(7,10),
retractall(_,lolo),
nl,
write("Если вы хотите узнать данные о годе выпуска , то"),nl,
write("Введите год:"),
readint(X),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
S=NA,
S=X,
N1=KY,KO1=KO,OB1=
KK1=KKK,II1=III,TT1=TTT,HH1=HHH,
assert(lolo(N1,S,KO,OB1,PL1,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
fail.
procedure(2):-
write("База создана"),nl,
write("╔═════════════════════════════════════════════════════════╗"),
write("║ ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦════╦══════╦════════╦═════╦═════╣"),
write("║марка║ год ║ No ║ No ║ ║номер-║паспорт ║ ФИО ║район║"),
write("║автю.║выпу-║двига-║шасси║цвет║ ной ╠═════╦══╬═╦═╦═╣ ║"),
write("║ ║ ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬════╬══════║═════╬══╬═╬═╬═╬═════╣"),
lolo(KY,S,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(KY),
cursor(Z,8),write(S),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(PL),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
procedure(2):-
write("═══════════════════════════════════════════════════════════"),
save("not1.dat",lolo),
nl,
write("База сохранена в файле not1.dat"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
removewindow,
!.
procedure(2):-
write("═══════════════════════════════════════════════════════════"),
nl,
write("Невозможно сохранить созданную базу"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
makewindow(1,2,7,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80).
procedure(3):-
makewindow(1,2,7,"Создание базы данных по цвету автомобилей",0,0,25,80),
nl,
cursor(7,10),
retractall(_,kuku),
nl,
write("Если вы хотите узнать данные об автомобиле , то"),
nl,
write("Введите интересующий цвет :"),
readln(X),
svod(KY,NA,KO,OB,PL,N,OOO,YYY,KKK,III,TTT,HHH),
S=PL,
S=X,
N1=KY,NA1=NA,KO1=KO,OB1=
KK1=KKK,II1=III,TT1=TTT,HH1=HHH,FF1=N,
assert(kuku(N1,NA1,KO1,OB1,S,FF1,OO1,YY1,KK1,II1,TT1,HH1)),
fail.
procedure(3):-
write("База создана"),nl,
write("╔═══════════════════════════════════════════════════════════╗"),
write("║ ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ ║"),
write("╠═════╦═════╦══════╦═════╦══════╦══════╦════════╦═════╦═════╣"),
write("║марка║ год ║ No ║ No ║ цвет ║номер-║ паспорт║ ФИО ║район║"),
write("║авт. ║выпу-║двига-║шасси║ ║ ной ╠═════╦══╬═╦═╦═╣ ║"),
write("║ ║ ска ║ теля ║ ║ ║ знак ║серия║No║Ф║И║О║ ║"),
write("╠═════╬═════╬══════╬═════╬══════╬══════╬═════╬══╬═╬═╬═╬═════╣"),
kuku(KY,NA,KO,OB,S,N,OOO,YYY,KKK,III,TTT,HHH),
cursor(Z,_),
cursor(Z,0),write(KY),
cursor(Z,8),write(NA),
cursor(Z,16),write(KO),
cursor(Z,26),write(
cursor(Z,32),write(S),
cursor(Z,39),write(N),
cursor(Z,46),write(OOO),
cursor(Z,52),write(YYY),
cursor(Z,58),write(KKK),
cursor(Z,66),write(III),
cursor(Z,68),write(TTT),
cursor(Z,70),write(HHH),
nl,
fail.
procedure(3):-
write("═══════════════════════════════════════════════════════════"),
save("not2.dat",kuku),
nl,
write("База сохранена в файле not.dat"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
removewindow,
!.
procedure(3):-
write("═══════════════════════════════════════════════════════════"),
nl,
write("Невозможно сохранить созданную базу"),
nl,
write("Нажмите любую клавишу"),
readchar(_),
makewindow(1,2,7,"ТЕХНИЧЕСКИЙ ПАСПОРТ АВТОЛЮБИТЕЛЯ",0,0,25,80).
/*Процедура записи на диск*/
sve(1):-
write("Введите имя файла :"),
readln(N),
save(N),
write("Все в порядке"),
beep,
!.
sve(1):-
write("Ошибка обмена, нажмите любую клавишу"),
readchar(_).
sve(2):-
save("dima.dat").
sve(3).
/*Процедура чтения с диска*/
lod(1):-
retractall(_),
write("Введите имя файла :"),
readln(N),
existfile(N),
consult(N),
write("Все в порядке"),
beep,
!.
lod(1):-
nl,
write("Данного файла нет на диске"),nl,
write("Нажмите любую клавишу"),
readchar(_).
lod(2):-
retractall(_),
existfile("dima.dat"),
consult("dima.dat"),
write("Все в порядке"),
beep,
!.
lod(2):-
write("Файла dima.dat нет на диске"),nl,
write("нажмите любую клавишу"),
readchar(_).
lod(3).
repeat.
repeat:- repeat.
/*Выбор записи*/
select(N):-
nl,
write("1 - известна марка автомобиля"),nl,
write("2 - известен год выпуска"),nl,
write("3 - известен цвет автомобиля"),nl,
write("4 - известен район учета"),nl,
write("5 - известен номер двигателя"),nl,
write("==>"),
readint(X),
sel(X,N).
sel(1,N):-
nl,
write("Введите марку автомобиля :"),
readln(KY),
svod(KY,_,_,_,_,Z,_,_,_,_,_,_),
N=Z.
sel(1,N):-
N=0.
sel(2,N):-
nl,
write("Введите год выпуска :"),
readint(L),
svod(_,L,_,_,_,Z,_,_,_,_,_,_),
N=Z.
sel(2,N):-
N=0.
sel(3,N):-
nl,
write("Введите цвет : "),
readln(F),
svod(_,_,_,_,F,Z,_,_,_,_,_,_),
N=Z.
sel(3,N):-
N=0.
sel(4,N):-
nl,
write("Введите район учета :"),
readln(Q),
svod(_,_,_,_,_,Z,_,_,_,_,_,Q),
N=Z.
sel(4,N):-
N=0.
sel(5,N):-
nl,
write("Введите номер двигателя :"),
readint(PPPP),
svod(_,_,PPPP,_,_,Z,_,_,_,_,_,_),
N=Z.
sel(5,N):-
N=0.