Лекции.Орг


Поиск:




Описание интерфейса программного продукта

Содержание

 

 

Введение……………………………………………………………….…….3

Техническое задание…………………………………………………….….5

Описание программы……………………………………………………....7

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

Используемые источники…………………………………………………..9

Приложения………………………………………………………………..10

Введение

Под Экспертной Системой (ЭС) понимается программа (комплекс программ), моделирующая в некоторой степени работу человека-эксперта в конкретной предметной области. Причем эта область строго ограничена. Основное назначение ЭС — проведение консультаций в той предметной области, для которой спроектирована данная ЭС.

В составе ЭС выделяется три компонента:

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

Механизм Вывода (MB). MB содержит описания способов применения содержащихся в БЗ знаний. Во время консультации MB запускает ЭС в работу, выполняет правила, определяет приемлемость найденного решения и передает результаты в СПИ.

3) Система Пользовательского Интерфейса (СПИ). СПИ есть та часть ЭС, которая взаимодействует с пользователем. В функции СПИ входит: прием информации от пользователя, передача результатов пользователю в наиболее удобной для него форме, объяснение полученных ЭС результатов (выдача справочной информации по выводу результатов).

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

Сетевая модель основана на представление знаний в виде сети, вершины которой соответствуют понятиям, а дуги — отношениям между ними.

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

Продукционная модель основывается на правилах вида «если-то» и позволяет помещать фрагменты фактического знания в правила языка Пролог. Именно так строятся ЭС, базирующиеся на правилах. При реализации ЭС, базирующейся на логике, БЗ представляется совокупностью утверждений в виде фактов. Вывод экспертного заключения пр8и этом строится на основе стандартных средств работы со списками.

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

В ЭС, базирующейся на правилах, запросы пользователя трансформируются в форму, сопоставимую с формой правил БЗ. Механизм вывода инициализирует процесс сопоставления, начиная с «верхнего» правила, Обращение к правилу называется «вызовом». Вызов соответствующих правил в процессе сопоставления продолжается до тех нор, пока не произошло сопоставление или не исчерпана вся БЗ, а значение не найдено. Если MB обнаруживает, что можно вызвать более одного правила,

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

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

Внутренние программы унификации Visual Prolog'a позволяют решать задачи поиска и сопоставления по образцу без написания дополнительных правил. Как в системе, базирующейся на правилах, так и в системе, базирующейся на логике, пользователь получает ответы на свои запросы в соответствии с заложенной в ЭС логикой. Для программной реализации механизма вывода экспертного заключения достаточно только написать необходимые спецификации.

 

Техническое задание

Постановка задачи

 

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

 

Функциональное назначение

 

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

Описание интерфейса программного продукта

 

Вся работа с пользователем представлена в виде диалога. Ввод и вывод значений осуществляется при помощи программы Prolog.

 

 

 

 

Описание программы

 

Запуск ЭС начинается при помощи программы “Prolog”. С пользователем ведется диалог в простой и понятной форме. Пользователю последовательно предлагаются параметры, в соответствии с его ответами. Ответ «Всё равно» выбирает все предложенные варианты. Выбор ответов, на поставленные ЭС вопросы осуществляется с клавиатуры. При введении неизвестного символа или неверных значений ответа из представленных вариантов ЭС задаёт тот же вопрос. Вопрос будет задаваться до тех пор, пока пользователь не введет один из возможных ответов. После выбора лопаты предлагается: подобрать альтернативу выбранной лопаты; произвести поиск другой лопаты; завершить работу с системой.


 

Заключение

 

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

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


 

Используемые источники

 

1) А.Н.Гущин, “Языковые средства разработки интеллектуальных систем: учебное пособие ”, БГТУ, СПб, 2006.

2) А.Н.Гущин, “Основы представления знаний: учебное пособие ”,

БГТУ, СПб, 2007.


 

 

Приложение

Текст программы:

 

database

loc(integer, integer),

selection(string),

result(string),

second(string)

predicates

lopata(string)

cena(string, string)

clearloc

clearSelection

clearResult

clearSecond

q1

q2

q3

q4

q5

q6

addloc(integer, integer)

begin

continue(integer)

continue2(integer)

menu

getSolve

print(string)

getAnswer(integer, integer, integer, integer)

resultat(string, integer, integer, integer, integer, integer)

loclist(integer, integer, string)

showInfo(string)

 

clauses

continue2(1):-begin.

 

continue2(2):-

removewindow,

exit.

 

showInfo(X):-resultat(X,X1, X2, X3, X4, X5),

loclist(1, X1, Y1),

loclist(2, X2, Y2),

loclist(3, X3, Y3),

