Перейти до вмісту
coden

Нечіткі множини й функції належності: як записати «трохи тепло»

Чітка межа і парадокс купи, нечітка множина і ступінь належності, форми функцій належності, лінгвістична змінна, носій, ядро та α-перерізи, операції Заде і модифікатори «дуже» та «трохи» — на температурі від холоду до спеки.

12 хвилин Matěj Žalmánek 2026-10-15

Серія Основи ШІ Частина 32 з 52
  1. Мапа штучного інтелекту: що є що і як усе це пов’язано
  2. Коротка історія штучного інтелекту: від Тюрінга до мовних моделей
  3. Дані, модель, тренування, інференс: основні поняття на одному прикладі
  4. Як читати математичний запис: символи, індекси, суми та квантори
  5. Множини й відношення: конструктор, з якого складаються означення в ШІ
  6. Функції й відображення: чому кожна модель у ШІ — це функція
  7. Логіка й доведення: правила, за якими міркують у ШІ
  8. Графи й дерева: структура, на якій тримаються пошук і нейронні мережі
  9. Лінійна алгебра для машинного навчання: вектори, матриці й чому ШІ передусім множить
  10. Похідні, градієнт і правило ланцюжка: як модель дізнається, у якому напрямку вчитися
  11. Градієнтний спуск: як навчається модель
  12. Що таке ймовірність: від кидка кубика до аксіом Колмогорова
  13. Умовна ймовірність і теорема Баєса: як змінити оцінку, коли дізнаєтеся щось нове
  14. Випадкова величина і функція розподілу: одна функція, яка каже про розподіл усе
  15. Функція щільності та функція маси ймовірності: чому неперервна величина має в точці ймовірність нуль
  16. Математичне сподівання, дисперсія і коваріація: де лежить розподіл, наскільки він широкий і що з чим пов’язано
  17. Огляд розподілів ймовірностей: Бернуллі, біноміальний, Пуассона, рівномірний, нормальний і експоненційний
  18. Закон великих чисел і центральна гранична теорема: чому середні поводяться так передбачувано
  19. Статистика й оцінювання параметрів: максимальна правдоподібність, MAP і довірчі інтервали
  20. Теорія інформації: ентропія, перехресна ентропія і KL-дивергенція — звідки беруться функції втрат
  21. Пошук у просторі станів: BFS, DFS, UCS і A* з анімаціями
  22. Ігри та суперник: мінімакс, альфа-бета відсікання і Monte Carlo tree search
  23. Задоволення обмежень: бектрекінг, поширення обмежень і AC-3 на судоку та мапі чеських країв
  24. Логіка й системи, засновані на знаннях: пряме і зворотне виведення, резолюція та експертні системи
  25. Планування: STRIPS, світ кубиків, евристики з релаксації та планування в AI-агентах
  26. Локальний пошук та імітація відпалу: комівояжер через обласні центри Чехії
  27. Генетичні алгоритми: популяція, схрещування, мутація і добір на рюкзаку для походу
  28. Еволюційні стратегії і генетичне програмування: від правила однієї п’ятої до закону Кеплера
  29. Оптимізація мурашиною колонією: як феромоновий слід знаходить короткий шлях
  30. Оптимізація роєм частинок: інерція, власний досвід і досвід рою
  31. Нейроеволюція: еволюція ваг і форми нейронних мереж та алгоритм NEAT
  32. Нечіткі множини й функції належності: як записати «трохи тепло»
  33. Нечітка логіка та ймовірність: чому «трохи тепло» не означає «імовірно тепло»
  34. Нечітка логіка: t-норми, імплікації та правила ЯКЩО–ТО
  35. Нечітке керування: Мамдані та Суґено від вентилятора до маятника на візку
  36. Нечітка кластеризація: алгоритм fuzzy c-means і точки між кластерами
  37. Нейро-нечіткі системи (ANFIS): нечіткі правила, які навчаються з даних
  38. Марковські ланцюги: матриця переходів, стаціонарний розподіл і PageRank
  39. Приховані марковські моделі: алгоритм Вітербі й нечесне казино
  40. Байєсівські мережі: чому трава мокра і що з цього випливає для дощувача
  41. Фільтр Калмана: як за неточними вимірюваннями оцінити, де авто і як швидко воно їде
  42. Види машинного навчання: з учителем, без учителя, з частковим залученням учителя та інші
  43. Промпти, контекст і RAG: як дати моделі правильну інформацію
  44. Варіаційні автокодувальники (VAE): нові зображення з неперервного латентного простору
  45. Генеративні змагальні мережі (GAN): фальшувальник проти детектива
  46. Дифузійні моделі: як із чистого шуму постає зображення
  47. Марковські процеси ухвалення рішень: стани, дії, винагороди й рівняння Беллмана
  48. Q-навчання і DQN: як навчитися цінності дій — від таблиці до нейронної мережі
  49. Policy gradient і PPO: навчання безпосередньо політики
  50. Як працює ШІ-агент: мовна модель у циклі з інструментами
  51. Програмування з AI-агентами: завдання, тести й перевірка
  52. Оцінювання і безпека систем ШІ: як вимірювати і як стежити

