Реферат: Система "Посредник"

”. Заключение договоров на поставкустроительных материалов

Введение

В конце двадцатого векаавтоматизация всё сильнее завоёвывает все сферы человеческой деятельности.Применение вычислительной техники в разнообразных отраслях народного хозяйствапризвано облегчить труд человека и уменьшить число ошибок, совершаемых припринятии решений.

При построении систем,помогающих человеку, используются приёмы, изучаемые такой областью информатики,как инженерия знаний.

В данном курсовом проектереализована система “Посредник”, служащая для заключения договоров междупоставщиками и покупателями строительных материалов. Эта система можетиспользоваться сотрудниками посреднических контор, работающих в этой области.

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

1. Виды услуг и режимы работысистемы “Посредник”

Основное предназначениесистемы “Посредник” – оказание услуг по заключение договоров между поставщикамии покупателями строительных материалов. Заключение договоров можетпроизводиться в обычном, либо в интерактивном режиме. В первом случае системазаключает контракт на основе имеющейся в базе данных информации о клиентах, вовтором случае система запрашивает данные у пользователя, после чего ищетнеобходимую информацию в базе данных и, найдя подходящие договоры, выводит их,либо при отсутствии на данный момент возможностей для сделки, заносит информациюо клиенте в базу данных. Кроме всех возможных вариантов договоров системавыводит ещё и наиболее предпочтительные для посредника с точки зрениякоммерческой выгоды.

Кроме того, в системе имеютсярежимы просмотра и редактирования (либо добавления) данных по поставщикам и попокупателям, а так же просмотра и редактирования региональной принадлежностифирм-производителей. Если во время работы с программой в базы данных быливнесены какие-либо изменения, то при выходе из программы при согласиипользователя будет произведено сохранение изменений.

2. Концептуальная модельзнаний, необходимых для оказания услуг

Концептуальная модельпредметной области представляется множеством классов объектов с заданными нанём отношениями и операциями. Классы объектов характеризуются некоторым набороматрибутов.

В данном курсовом проектеклассами объектов являются Спрос, Предложение и Договор. Класс, Спрос, имеетследующие атрибуты: порядковый номер, название фирмы, название товара,производитель, желаемой партии товара, цена за единицу товара и срок поставки.У класса Предложение, имеются такие же атрибуты, за исключением того, чтовместо желаемой партии товара здесь присутствуют минимальная партия имаксимальное количество товара, имеющееся у поставщика.

Представим объекты классовСпрос и Предложение в виде таблиц:

Таблица объектов класса Спрос

№ Фирма Товар Производитель Кол-во Цена, $ Срок поставки 1 ДСК-3 Кирпич облицовочный российская 1000 0.33 6 2 Мосжилстрой Керамзит европейская 30 22 8 3 Геракл Арматура стальная СНГ 15 51 10 4 МВМ Асбест строительный украинская 70 20 7 5 АТС-50 Кабель АВВГ российская 1000 2 18 6 СМУ-35 Керамзит российская 120 20 6 7 РЭУ-22 Стекло оконное белорусская 500 3 10 8 Атлант Обои моющиеся Vertex 1000 4 14 9 Sunpride Кирпич облицовочный московская 800 0.4 10 10 Hausbauer Плитка облицовочная итальянская 1000 11 7 11 СМУ-28 Ванна чугунная европейская 40 350 20 12 Протон Кабель АВВГ московская 1000 21 4

Таблица объектов класса Предложение

№ Фирма Продукция Производитель Мин. партия Макс. партия Цена, $ Срок поставки 1 Стройсервис Кирпич облицовочный 2-й кирпичный 120 900 0.25 7 2 Орион Керамзит Электроизолит 10 50 20 4 3 Салют Арматура стальная ММЗ 1 20 50 8 4 Стройсервис Кабель АВВГ Иркутсккабель 900 9000 1 11 5 Байрамикс Асбест строительный Стройперлит 30 100 15 9 6 Всё для дома Кабель АВВГ ММЗ 900 9000 1 12 7 Спецстрой Стекло оконное Серп и молот 50 700 2 10 8 Астра Обои моющиеся Vertex 1000 9000 3 11 9 Глобус Асбест строительный Донецкбетон 10 200 15 6 10 Орбита Кирпич облицовочный Мосбетон 2000 9000 0.3 4 11 Всё для дома Плитка облицовочная Marlit 1000 8000 10 6 12 Ункомтех Кабель АВВГ Иркутсккабель 700 1200 0.9 8 13 Электросталь Арматура стальная ММЗ 7 20 65 3 14 Arkon Паралон жидкий Interchemall 3000 9000 10 10 15 Worms Ванна стальная Nord Star 35 1000 300 18

Концептуальная схема предметной области представлена на рис.1. ирис.2.

/>

Рис.1. Концептуальная схемапредметной области (спрос и предложение).

/>

Рис.2. Концептуальная схемапредметной области (договор).

3. Представление данных оклиентах