loclist(4, X4, Y4),

loclist(5, X5, Y5),

write(Y1, ' ', Y2, ' ', Y3, ' ', Y4, ' ', Y5, ' '), nl.

 

getAnswer(X, A, B, 1):- readint(X), X >= A, X <= B; X=4.

getAnswer(X, A, B, 0):- readint(X), X >= A, X <= B.

 

getSolve:-

lopata(X),

not(selection(X)),

print(X),!,

asserta(selection(X)),

getSolve.

 

print(X):- X<> "None",

clearResult,

asserta(result("yes")),

cena(X, Y),

write(X), nl,

write("Cena: ", Y, " rub"), nl.

 

menu:-result("yes"), second("no"),

write(" 1. Drugoi variant"), nl,

write(" 2. Zanovo"), nl,

write(" 3. Zakonchit rabotu"), nl,

readint(Z), nl, continue(Z).

 

menu:-result("no"), second("no"),

write("Takogo ne nashlos’, no mojno posmotret’ drugoe"), nl,

write(" 1. Drugoi variant"), nl,

write(" 2. Zanovo"), nl,

write(" 3. Zakonchit’ rabotu"), nl,

readint(Z), nl, continue(Z).

 

menu:-result("no"), second("yes"),

write("Drygih nety"), nl,

write(" 1. Drugoi variant"), nl,

write(" 2. Zanovo"), nl,

write(" 3. Zakonchit rabotu"), nl,

readint(Z), nl, continue(Z).

 

menu:-result("yes"), second("yes"),

write("Dalee? \n"), nl,

write(" 1. Zanovo"), nl,

write(" 2. Zakonchit rabotu"), nl,

readint(Z), nl, continue2(Z).

 

Clearloc:- retractall(loc(_,_)).

ClearSelection:- retractall(selection(_)).

ClearResult:- retractall(result(_)).

ClearSecond:-retractall(second(_)).

 

addloc(X, Y):- Y<>4, asserta(loc(X,Y)).

addloc(X, 4):- asserta(loc(X,1)), asserta(loc(X,2)), asserta(loc(X,3)).

 

continue(3):-

removewindow,

exit.

 

continue(2):-

begin.

 

continue(1):-

clearSecond,

asserta(second("yes")),

clearResult,

asserta(result("no")),

addloc(5, 1), addloc(5, 2),

addloc(6, 1), addloc(6, 2), addloc(6, 3),

getSolve,

menu.

 

begin:- clearloc,

clearSelection,

clearResult,

clearSecond,

asserta(result("no")),

asserta(second("no")),

q1,

menu.

 

%Opisanie voprosov

 

q1:-

clearwindow,

write("Dlia 4ego vam nujna lopata?\n"), nl,

write(" 1. Lublu s ytra kopat sneg"), nl,

write(" 2. Dlia sipy4ish materialov "), nl,

write(" 3. Kopat'"), nl,

getAnswer(Z, 1, 3, 0), nl, addloc(1, Z), q2.

q1:-q1.

 

q2:-loc(2, _),

menu.

 

q2:-

loc(1, 1),

write("Mojet traktor? \n"),

write(" 1. Nee"), nl,

write(" 2. Horoshaia ideia"), nl,

getAnswer(Z, 1, 2, 0), nl, addloc(2, Z), addloc(5, 0), addloc(4, 0), q3.

 

q2:-

loc(1, W), W<>1,

addloc(2, 0),

q3.

q2:-q2.

 

 

q3:-loc(3, _),

menu.

 

q3:-

loc(1, 3),

q4.

 

q3:-

loc(2, 2),

addloc(3, 0),

q6.

 

 

q3:-

loc(2, 2),

loc(3, _),

q6.

 

q3:-

loc(1, F), F<>3,

write("Viberite proizvoditelya: \n"),

write(" 1. Fiskars(FIN)"), nl,

write(" 2. Alternativa(RUS)"), nl,

write(" 3. Drugoi"), nl,

write(" 4. Vse ravno"), nl,

getAnswer(Z, 1, 3, 1), nl, addloc(3, Z), addloc(4, 0), q5.

q3:-q3.

 

q4:-loc(4, _),

menu.

 

q4:-

write("Poto4nee \n"), nl,

write(" 1. Obi4nie"), nl,

write(" 2. Na pojarnii shit"), nl,

write(" 3. Sapernie"), nl,

getAnswer(Z, 1, 3, 0), nl, addloc(4, Z), addloc(3, 0), q5.

q4:-q4.

 

q5:-loc(5, _), loc(6, _),

menu.

 

q5:-

loc(1, 1),

q6.

 

q5:-

