Разработка информационно-справочной системы "Технический паспорт автомобиля" Prolog

Загрузить архив:
Файл: 240-0563.zip (17kb [zip], Скачиваний: 39) скачать

                          Задание N П-21

            На курсовое проектирование по дисциплине

             "Логическое  программирование" студенту

            Тарасову Михаилу Сергеевичу гр. ИИ-1-95.

    1. Тема:

       разработка  информационно-справочной системы.

    2. Исходные данные:

       Разработать информационно-справочную систему, обеспечиваю-

       щую работу с базой данных Avto включающей записи вида:

 ╔═════════════════════════════════════════════════════════════════════╗

 ║                ТЕХ. ПАСПОРТ АВТОМОБИЛЯ                              ║

 ╠══╦═════════╦═════╦═════╦═════╦════════╦═══════════════════╦═════════╣

 ║N°║ МАРКА   ║ ГОД ║ N°  ║ N°  ║ НОМЕРН ║   Ф. И. О.        ║ РАЙОН   ║

 ║  ║АВТОМОБИЛ║ВЫПУС║ДВИГ ║ШАССИ║ ЗНАК   ║                   ║ УЧЕТА   ║

 ╠══╬═════════╬═════╬═════╬═════╬════════╬═══════╦═════╦═════╬═════════╣

    Из базы Avto создать 2 базы Avto1 и Avto2 по признакам, определяе-

мым пользователем

    Меню системы  должно  включать  режимы корректировки,  уничтожения

просмотра, загрузки, сохранения.

    Язык  программирования Пролог.

    3. Перечень вопросов, подлежащих разработке:

       3.1 Разработка меню, обеспечивающее взаимодействие пользо-

           вателя с системой, в соответствии с заданием,  предус-

           мотрев режимы:

            - корректировки данных,

            - уничтожения данных,

            - просмотра базы,

            - загрузки базы,

            - сохранения базы,

            - создания новой базы.

       3.2 Разработка процедур:

            - корректировки данных,

            - уничтожения данных,

            - просмотра базы,

            - загрузки базы,

            - сохранения базы,

            - создания новой базы.

    4. Перечень графических материалов:

       4.1 структурная схема меню

       4.2 структурная схема программы.


    5. Календарный план-график работы над курсовой работой:

       1. Получение задания

                            4.10.96

       2. Анализ задания, постановка задачи,  подбор  и  изучение

          литературы

                           с 5.10.96 по 20.10.96

       3. Разработка меню и структуры программы

                            22.10.96

       4. Разработка процедур информационно-справочной системы

                            18.11.96

       5. Отладка программы

                            29.11.96

       6. Доработка программы с учетом вновь изменившихся требований

                            20.12.96

       7. Вторичная отладка программы

                            21.12.96

       8. Оформление пояснительной записки

                            24.12.96

       9. Сдача работы на проверку

                            25.12.96

       7. Защита курсовой работы

                            27.12.96

                              Руководитель          /Холкин И.И./

                              Студент   /Тарасов М.С., ИИ-1-95/


                             2Содержание.

          Введение ....................................

          1. Понятие об информационных системах и их

             программной реализации ...................

          2. База данных и способы ее представления ...

          3. Разработка системного меню ...............

          4. Разработка структуры программы ...........

          5. Разработка процедур:

             5.1 Основной процедуры Nachalo ...........

             5.2 Вывода главного меню Mainmenu ........

             5.3 Загрузки БД Zagruz ...................

             5.4 Вывода информации о программе

                 Rabota (0) ...........................

             5.5 Корректировки данных Rabota (1) ......

             5.6 Удаления записей Rabota (2) ..........

             5.7 Просмотра базы Rabota (3) ............

             5.8 Вывода меню загрузки Rabota (4) .....

             5.9 Вывода меню сохранения Rabota (5) ...

             5.10 Создания новой БД Rabota (6) .......

             5.11 Добавления новых записей Rabota(7)..

             5.12 Просмотра-добавления данных

                  Rabota(8) ...........................

             5.13 Выхода из программы      Rabota(9) ..

             5.14 Процедуры выбора Сhoice1............

             5.15 Процедур Sbros и Sbros1      .......

             5.16 Загрузки БД с диска Loadbase........

             5.17 Сохранения БД на диске Savebase.....

             5.18 Вспомогательной для коррекции даных

                  Correct(N)  ........................

          6. Листинг программы .......................

          7. Отладка программы .......................

          8. Инструкция пользователя и решение

             контрольных примеров: ...................

          Заключение .................................

          Список литературы ..........................

                                     


    Данная курсовая написана на языке Пролог в среде  Turbo  Prolog  v

2.0 (русифицированная версия).  В структуре языка заложены возможности

простой и черезвычайно эффективной работы с базами данных,  что позво-

ляет  на его основе создавать различного рода информационно - справоч-

ные системы.  Структура языка Пролог соответствует структуре реляцион-

ных баз данных.  Так отношению в РБД соответствует предикат в Прологе,

элементу - факт, атрибуту отношения - аргумент предиката и т.д. Встро-

енные в Пролог предикаты работы с окнами позволяют создать дружествен-

ный интерфейс для работы пользователя  с  информационно  -  справочной

системой.

     Информационно-справочные системы - это программы-оболочки, служа-

щие для управления массивами и  базами  данных.  В  наш  век  всеобщей

компьютеризации информационно-справочные системы значительно облегчают

труд человека во всех отраслях народного хозяйства. Значительно упрос-