Данные о клиентах в системе“Посредник” представлены в виде стандартных баз данных (database) языка Пролог.Поскольку в Прологе имеется довольно мощный механизм работы с такими базамиданных, реализовать на нём программу типа системы “Посредник” намного проще иестественней, чем на алгоритмических языках (типа Pascal или C).

Общий вид записей в базахданных следующий:

поставщик(N,F,T,P,M,X,C,D)

покупатель(N,F,T,P,K,C,D)

где N — номер записи, F — фирма-поставщик, T – наименование товара, P – производитель товара, M –минимальная партия, X – имеющаяся в наличии партия, С – цена за единицу товара,D – срок поставки, K – нужное покупателю количество товара. N, M, X, K, D –целочисленные, F, T, P – строковые, С – действительная.

База данных по поставщикамзаписана в файле kurs1.dat, по покупателям – в kurs2.dat.

4. Сетевая модельпредставления знаний и её использование для получения справочной информации иформирования вариантов договора

Сетевая модель реализуется спомощью так называемых семантических сетей. В семантической сети именанекоторых объектов, процессов, действий, сущностей и их классов ассоциируются сузлами, а отношения между ними ассоциируются с дугами, соединяющими узлы.Сетевую модель можно представить в виде следующей конструкции: S=/>, где I – множествоинформационных единиц, С1, С2,…, Сn – множествотипов связей между информационными единицами, Г – отображение, задающее связи(из заданного множества типов связей) между информационными единицами,входящими в I.

Классифицирующие сети(использованные в данной курсовой), на ряду с функциональными, являются однимиз классов однородных (у которых дуги только одного типа) сетей. Классифицирующиесети строятся на основе родовидового отношения sup, заданного намножестве классов объектов. Это отношение интерпретируется следующим образом:если Kisup Kj, то в любой момент времени tкаждый объект класса Ki является объектом класса Kj, т.е.Kj является подклассом Ki (или Ki являетсяподклассом Kj). Конкретные объекты, как правило, связываются склассами низшего уровня иерархии отношением принадлежности isa.Запись ki isa K означает, что объект kiявляется элементом класса K.

В данном курсовом проектеклассифицирующая сеть используется для определения региональной принадлежностипроизводителя строительных материалов. Благодаря этому при заключении договоровпокупателю не обязательно задавать конкретного производителя, а можно задатьтолько регеон расположения тех производителей, продукция которых покупателюкажется наиболее предпочтительной.

В системе “Посредник” имеетсятак же возможность получения информации о принадлежности какого-либопроизводителя региону путём просмотра связей в классифицирующей сети, а так жеимеются режимы корректировки и дополнения этой сети.

Графическое представлениеклассифицирующей сети показано на рис.3.

/>

Програмно классифицирующаясеть реализована в виде стандартных баз данных Пролога (database) и выглядитследующим образом:

sup(Ki,Kj)

где Ki и Kj– класс и его подкласс соответственно.

Классифицирующая сетьнаходится в файле web.dat.

5. Критерии выбора наиболеепредпочтительного варианта договора

В данном курсовом проектенаиболее предпочтительный договор выбирается в пользу посредника. Выгодапосредника состоит в получении наибольшей прибыли в кратчайшие сроки. Доходпосредника обычно составляет некоторый комиссионный процент от заключённой сделки,поэтому наиболее выгодны контракты, в которых произведение количества товара,необходимое покупателю на цену этого товара, назначенную продавцом, будетмаксимальным. Это и будет первым критерием выбора наиболеепредпочтительного договора. Вторым критерием, как было сказано выше,будет являться кратчайший срок поставки.

В начале программа выбираетпредпочтительные договоры по первому критерию. Если таких договоров получитсянесколько, то программа выбирает из них тот, у которого срок поставки меньше(т.е. реализуется второй критерий).

Например, пусть имеется тривозможных договора для фирмы “АТС-50”, которой требуется партия кабеля АВВГроссийского производителя объёмом 1000 единиц по цене 2$ за единицу в сроки неболее 18 дней:

№ Фирма Товар Производитель Мин. партия. Кол-во Цена Сроки 4 Стройсервис Кабель АВВГ Иркутсккабель 900 9000 1 11 6 Всё для дома Кабель АВВГ ММЗ 900 9000 1 12 12 Ункомтех Кабель АВВГ Иркутсккабель 700 1200 0.9 8

При применении первогокритерия выбираются фирмы “Стройсервис” и “Всё для дома”, поскольку цена, покоторой они предлагают товар, больше, чем у фирмы “Уникомтех” и следовательнодоход посредника будет больше. На втором этапе из этих двух фирм выбирается“Стройсервис”, поскольку у неё меньше срок поставки.

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

Логическая модель – этоописание предметной области на каком-либо логическом языке. Одним из такихлогических языков является многосортное исчисление предикатов. Припредставлении логических моделей на этом языке классы сущностей предметнойобласти интерпретируются, как имена сортов.