Повна програма серії Готово: 52 з 83 тем

Що ви винесете
  • Що таке нечітка множина і чому ступінь належності — не ймовірність.
  • Як слова на кшталт «тепло» чи «приємно» записуються функціями належності і як вони перекриваються.
  • Як працюють нечіткі перетин, об’єднання й доповнення і чому не справджується закон виключеного третього.

Що варто знати заздалегідь: Множини й відношення: конструктор, з якого складаються означення в ШІ, Функції й відображення: чому кожна модель у ШІ — це функція

Скільки піщинок становлять купу? Мільйон — напевно. Одна — напевно ні. А якщо з купи забрати одну піщинку, це все ще купа — тож за цією логікою навіть одна піщинка була б купою. Цей парадокс знали ще давні греки, і він показує, що багато слів, якими ми говоримо про світ, не мають чіткої межі: високий, тепло, швидко, майже повно. Класична математика дає з ними раду погано, бо елемент або належить множині, або ні. 1965 року Лотфі Заде з Каліфорнійського університету в Берклі запропонував просте розв’язання: дозволити елементові належати множині трохи.

Цією частиною починається модуль про нечітку логіку. Вона продовжує частини Множини й відношення та Функції й відображення.

1. Чітка межа і її проблема

Означення — характеристична функція

Класична (чітка) множина A ⊆ X однозначно задається своєю характеристичною функцією χA : X → {0, 1}, де χA(x) = 1 для x ∈ A і 0 в іншому разі.

Простими словами

Чітка множина — це перелік із ясними «так» і «ні». Скажімо, «тепло» — це від 25 °C і вище. Тоді 25 °C — тепло, а 24,9 °C — ні, хоча різниці ніхто не відчує. Межа в одній точці довільна, і мала зміна входу дає стрибок у результаті.

00,51 0510152025303540 температура T (°C) ступінь належності μ (0–1)
«Тепло» як чітка і як нечітка множина чітка: від 25 °Cнечітка

2. Нечітка множина

Означення — нечітка множина (Заде, 1965)

Нечітка множина A на універсумі X задається функцією належності μA : X → [0, 1]. Число μA(x) — це ступінь належності елемента x до A; формально A = {(x, μA(x)) : x ∈ X}.

Чітка множина — окремий випадок, коли μA набуває лише значень 0 і 1.

Простими словами

Замість «належить, не належить» кожен елемент отримує число від нуля до одиниці: наскільки він належить множині. 28 °C — «тепло» повністю (1), 25 °C — наполовину (0,5), 20 °C — зовсім ні (0). Між ними належність змінюється плавно — жодного стрибка між 24,9 і 25.

Важливо, чим ступінь належності не є: це не ймовірність. Якщо 25 °C — «тепло» на 0,5, це не означає, що з п’ятдесятивідсотковим шансом тепло. Температура відома точно; нечітке саме слово. Різниці між розмитістю слова і невизначеністю випадку присвячено наступну частину.

3. Форми функцій належності

Означення — звичні функції належності
  • Трикутна з параметрами a < b < c: зростає лінійно від 0 в a до 1 в b і спадає до 0 в c.
  • Трапецієподібна з параметрами a ≤ b ≤ c ≤ d: зростає від a до b, між b і c дорівнює 1, спадає до d.
  • Гауссова: μ(x) = e−(x − m)2 / 2s2 — гладкий пагорб із центром m і шириною s.
  • Сигмоїдна: μ(x) = 1 / (1 + e−a(x − c)) — плавний перехід від 0 до 1 довкола точки c.