loc(4, 2),

addloc(5, 0),

q6.

 

q5:-

loc(4, 2),

loc(5, _),

q6.

 

q5:-

loc(1, S), S<>1,

write("Material Cherenka? \n"),

write(" 1. Metal"), nl,

write(" 2. Derevo"), nl,

write(" 3. Vse ravno"), nl,

getAnswer(Z, 1, 2, 1), nl, addloc(5, Z), q6.

q5:-q5.

 

q6:-loc(6, _),

menu.

 

q6:-

loc(4, 2),

addloc(6, 1),!, getSolve.

q6:-

loc(4, 2),

loc(6, _),

!, getSolve.

 

q6:-

loc(1,1), loc(2,1), loc(3,1),

write("How much? \n"), nl,!, result("no"),

write(" 1. do 1000 rub"), nl,

write(" 2. dorozhe 1000 rub"), nl,

write(" 3. vse ravno"), nl,

getAnswer(Z, 1, 2, 1), nl, addloc(6, Z),!, getSolve.

 

q6:-

loc(1,2), loc(3,1), loc(5,2),

write("How much? \n"), nl,!, result("no"),

write(" 1. do 1000 rub"), nl,

write(" 2. dorozhe 1000 rub"), nl,

write(" 3. vse ravno"), nl,

getAnswer(Z, 1, 2, 1), nl, addloc(6, Z),!, getSolve.

 

q6:-

loc(1,3), loc(4,3), loc(5,2),

write("How much? \n"), nl,!, result("no"),

write(" 1. do 1000 rub"), nl,

write(" 2. dorozhe 1000 rub"), nl,

write(" 3. vse ravno"), nl,

getAnswer(Z, 1, 2, 1), nl, addloc(6, Z),!, getSolve.

 

q6:-

loc(2,2),

write("How much? \n"), nl,!, result("no"),

write(" 1. do 1000 rub"), nl,

write(" 2. dorozhe 1000 rub"), nl,

write(" 3. vse ravno"), nl,

getAnswer(Z, 1, 2, 1), nl, addloc(6, Z),!, getSolve.

 

q6:-

loc(5, 1),

write("How much? \n"), nl,!, result("no"),

write(" 1. do 1000 rub"), nl,

write(" 2. dorozhe 1000 rub"), nl,

write(" 3. vse ravno"), nl,

getAnswer(Z, 1, 2, 1), nl, addloc(6, Z),!, getSolve.

 

q6:- not(loc(6, _)),

write("How much? \n"), nl,!, result("no"),

write(" 1. do 100 rub"), nl,

write(" 2. do 1000 rub"), nl,

write(" 3. dorozhe 1000 rub"), nl,

write(" 4. vse ravno"), nl,

getAnswer(Z, 1, 3, 1), nl, addloc(6, Z),!, getSolve.

 

% Baza dannih

 

lopata("Fiskars 143600"):-

loc(1, 1),

loc(2, 1),

loc(3, 1),

loc(4, 0),

loc(5, 0),

loc(6, 1).

 

lopata("Fiskars 142610"):-

loc(1, 1),

loc(2, 1),

loc(3, 1),

loc(4, 0),

loc(5, 0),

loc(6, 2).

 

lopata("stalnaia krashenaia 355*380"):-

loc(1, 1),

loc(2, 1),

loc(3, 2),

loc(4, 0),

loc(5, 0),

loc(6, 1).

 

lopata("lopata plastmassovaia 400*460mm"):-

loc(1, 1),

loc(2, 1),

loc(3, 2),

loc(4, 0),

loc(5, 0),

loc(6, 2).

 

lopata("lopata dvijok na kolesah"):-

loc(1, 1),

loc(2, 1),

loc(3, 2),

loc(4, 0),

loc(5, 0),

loc(6, 3).

 

lopata("detskaia pomogat bydet"):-

loc(1, 1),

loc(2, 1),

loc(3, 3),

loc(4, 0),

loc(5, 0),

loc(6, 1).

 

lopata("lopata Rusich-4 alluminievaia"):-

loc(1, 1),

loc(2, 1),

loc(3, 3),

loc(4, 0),

loc(5, 0),

loc(6, 2).

 

lopata("Novital BIOCCOLO"):-

loc(1, 1),

loc(2, 1),

loc(3, 3),

loc(4, 0),

loc(5, 0),

loc(6, 3).

 

lopata("Belarus"):-

loc(1, 1),

loc(2, 2),

loc(3, 0),

loc(4, 0),

loc(5, 0),

loc(6, 1).

 

lopata("KIROVEC"):-

loc(1, 1),

loc(2, 2),

loc(3, 0),