Для примера введём следующиеимена сортов: Договор, Поставщик, Покупатель, Продукция, Производитель,Количество, Цена, Срок, Тип_Произв, а так же следующие функции и предикаты:

пост: Договор/>Поставщик, покуп: Договор/>Покупатель,

 прод: Договор/>Продукция,произв: Договор/>Производитель,

 кол: Договор/>Количество, цена:Договор/>Цена, срок: Договор/>Срок

тип_произв: Производитель/>Тип_Произв

российский:/> Тип_Произв,европейский:/> Тип_Произв

/>: Количество/> Количество/>T

 />: Количество/> Количество/>T

 

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

Задаёт несколько функций,например прод (продукция), которые будучи применимы к объекту е сортаДоговор, дают например продукцию прод(е), участвующую в операции е.

Задаёт функцию, значениямикоторой служат типы производителя.

Задаёт константы,принадлежащие сорту Тип_Произв.

Задаёт двухместные предикатына объектах сорта Количество.

Сигнатура – это множество функцийвида f: A1/> A2/>…/> An/>B, где A1,A2,…,An – аргументы, B – значение функции. Множествааргументов и значений функций образуют соответственно сорта A и B. В частномслучае, если B=T, причём T={1,0} – особый сорт, то сигнатура имеет вид P:A1/> A2/>…/> An/>T, причём Pназывают предикатом.

Сигнатура задает структурныесвязи между понятиями предметной области, представленными предикатами ифункциями. Логические связи между этими понятиями задаются формулами, которыезаписываются в сигнатуре. Структурные и логические связи выражают некотороезнание о предметной области. Таким образом, сигнатура формально представляетодну часть знания о предметной области, а формулы, записанные в этой сигнатуре,представляют другую часть знания.

Графическое представлениесигнатуры показано на рис.4, а модельной структуры – на рис.5.

/>

Рис.4. Графическоепредставление сигнатуры

/>

Логическая модель в Прологепредставляется в виде предикатов и баз данных database. Например:

 database – договор

 дог(Поставщик, Покупатель)

Функцию пост (поставщик)можно реализовать так

 пост (N):–дог(Покупатель, Поставщик), N=Поставщик.

Функцию /> можно представить следующимобразом:

/>(Количество1, Количество2):–Количество1<=Количество2.

7. Организация диалога спользователем

При загрузке система“Посредник” выводит главное меню, в котором представлены все режимы работыпрограммы. Каждый режим выбирается посредством нажатия цифровой клавиши.Система меню представлена многоуровневой иерархической структурой, т.е. умногих режимов есть свои подменю.

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

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

Схема организации диалогапредставлена на рис.6.

/>

заключение

При написании курсовогопроекта были использованы разнообразные модели представления знаний, изучаемыеинженерией знаний. Система “Посредник” программно реализована на языке Пролог всреде Turbo Prolog 2.0.

Приложение

Текст программы “посредник”

/*==========================================================*/

/* Курсовой проект подисциплине «Инженерия знаний» */

/* Система«Посредник» */

/* Автор: Данченков А.В., гр.ИИ-1-95 */

/*==========================================================*/

code=8850

domains

 Фирма, Товар, Произв,Str=string

 Int,N, Парт, Кол_во, Сроки=integer

 Цена=real

/* Основные и служебные базыданных */

database — поставщик

 поставщик(integer, Фирма, Товар, Произв, Парт, Кол_во, Цена, Сроки)

database — покупатель

 покупатель(N, Фирма, Товар, Произв, Парт, Цена, Сроки)

database — sup

 sup(Str,Str)

database — contract

 contract(integer,integer)

database — best

 best(integer,integer,integer,integer)

database — best2

 best2(integer,integer,integer,integer)

database — flag

 flag(Int)

predicates

 start

 view(Int)

 autoload

 working(Int)

 main_menu

 correct(Int)

 interact(integer)

 warning(integer)

 form_best(integer,integer,integer,integer)

 form_best2(integer)

 f_b2(integer,integer,integer,integer)

 fb1(integer,integer,integer,integer)

 fb2(integer,integer,integer,integer)

 del(Int)

 del_sup(string)

 ins_sup(string)

 view_sup(string)

 sve

 save_bd

 ask

 error

 io_error

 ok

 repeat

 checkcontr(integer)

 all_contract

 print_contract

 cmp_name(string,string)

 find_web(Str,Str)

 prn(integer,string)

goal

 start.

clauses

/* Основная процедура */

 start:-

 makewindow(1,26,94,«СИСТЕМАПОСРЕДНИК»,0,0,25,80),

 clearwindow,

 autoload,

 main_menu.

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

 autoload:-

 retractall(_, поставщик),

 existfile(«kurs1.dat»),

 consult(«kurs1.dat», поставщик),

 retractall(_, покупатель),

 existfile(«kurs2.dat»),

 consult(«kurs2.dat», покупатель),

 retractall(_,sup),

 existfile(«web.dat»),

 consult(«web.dat»,sup),

 cursor(21,30),

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

 autoload:-

 makewindow(2,74,79,«ОШИБКА»,6,18,8,40),

 cursor(2,10),

 write(«Нет базы надиске»),

 sound(70,294),

 removewindow,

 !.