Простими словами

Форму обирають за тим, що природно і що легко обчислювати. На практиці найчастіше перемагають трикутники й трапеції: досить кількох чисел, кожен їх розуміє, а обчислення швидкі. Точна форма зазвичай важить менше, ніж здається, — важливо, де функція починається, де досягає вершини і де закінчується.

μ(x) = max( 0, min( (x − a) / (b − a), (c − x) / (c − b) ) )

(x − a) / (b − a)
ліве ребро — пряма, що в a має значення 0, а в b значення 1; ділення на довжину b − a гарантує, що вершина вийде рівно 1 незалежно від ширини
(c − x) / (c − b)
праве ребро — дзеркально: у b значення 1, у c значення 0
min
вибирає те ребро, яке саме нижче, — ліворуч від b праве ребро вище 1, праворуч від b ліве; тож мінімум «зрізає» вістря рівно в b
max(0, …)
поза інтервалом (a; c) ребра вийшли б від’ємними; але ступінь належності не може впасти нижче 0
Трикутник одним виразом — саме тим, який обчислює функція trojuhelnik нижче. Для «тепло» (22, 28, 34) і 25 °C: min(3/6, 9/6) = 0,5.
def trojuhelnik(a, b, c):
    return lambda x: max(0.0, min((x - a) / (b - a), (c - x) / (c - b)))

def lichobeznik(a, b, c, d):
    def mu(x):
        if x < a or x > d:
            return 0.0
        if x < b:
            return (x - a) / (b - a)
        return 1.0 if x <= c else (d - x) / (d - c)
    return mu

teplo = trojuhelnik(22, 28, 34)
print(teplo(25), teplo(28), teplo(31))   # 0.5 1.0 0.5

4. Лінгвістична змінна

Означення — лінгвістична змінна (Заде, 1975)

Лінгвістична змінна — це змінна, значеннями якої є слова. Вона задається назвою (наприклад, «температура»), універсумом X (0–40 °C) і множиною термів (холодно, приємно, тепло, спекотно), кожен з яких є нечіткою множиною на X.

Простими словами

Слова, якими ми описуємо температуру, перекриваються — і це нормально. 25 °C — трохи «приємно» і трохи «тепло», саме так, як сказала б людина.

Наша температура має чотири терми: холодно — трапеція (0, 0, 6, 14), приємно — трапеція (10, 17, 23, 28), тепло — трикутник (22, 28, 34) і спекотно — трапеція (30, 36, 40, 40). Вертикальна лінія перескакує між прикладовими температурами:

00,51 0510152025303540 12 °C 0,250,29 25 °C 0,600,50 31 °C 0,500,17 температура T (°C) ступінь належності μ (0–1)
Лінгвістична змінна «температура» і належності трьох температур холодноприємнотеплоспекотно
  • 12 °C — «холодно» на 0,25 і «приємно» на 0,29: прохолодна весна, коли не можна вирішити.
  • 25 °C — «приємно» на 0,6 і «тепло» на 0,5.
  • 31 °C — «тепло» на 0,5 і вже «спекотно» на 0,17.
Приклад — належності крок за кроком

На кожному ребрі досить співвідношення «скільки вже пройдено ребром» до «яка довжина ребра»:

12 °C, холодно (0, 0, 6, 14) на спадному ребрі: (14 − 12) / (14 − 6) = 2/8 = 0,25

12 °C, приємно (10, 17, 23, 28) на зростаючому ребрі: (12 − 10) / (17 − 10) = 2/7 ≈ 0,29

25 °C, приємно на спадному ребрі: (28 − 25) / (28 − 23) = 3/5 = 0,6

25 °C, тепло (22, 28, 34) на зростаючому ребрі: (25 − 22) / (28 − 22) = 3/6 = 0,5

31 °C, тепло на спадному ребрі: (34 − 31) / (34 − 28) = 3/6 = 0,5

31 °C, спекотно (30, 36, 40, 40) на зростаючому ребрі: (31 − 30) / (36 − 30) = 1/6 ≈ 0,17

Решта термів має за цих температур належність 0 — температура лежить поза їхнім носієм.