тилась  работа  московской  милиции по обнаружению угнаного транспорта

после создания в Москве компьютерных баз данных по  угнаным  автомоби-

лям.  Бухгалтерам  предприятий  и фирм теперь не нужно перебирать горы

бумаг,  чтобы получить все данные о сотруднике:  достаточно  загрузить

информационно-справочную  систему и она в удобной форме выдаст всю не-

обходимую информацию.

     Области применения информационно-справочных систем воистину безг-

раничны: это ведение статистики удоя скота на ферме, составление ката-

логов книг в библиотеках и произведений искусства в музеях,  сбор дан-

ных о наличии рабочих вакансий в данном регеоне и многие другие.

     Одним из  способов програмной реализации информационно-справочной

системы является использование для ее создания языка логического прог-

раммирования  Пролог.  В  данной реализации языка содержится множество

встроенных предикатов, существенно облегчающих написание таких систем.

     База данных в простейшем случае - упорядоченная структура  данных

в  виде  таблицы,  каждая  запись которой может объединять разнотипные

данные,  причем все записи одной базы имеют одинаковую структуру.  Су-

ществуют три модели представления баз данных: иерархическая, сетевая и

реляционная.  В силу особенностей языка Пролог, с его помощью реализу-

ется  реляционная модель.  Каждая строка в базе данных называется эле-

ментом отношения,  каждая колонка - атрибутом  отношения,  колличество

колонок - арностью,  а колличество строк - мощностью. В языке програм-

мирования Пролог атрибуту отношения соответствует аргумент  предиката,

арности  -  колличество аргументов в предикате,  отношению - предикат,

элементу - факт, и мощности - число фактов.

    Исходя из  вышеперечисленных соответствий Пролог является прекрас-

ным средством для реализации реляционных баз данных.

     Все режимы программы активизируются с помощью меню,  которое реа-

лизовано с помощью процедуры mainmenu. Для активизации какого либо ре-

жима пользователю следует  нажать  цифровую  клавишу,  соответствующую

выбранному пункту меню.


  Меню данной программы состоит из девяти пунктов:

     0 - О пpогpамме...       - вывод данных о системе

     1 - коррекция данных     - режим корректировки данных

     2 - удаление данных      - режим удаления данных

     3 - просмотр базы        - режим просмотра базы

     4 - загрузка базы        - режим загрузки базы

     5 - сохранение базы      - режим сохранения базы

     6 - создание новой базы  - режим создания новой базы

     7 - ввод новых данных    - выход из программы

     8 - просмотр-добавление  - просмотр и добавление данных

     9 - выход из программы   - выход

 На следующей странице представлена графическая структура меню.


     Процедуры создавались на основе требований,  изложенных в задании

к курсовой работе.

     С помощью процедуры Nachalo разделе GOAL инициируется начало  вы-

полнения  программы.  Эта процедура запускает процедуру начальной заг-

рузки базы данных Zagruz ,  после чего передает  управление  процедуре

вывода главного меню Mainmenu.

     Эта процедура  выводит  список пунктов главного меню и ожидает от

пользователя ввода числа, которое будет занесено в переменную C. После

этого вызывается процедура обработки основных режимов Rabota , в кото-

рую переменная C передается в качестве аргумента.  В процедуре исполь-

зован предикат Povtor,  в связи с этим после возврата из процедуры Ra-

bota в случае,  если C не равно 7 происходит повторный  вывод  пунктов

меню и ожидание ввода числа.

     Процедура Zagruz предназначена для автоматической загрузки основ-

ной базы данных при запуске программы. Это значительно облегчает рабо-

ту с системой,  так как не требуется при запуске программы  задгружать

основную БД из режима "Загрузка". Процедура Zagruz проверяет существо-

вание на диске файла avto.dat с помощью встроенного предиката existfi-

le и задгружает БД в память с помощью предиката consult.  В случае от-

сутствия файла выдается сообщение об ошибке.

     Данная процедура выводит информацию о языке,  на котором написана

система и данные о создателе.

     Процедура Rabota (1) служит коррекции данных, находящихся в БД, и

внесения новых записей.При активизации процедура запрашивает номер за-

писи и если таковая существует выводит ее значения после  чего  просит

ввести  новые  значения.Если же запись с таковым номером не существует

то процедура выводит сообщение об этом просит повторить  номер  записи

после чего осуществляется ввод новых данных.

     Данная процедура предназначена для удаления записей из базы  дан-