/* Главное меню */

 main_menu:-

 repeat,

 cursor(7,0),

 write(" 0 — Осистеме… "),nl,

 write(" 1 — Корректировка данных"),nl,

 write(" 2 — Уничтожениезаписей"),nl,

 write(" 3 — Просмотрбаз данных"),nl,

 write(" 4 — Заключениедоговоров"),nl,

 write(" 5 — Интерактивный режим"),nl,

 write(" 6 — Выход изпрограммы"),nl,

 write(" =>"),

 readint(C),

 clearwindow,

 working(C),

 clearwindow,

 C = 6,

 retractall(_),

 removewindow.

/* Вывод данных о создателепрограммы */

 working(0):-

 makewindow(3,27,30,«Осистеме...»,0,0,25,80),

 nl,nl,

write(" Инфоpмационно-спpавочнаясистема"),

 nl,nl,

write(" Посредник"),

 nl,nl,nl,nl,

write(" Программасоставлена в среде "),

 nl,

write(" TURBO-PROLOGv.2.0."),

 nl,nl,nl,

write(" автоp: ДанченковА.В."),

 nl,nl,

write(" МИРЭА,гp.ИИ-1-95 (С) 1997 г. "),

 nl,

 sound(5,220),

 cursor(22,26),

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

 readchar(_),

 removewindow,!.

 /*Процедура вывода менюкорректировки данных*/

 working(1):-

 makewindow(4,26,48,«Коppектировкаданных»,0,0,25,80),

 sound(5,220),

 repeat,

 nl,

 nl,

 cursor(9,0),

 write(" 1 — Изменениеданных по поставщикам"),nl,

 write(" 2 — Изменениеданных по покупателям"),nl,

 write(" 3 — Добавлениеданных по поставщикам"),nl,

 write(" 4 — Добавлениеданных по покупателям"),nl,

 write(" 5 — Выход вглавное меню" ),nl,

 write(" =>"),

 readint(X),

 clearwindow,

 X>0,X<=5,

 correct(X),

 clearwindow,

 X=5,!,

 removewindow.

/* Процедура вывода менюуничтожения данных*/

 working(2):-

 makewindow(5,48,107,«Уничтожениезаписей»,0,0,25,80),

 sound(5,220),

 repeat,

 cursor(7,0),

 write(" 1 — Удаление избазы данных поставщиков"),nl,

 write(" 2 — Удаление избазы данных покупателей"),nl,

 write(" 3 — Удаление изклассифицирующей сети"),nl,

 write(" 4 — Выход"),nl,

 write(" => "),

 readint(I),

 clearwindow,

 I>0,I<=4,

 del(I),

 clearwindow,

 I=4,!,

 removewindow.

/* Процедура вывода менюпросмотра базы данных */

 working(3):-

 makewindow(6,30,26,«Просмотpбаз данных»,0,0,25,80),

 sound(5,220),

 repeat,

 nl,

 nl,

 cursor(7,0),

 write(" 1 — Просмотрбазы данных по поставщикам"),nl,

 write(" 2 — Просмотрбазы данных по покупателям"),nl,

 write(" 3 — Просмотрсвязей в классифицирующей сети"),nl,

 write(" 4 — Выход вглавное меню" ),nl,

 write(" =>"),

 readint(X),

 clearwindow,

 X>0,X<=4,

 view(X),

 clearwindow,

 X=4,!,

 removewindow.

 /* Вызов процедуры,выводящей контракты */

 working(4):-retractall(_,best),

 retractall(_,best2),

 all_contract,!.

 /* Процедура вывода менюинтерактивного режима */

 working(5):-

 makewindow(4,26,48,«Заключениедоговоров в интерактивном режиме»,0,0,25,80),

 sound(5,220),

 repeat,

 nl,

 nl,

 cursor(9,0),

 write(" 1 — Поискпоставщика"),nl,

 write(" 2 — Поискпокупателя"),nl,

 write(" 3 — Выход"),nl,

 write(" =>"),

 readint(X),

 clearwindow,

 X>0,X<=3,

 interact(X),

 clearwindow,

 X=3,!,

 removewindow.

 /* Процедура выхода изпрограммы */

 working(6):-flag(1),retract(flag(1)),save_bd,!.

 working(6).

 working(_):-

 makewindow(16,74,79,«ОШИБКАВВОДА»,6,18,8,40),

 nl,

 write(" Введите числоот 0 до 6,"),nl,

 write(" соответствующеевыбранному пункту"),nl,nl,nl,

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

 sound(20,494),

 sound(30,392),

 readchar(_),

 removewindow.

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

 view(1):-

 makewindow(16,31,26,«Просмотpбазы данных по поставщикам»,0,0,25,80),

write("|=================================================================|"),nl,

