Редактирование: Основы Кибернетики, Алгоритмы решения задач/Задачи на синтез схем

Материал из eSyr's wiki.

Перейти к: навигация, поиск

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

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

Текущая версия Ваш текст
Строка 1: Строка 1:
-
== По заданной ФАЛ с помощью простейших методов, метода каскадов или метода Шеннона построить реализующую ее СФЭ или КС. ==
+
== From Ebaums Inc to MurkLoar. ==
-
 
+
We at EbaumsWorld consider you as disgrace of human race.
-
=== Простейшие методы ===
+
Your faggotry level exceeded any imaginable levels, and therefore we have to inform you that your pitiful resourse should be annihilated.
-
==== Промежуточные действия ====
+
Dig yourself a grave - you will need it.
-
* Если ФАЛ представлена в виде таблицы, то построим по ней совершенную ДНФ (как объединение всех возможных случаев, когда она равна 1).
+
-
* Если ФАЛ представлена в виде формулы, преобразуем ее, чтобы остались только функции базиса Б<sub>0</sub>. Кроме того, поднимаем все отрицания (они должны стоять только над переменными, но не над бо́льшими кусками выражения).
+
-
 
+
-
==== Получение СФЭ ====
+
-
Строим как-нибудь подвыражения в соответствии с приоритетом операций. Поскольку оставлены только функции базиса Б<sub>0</sub>, то это не вызывает особых затруднений. Что вижу, то и рисую.
+
-
 
+
-
==== Получение КС ====
+
-
Разбираем формулу
+
-
* ''A'' ∨ ''B'' преобразуем в ветвление, где один вариант реализует ''A'', а другой — ''B''
+
-
* ''A'' & ''B'' преобразуем в последовательное соединение, где первая часть реализует ''A'', другая — ''B''.
+
-
* <span style="border-top:solid 1px">''x''<sub>i</sub></span> преобразуем в контакт с меткой <span style="border-top:solid 1px">''x''<sub>i</sub></span>
+
-
* ''x''<sub>i</sub> преобразуем в контакт с меткой ''x''<sub>i</sub>
+
-
 
+
-
=== Метод каскадов ===
+
-
==== Промежуточные действия ====
+
-
Пусть у нас имеются булевы функции F<sub>1</sub>(x<sub>1</sub>, x<sub>2</sub>, &hellip; , x<sub>n</sub>), &hellip; , F<sub>k</sub>(x<sub>1</sub>, x<sub>2</sub>, &hellip; , x<sub>n</sub>), зависящие от n переменных. Обозначим следующее множество:
+
-
M<sub>0</sub> = {F<sub>1</sub>(x<sub>1</sub>, x<sub>2</sub>, &hellip; , x<sub>n</sub>), &hellip; , F<sub>k</sub>(x<sub>1</sub>, x<sub>2</sub>, &hellip; , x<sub>n</sub>)}.
+
-
В простейшем случае, в нем одна функция. Воспользуемся следующим приемом:
+
-
F(x<sub>1</sub>, x<sub>2</sub>, &hellip; , x<sub>n</sub>) = x<sub>1</sub>*F(1,x<sub>2</sub>, &hellip; , x<sub>n</sub>)V <span style="border-top:solid 1px">x<sub>1</sub></span>*F(0, x<sub>2</sub>, &hellip;, x<sub>n</sub>)
+
-
Тогда определим правило построения следующих множеств (M<sub>1</sub>, M<sub>2</sub>, &hellip; , M<sub>n</sub>):
+
-
M<sub>i+1</sub> = {g(0,x<sub>i+1</sub>, &hellip; , x<sub>n</sub>)|g∈M<sub>i</sub>} U {g(1,x<sub>i+1</sub>, &hellip; , x<sub>n</sub>)|g∈M<sub>i</sub>}.
+
-
Если функция представлена строкой значений, то формируем новое множество из левых и правых половин.
+
-
Если функция представлена формулой, то подставляем в нее x<sub>i</sub>=0 и x<sub>i</sub>=1 и упрощаем.
+
-
При этом после построения из M<sub>i</sub> удаляются все фунции, несущественно зависящие от x<sub>1</sub> (для строк значений это хорошо видно, т.к. левая и правая половина совпадает)
+
-
===== Пример =====
+
-
f<sub>1</sub>(x<sub>1</sub>,x<sub>2</sub>,x<sub>3</sub>,x<sub>4</sub>)=(1000 0010 1111 1000)
+
-
f<sub>2</sub>(x<sub>1</sub>,x<sub>2</sub>,x<sub>3</sub>,x<sub>4</sub>)=(1000 1111 0010 1000)
+
-
*M<sub>0</sub> = {(1000 0010 1111 1000),(1000 1111 0010 1000)}
+
-
*M<sub>1</sub> = {(1000 0010),(1111 1000),(1000 1111),(0010 1000)}
+
-
*M<sub>2</sub> = {(1000),(0010),(1111)}
+
-
*M<sub>3</sub> = {(10),<strike>(00)</strike>,<strike>(11)</strike>}
+
-
*M<sub>4</sub> = {0,1}
+
-
 