Зверніть увагу, що належності однієї температури не мусять у сумі давати 1 (для 25 °C це 1,1). Нечіткі множини — не частки одного цілого, а незалежні відповіді на запитання «чи холодно?», «чи приємно?»…

5. Носій, ядро та α-перерізи

Означення — носій, ядро, висота, α-переріз
  • Носій (support) — це {x : μA(x) > 0}: елементи, що належать A хоча б трохи.
  • Ядро (core) — це {x : μA(x) = 1}: елементи, що належать повністю.
  • Висота — це supx μA(x); множина з висотою 1 — нормальна.
  • α-переріз для α ∈ (0, 1] — це чітка множина Aα = {x : μA(x) ≥ α}. Нечітка множина опукла, якщо всі її α-перерізи є інтервалами.
Простими словами

α-переріз — це «наскільки суворими ми хочемо бути». Переріз на рівні 0,5 містить температури, які приємні хоча б наполовину. З α-перерізів нечітку множину можна скласти назад — це горизонталі пагорба. І завдяки їм чітку математику можна застосувати й до нечітких множин: досить виконати її окремо на кожному рівні α.

00,51 0510152025303540 α-переріз 0,5: [13,5; 25,5]носій (10; 28)ядро [17; 23] температура T (°C) ступінь належності μ (0–1)
Терм «приємно»: носій, ядро й α-переріз для α = 0,5 приємно

Для «приємно» носій — відкритий інтервал (10; 28), ядро — [17; 23], а α-переріз на рівні 0,5 — інтервал [13,5; 25,5]. Множина нормальна (висота 1) і опукла — як усі наші терми. (Супремум sup в означенні висоти — це найменша верхня межа значень; для наших неперервних функцій на замкненому інтервалі це просто максимум.)

Aα = [ a + α (b − a) ;  d − α (d − c) ]

α
рівень перерізу (на рисунку бурштинова лінія) — скільки належності ми вимагаємо; що він вищий, то далі від країв треба відійти, і переріз звужується
a
лівий край носія — звідси піднімається ліве ребро; при α → 0 переріз починається саме тут
(b − a)
ширина лівого ребра — на ньому належність зростає від 0 до 1, тож рівня α вона досягає, пройшовши частку α цієї ширини
d
правий край носія — звідси відлік іде назад ліворуч
(d − c)
ширина правого ребра — дзеркально: від d проходимо ліворуч частку α цієї ширини
α-переріз трапеції (a, b, c, d) для α ∈ (0, 1]: досить розв’язати (x − a)/(b − a) = α і (d − x)/(d − c) = α. Для α = 1 виходить ядро [b; c].
Приклад — α-перерізи терма «приємно» (10, 17, 23, 28)

α = 0,5: [10 + 0,5 · 7; 28 − 0,5 · 5] = [13,5; 25,5]

α = 0,8: [10 + 0,8 · 7; 28 − 0,8 · 5] = [15,6; 24]

α = 1: [10 + 7; 28 − 5] = [17; 23] = ядро

Перерізи вкладені один в одного: що вище α, то менший інтервал, і кожен вищий лежить усередині нижчого. Назад нечітка множина складається як μA(x) = sup {α : x ∈ Aα} — належність точки дорівнює найвищому перерізу, до якого вона ще потрапляє.

Коли функцію належності задано не формулою, а, скажімо, виміряними точками, α-переріз обчислюють на густій сітці. Саме так це робить програма, що малює рисунки в цій частині:

def alfa_rez(mu, alfa, od=0.0, do=40.0, kroku=4000):
    body = [od + i * (do - od) / kroku for i in range(kroku + 1)]
    uvnitr = [x for x in body if mu(x) >= alfa]
    return (uvnitr[0], uvnitr[-1]) if uvnitr else None   # для опуклої множини — інтервал

prijemne = lichobeznik(10, 17, 23, 28)
print(alfa_rez(prijemne, 0.5))    # (13.5, 25.5)

6. Доповнення, перетин і об’єднання

Означення — операції Заде

μ¬A(x) = 1 − μA(x),   μA ∩ B(x) = min(μA(x), μB(x)),   μA ∪ B(x) = max(μA(x), μB(x)).

Для чітких множин ці формули дають саме класичні доповнення, перетин і об’єднання.

Простими словами

«Приємно й водночас тепло» настільки істинне, наскільки істинна слабша з обох частин; «приємно або тепло» — наскільки сильніша. Ланцюг міцний, як його найслабша ланка, а коли досить одного з двох, вирішує краще.