write("| ПОСТАВЩИКИ|"),nl,

write("|=================================================================|"),nl,

write("| | | | | Мин. || | |"),nl,

write("|No| Фирма |Товар |Производитель| партия | Кол-во |Цена|Д|"),nl,

write("|=================================================================|"),nl,

 поставщик(N,Firm,Tov,Proizv,Min,Kol,Price,Srok),

 cursor(Z,_),

 cursor(Z,1),write(N),

 cursor(Z,3),write("¦",Firm),

 cursor(Z,16),write("¦",Tov),

 cursor(Z,36),write("¦",Proizv),

 cursor(Z,50),write("¦",Min),

 cursor(Z,59),write("¦",Kol),

 cursor(Z,68),write("¦",Price),

 cursor(Z,73),write("¦",Srok),

 cursor(Z,0),write("¦"),

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

 nl,

 fail.

 view(1):-

write("|==================================================================|"),

 nl,

 cursor(22,26),

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

 readchar(_),

 removewindow.

 view(2):-

 makewindow(16,31,26,«Просмотpбазы данных по покупателям»,0,0,25,80),

write("|=================================================================|"),nl,

write("| ПОКУПАТЕЛИ|"),nl,

write("|=================================================================|"),nl,

write("| | | | |Требуемая | | |"),nl,

write("|No| Фирма |Товар |Производитель| партия |Цена |Д|"),nl,

write("|=================================================================|"),nl,

 покупатель(N,Firm,Tov,Proizv,Part,Price,Srok),

 cursor(Z,_),

 cursor(Z,1),write(N),

 cursor(Z,4),write("¦",Firm),

 cursor(Z,20),write("¦",Tov),

 cursor(Z,42),write("¦",Proizv),

 cursor(Z,57),write("¦",Part),

 cursor(Z,67),write("¦",Price),

 cursor(Z,72),write("¦",Srok),

 cursor(Z,0),write("¦"),

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

 nl,

 fail.

 view(2):-

write("|==================================================================|"),

 nl,

 cursor(22,26),

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

 readchar(_),

 removewindow.

 view(3):-

 makewindow(16,31,26,«Просмотpсвязей в классифицирующей сети»,0,0,25,80),

 nl,nl,

 view_sup(«производитель»),

 cursor(21,26),

 write(" Просмотрзакончен "),nl,

 cursor(22,26),

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

 readchar(_),

 removewindow,!.

 view(_).

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

 correct(1):-

 makewindow(4,26,48,«Изменениеданных о поставщках»,0,0,25,80),

 nl,

 write(" Введитепорядковый номер поставщика: "),readint(X),nl,

 поставщик(X,Firm,Tov,Proizv,Min,Kol,Price,Srok),

 clearwindow,nl,

 write(" Порядковыйномер поставщика: "),write(X),nl,

 write(" Фирма:"),write(Firm),nl,

 write(" Товар:"),write(Tov),nl,

 write(" Производитель:"),write(Proizv),nl,

 write(" Минимальнаяпартия: "),write(Min),nl,

 write(" Колличество наскладе: "),write(Kol),nl,

 write(" Цена за единицутовара: "),write(Price),nl,

 write(" Сроки поставки: "),write(Srok),nl,

 nl,nl,nl,

 write(" Введитеназвание фирмы: "),readln(Firm1),

 write(" Введитеназвание товара: "),readln(Tov1),

 write(" Введитепроизводителя: "),readln(Proizv1),

 write(" Введитеминимальную партию: "),readInt(Min1),

 write(" Введитеколличество на складе: "),readInt(Kol1),

 write(" Введите цену заединицу товара: "),readreal(Price1),

 write(" Введите срокипоставки: "),readInt(Srok1),nl,

 X1=X,

 retract(поставщик(X,Firm,Tov,Proizv,Min,Kol,Price,Srok)),

 assertz(поставщик(X1,Firm1,Tov1,Proizv1,Min1,Kol1,Price1,Srok1)),

 !,

 ins_sup(Proizv1),

 assert(flag(1)),

 removewindow.

 correct(2):-

 makewindow(4,26,48,«Изменениеданных о покупателях»,0,0,25,80),

 nl,

 write(" Введитепорядковый номер покупателя: "),readint(X),nl,

 покупатель(X,Firm,Tov,Proizv,Part,Price,Srok),

 clearwindow,nl,

 write(" Порядковыйномер покупателя: "),write(X),nl,

 write(" Фирма:"),write(Firm),nl,

 write(" Товар:"),write(Tov),nl,

 write(" Производитель:"),write(Proizv),nl,

 write(" Необходимаяпартия: "),write(Part),nl,

 write(" Цена за единицутовара: "),write(Price),nl,

 write(" Сроки поставки: "),write(Srok),nl,

 nl,nl,nl,

 write(" Введитеназвание фирмы: "),readln(Firm1),

 write(" Введитеназвание товара: "),readln(Tov1),

 write(" Введитепроизводителя: "),readln(Proizv1),

 write(" Введитенеобходимую партию: "),readInt(Part1),

 write(" Введите цену заединицу товара: "),readreal(Price1),

 write(" Введите срокипоставки: "),readInt(Srok1),nl,

 X1=X,

 retract(покупатель(X,Firm,Tov,Proizv,Part,Price,Srok)),

 assertz(покупатель(X1,Firm1,Tov1,Proizv1,Part1,Price1,Srok1)),

 ins_sup(Proizv1),

 !,

 assert(flag(1)),

 removewindow.

 correct(3):-

 makewindow(9,26,48,«Добавлениеданных о поставщиках»,0,0,25,80),

 repeat,

 nl,

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

 write(" Введитеназвание фирмы: "),readln(F),

 write(" Введитеназвание товара: "),readln(T),

 write(" Введитепроизводителя: "),readln(P),

 write(" Введитеминимальную партию: "),readInt(M),

 write(" Введитеколличество на складе: "),readInt(Kl),

 write(" Введите цену заединицу товара: "),readreal(Pr),

 write(" Введите срокипоставки: "),readInt(S),nl,

 N1=K,

 Firm=F,Tov=T,Proizv=P,

 Min=M,Kol=Kl,

 Price=Pr,Srok=S,

 assertz(поставщик(N1,Firm,Tov,Proizv,Min,Kol,Price,Srok)),

 ins_sup(Proizv),

 ask,!,

 assert(flag(1)),

 removewindow.

 correct(4):-

 makewindow(9,26,48,«Добавлениеданных о покупателях»,0,0,25,80),

 repeat,

 nl,

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

 write(" Введитеназвание фирмы: "),readln(F),

 write(" Введитеназвание товара: "),readln(T),

 write(" Введитепроизводителя: "),readln(P),

 write(" Введитенеобходимую партию: "),readInt(M),

 write(" Введите цену заединицу товара: "),readreal(Pr),

 write(" Введите срокипоставки: "),readInt(S),nl,

 N1=K,

 Firm=F,Tov=T,Proizv=P,

 Part=M,

 Price=Pr,Srok=S,

 assertz(покупатель(N1,Firm,Tov,Proizv,Part,Price,Srok)),

 ins_sup(Proizv),

 ask,!,

 assert(flag(1)),

 removewindow.

 correct(_).