ных.  Удалять можно данные по любому признаку ( для этого используется

предикат Choice1. После выбора признака все записи содержащие его уда-

ляются с помощью встроенного предиката Retract.

   Процедура Rabota (3) выводит содержание базы данных в виде таблицы.

    Данная процедура выводит меню,  содержащее следующие пункты: "База

будет загружена из указанного файла",  " База будет загружена из файла

avto.dat", " Выход в основное меню". Загрузка баз данных осуществляет-

ся процедурой Loadbase,  аргументом которой служит переменная C,  счи-

танная с клавиатуры при вводе пользователем  номера  желаемого  пункта

меню.

     Процедура Rabota  (5)  аналогична Rabota (4).  Для сохранения баз

данных применяется процедура Savebase,  рассмотренная ниже, аргументом

которой является переменная I.


     Данная процедура служит для создания новых баз данных.  Процедура

работает следующим образом: выводится меню выбора признака по которому

будет создана новая БД :

           1 - По марке автомобиля

           2 - По году выпуска

           3 - По району учета

           4 - Выход в основное меню

           =>

    Выбор делается вводом соответствующей цифры после  чего  процедура

передает  управление  процедуре  Rabota1(N)  где  N - номер выбранного

пункта. Процедура Rabota1 будет рассмотрена ниже.

             5.11  Процедура ввода новых данных Rabota(7)

    Процедура предназначена для ввода новых данных в базу.После ее за-

пуска происходит последовательный запрос каждого следующего поля запи-

си.  После введения всех полей записи просисходит возврат к  основному

меню.

            5.12  Процедура просмотра и добавления данных

    Данная процедура  запрашивает  номер  записи и если находит в базе

запись с таковым номером то выводит ее значения  после  нажатия  любой

клавиши происходит возврат к основному меню.

     Если же записи с данным номером нет в базе  то  процедура  просит

повторить ввод номера и после этого производится последовательный ввод

данных.

                                 5.13

    Данная процедура состоит из отсечения,  которое запрещает дальней-

ший перебор.  Процедура оканчивается успехом и  происходит  возврат  в

процедуру Mainmenu,  в которой выполняется условие C=7, благодаря чему

происходит выход из программы.

                                 5.14

    Эта процедура определяет номер желаемой записи после ввода пользо-

вателем  либо собственно номера этой записи,  либо после ввода фамилии

другого поля меню и возвращает этот номер в вызывавшую процедуру.

                                 5.15

    Процедуры Sbros  и  Sbros1  являются  вспомагательными к процедуре

Correct(1).  Они позволяют определить,  следует ли замещать  имеющийся

элемент записи на новый или нет (если была нажата клавиша ).  В

процедурах проверяется,  является ли первый аргумент  пустой  строкой.

Если это так,  то третьему аргумент присваивается второй. Если же пер-

вый аргумент не является пустой строкой,  то он присваивается третьему

аргументу  (в Sbros1 происходит предварительное преобразование строко-

вой переменной в целочисленную).

                                 5.16

      Данная процедура осуществляет загрузку баз данных из  файлов  на

диске по признакам, зависящим от аргумента процедуры: Loadbase(1) заг-


ружает основную БД из файла, заданного пользователем, Loadbase(2) - из

файла  avto.dat В данных процедурах проверяется наличие файла на диске

с помощью предиката existfile и загрузка БД в память с помощью  преди-

ката consult.  В случае отсутствия файла на диске,  выдается соответс-

твующее сообщение.

                                 5.17

     Данная процедура осуществляет сохранение баз данных в  файлах  на

диске по признакам, зависящим от аргумента процедуры: Savebase(1) сох-

раняет основную БД в файле,  заданном пользователем,  Savebase(2) -  в

файле bit.dat. Сохранение БД осуществляется с помощью встроенного пре-

диката save. В случае ошибки выдается соответствующее сообщение .

                    5.18  Процедура Cjrrect(j,i).

     Данная процедура обеспечивает ввод соответствующего поля записи.

                                            


domains

        z,n,dvig,god,n1,shasi,i=integer

        j,mark,znac,fam,ima,otc,ucet=string

database -avto1

          avto1(i,j,i,i,i,j,j,j,j,j)

database -avto2

          avto2(i,j,i,i,i,j,j,j,j,j)

database -avto3

          avto3(i,j,i,i,i,j,j,j,j,j)

database

         avto(i,j,i,i,i,j,j,j,j,j)

        predicates

        nachalo

        mainmenu

        zagruz

        choice1(i)

        correct(i,i)

        rabota(i)

        rabota1(i)

        savebase(i)

        loadbase(i)

        povtor

        sbros(j,j,j)

        sbros1(j,i,i)

goal

        nachalo.

clauses

/*Процедура создания основного меню и загрузки базы данных*/

        nachalo:-

            makewindow(1,7,7,"ТЕХ. ПАСПОРТ АВТОМОБИЛЯ",0,0,25,80),

            clearwindow,zagruz,

            mainmenu.

/*Процедура управления основным меню*/

        mainmenu:-

            povtor,

            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(Vibor),

            Vibor >= 0,

            Vibor < 10,

            clearwindow,

            rabota(Vibor),

            clearwindow,

            Vibor = 9,

            retractall(_),

            removewindow.

/*Процедура поиска и загрузки файла содержащего базу данных*/

        zagruz:-

            existfile("avto.dat"),

            consult("avto.dat"),

            cursor(1,2),

            write("База загружена").

        zagruz:-

            cursor(1,2),

            write("Нет базы на диске").

/*Пpоцедуpа ввода новых данных*/

        rabota(7):-

        makewindow(1,7,7,"Ввод новых данных",0,0,25,80),

            nl,

         WRITE("Введите порядковый номер    :"),readint(K),nl,

         write("Введите МАРКУ               :"),readln(F),nl,

         write("Введите ГОД ВЫПУСКА         :"),readint(Y),nl,

         write("Введите N ДВИГАТЕЛЯ         :"),readint(J),nl,

         write("Введите N ШАССИ             :"),readint(G),nl,

         write("Введите НОМЕРНОЙ ЗНАК       :"),readln(W),nl,

         write("Введите ФАМИЛИЮ             :"),readln(B),nl,

         write("Введите ИМЯ                 :"),readln(C),nl,

         write("Введите ОТЧЕСТВО            :"),readln(D),nl,

         write("Введите РАЙОН УЧЕТА         :"),readln(R),nl,

   N1=K,MARK1=F,GOD1=Y,DVIG1=J,SHASI1=G,ZNAC1=W,

   FAM1=B,IMA1=C,OTC1=D,UCET1=R,

   assertz(avto(N1,MARK1,GOD1,DVIG1,SHASI1,ZNAC1,FAM1,IMA1,OTC1,UCET1)),

   removewindow, fail.

/*Процедура просмотра-добавления*/

        rabota(8):-

         makewindow(1,7,7,"Просмотр-добавление",0,0,25,80),

         nl,

         write("Введите номер записи:"),readint(A),nl,nl,

         avto(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

         A=N,


            write("НОМЕР ЗАПИСИ        :"),write(N),nl,

            write("МАРКА               :"),write(MARK),nl,

            write("ГОД ВЫПУСКА         :"),write(GOD),nl,

            write("N ДВИГАТЕЛЯ         :"),write(DVIG),nl,

            write("N ШАССИ             :"),write(SHASI),nl,

            write("НОМЕРНОЙ ЗНАК       :"),write(ZNAC),nl,

            write("ФАМИЛИЯ             :"),write(FAM),nl,

            write("ИМЯ                 :"),write(IMA),nl,

            write("ОТЧЕСТВО            :"),write(OTC),nl,

            write("РАЙОН УЧЕТА         :"),write(UCET),nl,nl,

            readchar(_),

            removewindow,

            !.

         rabota(8):-

write("Этого номера записи нет в базе."),

write("Повторите введенный номер записи и продолжайте ввод данных"),

nl,nl,nl,

write("Введите номер:"),

         readint(A),nl,

         N1=A,

            write("МАРКА               :"),readln(F),nl,

            write("ГОД ВЫПУСКА         :"),readint(Y),nl,

            write("N ДВИГАТЕЛЯ         :"),readint(J),nl,

            write("N ШАССИ             :"),readint(G),nl,

            write("НОМЕРНОЙ ЗНАК       :"),readln(W),nl,

            write("ФАМИЛИЯ             :"),readln(B),nl,

            write("ИМЯ                 :"),readln(C),nl,

            write("ОТЧЕСТВО            :"),readln(D),nl,

            write("РАЙОН УЧЕТА         :"),readln(R),nl,

   MARK1=F,GOD1=Y,DVIG1=J,SHASI1=G,ZNAC1=W,FAM1=B,IMA1=C,OTC1=D,UCET1=R,

   assertz(avto(N1,MARK1,GOD1,DVIG1,SHASI1,ZNAC1,FAM1,IMA1,OTC1,UCET1)),

         removewindow,

         fail.

/*Пpоцедуpа вывода данных о пpогpамме*/

         rabota(0):-

         makewindow(1,54,7,"О пpогpамме...",5,5,20,50),

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,

write("       Нажмите на любую клавишу"),

         readchar(_),

         removewindow.

/*Процедура удаления записей из базы данных*/

        rabota(2):-

            makewindow(1,7,7,"Удаление записей",0,0,25,80),


            nl,

            choice1(N),

            X=N,

            avto(X,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            retract(avto(X,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET)),!,

            removewindow.

/*Процедура просмотра содержимого базы данных*/

        rabota(3):-

        makewindow(1,7,7,"Просмотp базы",0,0,25,80),

        nl,

write(" ╔═════════════════════════════════════════════════════════╗"),nl,

write(" ║              ТЕХ. ПАСПОРТ АВТОМОБИЛЯ                    ║"),nl,

write(" ╠══╦═════════╦═════╦═════╦═════╦════════╦═══════╦═════════╣"),nl,

write(" ║N°║ МАРКА   ║ ГОД ║ N°  ║ N°  ║ НОМЕРН ║Ф.И.О  ║ РАЙОН   ║"),nl,

write(" ║  ║АВТОМОБИЛ║ВЫПУС║ДВИГ ║ШАССИ║ ЗНАК   ║       ║ УЧЕТА   ║"),nl,

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬═╦═════╬═════════╣"),nl,

           avto(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            cursor(Z,_),cursor(Z,1),write("║"),

            cursor(Z,2),write(N),cursor(Z,4),write("║"),

            cursor(Z,5),write(MARK),cursor(Z,14),write("║"),

            cursor(Z,15),write(GOD),cursor(Z,20),write("║"),

            cursor(Z,21),write(DVIG),cursor(Z,26),write("║"),

            cursor(Z,27),write(SHASI),cursor(Z,32),write("║"),

            cursor(Z,33),write(ZNAC),cursor(Z,41),write("║"),

            cursor(Z,42),write(FAM),cursor(Z,49),write("║"),

            cursor(Z,50),write(IMA),cursor(Z,58),write("║"),

            cursor(Z,59),write(OTC),cursor(Z,66),write("║"),

            cursor(Z,67),write(UCET),

            cursor(Z,76),write("║"),

            nl,

            fail.

        rabota(3):-

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬══╬═══════╬═════════╣"),

nl,

write("Нажмите на любую клавишу"),

           readchar(_),

            removewindow.

/*Процедура загрузки в память базы данных*/

        rabota(4):-

            nl,

            makewindow(2,15,4,"Загрузка",5,5,20,70),

            write("1 - База будет загружена из указанного файла"),nl,

            write("2 - База будет загружена из файла avto.dat"),nl,

            write("3 - Выход в основное меню"),nl,

            write("==>"),

            readint(C),

            C>0,C<4,

            loadbase(C),

            !,

            removewindow.


/*Процедура сохранения базы данных*/

        rabota(5):-

            nl,

            makewindow(2,15,4,"Запись",5,5,20,70),

            write("1 - База будет записана в указанный файл"),nl,

            write("2 - База будет записана в файл avto.dat"),nl,

            write("3 - Выход в основное меню"),nl,

            write("==>"),

            readint(I),

            I>0,I<4,

            savebase(I),!,

            removewindow.

 /*Процедура выбора создания новой базы*/

        rabota(6):-

            nl,

            makewindow(3,7,7,"Создание новой базы",0,0,25,80),

            write(" 1 - По марке автомобиля"),nl,

            write(" 2 - По году выпуска"),nl,

            write(" 3 - По району учета"),nl,

            write(" 4 - Выход в основное меню"),nl,

            write("==>"),

            readint(O),

            O>0,O<5,

            rabota(O),

            removewindow.

/*Процедура изменения содержимого записей базы данных*/

        rabota(1):-

        makewindow(1,7,7,"Коppекция данных",0,0,25,80),

            nl,

            choice1(N),

            X=N,

            avto(X,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            write("НОМЕР ЗАПИСИ        :"),write(N),nl,

            write("МАРКА               :"),write(MARK),nl,

            write("ГОД ВЫПУСКА         :"),write(GOD),nl,

            write("N ДВИГАТЕЛЯ         :"),write(DVIG),nl,

            write("N ШАССИ             :"),write(SHASI),nl,

            write("НОМЕРНОЙ ЗНАК       :"),write(ZNAC),nl,

            write("ФАМИЛИЯ             :"),write(FAM),nl,

            write("ИМЯ                 :"),write(IMA),nl,

            write("ОТЧЕСТВО            :"),write(OTC),nl,

            write("РАЙОН УЧЕТА         :"),write(UCET),nl,nl,

            write("Введите МАРКУ             :"),readln(MARK1),nl,

            write("Введите ГОД ВЫПУСКА       :"),readln(GOD1),nl,

            write("Введите N ДВИГАТЕЛЯ       :"),readln(DVIG1),nl,

            write("Введите N ШАССИ           :"),readln(SHASI1),nl,

            write("Введите НОМЕРНОЙ ЗНАК     :"),readln(ZNAC1),nl,

            write("Введите ФАМИЛИЮ           :"),readln(FAM1),nl,

            write("Введите ИМЯ               :"),readln(IMA1),nl,

            write("Введите ОТЧЕСТВО          :"),readln(OTC1),nl,

            write("Введите РАЙОН УЧЕТА       :"),readln(UCET1),nl,


            X1=X,

            retract(avto(X,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET)),

            sbros(MARK1,MARK,MARK2),

            sbros1(GOD1,GOD,GOD2),

            sbros1(DVIG1,DVIG,DVIG2),

            sbros1(SHASI1,SHASI,SHASI2),

            sbros(ZNAC1,ZNAC,ZNAC2),

            sbros(FAM1,FAM,FAM2),

            sbros(IMA1,IMA,IMA2),

            sbros(OTC1,OTC,OTC2),

            sbros(UCET1,UCET,UCET2),

            assertz(avto(X1,MARK2,GOD2,DVIG2,SHASI2,ZNAC2,FAM2,

                                                 IMA2,OTC2,UCET2)),

            !,

            removewindow.

            rabota(_).

      sbros("",MARK,MARK2):-

            MARK2=MARK,

            !.

      sbros(MARK1,_,MARK2):-

            MARK2=MARK1,

            !.

      sbros1("",MARK,MARK2):-

            MARK2=MARK,

            !.

      sbros1(MARK1,_,MARK2):-

            str_int(MARK1,MARK3),

            MARK2=MARK3,

            !.

/*Процедура создания новой базы данных и ее сохранения*/

      rabota1(1):-

  makewindow(1,7,7,"Создание новой базы по марке автомобиля",0,0,25,80),

            nl,

            cursor(7,10),

            retractall(_,avto1),

            nl,

            write("Введите марку автомобиля:"),

            readln(X),

            avto(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            S=MARK,

            S=X,

            N1=N,GOD1=GOD,DVIG1=DVIG,SHASI1=SHASI,

            ZNAC1=ZNAC,FAM1=FAM,IMA1=IMA,OTC1=OTC,UCET1=UCET,

            assert(avto1(N1,S,GOD1,DVIG1,SHASI1,ZNAC1,FAM1,

                                          IMA1,OTC1,UCET1)),

            fail.


     rabota1(1):-

write("База создана"),nl,

write("╔═════════════════════════════════════════════════════════╗"),nl,

write("║              ТЕХ. ПАСПОРТ АВТОМОБИЛЯ                    ║"),nl,

write("╠══╦═════════╦═════╦═════╦═════╦═══════╦════════╦═════════╣"),nl,

write("║N°║ МАРКА   ║ ГОД ║ N°  ║ N°  ║ НОМЕРН║Ф. И. О ║ РАЙОН   ║"),nl,

write("║  ║АВТОМОБИЛ║ВЫПУС║ДВИГ ║ШАССИ║ ЗНАК  ║        ║ УЧЕТА   ║"),nl,

write("╠══╬═════════╬═════╬═════╬═════╬═══════╬════════╬═════════╣"),nl,

            avto1(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            cursor(Z,_),cursor(Z,1),write("║"),

            cursor(Z,2),write(N),cursor(Z,4),write("║"),

            cursor(Z,5),write(MARK),cursor(Z,14),write("║"),

            cursor(Z,15),write(GOD),cursor(Z,20),write("║"),

            cursor(Z,21),write(DVIG),cursor(Z,26),write("║"),

            cursor(Z,27),write(SHASI),cursor(Z,32),write("║"),

            cursor(Z,33),write(ZNAC),cursor(Z,41),write("║"),

            cursor(Z,42),write(FAM),cursor(Z,49),write("║"),

            cursor(Z,50),write(IMA),cursor(Z,58),write("║"),

            cursor(Z,59),write(OTC),cursor(Z,66),write("║"),

            cursor(Z,67),write(UCET),

            cursor(Z,76),write("║"),

            nl,

            fail.

        rabota1(1):-

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬════════╬═════════╣"),

            save("avto1.dat",avto1),

            nl,

            write("База сохранена в файле avto1.dat"),

            nl,

            write("Нажмите любую клавишу"),

            readchar(_),

            removewindow,

            !.

        rabota1(1):-

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬═══════╬═════════╣"),

            nl,

            write("Невозможно сохранить созданную базу"),

            nl,

            write("Нажмите любую клавишу"),

            readchar(_),

            makewindow(1,7,7,"ТЕХ. ПАСПОРТ АВТОМОБИЛЯ",0,0,25,80).

            rabota1(2):-

   makewindow(1,7,7,"Создание новой базы по году выпуска",0,0,25,80),

            nl,

            cursor(7,10),

            retractall(_,avto2),

            nl,

            write("Введите год выпуска автомобиля:"),


            readint(X),

            avto(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            S=GOD,

            S=X,

            N1=N,MARK1=MARK,DVIG1=DVIG,SHASI1=SHASI,ZNAC1=ZNAC,FAM1=FAM,

                     IMA1=IMA,OTC1=OTC,UCET1=UCET,

            assert(avto2(N1,MARK1,S,DVIG1,SHASI1,ZNAC1,FAM1,IMA1,

                       OTC1,UCET1)),

            fail.

        rabota1(2):-

write("База создана"),nl,

write(" ╔════════════════════════════════════════════════════════╗"),nl,

write(" ║              ТЕХ. ПАСПОРТ АВТОМОБИЛЯ                   ║"),nl,

write(" ╠══╦═════════╦═════╦═════╦═════╦════════╦══════╦═════════╣"),nl,

write(" ║N°║ МАРКА   ║ ГОД ║ N°  ║ N°  ║ НОМЕРН ║Ф И О ║ РАЙОН   ║"),nl,

write(" ║  ║АВТОМОБИЛ║ВЫПУС║ДВИГ ║ШАССИ║ ЗНАК   ║      ║ УЧЕТА   ║"),nl,

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬══════╬═════════╣"),nl,

            avto2(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            cursor(Z,_),cursor(Z,1),write("║"),

            cursor(Z,2),write(N),cursor(Z,4),write("║"),

            cursor(Z,5),write(MARK),cursor(Z,14),write("║"),

            cursor(Z,15),write(GOD),cursor(Z,20),write("║"),

            cursor(Z,21),write(DVIG),cursor(Z,26),write("║"),

            cursor(Z,27),write(SHASI),cursor(Z,32),write("║"),

            cursor(Z,33),write(ZNAC),cursor(Z,41),write("║"),

            cursor(Z,42),write(FAM),cursor(Z,49),write("║"),

            cursor(Z,50),write(IMA),cursor(Z,58),write("║"),

            cursor(Z,59),write(OTC),cursor(Z,66),write("║"),

            cursor(Z,67),write(UCET),

            cursor(Z,76),write("║"),

            nl,

            fail.

        rabota1(2):-

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬════════╬═════════╣"),

            save("avto2.dat",avto2),

            nl,

            write("База сохранена в файле avto2.dat"),

            nl,

            write("Нажмите любую клавишу"),

            readchar(_),

            removewindow,

            !.

        rabota1(2):-

write(" ╠══╬═════════╬═════╬═════╬═════╬═══════╬═══════╬═════════╣"),

            nl,

            write("Невозможно сохранить созданную базу"),

            nl,

            write("Нажмите любую клавишу"),

            readchar(_),

            makewindow(1,7,7,"ТЕХ. ПАСПОРТ АВТОМОБИЛЯ",0,0,25,80).


            rabota1(3):-

   makewindow(1,7,7,"Создание новой базы по району учета",0,0,25,80),

            nl,

            cursor(7,10),

            retractall(_,avto3),

            nl,

            write("Введите район учета:"),

            readln(X),

            avto(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            S=UCET,

            S=X,

            N1=N,MARK1=MARK,GOD1=GOD,DVIG1=DVIG,SHASI1=SHASI,

                          ZNAC1=ZNAC,FAM1=FAM,IMA1=IMA,OTC1=OTC,

            assert(avto3(N1,MARK1,GOD1,DVIG1,SHASI1,ZNAC1,FAM1,

                                           IMA1,OTC1,S)),

            fail.

        rabota1(3):-

write("База создана"),nl,

write(" ╔══════════════════════════════════════════════════════╗"),nl,

write(" ║               ТЕХ. ПАСПОРТ АВТОМОБИЛЯ                ║"),nl,

write(" ╠══╦═════════╦═════╦═════╦═════╦══════╦══════╦═════════╣"),nl,

write(" ║N°║ МАРКА   ║ ГОД ║ N°  ║ N°  ║НОМЕРН║Ф И О ║ РАЙОН   ║"),nl,

write(" ║  ║АВТОМОБИЛ║ВЫПУС║ДВИГ ║ШАССИ║ ЗНАК ║      ║ УЧЕТА   ║"),nl,

write(" ╠══╬═════════╬═════╬═════╬═════╬══════╬══════╬═════════╣"),nl,

            avto3(N,MARK,GOD,DVIG,SHASI,ZNAC,FAM,IMA,OTC,UCET),

            cursor(Z,_),cursor(Z,1),write("║"),

            cursor(Z,2),write(N),cursor(Z,4),write("║"),

            cursor(Z,5),write(MARK),cursor(Z,14),write("║"),

            cursor(Z,15),write(GOD),cursor(Z,20),write("║"),

            cursor(Z,21),write(DVIG),cursor(Z,26),write("║"),

            cursor(Z,27),write(SHASI),cursor(Z,32),write("║"),

            cursor(Z,33),write(ZNAC),cursor(Z,41),write("║"),

            cursor(Z,42),write(FAM),cursor(Z,49),write("║"),

            cursor(Z,50),write(IMA),cursor(Z,58),write("║"),

            cursor(Z,59),write(OTC),cursor(Z,66),write("║"),

            cursor(Z,67),write(UCET),

            cursor(Z,76),write("║"),

            nl,

            fail.

        rabota1(3):-

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬════════╬═════════╣"),

            save("avto3.dat",avto3),

            nl,

            write("База сохранена в файле avto3.dat"),

            nl,

            write("Нажмите любую клавишу"),

            readchar(_),

            removewindow,

            !.

        rabota1(3):-

write(" ╠══╬═════════╬═════╬═════╬═════╬════════╬════════╬═════════╣"),

            nl,


            write("Невозможно сохранить созданную базу"),

            nl,

            write("Нажмите любую клавишу"),

            readchar(_),

            makewindow(1,7,7,"ТЕХ. ПАСПОРТ АВТОМОБИЛЯ",0,0,25,80).

/*Процедура записи на диск*/

        savebase(1):-

            write("Введите имя файла :"),

            readln(N),

            save(N),

            write("Все в порядке"),

            beep,

            !.

        savebase(1):-

            write("Ошибка обмена, нажмите любую клавишу"),

            readchar(_).

        savebase(2):-

            save("avto.dat").

        savebase(3).

/*Процедура чтения с диска*/

        loadbase(1):-

            retractall(_),

            write("Введите имя файла :"),

            readln(N),

            existfile(N),

            consult(N),

            write("Все в порядке"),

            beep,

            !.

        loadbase(1):-

            nl,

            write("Данного файла нет на диске"),nl,

            write("Нажмите любую клавишу"),

            readchar(_).

        loadbase(2):-

            retractall(_),

            existfile("avto.dat"),

            consult("avto.dat"),

            write("Все в порядке"),

            beep,

            !.

        loadbase(2):-

            write("Файла avto.dat нет на диске"),nl,

            write("нажмите любую клавишу"),

            readchar(_).


        loadbase(3).

        povtor.

        povtor:- povtor.

/*Выбор записи*/

        choice1(N):-

        nl,

        write("1 - известен номер записи   "),nl,

        write("2 - известна МАРКА          "),nl,

        write("3 - известен ГОД ВЫПУСКА    "),nl,

        write("4 - известен N ДВИГАТЕЛЯ    "),nl,

        write("5 - известен N ШАССИ        "),nl,

        write("6 - известен НОМЕРНОЙ ЗНАК  "),nl,

        write("7 - известна ФАМИЛИЯ        "),nl,

        write("8 - известно ИМЯ            "),nl,

        write("9 - известно ОТЧЕСТВО       "),nl,

        write("10- известен РАЙОН УЧЕТА    "),nl,

        write("=>"),

        readint(X),

        correct(X,N).

        correct(1,N):-

        nl,

        write("Введите номер записи                :"),

        readint(N),

        avto(M,_,_,_,_,_,_,_,_,_),

        M=N.

        correct(1,N):-

        N=0.

        correct(2,N):-

        nl,

        write("Введите марку автомобиля  :"),

        readln(L),

        avto(Z,L,_,_,_,_,_,_,_,_),

        N=Z.

        correct(2,N):-

        N=0.

        correct(3,N):-

        nl,

        write("Введите Год выпуска    : "),

        readint(F),

        avto(Z,_,F,_,_,_,_,_,_,_),

        N=Z.

        correct(3,N):-

        N=0.

        correct(4,N):-

        nl,


        write("Введите N двигателя  :"),

        readint(Q),

        avto(Z,_,_,Q,_,_,_,_,_,_),

        N=Z.

        correct(4,N):-

        N=0.

        correct(5,N):-

        nl,

        write("Введите N шасси   :"),

        readint(W),

        avto(Z,_,_,_,W,_,_,_,_,_),

        N=Z.

        correct(5,N):-

        N=0.

      correct(6,N):-

        nl,

        write(":"),

        readln(ZNAC),

        avto(Z,_,_,_,_,ZNAC,_,_,_,_),

        N=Z.

        correct(6,N):-

        N=0.

          correct(7,N):-

          nl,

          write(":"),

          readln(FAM),

          avto(Z,_,_,_,_,_,FAM,_,_,_),

        N=Z.

        correct(7,N):-

        N=0.

          correct(8,N):-

          nl,

          write(":"),

          readln(IMA),

          avto(Z,_,_,_,_,_,_,IMA,_,_),

          N=Z.

          correct(8,N):-

          N=0.

          correct(9,N):-

          nl,

          write(":"),

          readln(OTC),

          avto(Z,_,_,_,_,_,_,_,OTC,_),

          N=Z.


          correct(9,N):-

          N=0.

          correct(10,N):-

          nl,

          write(":"),

          readln(UCET),

          avto(Z,_,_,_,_,_,_,_,_,UCET),

          N=Z.

     Программа "Технический паспорт автомобиля" представляет собой ин-

формационно-справочную систему. В данной программе имеется возможность

создания  новых  баз данных,  являющихся списком записей отобранных по

выбираемому пользователем признаку.  В основной БД присутствуют данные

о  марке,годе выпуска,номере двигателя и шасси,номерном знаке,фамилии,

имени и отчестве владельца,а также районе учета. В дочерней БД имеются

те же данные но для одного конкретного признака,как-то марка автомоби-

ля ,  год выпуска и район учета.Создание баз данных по остальным приз-

накам  было  признано нецелесообразным т.к.  очень мала вероятность их

совпадения.

        При запуске программы на экран выводится главное меню:

                         0 - О пpогpамме...

                         1 - коррекция данных

                         2 - удаление данных

                         3 - просмотр базы

                         4 - загрузка базы

                         5 - сохранение базы

                         6 - создание новой базы

                         7 - ввод новых данных

                         8 - просмотр-добавление

                         9 - выход из программы

     Для выбора какого-либо пункта следует нажать соответствующую циф-

ровую клавишу.

     При выборе данного пункта на экран выводятся данные о  системе  и

ее  авторе.  После нажатия на любую клавишу происходит выход в главное

меню.

                           Выводится меню:

                      1 - известен номер записи

                      2 - известна МАРКА

                      3 - известен ГОД ВЫПУСКА

                      4 - известен N ДВИГАТЕЛЯ

                      5 - известен N ШАССИ

                      6 - известен НОМЕРНОЙ ЗНАК

                      7 - известна ФАМИЛИЯ

                      8 - известно ИМЯ

                      9 - известно ОТЧЕСТВО

                      10- известен РАЙОН УЧЕТА


     Следует ввести цифру соответствующего пункта. После этого система

запросит  соответственно номер и т.д.  Данные следует вводить в том же

виде в каком они емеются в базе данных (такое же сочетание строчных  и

заглавных букв). После определения корректируемой записи система выво-

дит на экран все данные об этом автомобиле и позволяет их отредактиро-

вать,  последовательно распечатывая поля записи. Если данные в текущем

поле исправлять не требуется, следует нажать клавишу .

     Данный режим служит для удаления записей из базы данных.  Как и в

подпункте "Крректировка данных" пользователю  предоставляется  возмож-

ность ввести необходимое поле записи. После ввода этих данных произой-

дет удаление выбранной записи.

     Данный режим предназначен для просмотра содержимого имеющихся баз

данных. На экран выводится таблица всех записей текущей базы.

    Данный режим  предназначен для загрузки баз данных из файлов.  При

входе в этот пункт выводится меню:

          1 - База будет загружена из указанного файла

          2 - База будет загружена из файла avto.dat

          3 - Выход в основное меню

     При выборе пунктов 1 и 2 произойдет загрузка  соответственно  ос-

новной  и  дочерней  БД  из стандартного файла avto.dat или указанного

пользователем файла,  в случае удачной загрузки будет выдано соответс-

твующее  сообщение.  После нажатия на любую клавишу произойдет выход в

главное меню.

       Пункт 3 предназначен для  выхода в главное меню.

       Данный режим предназначен для сохранения баз данных.  При входе

в данный режим выводится следующее меню:

          1 - База будет записана в указанный файл

          2 - База будет записана в файл avto.dat

          3 - Выход в основное меню

     Работа с его пунктами полностью аналогична работе с подменю режи-

ма "Загрузка базы".

     Данный режим предназначен для создания дочерних баз  данных.  При

запуске этого режима выводитсяь меню:

           1 - По марке автомобиля

           2 - По году выпуска

           3 - По району учета

           4 - Выход в основное меню

     Вводом соответствующей цифры производится выбор нужного параметра

для создания новой базы.После чего производится  его  ввод.Новые  базы

сохраняются  автоматически  соответственно  в  файлах avto1.dat ,  av-

to2.dat ,  avto3.dat и содержат все записи имеющие одинаковый заданный

параметр.


    Пункт 4 производит возвращение к основному меню.

    Этот пункт меню предназначен для выхода из  информационно-справоч-

ной системы в ДОС.

    В целях конечной отладки программы и устранения скрытых ошибок бы-

ло решено несколько контрольных примеров по работе с системой во  всех

режимах. Была создана и отредактирована основная база данных. с ее по-

мощью были опробованы режимы удаления,  корректировки,  создания новой

БД,  загрузки и сохранения БД. При решении контрольных примеров ошибок

в программе не обнаружено.

    В данной  курсовой работе были исследованы возможности языка прог-

раммирования Пролог для создания информационно-справочных систем. Мож-

но сделать вывод, что Пролог представляет богатые возможности для реа-

лизации таких систем и написания дружественного интерфейса для общения

пользователя с программой.

                             2ЛИТЕРАТУРА:

         И.Братко   "Программирование на языке Пролог для

                     искусственного интеллекта"

         Дж.Доорс   "Пролог - язык программирования будущего"

         Ю.Тихонов  "МПролог - язык логического

                     программирования. Версия 2.3"