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

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

Информационно-справочные системы предназначены для управления различными информационными и справочными массивами, в число которых входят и базы данных. Эти системы организовывают определенный интерфейс пользователя с функциями обработки информации самой системы. Набор возможностей таких систем обычно включает в себя коррекцию структуры используемого объекта (инкапсулирующего информацию), работа с его составляющими - дополнение, редактирование, удаление (в случае, когда роль такого объекта выполняет база данных, это - записи), простой просмотр, поиск элементов. Также необходимо обеспечить для такой системы и функции постоянного надежного хранения - в простейшем случае, это - запись базы из памяти в файл на диске и считывание оного с диска в память.

Программная реализация мало отличается от подобной концепции, но конкретизирует абстрактные операции в конкретные процедуры и функции (или же объекты) и зависит полностью от возможностей языка, поставленной задачи и искусства программиста. 2. Базы данных и способы их представления. Общая концепция теории простых баз данных подразумевает наличие некоторого множества таблиц и являющихся, собственно, базой данных, имеющей определенный идентификатор (имя). Каждая таблица состоит из n -го количества записей (величина n зависит от возможностей конкретной системы), каждая из которых имеет одну и ту же структуру (в рамках одной таблицы) и может объединять в себе несколько разнородных объектов (их количество также зависит целиком и полностью от возможностей системы). Работа с базой данных предполагает в себе возможность работать с записями (либо изменять структуру таблиц). В языке программирования Пролог база данных описывается в отдельном разделе, именуемом database . Таких разделов может быть несколько в одной программе и каждый из них, если они действительно представляют собой разные БД, должны иметь разные имена. В случае отсутствия имени у базы данных, ей дается имя по умолчанию - dbasedom . Работу с загружаемыми базами данных в Прологе реализуют следующие стандартные предикаты: assert - добавить запись в БД, retract - удалить указанную запись, save - сохранить указанную БД в файле, consult - загрузить БД из файла в память. В данной работе объявлена главная база данных bd , имеющая предикат characteristick, и две временные базы b1, b2 с предикатами table1, table2 . 3. Разработка системного меню.

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

Разработка меню отталкивается от имеющихся функций системы (предикатов). Поскольку объявлен предикат do (char) , служащий буфером между системным меню и существующими процедурами, он имеет в себе либо подменю с выбором режимов работы имеющихся предикатов, либо их вызов с последующим возвратом в системное меню : +-------------- Системное меню --------------+ ¦ Выберите вариант работы с базами данных: ¦ ¦ ¦ ¦ 1 :- Загрузить ¦ ¦ 2 :- Сохранить ¦ ¦ 3 :- Просмотреть ¦ ¦ 4 :- Скорректировать ¦ ¦ 5 :- Удалить запись по признакам ¦ ¦ 6 :- Создать по признакам ¦ ¦ 7 :- Добавить ¦ ¦ 8 :- Выход в ДОС ¦ ¦ ¦ ¦ ------------------| |------------------ ¦ +--------------------------------------------+ 4. Разработка структуры программы.

Системное меню вызывает только предикаты do ( режим > ), определенные для каждой из необходимых задач (номер режим полностью совпадает с нумерацией в главном меню). Каждая из реализаций этого предиката выводит меню, либо сразу вызывает соответствующие процедуры: open, store, adding, correct, see, del, indication . Процедура Indication выводит дополнительное подменю и вызывает либо IndicationB1 , либо IndicationB2 в зависимости от выбора пользователя . Do(‘8’) завершает работу с системой. 5. Разработка процедур: 5.1. Загрузка базы данных ( Open ). В do(‘1’) имеется меню: +--------- Загрузить --------+ ¦ Куда загрузить ? ¦ ¦ ¦ ¦ 1 :- В bd ¦ ¦ 2 :- В b1 ¦ ¦ 3 :- В b2 ¦ ¦ 4 :- Меню ¦ ¦ ¦ ¦ ------| |------ ¦ +----------------------------+ процедура Open имеет четыре реализации, для каждого из вариантов работы. Для любого случая перед загрузкой базы данных проверяется существование файла с введенным именем (предикат exists ). Для загрузки базы данных используется стандартный предикат consult . При вызове Open(‘1’) загрузка производится в базу bd , при вызове Open(‘ 2 ’) в базу b1 , при вызове Open(‘3’) - в b2 . 5.2. Сохранение ( Store ). В do(‘2’) : +--------- Сохранить --------+ ¦ Что сохранить ? ¦ ¦ ¦ ¦ 1 :- bd ¦ ¦ 2 :- b1 ¦ ¦ 3 :- b2 ¦ ¦ 4 :- Меню ¦ ¦ ¦ ¦ ------| |------ ¦ +----------------------------+ С уществуют предикаты для записи главной базы и двух временных.