/* Вспомагательные процедурыудаления данных */

 del(1):-

 makewindow(5,48,107,«Удалениеданных о поставщках»,0,0,25,80),

 nl,

 write(" Введитепорядковый номер поставщика: "),readint(X),nl,

 поставщик(X,Firm,Tov,Proizv,Min,Kol,Price,Srok),

 retract(поставщик(X,Firm,Tov,Proizv,Min,Kol,Price,Srok)),

 assert(flag(1)),

 ok,

 !,

 removewindow.

 del(1):-

 error,

 removewindow,!.

 del(2):-

 makewindow(5,48,107,«Удалениеданных о покупателях»,0,0,25,80),

 nl,

 write(" Введитепорядковый номер покупателя: "),readint(X),nl,

 покупатель(X,Firm,Tov,Proizv,Part,Price,Srok),

 retract(покупатель(X,Firm,Tov,Proizv,Part,Price,Srok)),

 assert(flag(1)),

 ok,

 !,

 removewindow.

 del(2):-

 error,

 removewindow,!.

 del(3):-makewindow(5,48,107,«Удаление из классифицирующей сети»,0,0,25,80),

 nl,

 write(" Введитеудаляемого производителя/регеон: "),readln(S),nl,

 del_sup(S),

 assert(flag(1)),

 ok,

 !,

 removewindow.

 del(3):-

 error,

 removewindow,!.

 del(_).

 /* Процедура запроса наокончание ввода в correct(3) и correct(3) */

 ask:-

 makewindow(10,43,120,«Вопрос»,6,18,8,40),nl,nl,

 write(" Продолжитьпроцесс ввода данных? "),nl,nl,

 write("[Д]а/[Н]ет"),

 readchar(Ch),

 removewindow,

 clearwindow,

 Ch='Н',!.

/* Вывод запроса о сохраненииизменённых баз данных */

 save_bd:-

 makewindow(17,74,79,«Сохранениеизменений»,6,18,8,40),nl,

 write(" Сохранитьпроизведённые "),nl,

 write(" изменения надиске?"),nl,nl,

 write("[Д]а/[Н]ет"),

 sound(20,494),

 sound(30,392),

 readchar(Ch),

 removewindow,

 clearwindow,

 Ch='Д',!,sve.

 save_bd.

 /* Сохранение данных надиске */

 sve:-save(«kurs1.dat», поставщик),

 save(«kurs2.dat», покупатель),

 save(«web.dat»,sup),!.

 sve:-io_error,removewindow.