loc(4, 0),

loc(5, 0),

loc(6, 2).

 

lopata("FISKARS 132402"):-

loc(1, 2),

loc(2, 0),

loc(3, 1),

loc(4, 0),

loc(5, 1),

loc(6, 1).

 

lopata("Fiskars 132500"):-

loc(1, 2),

loc(2, 0),

loc(3, 1),

loc(4, 0),

loc(5, 1),

loc(6, 2).

 

lopata("FISKARS 131650"):-

loc(1, 2),

loc(2, 0),

loc(3, 1),

loc(4, 0),

loc(5, 2),

loc(6, 1).

 

lopata("Fiskars 131410"):-

loc(1, 2),

loc(2, 0),

loc(3, 1),

loc(4, 0),

loc(5, 2),

loc(6, 2).

 

lopata("lopata M-1016"):-

loc(1, 2),

loc(2, 0),

loc(3, 2),

loc(4, 0),

loc(5, 1),

loc(6, 1).

 

lopata("lopata M-1022"):-

loc(1, 2),

loc(2, 0),

loc(3, 2),

loc(4, 0),

loc(5, 1),

loc(6, 2).

 

lopata("lopata M-1015"):-

loc(1, 2),

loc(2, 0),

loc(3, 2),

loc(4, 0),

loc(5, 2),

loc(6, 1).

 

lopata("lopata M-1020"):-

loc(1, 2),

loc(2, 0),

loc(3, 2),

loc(4, 0),

loc(5, 2),

loc(6, 2).

 

lopata("lopata M-1033"):-

loc(1, 2),

loc(2, 0),

loc(3, 2),

loc(4, 0),

loc(5, 2),

loc(6, 3).

 

lopata("Centrinstrument, lopata - molodost’"):-

loc(1, 2),

loc(2, 0),

loc(3, 3),

loc(4, 0),

loc(5, 1),

loc(6, 1).

 

lopata("Nava"):-

loc(1, 2),

loc(2, 0),

loc(3, 3),

loc(4, 0),

loc(5, 1),

loc(6, 2).

 

lopata("SOVKOVAIA BEZ CHERENKA 17421"):-

loc(1, 2),

loc(2, 0),

loc(3, 3),

loc(4, 0),

loc(5, 2),

loc(6, 1).

 

lopata("Centrinstryment, lopata - dachnik"):-

loc(1, 2),

loc(2, 0),

loc(3, 3),

loc(4, 0),

loc(5, 2),

loc(6, 2).

 

lopata("Terraline 03786"):-

loc(1, 2),

loc(2, 0),

loc(3, 3),

loc(4, 0),

loc(5, 2),

loc(6, 3).

 

lopata("Fiskars 131412"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 1),

loc(5, 1),

loc(6, 1).

 

lopata("FISKARS 131510"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 1),

loc(5, 1),

loc(6, 2).

 

lopata("Lko-4 s rebrom"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 1),

loc(5, 2),

loc(6, 1).

 

lopata("Fiskars 131640"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 1),

loc(5, 2),

loc(6, 2).

 

lopata("Fiskars 131410"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 1),

loc(5, 2),

loc(6, 3).

 

lopata("lopata"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 2),

loc(5, 0),

loc(6, 1).

 

lopata("FIT skladnaia"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 3),

loc(5, 1),

loc(6, 1).

 

lopata("Titanovaia"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 3),

loc(5, 1),

loc(6, 2).

 

lopata("Matrix 61425"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 3),

loc(5, 2),

loc(6, 1).

 

lopata("Azart b"):-

loc(1, 3),

loc(2, 0),

loc(3, 0),

loc(4, 3),

loc(5, 2),

loc(6, 2).

 

 

lopata("None").

 

%Ceni%

 

cena("Fiskars 143600", "990").

cena("Fiskars 142610", "1947").

cena("stalnaia krashenaia 355*380", "70").

cena("lopata plastmassovaia 400*460mm", "117").

cena("lopata dvijok na kolesah", "1100").

cena("detskaia pomogat bydet", "94").

cena("lopata Rusich-4 alluminievaia", "625").

cena("Novital BIOCCOLO", "1950").

cena("KIROVEC", "7000000").

cena("Belarus", " v te4enii 3-eh let, v den’ po 999 ").

cena("FISKARS 132402", "650").

cena("Fiskars 132500", "2323").

cena("FISKARS 131650", "520").

cena("Fiskars 131410", "1100").

cena("lopata M-1016", "278").

cena("lopata M-1022", "1001").

cena("lopata M-1015", "95").

cena("lopata M-1020", "295").

cena("lopata M-1033", "1001").