00,51 0510152025303540 не приємно = 1 − μ приємно й тепло = min приємно або тепло = max температура T (°C) ступінь належності μ (0–1)
Операції з термами «приємно» і «тепло» приємнотепло

За 25 °C «приємно й тепло» дорівнює 0,5, а «приємно або тепло» — 0,6. Перетин сягає найбільше 0,545 близько 25,3 °C, де обидві криві перетинаються, — жодна температура не є і тим, і тим повністю.

μP ∩ T(x) = min( μP(x), μT(x) )

μP(x)
наскільки температура x — «приємно» (на рисунку зелена крива)
μT(x)
наскільки це «тепло» (бурштинова крива) — обидві належності обчислюються незалежно, кожна своєю функцією
min
«і водночас» може бути щонайбільше таким істинним, як слабша частина, — якби було більше, ми стверджували б про температуру більше, ніж витримує одне з двох слів; а для значень 0 і 1 min дає саме класичне «і»
Об’єднання — те саме з max (сильніша з обох), доповнення 1 − μ перевертає шкалу: що належить повністю, не належить зовсім, а що наполовину — лишається наполовину.
Приклад — де перетин найвищий

Між 23 і 28 °C «приємно» спадає, а «тепло» зростає, тож мінімум найвищий там, де криві перетинаються:

(28 − x) / 5 = (x − 22) / 6

6 (28 − x) = 5 (x − 22)  ⇒  168 − 6x = 5x − 110  ⇒  x = 278/11 ≈ 25,27 °C

μ = (28 − 278/11) / 5 = 6/11 ≈ 0,545

Ліворуч від точки перетину нижче «тепло», праворуч — «приємно», тож мінімум там завжди спадає.

Тут нечіткі множини відрізняються від класичних у чомусь суттєвому. Для них справджуються майже всі відомі правила — комутативність, асоціативність, закони де Моргана, — але не закон виключеного третього. Перетин A ∩ ¬A не мусить бути порожнім: «приємно й водночас не приємно» за 13,5 °C має значення 0,5. Для розмитих слів це правильно: про температуру, яка приємна наполовину, можна водночас наполовину сказати, що вона не приємна. Інші варіанти перетину й об’єднання (так звані t-норми) з’являться в частині про нечітку логіку.

Теорема — закони де Моргана справджуються, виключене третє — ні

Для довільних нечітких множин A, B на X і кожного x ∈ X з операціями Заде справджується

  1. ¬(A ∩ B) = ¬A ∪ ¬B і ¬(A ∪ B) = ¬A ∩ ¬B,
  2. μA ∩ ¬A(x) ≤ ½ і μA ∪ ¬A(x) ≥ ½, причому рівність — тоді й лише тоді, коли μA(x) = ½.

Доведення. (1) Позначмо p = μA(x), q = μB(x) і без втрати загальності p ≤ q. Тоді 1 − min(p, q) = 1 − p, а оскільки 1 − p ≥ 1 − q, то й max(1 − p, 1 − q) = 1 − p. Другий закон — так само з переставленими min і max.

(2) Числа p і 1 − p у сумі дають 1, тож менше з них щонайбільше ½, а більше — щонайменше ½. ∎

Класичний закон виключеного третього вимагає A ∪ ¬A = X, тобто значення 1 всюди. Для нечіткої множини він справджується лише там, де μA дорівнює 0 або 1; найгірше — у точках із належністю ½: для «приємно» за 13,5 і 25,5 °C, де A ∩ ¬A і A ∪ ¬A мають значення 0,5.

Перевірка на числі: за 25 °C ¬(P ∩ T) = 1 − min(0,6; 0,5) = 0,5 і ¬P ∪ ¬T = max(0,4; 0,5) = 0,5.

7. Дуже тепло, трохи тепло

Означення — лінгвістичні модифікатори (Заде, 1972)

Концентрація («дуже»): μдуже A(x) = μA(x)2. Розтягування («трохи», «більш-менш»): μтрохи A(x) = √μA(x).

Простими словами

Піднесення числа між 0 і 1 до квадрата його зменшує — і тим більше, чим воно менше: 0,5 стає 0,25, але 1 лишається 1. Тому «дуже тепло» вужче й суворіше, ніж «тепло». Квадратний корінь, навпаки, множину розширює: 25 °C — «тепло» на 0,5, «трохи тепло» на 0,71 і «дуже тепло» лише на 0,25.