/* Процедуры вывода сообщенийоб ошибках */

 error:-

 makewindow(15,74,79,«ОШИБКА»,6,18,8,40),

 cursor(2,16),

 write(«ОШИБКА»),nl,nl,

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

 sound(70,294),

 readchar(_),

 removewindow,

 !.

 io_error:-

 makewindow(16,74,79,«ОШИБКА»,6,18,8,40),

 cursor(2,7),

 write(«Ошибкаввода/вывода»),nl,nl,

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

 sound(70,294),

 readchar(_),

 removewindow.

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

 ok:-

 makewindow(17,27,90,«ОК»,6,18,8,40),

 cursor(2,7),

 write(" ОПЕРАЦИЯВЫПОЛНЕНА"),nl,nl,

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

 readchar(_),

 removewindow.

/* Процедура repeat */

 repeat.

 repeat:- repeat.

/* Процедура обнаружениясвязей по классифицирующей сети */

 cmp_name(Proizv,Proizv).

 cmp_name(Proizv,Proizv1):-

 find_web(Proizv,Proizv1).

 find_web(X,Y):-sup(X,Y).

 find_web(X,Y):-sup(X,Z),find_web(Z,Y).

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

 all_contract:-

 покупатель(N,_,Tov,Proizv,Part,Price,Srok),

 поставщик(N1,_,Tov,Proizv1,Min1,Kol1,Price1,Srok1),

 cmp_name(Proizv,Proizv1),

 Part>=Min1,Part<=Kol1,Price>=Price1,Srok>=Srok1,

 assertz(contract(N,N1)),

 assert(best(N,0,0,0)),

 assert(best2(N,0,0,1000)),

 fail.

 all_contract:-print_contract.

 /* Процедуры вывода на экранвсех возможных контрактов */

 print_contract:-

 makewindow(16,31,26,«Всевозможные контракты»,0,0,25,80),

 nl,nl,

 покупатель(N,Firm,_,_,_,_,_),

 checkcontr(N),

 prn(N,Firm),

 fail.

 print_contract:-

 retractall(_,contract),

 removewindow.

 prn(N,Firm):-

 cursor(1,1),

 write(«Для фирмы:»,Firm),

 nl,

write("|=================================================================|"),nl,

write("| | | | | Мин. || | |"),nl,

write("|No| Фирма |Товар |Производитель| партия | Кол-во |Цена|Д|"),nl,