cena("Centrinstrument, lopata - molodost’", "492").

cena("Nava", "1047").

cena("SOVKOVAIA BEZ CHERENKA 17421", "77").

cena("Centrinstryment, lopata - dachnik", "854").

cena("Terraline 03786", "1474").

cena("Fiskars 131412", "783").

cena("FISKARS 131510", "1990").

cena("Lko-4 s rebrom", "99").

cena("Fiskars 131640", "588").

cena("Fiskars 131410", "1190").

cena("lopata", "34").

cena("FIT skladnaia", "500 000").

cena("Titanovaia","1500").

cena("Matrix 61425", "124").

cena("Azart b", "1050").

cena("None", "-").

 

loclist(1, 1, "Lublu s ytra kopat sneg").

loclist(1, 2, "Dlia sipy4ish materialov").

loclist(1, 3, "Shtikovie").

loclist(2, 1, "Nee").

loclist(2, 2, "Horoshaia ideia").

loclist(2, 0, "").

loclist(3, 1, "Fiskars").

loclist(3, 2, "Alternativa").

loclist(3, 3, " Drugoi").

loclist(3, 0, "").

loclist(4, 1, "Obi4nie").

loclist(4, 2, "Na pojarnii shit").

loclist(4, 3, "Sapernie").

loclist(4, 0, "").

loclist(5, 1, "Metal").

loclist(5, 2, "Derevo").

 

resultat("Fiskars 143600", 1, 1, 1, 0, 1).

resultat("Fiskars 142610", 1, 1, 1, 0, 1).

resultat("stalnaia krashenaia 355*380", 1, 1, 2, 0, 1).

resultat("lopata plastmassovaia 400*460mm", 1, 1, 2, 0, 1).

resultat("lopata dvijok na kolesah", 1, 1, 2, 0, 1).

resultat("detskaia pomogat bydet", 1, 1, 3, 0, 1).

resultat("lopata Rusich-4 alluminievaia", 1, 1, 3, 0, 1).

resultat("Novital BIOCCOLO", 1, 1, 3, 0, 1).

resultat("KIROVEC", 1, 2, 0, 0, 1).

resultat("Belarus", 1, 2, 0, 0, 1).

resultat("FISKARS 132402", 2, 0, 1, 0, 1).

resultat("Fiskars 132500", 2, 0, 1, 0, 1).

resultat("FISKARS 131650", 2, 0, 1, 0, 2).

resultat("Fiskars 131410", 2, 0, 1, 0, 2).

resultat("lopata M-1016", 2, 0, 2, 0, 1).

resultat("lopata M-1022", 2, 0, 2, 0, 1).

resultat("lopata M-1015", 2, 0, 2, 0, 2).

resultat("lopata M-1020", 2, 0, 2, 0, 2).

resultat("lopata M-1033", 2, 0, 2, 0, 2).

resultat("Centrinstrument, lopata - molodost’", 2, 0, 3, 0, 1).

resultat("Nava", 2, 0, 3, 0, 1).

resultat("Terraline 03786", 2, 0, 3, 0, 2).

resultat("SOVKOVAIA BEZ CHERENKA 17421", 2, 0, 3, 0, 2).

resultat("Centrinstryment, lopata - dachnik", 2, 0, 3, 0, 2).

resultat("Fiskars 131412", 3, 0, 0, 1, 1).

resultat("FISKARS 131510", 3, 0, 0, 1, 1).

resultat("Lko-4 s rebrom", 3, 0, 0, 1, 2).

resultat("Fiskars 131640", 3, 0, 0, 1, 2).

resultat("Fiskars 131410", 3, 0, 0, 1, 2).

resultat("lopata", 3, 0, 0, 2, 2).

resultat("FIT skladnaia", 3, 0, 0, 3, 1).

resultat("Titanovaia", 3, 0, 0, 3, 1).

resultat("Matrix 61425", 3, 0, 0, 3, 2).

resultat("Azart b", 3, 0, 0, 3, 2).

 

goal

makewindow(2,30,30, " Expert system: auto selection ", 0, 0, 25, 80), nl,

write("Viberite lopaty"), nl,

begin.

 



<== предыдущая лекция | следующая лекция ==>
Выбираем секционную ячейку на 630 А с выключателем ВВ/TEL-10-630-12,5 | Примерный перечень контрольных вопросов для подготовки к аттестации по дисциплине
Поделиться с друзьями:


Дата добавления: 2016-03-26; Мы поможем в написании ваших работ!; просмотров: 657 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Вы никогда не пересечете океан, если не наберетесь мужества потерять берег из виду. © Христофор Колумб
==> читать все изречения...

777 - | 750 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.