Используется стандартный предикат save , записывающий в текстовый файл факты, связанные с данной БД. 5.3. Просмотр ( See) . В do(‘3’) меню: +-------- Просмотреть -------+ ¦ Что просмотреть ? ¦ ¦ ¦ ¦ 1 :- bd ¦ ¦ 2 :- b1 ¦ ¦ 3 :- b2 ¦ ¦ 4 :- Меню ¦ ¦ ¦ ¦ ------| |------ ¦ +----------------------------+ Предложения See(‘1’) и See(‘2’) создают новые окна и выводят в них найденные записи. После каждой выведенной записи запрашивается нажатие клавиши, затем повторяется поиск с помошью стандартного предиката Fail или происходит выход из предиката в системное меню. 5.4. Добавление ( Adding) . Данный предикат был добавлен в программу по причине облегчения работы с ней, хоть и в задании его не было. В этой процедуре используется определенная в этой же программе процедура Get , запрашивающая с клавиатуры значения для новой записи в главной базе данных и стандартная процедура assert , добавляющая новый факт в базу данных. 5.5. Корректировка ( Correct) . В данной программе существует два варианта корректировки - редактирование записи, найденной по номеру артикула и найденной по названию детали. В каждой из версий предиката вначале запрашивается номер артикула (или название) изменяемой записи, поиск и вывод на экран, затем происходит ввод новых значений полей, подтверждаются сделанные изменения, удаляется старый факт ( retract ) и добавляется вновь сформированный ( assert ). 5.6. Создания базы по признакам ( Indication) . Indication(‘1’) создает базу b1 , а Indication(‘2’) - базу b2 . Для каждой базы существует отдельный предикат - IndicationB1 и IndicationB2 . Существуют возможности создания таких баз по следующим признакам: по месту хранения, по цене, по дате поступления. В каждом из вариантов производится запрос на несколько параметров сразу и поиск фактов, отвечающих этим требованиям. При успешном поиске, найденный факт добавляется в базу b1 или b2 . 5.7. Удаление записи по признакам ( Del). Признаками для удаляемой записи могут служить номер артикула, название, а также возможно уничтожить из памяти всю базу данных. Во всех вариантах используется процедура удаления записи retract . 6. Листинг. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % Пакостина Александра. % % ИР-1-95. % % Задание 11. % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% domains artikul = integer cex, sklad = integer name = string rubley, kopeek = integer year, month, day = integer placedom = place(cex, sklad) pricedom = price(rubley, kopeek) datedom = date(year, month, day) database - bd characteristick(artikul, placedom, name, pricedom, datedom) database - b1 table1(artikul, placedom, name, pricedom, datedom) database - b2 table2(artikul, placedom, name, pricedom, datedom) predicates windows go do(char) open(char) store(char) adding correct(char) indication(char) indicationB1(char) indicationB2(char) see(char) del(char) exists(string) show(artikul, placedom, name, pricedom, datedom) get(artikul, placedom, name, pricedom, datedom) goal windows, go. clauses characteristick(1,place(5,6),'Gayka',price(0,45),date(1996,1,4)). characteristick(2,place(6,7),'Vint',price(0,65),date(1996,2,45)). windows :- makewindow(1,52,0,'',24,0,1,80), write(' Пакостина Александра.'), makewindow(2,52,0,'',0,0,1,80), write(' Система управления базой данных 'Характеристика детали''), makewindow(3,112,1,' Системное меню ',2,17,14,46), nl, write(' Выберите вариант работы с базами данных:'), nl, 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, nl, write(' ------------------| |------------------'), framewindow(126). go :- gotowindow(3), cursor(11,21), readchar(X), do(X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% do('1') :- makewindow(4,18,1,' Загрузить ',5,25,10,30), framewindow(19), nl, write(' Куда загрузить ?'), nl, nl, write(' 1 :- В bd'), nl, write(' 2 :- В b1'), nl, write(' 3 :- В b2'), nl, write(' 4 :- Меню'), nl, nl, write(' ------| |------'), cursor(7,13), readchar(X), open(X), removewindow, go, !. do('2') :- makewindow(4,18,1,' Сохранить ',5,25,10,30), framewindow(19), nl, write(' Что сохранить ?'), nl, nl, write(' 1 :- bd'), nl, write(' 2 :- b1'), nl, write(' 3 :- b2'), nl, write(' 4 :- Меню'), nl, nl, write(' ------| |------'), cursor(7,13), readchar(X), store(X), removewindow, go, !. do('3') :- makewindow(4,18,1,' Просмотреть ',5,25,10,30), framewindow(19), write(' Что просмотреть ?'), nl, nl, write(' 1 :- bd'), nl, write(' 2 :- b1'), nl, write(' 3 :- b2'), nl, write(' 4 :- Меню'), nl, nl, write(' ------| |------'), cursor(7,13), readchar(X), see(X), removewindow, go, !. do('4') :- makewindow(4,18,1,' Корректировка ',5,25,9,30), framewindow(19), write(' Способ нахождения записи: '), nl, nl, write(' 1 :- по номеру артикула'), nl, write(' 2 :- по названию'), nl, write(' 3 :- Меню'), nl, nl, write(' ------| |------'), cursor(6,13), readchar(X), correct(X), removewindow, go, !. do('5') :- makewindow(4,18,1,' Удаление записи по признаку ',5,25,10,30), framewindow(19), write(' Введите признак:'), nl, nl, write(' 1 :- По артикулу'), nl, write(' 2 :- По названию'), nl, write(' 3 :- Удалить всю базу'), nl, write(' 4 :- Меню'), nl, nl, write(' ------| |------'), cursor(7,13), readchar(X), del(X), removewindow, go, !. do('6') :- makewindow(4,18,1,' Создать базу по признаку ',5,25,9,30), framewindow(19), write(' Какую базу создать ?'), nl, nl, write(' 1 :- B1'), nl, write(' 2 :- B2'), nl, write(' 3 :- Меню'), nl, nl, write(' ------| |------'), cursor(6,13), readchar(X), indication(X), removewindow, go, !. do('7') :- makewindow(4,18,1,' Добавить запись к главной базе ',7,10,13,60), framewindow(19), adding, removewindow, go, !. do('8') :- makewindow(4,95,1,'Запрос',10,29,5,22), nl, framewindow(94), write(' Выйти ? (Yes/No)'), readchar(X), X='y', exit; removewindow, go, !. do(_) :- makewindow(4,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, go. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% open('1') :- makewindow(5,95,1,'Загрузка bd',7,20,10,40), framewindow(94), nl, write(' Имя файла : '), readln(FN), exists(FN), consult(FN, bd), nl, write(' Загружено'), readchar(_), removewindow, !. open('2') :- makewindow(5,95,1,'Загрузка b1',7,20,10,40), framewindow(94), nl, write(' Имя файла : '), readln(FN), exists(FN), consult(FN, b1), nl, write(' Загружено'), readchar(_), removewindow, !. open('3') :- makewindow(5,95,1,'Загрузка b2',7,20,10,40), framewindow(94), nl, write(' Имя файла : '), readln(FN), exists(FN), consult(FN, b2), nl, write(' Загружено'), readchar(_), removewindow, !. open('4') :- !. open(_) :- makewindow(5,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, do('1'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% store('1') :- makewindow(5,95,1,'Сохранение bd',7,20,10,40), framewindow(94), nl, write(' Имя файла : '), readln(FN), save(FN, bd), nl, write(' Сохранено'), readchar(_), removewindow, !. store('2') :- makewindow(5,95,1,'Сохранение b1',7,20,10,40), framewindow(94), nl, write(' Имя файла : '), readln(FN), save(FN, b1), nl, write(' Сохранено'), readchar(_), removewindow, !. store('3') :- makewindow(5,95,1,'Сохранение b2',7,20,10,40), framewindow(94), nl, write(' Имя файла : '), readln(FN), save(FN, b2), nl, write(' Сохранено'), readchar(_), removewindow, !. store('4') :- !. store(_) :- makewindow(5,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, do('2'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% see('1') :- makewindow(5,95,1,' Просмотр bd ',7,10,9,60), framewindow(94), nl, characteristick(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), show(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), nl,nl,write('Нажмите ENTER для продолжения...'), readchar(_), nl, fail. see('1') :- removewindow, removewindow, do('3'), !. see('2') :- makewindow(5,95,1,' Просмотр b1 ',7,10,9,60), framewindow(94), nl, table1(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), show(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), nl,nl,write('Нажмите ENTER для продолжения...'), readchar(_), nl, fail. see('2') :- removewindow, removewindow, do('3'), !. see('3') :- makewindow(5,95,1,' Просмотр b2 ',7,10,9,60), framewindow(94), nl, table2(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), show(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), nl,nl,write('Нажмите ENTER для продолжения...'), readchar(_), nl, fail. see('3') :- removewindow, removewindow, do('3'), !. see('4') :- !. see(_) :- makewindow(5,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, do('3'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% correct('1') :- makewindow(5,95,1,' Корректировка записи, найденной по артикулу ',7,10,13,60), framewindow(94), write('Номер артикула: '), readint(X), characteristick(X,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), nl, write('Старая запись:'), nl, nl, show(X,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), nl, nl, write('Введите новый вариант:'), nl, nl, get(ArtD,place(NCD,NSD),NameD,price(RubD,KopD),date(YearD,MonD,DayD)), nl, clearwindow, retract(characteristick(X,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day))), assert(characteristick(ArtD,place(NCD,NSD),NameD,price(RubD,KopD),date(YearD,MonD,DayD))), removewindow, removewindow, do('4'), !. correct('1') :- removewindow, removewindow, do('4'), !. correct('2') :- makewindow(5,95,1,' Корректировка записи, найденной по названию ',7,10,13,60), framewindow(94), write('Название: '), readln(X), characteristick(Art,place(NC,NS),X,price(Rub,Kop),date(Year,Mon,Day)), nl, write('Старая запись:'), nl, nl, show(Art,place(NC,NS),X,price(Rub,Kop),date(Year,Mon,Day)), nl, nl, write('Введите новый вариант:'), nl, nl, get(ArtD,place(NCD,NSD),NameD,price(RubD,KopD),date(YearD,MonD,DayD)), nl, clearwindow, retract(characteristick(Art,place(NC,NS),X,price(Rub,Kop),date(Year,Mon,Day))), assert(characteristick(ArtD,place(NCD,NSD),NameD,price(RubD,KopD),date(YearD,MonD,DayD))), removewindow, removewindow, do('4'), !. correct('2') :- removewindow, removewindow, do('4'), !. correct('3') :- !. correct(_) :- makewindow(5,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, do('4'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% del('1') :- makewindow(5,95,1,' Удаление по артикулу ',7,20,10,40), framewindow(94), write(' Номер артикула: '), readint(X), retract(characteristick(X,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day))), nl, write(' Готово.'), readchar(_), removewindow,removewindow, do('5'), !. del('1') :- makewindow(6,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Запись не найдена.'), readchar(_), removewindow, removewindow, removewindow, do('5'). del('2') :- makewindow(5,95,1,' Удаление по названию ',7,20,10,40), framewindow(94), write(' Название: '), readln(X), retract(characteristick(Art,place(NC,NS),X,price(Rub,Kop),date(Year,Mon,Day))), nl, write(' Готово.'), readchar(_), removewindow,removewindow, do('5'), !. del('2') :- makewindow(6,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Запись не найдена.'), readchar(_), removewindow, removewindow, removewindow, do('5'). del('3') :- makewindow(5,95,1,' Удаление всей базы ',7,20,10,40), framewindow(94), retract(characteristick(_,place(_,_),_,price(_,_),date(_,_,_))), fail. del('3') :- write(' База удалена.'), readchar(_), removewindow,removewindow, do('5'), !. del('4') :- !. del('_') :- makewindow(5,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, do('5'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% indication('1') :- makewindow(5,18,1,' Создать базу B1 по признаку ',8,25,10,30), framewindow(19), write(' Введите признак:'), nl, nl, write(' 1 :- По месту хранения'), nl, write(' 2 :- По цене'), nl, write(' 3 :- По дате поступления'), nl, write(' 4 :- Меню'), nl, nl, write(' ------| |------'), cursor(7,13), readchar(X), indicationB1(X), removewindow, removewindow, do('6'), !. indication('2') :- makewindow(5,18,1,' Создать базу B2 по признаку ',8,25,10,30), framewindow(19), write(' Введите признак:'), nl, nl, write(' 1 :- По месту хранения'), nl, write(' 2 :- По цене'), nl, write(' 3 :- По дате поступления'), nl, write(' 4 :- Меню'), nl, nl, write(' ------| |------'), cursor(7,13), readchar(X), indicationB2(X), removewindow, removewindow, do('6'), !. indication('3') :- !. indication(_) :- makewindow(5,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, do('6'). indicationB1('1') :- makewindow(6,95,1,' Создание базы B1 по месту хранения ',7,20,10,40), framewindow(94), nl, write(' Номер цеха: '), readint(X), write(' Номер склада: '), readint(Y), characteristick(Art,place(X,Y),Name,price(Rub,Kop),date(Year,Mon,Day)), assert(table1(Art,place(X,Y),Name,price(Rub,Kop),date(Year,Mon,Day))), fail. indicationB1('1') :- removewindow, removewindow, indication('1'). indicationB1('2') :- makewindow(6,95,1,' Создание базы B1 по цене ',7,20,10,40), framewindow(94), nl, write(' Рублей: '), readint(X), write(' Копеек: '), readint(Y), characteristick(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day)), assert(table1(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day))), fail. indicationB1('2') :- removewindow, removewindow, indication('1'). indicationB1('3') :- makewindow(6,95,1,' Создание базы B1 по дате поступления ',7,20,10,40), framewindow(94), nl, write(' Год: '), readint(X), write(' Месяц: '), readint(Y), write(' День: '), readint(Z), characteristick(Art,place(NC,NS),Name,price(Rub,Kop),date(X,Y,Z)), assert(table1(Art,place(NC,NS),Name,price(Rub,Kop),date(X,Y,Z))), fail. indicationB1('3') :- removewindow, removewindow, indication('1'). indicationB1('4') :- !. indicationB1(_) :- makewindow(6,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, indication('1'). indicationB2('1') :- makewindow(6,95,1,' Создание базы B2 по месту хранения ',7,20,10,40), framewindow(94), nl, write(' Номер цеха: '), readint(X), write(' Номер склада: '), readint(Y), characteristick(Art,place(X,Y),Name,price(Rub,Kop),date(Year,Mon,Day)), assert(table2(Art,place(X,Y),Name,price(Rub,Kop),date(Year,Mon,Day))), fail. indicationB2('1') :- removewindow, removewindow, indication('2'). indicationB2('2') :- makewindow(6,95,1,' Создание базы B2 по цене ',7,20,10,40), framewindow(94), nl, write(' Рублей: '), readint(X), write(' Копеек: '), readint(Y), characteristick(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day)), assert(table2(Art,place(NC,NS),Name,price(X,Y),date(Year,Mon,Day))), fail. indicationB2('2') :- removewindow, removewindow, indication('2'). indicationB2('3') :- makewindow(6,95,1,' Создание базы B2 по дате поступления ',7,20,10,40), framewindow(94), nl, write(' Год: '), readint(X), write(' Месяц: '), readint(Y), write(' День: '), readint(Z), characteristick(Art,place(NC,NS),Name,price(Rub,Kop),date(X,Y,Z)), assert(table2(Art,place(NC,NS),Name,price(Rub,Kop),date(X,Y,Z))), fail. indicationB2('3') :- removewindow, removewindow, indication('2'). indicationB2('4') :- !. indicationB2(_) :- makewindow(6,76,1,'Ошибка',8,29,5,22), framewindow(75), nl, write(' Выберите из меню'), readchar(_), removewindow, removewindow, indication('2'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% adding :- get(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), nl, write(' Вы ввели :'), nl, show(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)), nl, nl, write(' Добавить ? (Yes/No)'), readchar(A), A='y', assert(characteristick(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day))); !. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% exists(FN) :- existfile(FN); makewindow(6,76,1,'Ошибка',10,25,5,30), nl, framewindow(75), write(' Файл ',FN,' не найден!'), readchar(_), removewindow, removewindow, removewindow, do('1'). show(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)) :- write(' Артикул : ',Art), nl, write(' Местоположение (Цех, Склад) : ',NC,', ',NS), nl, write(' Наименование товара : ',Name), nl, write(' Стоимость (Рублей:Копеек) : ',Rub,':',Kop), nl, write(' Дата поступления (Год-Месяц-День) : ',Year,'-',Mon,'-',Day). get(Art,place(NC,NS),Name,price(Rub,Kop),date(Year,Mon,Day)) :- write(' Артикул : '), readint(Art), write(' Местоположение : '), nl, write(' Цех : '), readint(NC), write(' Склад : '), readint(NS), write(' Наименование товара : '), readln(Name), write(' Стоимость : '), nl, write(' Рублей : '), readint(Rub), write(' Копеек : '), readint(Kop), write(' Дата поступления : '), nl, write(' Год : '), readint(Year), write(' Месяц : '), readint(Mon), write(' День : '), readint(Day). 7. Отладка программы.