write("|=================================================================|"),nl,

 contract(N,N1),

 поставщик(N1,Firm1,Tov1,Proizv1,Min1,Kol1,Price1,Srok1),

 cursor(Z,_),

 cursor(Z,1),write(N1),

 cursor(Z,3),write("¦",Firm1),

 cursor(Z,16),write("¦",Tov1),

 cursor(Z,36),write("¦",Proizv1),

 cursor(Z,50),write("¦",Min1),

 cursor(Z,59),write("¦",Kol1),

 cursor(Z,68),write("¦",Price1),

 cursor(Z,73),write("¦",Srok1),

 cursor(Z,0),write("¦"),

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

 nl,

 покупатель(N,_,_,_,Part,_,_),

 retract(contract(N,N1)),

 Cs=Part*Price1,

 form_best(N,N1,Cs,Srok1),

 form_best2(N),

 fail.

 prn(N,_):-

 write("|===================================================================|"),

 nl,

 best2(N,Np,_,_),

 поставщик(Np,Firm,_,_,_,_,_,_),nl,

 write(«Наиболеепредпочтительный»),nl,

 write(«контракт сфирмой: »,Firm),nl,

 cursor(22,26),

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

 readchar(_),

 clearwindow,!.

 /* Проверяет, есть ликонтракты */

 checkcontr(N):-contract(N,_).

 /* Процедура формированиянаиболее предпочтительного контракта */

 form_best(N,Np,S,Srok):-Na=N,

 best(Na,Np1,S1,Srok1),S=S1,

 assertz(best(Na,Np,S,Srok)),!.

 form_best(N,Np,S,Srok):-Na=N,

 best(Na,Np1,S1,Srok1),S>S1,fb1(Na,Np,S,Srok),

 assertz(best(Na,Np,S,Srok)),!.

 form_best(_,_,_,_).

 fb1(N,_,_,_):-

 retract(best(N,_,_,_)),fail.

 fb1(_,_,_,_).

 form_best2(N):-

 best(N,Np,S,Srok),f_b2(N,Np,S,Srok),fail.

 form_best2(_).

 f_b2(N,Np,S,Srok):- Na=N,

 best2(Na,Np1,_,Srok1),Srok1>Srok,

 fb2(Na,Np,S,Srok),

 assertz(best2(Na,Np,S,Srok)),!.

 f_b2(_,_,_,_).

 fb2(N,_,_,_):-retract(best2(N,_,_,_)),fail.

 fb2(_,_,_,_).

 /* Процедуры заключениядоговоров в интерактивном режиме */

 interact(1):-

 makewindow(9,26,48,«Поискпоставщика»,0,0,25,80),

 nl,

 write(" Введитеназвание фирмы: "),readln(F),

 write(" Введитеназвание товара: "),readln(T),

 write(" Введитепроизводителя: "),readln(P),

 write(" Введитенеобходимую партию: "),readInt(M),

 write(" Введите цену заединицу товара: "),readreal(Pr),

 write(" Введите срокипоставки: "),readInt(S),nl,

 N=0,

 Firm=F,Tov=T,Proizv=P,

 Part=M,

 Price=Pr,Srok=S,

 assertz(покупатель(N,Firm,Tov,Proizv,Part,Price,Srok)),

 removewindow,

 поставщик(N1,_,Tov,Proizv1,Min1,Kol1,Price1,Srok1),

 cmp_name(Proizv,Proizv1),

 Part>=Min1,Part<=Kol1,Price>=Price1,Srok>=Srok1,

 assert(flag(2)),

 assertz(contract(N,N1)),

 assert(best(N,0,0,0)),

 fail.

 interact(1):-flag(2),print_contract,

 retract(покупатель(0,Firm,Tov,Proizv,Part,Price,Srok)),

 retract(flag(2)),!.

 interact(1):-

 warning(N),

 покупатель(0,Firm,Tov,Proizv,Part,Price,Srok),

 assertz(покупатель(N,Firm,Tov,Proizv,Part,Price,Srok)),

 ins_sup(Proizv),

 retract(покупатель(0,Firm,Tov,Proizv,Part,Price,Srok)),

 assert(flag(1)),

 !.

 interact(1):-retract(покупатель(0,Firm,Tov,Proizv,Part,Price,Srok)),!.

 interact(2):-

 makewindow(9,26,48,«Поискпокупателя»,0,0,25,80),

 nl,

 write(" Введитеназвание фирмы: "),readln(F),

 write(" Введитеназвание товара: "),readln(T),

 write(" Введитепроизводителя: "),readln(P),

 write(" Введитеминимальную партию: "),readInt(M),

 write(" Введитеимеющуюся партию: "),readInt(I),

 write(" Введите цену заединицу товара: "),readreal(Pr),

 write(" Введите срокипоставки: "),readInt(S),nl,

 N=0,

 Firm=F,Tov=T,Proizv=P,Min=M,

 Kol=I,

 Price=Pr,Srok=S,

 assertz(поставщик(N,Firm,Tov,Proizv,Min,Kol,Price,Srok)),

 removewindow,

 покупатель(N1,_,Tov,Proizv1,Part1,Price1,Srok1),

 cmp_name(Proizv1,Proizv),

 Part1>=Min,Part1<=Kol,Price1>=Price,Srok1>=Srok,

 assert(flag(2)),

 assertz(contract(N1,N)),

 assert(best(N1,0,0,0)),

 fail.

 interact(2):-flag(2),print_contract,

 retract(поставщик(0,Firm,Tov,Proizv,Min,Kol,Price,Srok)),

 retract(flag(2)),!.

 interact(2):-

 warning(N),

 поставщик(0,Firm,Tov,Proizv,Min,Kol,Price,Srok),

 assertz(поставщик(N,Firm,Tov,Proizv,Min,Kol,Price,Srok)),

 ins_sup(Proizv),

 retract(поставщик(0,Firm,Tov,Proizv,Min,Kol,Price,Srok)),

 assert(flag(1)),

 !.

 interact(2):-retract(поставщик(0,Firm,Tov,Proizv,Min,Kol,Price,Srok)),!.

 interact(_).

 /* Вывод предупреждения оневозможности заключения договора */

 warning(N):-makewindow(7,49,113,«Предупреждение»,5,10,12,60),

 sound(5,220),nl,nl,

 write(" На данныймомент заключение контракта невозможно"),nl,

 write(" Поместитьданные в базу данных"),nl,

 write(" для последующейобработки?"),nl,nl,

 write(" [Д]а/[Н]ет"),nl,

 readchar(Ch),

 removewindow,

 Ch='Д',

 write(" Введитепорядковый номер фирмы: "),readInt(N),nl,

 !.

 /* Удаление элемента изклассифицирующей сети */

 % В середине цепочки

 del_sup(S):- sup(S,X),del_sup(X),fail.

 % В конце цепочки

 del_sup(S):- sup(_,S),retract(sup(_,S)),fail.

 del_sup(_).

 /* Определение необходимостидобавления и добавление */

 /* элемента вклассифицирующую сеть */

 ins_sup(S):-sup(_,S),!.

 ins_sup(S):-sup(«производитель»,S),!.

 ins_sup(S):-

 write(«Введите региональнуюпринадлежность объекта _ »,S,"_ :"),

 readln(M),nl,

 assertz(sup(M,S)),assert(flag(1)),ins_sup(M),!.

 /* Вывод на печать связей вклассифицирующей сети */

 view_sup(S):-

 sup(S,M),write(S,"-> ",M),write("; "),

 view_sup(M),nl,fail.

 view_sup(_):- readchar(_).

еще рефераты
Еще работы по информатике, программированию