Смекни!
smekni.com

Система Посредник (стр. 2 из 2)

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

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

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

Сигнатура – это множество функций вида 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 P P autoload:- P makewindow(2,74,79,"ОШИБКА",6,18,8,40), P cursor(2,10), P write("Нет базы на диске"), P sound(70,294), P removewindow, P !. P P P/* Главное меню */ P P main_menu:- P repeat, P cursor(7,0), P write(" 0 - О системе... "),nl, P write(" 1 - Корректировка данных"),nl, P write(" 2 - Уничтожение записей"),nl, P write(" 3 - Просмотр баз данных"),nl, P write(" 4 - Заключение договоров"),nl, P write(" 5 - Интерактивный режим"),nl, P write(" 6 - Выход из программы"),nl, P 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-PROLOG v.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 "),

readint(I),

clearwindow,

I>0,I"),

readint(X),

clearwindow,

X>0,X"),

readint(X),

clearwindow,

X>0,X P P ok:- P makewindow(17,27,90,"ОК",6,18,8,40), P cursor(2,7), P write(" ОПЕРАЦИЯ ВЫПОЛНЕНА"),nl,nl, P write(" Нажмите на любую клавишу"), P readchar(_), P removewindow. P P P/* Процедура repeat */ P P repeat. P repeat:- repeat. P P P/* Процедура обнаружения связей по классифицирующей сети */ P P cmp_name(Proizv,Proizv). P cmp_name(Proizv,Proizv1):- P find_web(Proizv,Proizv1). P P find_web(X,Y):-sup(X,Y). P find_web(X,Y):-sup(X,Z),find_web(Z,Y). P P P /* Процедура обнаружения всех возможных контрактов */ P P all_contract:- P покупатель(N,_,Tov,Proizv,Part,Price,Srok), P поставщик(N1,_,Tov,Proizv1,Min1,Kol1,Price1,Srok1), P cmp_name(Proizv,Proizv1), P Part>=Min1,Part=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=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=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(_).