+
-
==== Получение СФЭ ====
+
-
Реализуем на базе любого входа
+
-
*0 = x<sub>i</sub> & <span style="border-top:solid 1px">x<sub>i</sub></span>
+
-
*1 = x<sub>i</sub> V <span style="border-top:solid 1px">x<sub>i</sub></span>
+
-
 
+
-
Для реализации элемента M<sub>i</sub> используем элементы M<sub>i+1</sub>: пусть f(0,x<sub>i+1</sub>,...x<sub>n</sub>)=g(x<sub>i+1</sub>,...x<sub>n</sub>) и f(1,x<sub>i+1</sub>,...x<sub>n</sub>)=h(x<sub>i+1</sub>,...x<sub>n</sub>).
+
-
 
+
-
Тогда для реализации f соединеним дизъюнкцией конъюнкцию g и <span style="border-top:solid 1px">x<sub>i</sub></span> с конъюнкцией h и x<sub>i</sub>.
+
-
 
+
-
Реализацию элементов M<sub>0</sub> метим как выходы СФЭ.
+
-
 
+
-
==== Получение КС ====
+
-
Обозначаем все элементы всех множеств узлами КС.
+
-
*если g(x<sub>i+1</sub>,...x<sub>n</sub>)=h(0,x<sub>i+1</sub>,...x<sub>n</sub>), то соединим g и h контактом с меткой <span style="border-top:solid 1px">x<sub>i</sub></span>
+
-
*если g(x<sub>i+1</sub>,...x<sub>n</sub>)=h(1,x<sub>i+1</sub>,...x<sub>n</sub>), то соединим g и h контактом с меткой x<sub>i</sub>
+
-
После этого удаляем вершину с меткой 0 и все ведущие в нее контакты. Вершину с меткой 1, а также F<sub>1</sub>,...,F<sub>k</sub> помечаем как входы КС.
+
-
 