00,51 0510152025303540 температура T (°C) ступінь належності μ (0–1)
Тепло, дуже тепло і трохи тепло трохи тепло (√μ)теплодуже тепло (μ²)
Означення — включення нечітких множин

Нечітка множина A є підмножиною B (A ⊆ B), якщо μA(x) ≤ μB(x) для кожного x ∈ X. Для чітких множин це звичайне включення: де χA = 1, там мусить бути й χB = 1.

μ(x)2 ≤ μ(x) ≤ √μ(x)   для μ(x) ∈ [0, 1]

μ2
«дуже» (червона крива) — множення на число, не більше за 1, ніколи не збільшує, тож квадрат лежить під початковою кривою; найбільше забирає в середніх значень, нуль і одиницю лишає
μ
саме «тепло» (бурштинова крива) — вихідний терм, який модифікатори лише деформують; ні носій, ні ядро не змінюються
√μ
«трохи» (фіолетова крива) — корінь обернений до квадрата, тож піднімає те, що квадрат притискає: √0,25 = 0,5
Тому дуже A ⊆ A ⊆ трохи A: «дуже тепло» — завжди тепло, а що тепло, те принаймні трохи тепло. Повторенням виникає шкала: «дуже-дуже» — це μ4.
Приклад — наскільки «дуже» звужує, а «трохи» розширює

α-переріз на рівні 0,5 для «тепло» (22, 28, 34) — це [25; 31]. Для модифікованих термів досить перевести рівень назад на початкове μ:

дуже тепло: μ² ≥ 0,5  ⇔  μ ≥ √0,5 ≈ 0,707  →  [22 + 0,707 · 6; 34 − 0,707 · 6] ≈ [26,24; 29,76]

трохи тепло: √μ ≥ 0,5  ⇔  μ ≥ 0,25  →  [22 + 0,25 · 6; 34 − 0,25 · 6] = [23,5; 32,5]

Інтервал «хоча б наполовину» має 6 °C для «тепло», близько 3,5 °C для «дуже тепло» і 9 °C для «трохи тепло».

8. Нечіткі множини на практиці

  • Нечітке керування. Метро в японському Сендаї з 1987 року їздить із нечітким регулятором, який розганяє й гальмує плавніше, ніж людина. Близько 1990 року в Японії настала хвиля нечітких пральних машин, камер і кондиціонерів. Як такий регулятор працює, пояснить частина про нечітке керування.
  • Обробка зображень і кластеризація. Піксель на межі двох областей може трохи належати обом; нечітка кластеризація відносить точки до кількох кластерів одночасно.
  • Машинне навчання. М’які виходи класифікаторів або техніка label smoothing (замість упевненого «це кіт» — ціль «кіт на 0,9») не є нечіткими множинами в розумінні Заде, але поділяють із ними думку, що належність до класу не мусить бути лише 0 або 1.
  • Мова. Мовні моделі щодня працюють зі словами на кшталт «доволі», «майже» чи «радше ні». Нечіткі множини — один із небагатьох інструментів, що надають таким словам точного, перевірного значення.

9. Підсумок

  • Нечітка множина приписує кожному елементові ступінь належності з інтервалу [0, 1]; чітка множина — окремий випадок зі значеннями 0 і 1.
  • Функції належності зазвичай мають форму трикутника, трапеції, гауссового пагорба або сигмоїди.
  • Значеннями лінгвістичної змінної є слова — терми, які можуть перекриватися; 25 °C — «приємно» на 0,6 і «тепло» на 0,5.
  • Носій, ядро та α-перерізи описують форму нечіткої множини чіткими множинами.
  • Доповнення — це 1 − μ, перетин — мінімум, об’єднання — максимум; закон виключеного третього не справджується. Модифікатор «дуже» — це μ², «трохи» — √μ.

Хочете спробувати самі? Попросіть ШІ-агента намалювати функції належності для слів, якими ви описуєте власний день, — «рано», «пізно», «довго», — і спитайте кількох людей, де межу провели б вони.

Маєте іншу думку? Напишіть на support@coden-app.com.

Агент на вашому комп’ютері, керований з телефона