+
-
=== Метод Шеннона ===
+
-
==== Промежуточные действия ====
+
-
Выбираем некоторое 1≤q≤n. Расклыдаваем исходное f(x',x") = V x<sub>i+1</sub><sup>σ<sub>i+1</sub></sup> & x<sub>i+2</sub><sup>σ<sub>i+2</sub></sup> & ... & x<sub>n</sub><sup>σ<sub>n</sub></sup> & f<sub>σ"</sub>(x').
+
-
Обычно выбирают q = округленноый вниз(log<sub>2</sub>(n-2*log<sub>2</sub>(n))). После чего составляется универсальный многополюсник порядка q(имеющий q входов и 2<sup>n</sup> выходов) и мультиплексор порядка n-q (зависщий от адресных переменных x<sub>i+1</sub>, ... ,x<sub>n</sub> и от выходов универсального многополюсника, выдающий на выход f<sub>σ"</sub>(x') в соответствии с приведенной формулой в свой единственный выход).
+
-
 
+
-
Данный метод не применяется на практике для построения КС или СФЭ, это скорее мысленный эксперимент вроде падающего из окна Дэвида Дойча или квантового самоубийцы, используемый затем Шенноном и его последователями для оценки функции Шеннона...
+
-
 
+
-
==== Получение СФЭ ====
+
-
Универсальный многополюсник в СФЭ выглядит так:
+
-
Мультиплексор порядка q для f(x) в СФЭ выгладит так:
+
-
 
+
-
==== Получение КС ====
+
-
Универсальный многополюсник в КС выглядит так: точно так же как в методе каскадов к каждой вершине приписываем <span style="border-top:solid 1px">x<sub>1</sub></span> или x<sub>1</sub>, дабы соединить с новой волной вершин. В каждой следующем множестве будет в 2 раза больше вершин.
+
-
Мультиплексор порядка q для f(x) в КС выгладит так:
+
-
 
+
-
== Оценить сверху или снизу сложность конкретной ФАЛ или сложность самой сложной ФАЛ из заданного множества в заданном классе схем. ==
+
-
=== Оценка сложности самой сложной ФАЛ из класса ===
+
-
Для того, что посчитать сложность самой сложной ФАЛ из некоторого класса ''Q''(''n'') &isin; ''P''<sub>2</sub>(''n''), то есть, иначе говоря, вычислить функцию Шеннона, связанную с классом ''Q''(''n'') (и для некоторого класса cхем U — например, СФЭ или КС), необходимо выполнить следующие шаги:
+
-
# Посчитать число функций в заданном классе ''Q''(''n'').
+
-
# Сразу же из этого получить асимптотически нижнюю оценку функции Шеннона, связанной с классом ''Q''(''n''):
+
-
#* ''L''<sup>''K''</sup>(''Q''(''n'')) ≳ log(|''Q''(''n'')|) / log(log(|''Q''(''n'')|))
+
-
#* L<sup>C</sup>(''Q''(''n'')) ≳ log(|''Q''(''n'')|) / log(log(|''Q''(''n'')|))
+
-
# Показать, как для любой функции из данного класса построить схему из класса U, реализующую данную функцию и имеющую сложность, асимптотически равную вычисленной нижней оценке. Из этого будет следовать, что полученная асимптотически нижняя оценка является и асимптотически верхней оценкой, а из этого, в свою очередь, будет следовать, что функция Шеннона для заданного класса ''U''(''n'') будет просто асимптотически равна полученной нижней оценке.
+
-
#* В пункте 3 всегда пригождается следующее: для любой функции от ''n'' переменных можно построить, реализующую её СФЭ и КС со сложностью, асимптотически не превосходящей 2<sup>n</sup> / ''n''
+
-
 
+
-
==== Пример ====
+
-
* Посчитать функцию Шеннона, связанную с классом самодвойственных функций, для класса СФЭ.
+
-
** Самодвойственная функция ''f'': ''f''(''x''<sub>1</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''f''(<span style="border-top:double 3px">''x''</span><sub>1</sub>, &hellip;, <span style="border-top:double 3px">''x''</span><sub>n</sub>)</span>
+
-
 
+
-
'''Решение'''
+
-
# Первый пункт является самым главным. В нём нужно получить некоторую формулу, в которой любая функция из заданного класса выражается через функцию от меньшего числа переменных. Полученная формула пригодится и впоследствии. Например, для класса самодвойственных функций, разложим функцию ''f'' по первой переменной ''f''(''x''<sub>1</sub>, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''f''(0, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''f''(1, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''f''(0, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''f''(0, <span style="border-top:solid 1px">''x''</span><sub>2</sub>, &hellip;, <span style="border-top:solid 1px">''x''</span><sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''f''<sub>0</sub>(''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & <span style="border-top:solid 1px">''f''<sub>0</sub>(''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>)</span>, где ''f''<sub>0</sub> = ''f''(0, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>). Перепишем это в виде ''f''(''x''<sub>1</sub>, &hellip;, ''x''<sub>n</sub>) = ''x''<sub>1</sub> ⊕ ''f''<sub>0</sub>(''x''<sub>2</sub> ⊕ ''x''<sub>1</sub>, &hellip;, ''x''<sub>n</sub> ⊕ ''x''<sub>1</sub>) (*). Теперь видно, самодвойственная функция от ''n'' переменных однозначно определяется функцией ''f''<sub>0</sub> от ''n'' &minus; 1 переменной, и, следовательно, число самодвойственных функций от ''n'' переменных равно 2<sup>2<sup>''n'' &minus; 1</sup></sup>. В принципе, это и ежу очевидно, но полученная нами (*) потребуется нам в дальнейшем.
+
-
# Из пункта 1 следует что ''L''<sup>C</sup>(''Q''(''n'')) ≳ 2<sup>''n'' &minus; 1</sup> / ''n''
+
-
# Из (*), а также из утверждения строим схему для произвольной самодвойственной функции. Строим ''f''<sub>0</sub> (сложность 2<sup>''n'' &minus; 1</sup> / (''n'' &minus; 1)). Для ''n'' «⊕» потребуется ещё не более, чем ''C'' &times; ''n'' функциональных элементов. В итоге как раз и получится, что сложность результирующей схемы асимптотически не превосходит 2<sup>''n'' &minus; 1</sup> / ''n''
+
-
 
+
-
==== Пример ====
+
-
* Посчитать функцию Шеннона, также для класса СФЭ, связанную с классом функций, таких, что:
+
-
''f''(''x''<sub>1</sub>, ''x''<sub>2</sub>, ''x''<sub>3</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(<span style="border-top:solid 1px">''x''</span><sub>3</sub>, ''x''<sub>1</sub>, ''x''<sub>2</sub>, &hellip;, ''x''<sub>n</sub>)
+
-
 
+
-
'''Решение'''
+
-
# Разлагаем ''f'' по первым трём переменным:
+
-
#* ''f''(''x''<sub>1</sub>, ''x''<sub>2</sub>, ''x''<sub>3</sub>, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = <span style="border-top:solid 1px">''x''</span><sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(0, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ <span style="border-top:solid 1px">''x''</span><sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & ''x''<sub>3</sub> & ''f''(0, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''x''<sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(0, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ <span style="border-top:solid 1px">''x''</span><sub>1</sub> & ''x''<sub>2</sub> & ''x''<sub>3</sub> & ''f''(0, 1, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(1, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & <span style="border-top:solid 1px">''x''</span><sub>2</sub> & ''x''<sub>3</sub> & ''f''(1, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''x''<sub>2</sub> & <span style="border-top:solid 1px">''x''</span><sub>3</sub> & ''f''(1, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) ∨ ''x''<sub>1</sub> & ''x''<sub>2</sub> & ''x''<sub>3</sub> & ''f''(1, 1, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = (<span style="border-top:solid 1px">''x''</span><sub>1</sub>''x''<sub>2</sub><span style="border-top:solid 1px">''x''</span><sub>3</sub> ∨ ''x''<sub>1</sub><span style="border-top:solid 1px">''x''</span><sub>2</sub>''x''<sub>3</sub>) & ''f''<sub>a</sub> ∨ (<span style="border-top:solid 1px">(<span style="border-top:double 3px">''x''</span><sub>1</sub>''x''<sub>2</sub><span style="border-top:double 3px">''x''</span><sub>3</sub> ∨ ''x''<sub>1</sub><span style="border-top:double 3px">''x''</span><sub>2</sub>''x''<sub>3</sub>)</span>) & ''f''<sub>b</sub> (*), <br />где ''f''<sub>a</sub> = ''f''(0, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(1, 0, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(1, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = f(1, 1,1,x4,...,xn) = ''f''(0, 1, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(0, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>); <br /> ''f''<sub>b</sub> = ''f''(0, 1, 0, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>) = ''f''(1, 0, 1, ''x''<sub>4</sub>, &hellip;, ''x''<sub>n</sub>). Теперь видно, что функция из данного класса однозначно определяется парой (''f''<sub>a</sub>, ''f''<sub>b</sub>), где ''f''<sub>a</sub>, ''f''<sub>b</sub> — функции от ''n'' &minus; 3 переменных. Таким образом, число функций из заданного класса равно числу таких пар, т.&nbsp;е. 2<sup>2<sup>''n'' &minus; 3</sup></sup> &times; 2<sup>2<sup>''n'' &minus; 3</sup></sup> = 2<sup>2<sup>''n'' &minus; 2</sup></sup>
+
-
# Из (1) следует, что ''L''<sup>C</sup>(''Q''(''n'')) ≳ 2<sup>''n'' &minus; 2</sup> / ''n''
+
-
# Опять же, из (*) ясно, как строить схему для произвольной функции из заданного класса. Строим СФЭ для функций ''f''<sub>a</sub>, ''f''<sub>b</sub> (сложность каждой &le; (2<sup>''n'' &minus; 3</sup> / (''n'' &minus; 3)). И, кроме того, нам потребуется дополнительная константа С «∨», «&» и «¬» для реализации (*). Складывая (2<sup>''n'' &minus; 3</sup> / (''n'' &minus; 3)) + (2<sup>''n'' &minus; 3</sup> / (''n'' &minus; 3)) + С, получим как раз, что это ≲ 2<sup>''n'' &minus; 2</sup> / ''n''.
+
-
 
+
-
<!-- Объяснил довольно криво, но, надеюсь, идея понятна.
+
-
И ещё я не умею пользоваться викой. Как встраивать латеховские формулы?
+
-
Почему у меня не получается? Вначаое пытался, а потом забил...
+
-
 
+
-
Есир, помоги, пожалуйста! Надеюсь, что ты всё приведёшь к нормальному виду, если тебе не будт влом.
+
-
Броник. -->
+
-
 
+
-
==== Оценка снизу ====
+
-
 
+
-
=== Оценка сложности ФАЛ ===
+
-
==== Оценка сверху ====
+
-
=== Оценка сложности самой сложной ФАЛ из класса ===
+
-
==== Оценка снизу ====
+
-
 
+
-
== По заданной КС построить эквивалентную ей самокорректирующуюся КС. ==
+
-
=== Определение самокорректирующейся КС ===
+
-
(p,&nbsp;q)-самокорректирующейся КС называют КС, из которой всегда получается эквивалентная ей КС (реализующая те же формулы через все контакты) после p операций обрыва контакта (смена проводимости одного контакта с x<sup>σ</sup> на 0) и q операций замыкания контакта (смена проводимости одного контакта с x<sup>σ</sup> на 1).
+
-
 
+
-
=== Простейший способ построения ===
+
-
* Для защиты от одного разрыва каждый контакт заменяем на пару параллельных.
+
-
* Для защиты от n разрывов&nbsp;— на (n+1) дублирующих друг друга контактов.
+
-
* Для защиты от одного замыкания каждый контакт заменяем на пару последовательных.
+
-
* Для защиты от n замыканий&nbsp;— на (n+1) подряд идущих одинаковых контактов.
+
-
Итого, для (p,&nbsp;q)-самокорректирующей схемы мы каждый из контактов заменяем на последовательность из (q&nbsp;+&nbsp;1) блоков, каждый из которых&nbsp;— параллельный пучок из (p&nbsp;+&nbsp;1) контакта.
+
-
 
+
-
==== Пример ====
+
-
{|
+
-
!Исходная контактная схема
+
-
!Контактная схема, исправляющая один разрыв
+
-
|-
+
-
|style="text-align:center"|[[Изображение:Contact_scheme.png|320px|Исходная контактная схема]]
+
-
|style="text-align:center"|[[Изображение:Contact_scheme_parallel.png|320px|Контактная схема, исправляющая один разрыв]]
+
-
|-
+
-
!Контактная схема, исправляющая одно замыкание
+
-
!Контактная схема, исправляющая один разрыв и одно замыкание
+
-
|-
+
-
|style="text-align:center"|[[Изображение:Contact_scheme_sequential.png|320px|Контактная схема, исправляющая одно замыкание]]
+
-
|style="text-align:center"|[[Изображение:Contact_scheme_pq.png|320px|Контактная схема, исправляющая один разрыв и одно замыкание]]
+
-
|}
+
-
 
+
-
=== Способы с оптимизацией числа дуг самокорректирующейся КС ===
+
-
Существуют способы предварительной модификации схемы, после чего к контактам нетронутой части применяется описанный выше алгоритм.
+
-
 
+
-
==== Для исправления одного замыкания ====
+
-
*Выделяем цикл из одинаковых контактов, вводим новую вершину и делаем ее центром звезды, на которую заменяем найденный цикл.
+
-
*Все контакты, не вошедшие ни в 1 цикл удваиваем последовательно.
+
-
*Данная конфигурация устойчива к одному замыканию, т.к. между любыми исходными узлами появляется не 1, а 2 контакта.
+
-
 
+
-
==== Для исправления одного обрыва цепи ====
+
-
*Выделяем звезду из одинаковых контактов, удаляем все контакты звезды и соединяем все контакты циклом.
+
-
*Все контакты, не вошедшие ни в 1 звезду удваиваем параллельно.
+
-
*Данная конфигурация устойчива к одному обрыву, т.к. между любыми 2 узлами появляется не 1, а 2 пути.
+
-
 
+
-
{{Курс Основы Кибернетики}}
+

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. eSyr's_wiki:Авторское право).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Шаблоны, использованные на этой странице:

Разделы