ML: Нечітка логіка


Вступ

Невизначеність деякого твердження може виникати через нестачу інформації або невизначеність результатів майбутніх подій. У цих випадках, зазвичай, використовують імовірнісну логіку. Однак, іноді про твердження відомо все, але його не можна вважати істинним чи хибним. Зазвичай це оцінні, порівняльні судження: "Маша красива" (але все ж не мрія); "Кава гаряча" (але пити її вже можна). Оцінний характер мають також опозиційні нечіткі квантифікатори:

далеко-близько,     давно-нещодавно,     багато-мало,     великий-маленький
і розмиті порядкові шкали:
ніколи,   дуже рідко,   рідко,   не часто,   часто,   дуже часто,   майже завжди,   завжди.

Нечітким може бути відношення: $\text{in}(x,y)$ - "об'єкт $x$ знаходиться всередині об'єкта $y$". Наприклад, "олівець у пеналі" може трохи виглядати з пенала, тим не менше перебуваючи всередині нього.

Нарешті, нечіткими можуть бути правила:

ЯКЩО завтра буде дощ І вітер, TO похолодає.
Кожне з трьох елементарних висловлювань (дощ, вітер, похолодає) може бути як імовірнісним (майбутні події), так і оцінним (одна дощова крапля - ще не дощ...). Крім цього, саме правило може не завжди виконуватися (бути ймовірнісним). Інший, трохи відмінний приклад буденних знань (висловлювання оцінні, а правило ймовірнісне):
ЯКЩО по склу сильно вдарити достатньо твердим предметом, TO скло розіб'ється.

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

Логічні зв'язки

Будемо вважати, що оцінне судження $A$ характеризується ступенем істинності $T_A$, який є дійсним числом з діапазону $[0...1]$. Значення $T_A=0$ відповідає хибному судженню, а $T_A =1$ - істинному. Проміжні значення - це "проміжна істинність". При, наприклад, $T_A=0.7$ для $A:$ "Маша красива", означає, що твердження скоріше істинне, ніж хибне.

Ступінь істинності логічного заперечення "НЕ $A$" природно визначити таким чином:

$$ \neg A:~~1-T_A. $$

Для логічних І, АБО найчастіше використовуються мінімум і максимум ступенів істинності суджень: $$ A\,\&\,B:~~~\min(T_A,T_B),~~~~~~~~~~~~~A\vee B:~~~\max(T_A,T_B). $$ Нагадаємо, що в теорії ймовірності нерівності $P(A\,\&\,B)\le \min(P_A,\,P_B)$ і $ \max(P_A,\,P_B)\le P(A\vee B)$ виконуються для будь-яких двох подій. Нечітка логіка не еквівалентна теорії ймовірностей чи ймовірнісній логіці і використовує верхню межу для кон'юнкції ($\,\&\,$) і нижню для диз'юнкції ($\vee $).

Нижче на малюнках наведені карти висот для ступенів істинності результатів логічних операцій:

Ці операції для меж діапазону $[0...1]$ відтворюють таблиці істинності булевої логіки: $$ \begin{array}{ccссc} A & B & A \,\&\, B & A\vee B\\ \hline 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 1 & 0 & 0 & 1 \\ 1 & 1 & 1 & 1 \\ \end{array} $$

Таким чином визначені логічні зв'язки задовольняють усі аксіоми булевої алгебри, за винятком закону виключеного третього: $$ A\vee \neg A = 1,~~~~~~~~~~~~~~~A\,\&\,\neg A = 0. $$ Варто це перевірити, наприклад, для $T_A=0.5$. Порушення цього закону типове для багатозначних логік, у яких вимога, щоб твердження було або істинним, або хибним, уже, очевидно, втрачає свій сенс.

Зауважимо, що в ймовірнісній логіці ступінь істинності $P(A\,\&\,B)$ залежить не тільки від $P(A)$ і $P(B)$, але й від ступеня скорельованості (залежності) цих тверджень (подій). У нечіткій логіці подібна кореляція ігнорується.

Надалі, якщо це не призводитиме до неоднозначності, замість $T_A$ будемо просто писати $A$. Тоді для заперечення $\neg A=1-A$, диз'юнкції $A\vee B =\max(A,B)$ і кон'юнкції $A\,\&\, B =\min(A,B)$.


Нечіткі множини

Істинність оцінних суджень зручно описувати за допомогою теорії множин. Кажучи про те, що "Маша красива", ми маємо на увазі множину красивих жінок, до якої з тим чи іншим ступенем точності належить Маша.

Таким чином, у теорії нечітких множин вводиться функція належності $\mu_A(x)$, що характеризує ступінь належності об'єкта $x$ до множини $A$: $x\in A$. Значення цієї функції лежать в інтервалі $[0...1]$, де $1$ означає точно належить, а $0$ - точно не належить.

Об'єднання $A\cup B$ нечітких множин $A$, $B$ відповідає диз'юнкції (АБО), а перетин $A\cap B$ - кон'юнкції (І). Тому їхні функції належності рівні: $$ \begin{array}{lll} \mu_{A\cap B}(x) = \min\{ \mu_A(x),~\mu_B(x)\},\\ \mu_{A\cup B}(x) = \max\{ \mu_A(x),~\mu_B(x)\}. \end{array} $$ Праворуч на малюнку у вигляді прямої $x$ зображено множину різних чашок з кавою (ці об'єкти не впорядковані і зазвичай малюються областями на площині). Кожній чашці відповідає те чи інше значення її належності до множин "гарячий" і "міцний". Пунктири - це межі чітких множин. Червона лінія є функцією належності перетину множин ($\min$).

У цьому прикладі нечіткий перетин включає чіткий перетин, оскільки його висота (максимальне значення) дорівнює 1. Але в загальному випадку це може бути й не так (якщо висота менша за 1). Множина називається нормальною, якщо її висота дорівнює 1. Праворуч наведено приклад, у якому перетин не є нормальним.

Включення або строга підмножина $A\subset B$ за визначенням істинне, якщо $\mu_A(x) \lt \mu_B(x)$. У протилежному випадку воно хибне. Це чітке логічне поняття. Різними способами можна визначити і нечітке включення (наприклад, як нормовану суму $|\mu_A(x)-\mu_B(x)|$ по всіх елементах множини $x$).

Зрізом нечіткої множини $A$ на рівні $\alpha$ називається множина елементів для яких функція належності більша за рівень: $\{x|~ \mu_A(x) \ge \alpha\}$. Ці елементи належать $A$ з точністю не менше $\alpha$.

Логічне висловлювання "кава гаряча і міцна" означає, що існує множина різних чашок кави. Частина з них належить до множини "гарячий", а частина до множини "міцний". Дана чашка (про яку йде мова у твердженні) належить до обох множин (у нечіткому сенсі).


Нечіткі предикати

У бінарній логіці висловлювання є окремим випадком предикатів. Предикат є логічною функцією (значення $0,1$) предметних змінних: $A(x),~ B(x,y)$. Предметні змінні - це елементи деяких множин (області визначення предиката). Приклади предикатів: $P(x)$ - число $x$ додатне, $M(x,y)$ - деяка $x$ є матір'ю для $y$, $A \in \alpha$ - точка $A$ лежить на прямій $\alpha$.

У нечіткій логіці значення предикатів, природно, лежать у діапазоні $[0...1]$. Унарні предикати $A(x)$ є нечіткими функціями належності елемента $x$ множині $A$. Вище для $x\in A$ ми використовували $\mu_A(x)$, тепер для стислості будемо писати просто $A(x)$.

Окремими випадками нечітких предикатів є нечіткі змінні та відношення.


Нечіткі змінні

Нечітка змінна - це предикат, що залежить від одного чи декількох дійсних чисел. Наприклад, говорячи про каву, можна визначити такі нечіткі змінні, що залежать від її температури $t$:

$C(t)$ - "холодний",      $W(t)$ - "теплий",      $H(t)$ - "гарячий".

Інші приклади: повільний, швидкий (функції швидкості); легкий, важкий (функції маси); молодий, старий (функції віку) і т.д.

До нечітких змінних можна застосовувати різні модифікатори: $$ \text{дуже}:~~~~A^2(x),~~~~~~\text{не дуже}:~~~~\sqrt{A(x)}. $$ Так "дуже теплий" $W^2(t)$ підсилює функцію $W(t)$, а "не дуже теплий" $\sqrt{W(t)}$ її послаблює. Перший модифікатор називають також концентрацією, а другий - розведенням.


Наведемо приклад формування трапецієподібної функції належності, що залежить від однієї дійсної змінної, на Python за допомогою бібліотеки NumPy:

 
def tra(min_X, x1,x2,x3,x4, max_X, num=100):
    X = np.linspace(min_X, max_X, num, dtype = 'float32')
    Y = np.zeros_like(X)
    
    idx = (X >= x1) & (X <= x2);  Y[idx] = (X[idx]-x1)/(x2-x1)   
    idx = (X >  x2) & (X <= x3);  Y[idx] = 1
    idx = (X >  x3) & (X <= x4);  Y[idx] = (x4-X[idx])/(x4-x3)
    
    return X,Y


Нечіткі відношення

Нечітке відношення є предикатом, що залежить від двох предметних змінних. Функція $R(x,y)$ даній парі сутностей $x,y$ (предметних констант) ставить у відповідність дійсне число з діапазону $[0...1]$ (ступінь істинності відношення). Наприклад, для відношення "два числа майже збігаються" $x\approx y$ можна покласти $R(x,y)=e^{-(x-y)^2}.$ Тоді $R(x,x)=1$; якщо $x$ і $y$ близькі, то $R(x,x)\approx 1$; і в протилежному випадку $R(x,y)\to 0$.

У бінарній логіці відношення $R(x,y)$ є підмножиною множини пар (декартів добуток) $\mathbb{X}\times \mathbb{Y}$. Тому нечітке відношення є нечіткою множиною. Усі визначення (об'єднання, перетин, доповнення відношень тощо) на цей випадок переносяться без змін.


Розглянемо детальніше композицію $(A \circ B)(x,y)$ двох відношень $A(x,z)$ і $B(z,y)$.
Нехай є три множини $\mathbb{X},\mathbb{Z},\mathbb{Y}$ (в загальному випадку різні). Відношення $A(x,z)$ задане на множині $\mathbb{X}\times \mathbb{Z}$, а відношення $B(z,y)$ на множині $\mathbb{Z}\times \mathbb{Y}$. У бінарній логіці, якщо $A(x_i,z_k)$ істинне, то елементи $x_i$ і $z_k$ пов'язані відношенням $A$. Це можна подати у вигляді стрілки з $x_i$ в $z_k$ (див. малюнок праворуч). Композиція відношень $(A \circ B)(x_i,y_j)$ буде істинна, якщо з $x_i$ можна "потрапити" в $y_j$ через деякий $z_k$. Формально це записується за допомогою квантора існування (є такий $z$, що ...): $$ (A \circ B)(x,y) : ~~~~~~\exists_z\, A(x,z)\,\&\,B(z,y) = \bigr[A(x,z_1)\,\&\,B(z_1,y)\bigr]\vee \bigr[A(x,z_2)\,\&\,B(z_2,y)\bigr]\vee ..., $$ де квантор існування виражений через "суму" логічних АБО по всіх елементах скінченної множини $\mathbb{Z}$. Для нечітких відношень це визначення узагальнюється природним чином: $$ (A \circ B)(x,y) = \max_z \bigr[\min\{A(x,z),~B(z,y)\}\bigr], $$ де для $\max$ обчислюється по всіх елементах $z\in \mathbb{Z}$.


Часто зустрічаються такі аксіоми, що фіксують властивості відношень: $$ \begin{array}{lllll} \text{рефлексивне} & R(x,x) = 1 \\ \text{антирефлексивне} & R(x,x) = 0 \\ \text{симетричне} & R(x,y) = R(y,x) \\ \text{асиметричне} & \min\bigr\{R(x,y),\,R(y,x)\bigr\} = 0 \\ \text{антисиметричне} & x\neq y ~\Rightarrow~ \min\bigr\{R(x,y),\,R(y,x)\bigr\} = 0 \\ \text{транзитивне} & \min\bigr\{R(x,y),\,R(y,z)\bigr\} \le R(x,z) \\ \end{array} $$ Наприклад, відношення близькості $x\approx y$ рефлексивне і симетричне.


Норма і конорма *

Вибір функцій $\min$ для кон'юнкції (перетину) і $\max$ для диз'юнкції (об'єднання) не є єдино можливим (хоча часто він більш прийнятний). Позначимо логічне І у вигляді функції $T(x,y)$ (норма), а логічне $АБО$ як $S(x,y)$ (конорма). Вимагатимемо, щоб вони були симетричними і асоціативними: $$ \begin{array}{llll} \&:~ \\ \vee\,:\\ \end{array}~~~~~~~~~~~~~~~~~~~~~~~~~~~ \left\{ \begin{array}{lcl} T(x,y) &=& T(y,x) \\ S(x,y) &=& S(y,x) \end{array}\right.,~~~~~~~~~~~~~~~~~~~ \left\{ \begin{array}{lcl} T(x, T(y,z)) &=& T(T(x, y),z)\\ S(x, S(y,z)) &=& S(S(x, y),z)\\ \end{array}\right.. $$ Крім цього накладемо властивості обмеженості і монотонності (що виконуються для $\&, \vee$ і в бінарній логіці): $$ \begin{array}{llll} \&:~ \\ \vee\,:\\ \end{array}~~~~~ \left\{ \begin{array}{llll} T(0,0) = 0, & T(1,x) = x\\ S(1,1) = 1, & S(0,x) = x\\ \end{array} \right.,~~~~~~~ \left\{ \begin{array}{llll} x_1 \le x_2,~~~ y_1 \le y_2~~~\Rightarrow~~~~~T(x_1, y_1) \le T(x_2, y_2)\\ x_1 \ge x_2,~~~ y_1 \ge y_2~~~\Rightarrow~~~~~S(x_1, y_1) \ge S(x_2, y_2)\\ \end{array} \right.. $$

Зауважимо, що умова монотонності виконується не тільки в булевій логіці, але й достатньо природно для нечіткої логіки. Наприклад: $0.5 \,\&\, 0.8 ~\lt~ 0.7 \,\&\, 0.9$ означає, що $0.5$ менш істинне, ніж $0.7~~~$ І $~~~0.8$ менш істинне, ніж $0.9$.

Будемо також припускати, що виконуються закони де Моргана $\neg(X\,\&\,Y) = \neg X\vee \neg Y$ і $\neg(X\vee Y) = \neg X\,\&\, \neg Y$, що пов'язують ці дві операції: $$ \begin{array}{llll} 1-T(x,y) = S(1-x,1-y), & ~~~~~ & 1-S(x,y) = T(1-x,1-y). \\ \end{array} $$ Можливі різні функції, що задовольняють цим аксіомам (зазвичай задається, наприклад, $T(x,y)$, а $S(x,y)$ отримується із закону де Моргана). Наведемо для прикладу три наступні варіанти: $$ \begin{array}{l|c|c|l|l|} & \text{1. логічні} & \text{2. алгебраїчні} & \text{3.} \\ \hline A\,\&\,B & \min(A,B) & A\,B & \max(A+B-1,~ 0) \\ A\vee B & \max(A,B) & A+B - A\,B & \min(A+B,~ 1) \\ \hline A \,\&\, A \equiv A & \mathbb{T} & (0,1) & (0, 1) \\ A \vee A \equiv A & \mathbb{T} & (0,1) & (0, 1) \\ A \,\&\, \neg A & (0.0,0.5) & (0,0.25) & \mathbb{F} \\ A \vee \neg A & (0.5,1.0) & (0.75,1) & \mathbb{T} \\ A\,\&\,(B\vee C) \equiv~... & \mathbb{T} & (0,1) & (0, 1) \\ A\vee (B\,\&\,C)\equiv~... & \mathbb{T} & (0,1) & (0, 1) \\ \end{array} $$ Під визначенням зв'язок вказані значення істинності деяких тотожностей булевої алгебри при використанні цих зв'язок. Якщо стоїть $\mathbb{T}$ - тотожність істинна, при $\mathbb{F}$ - хибна, у протилежному випадку вказані діапазони зміни істинності при всіх можливих значеннях істинності аргументів.

Зауважимо, що закони виключеного третього для варіанта (3.) виконуються, а в інших випадках $A \,\&\, \neg A$ прагне бути скоріше хибним, а $A \vee \neg A$ - скоріше істинним. Властивості ідемпотентності: $$ A\,\&\,A \equiv A,~~~~~~~~~~~~A\vee A \equiv A. $$ виконуються тільки для "логічного" варіанта ($\min,\max$). Насправді, це дуже природні властивості, як для логічних величин, так і для множин ($A\cap A=A$ і $A\cup A=A$). Тому, зазвичай, їхнє виконання бажане.

Зауважимо також, що для визначень 2,3 порушуються закони дистрибутивності: $$ \begin{array}{lcl} A\,\&\,(B\vee C) &\equiv& (A\,\&\,B)\vee (A\,\&\,B)\\ A\vee(B\,\&\,C) &\equiv& (A\vee B)\,\&\, (A\vee B). \end{array} $$ Це не так критично, але не цілком відповідає буденному розумінню сенсу логічних операцій.


Імплікація

У булевій логіці важливу роль відіграє імплікація: $A\to B$. Ця логічна зв'язка в мові відповідає фразам: "з $A$ випливає $B$", "якщо $A$, то $B$". Прийнято, що вона хибна тільки для $1\to 0$ ("з істини не можна отримати брехню"). У всіх інших випадках: $0\to 0$, $0\to 1$, $1\to 1$ вона істинна.

Зазвичай передбачається наявність деякого зв'язку між посилкою $A$ і наслідком $B$ імплікації $A\to B$.
Так, в арифметиці при будь-якому $x$ істинна формула: $(x<2) \to (x<4)$. Коли посилка істинна ($x=1$), істинний і наслідок. Якщо ж посилка хибна, то наслідок може бути як істинним (при $x=3$), так і хибним ($x=5$).
"Менш правильне" твердження $(x > 2) \to (x < 4)$ хибне при $x=5$.

У нечіткій логіці немає єдиної думки, який вираз слід використовувати для імплікації. Нижче наведені деякі варіанти, що пропонувалися різними авторами:

$$ A\to B:~~~~~~~~~~~~~~~~~~~ \begin{array}{lll} \text{Кліні} & \neg A \vee B & ~~~~~ & \max(1-A,~B) \\ \text{Заде} & \neg A \vee (A\,\&\,B)& & \max(1-A,~\min(A,B)) \\ \text{Ваді} & & & \max(1-A, ~A\,B)\\ \\ \text{Шарп} & & & \text{if}(A \le B)~ \{1,~0\} \\ \text{Брауер} & & & \text{if}(A \le B)~ \{1,~B\} \\ \text{Лукасевич} & & & \text{if}(A \le B)~ \{1,~B+1-A\} \\ \text{Гоген} & & & \text{if}(A \le B)~ \{1,~B/A\}, \\ \end{array} $$

де конструкція $\text{if}(C)\{A, B\}$ дорівнює $A$, якщо $C$ істинне і $B$ у протилежному випадку. Усі ці визначення відтворюють булеву імплікацію для значень $0,1$.

Перші три визначення "крутяться" навколо вираження імплікації через диз'юнкцію в бінарній логіці. У визначенні Кліні це записано у явному вигляді. У Заде, при виконанні дистрибутивності (для $\&=\min,$ $\vee=\max$), можна записати $(\neg A \vee A)\,\&\,(\neg A \vee B)$. Перша дужка в бінарній логіці дорівнює $1$. У нечіткій (з $\min$, $\max$) вона більша за $0.5$ і тим ближча до $1$, чим істинніше $A$. Числові значення цих імплікацій відрізняються, якщо один з аргументів зв'язки знаходиться в околі невизначеного значення $0.5$.

Останні чотири визначення виходять з того, що імплікація повинна бути строго істинною, якщо з менш істинного твердження "випливає" не менш істинне ($A \le B$). Відмінності виникають коли $A$ істинніше за $B$.


Логічний вивід

У бінарній логіці з $P$ логічно випливає $Q$, якщо завжди, коли формула $P$ істинна, то істинна і формула $Q$. Це позначається так: $P\Rightarrow Q$. Логічний вивід - це спосіб отримання одних істинних формул з інших, також істинних. Не варто плутати вивід та імплікацію $P\to Q$, яка є логічною зв'язкою, що приймає значення $0$ або $1$.

Розглянемо найпростіший приклад логічного виводу: якщо істинна кон'юнкція тверджень, то істинне (виводиме) кожне з тверджень. У нечіткій логіці це правило узагальнюється очевидним чином, приводячи до інтервальних оцінок для виводимої формули: $$ A\,\&\,B~~~~~ \Rightarrow~~~~~~ A,~~~~~~~~~~~~~~~~~~~~~~\min(A,~B) ~~~\le~~~ A ~~~\le~~~ 1, $$ де $\min(A,~B)$, з одного боку є значенням кон'юнкції $A\,\&\,B$, а з іншого, нижньою межею для $A$. Природно, в даному виводі передбачається, що ступінь істинності $A\,\&\,B$ задана і в результаті логічного виводу, вона обмежує знизу значення істинності $A$. Аналогічно інтерпретуються нерівності для наступного виводу: $$ A~~~~~ \Rightarrow~~~~~~ A\vee B,~~~~~~~~~~~~~~~~~~~~~~0 ~~~\le~~~ A ~~~\le~~~ \max(A,~B). $$

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

Одна з можливостей, як і в ймовірнісній логіці вважати, що $A~\Rightarrow~B$, якщо $A \le B$. Приклади висновків, наведені вище, задовольняють цю умову. У випадку предикатів, заданих на одній множині $\mathbb{X}$, такий вивід $A(x)~\Rightarrow~B(x)$ означає, що $A\subset B$ і множини $A,B$ є нормальними, тобто мають одиничну висоту (див. малюнок праворуч). Тоді на зрізі $\alpha=1$, $A$ буде звичайною підмножиною $B$.


Часто знання (буденні чи математичні) формулюють як правила "ЯКЩО ... TO ..." (імплікація).
Тоді в бінарній логіці важливими методами виводу є modus ponens і modus tollens (запис посилок виводу через кому передбачає зв'язування їх логічним І): $$ \begin{array}{cccccc} A, & A\to B&~~~~~~~~&\Rightarrow&~~~~~~~~&B\\ \neg B,& A\to B&~~~~~~~~&\Rightarrow&~~~~~~~~&\neg A\\ \end{array} $$ Вважаючи ці висновки справедливими в нечіткій логіці, знайдемо значення істинності отримуваних формул.

Для modus ponens маємо $\min(A,~A\to B) ~\le~ B~\le~ 1$. У випадку коли "аксіома" $A \to B$ завжди істинна, то $A \le B$. Якщо $A=1$, то $B=1$ (бінарний випадок), а при $A=0$ маємо $0 \le B\le 1$, тобто значення $B$ повністю не визначене (що також узгоджується з бінарною логікою). Для modus tollens для істинного правила $A \to B$ також отримуємо $$ A ~\le~ B ~\le~ 1. $$ Нагадаємо, що отримання значення істинності виводимих формул у вигляді нерівності типове й для ймовірнісної логіки.

Коли істинність правила $A\to B$ відмінна від $1$, необхідний вибір тієї чи іншої формули для імплікації. Зауважимо також, що з усіх визначень імплікації з нерівністю $\min(A,~A\to B) \le B$ у загальному випадку узгоджуються тільки імплікації Шарпа і Брауера.


Розглянемо простий приклад із двох правил: $$ A\to B,~~~~~~~\neg A\to \neg B. $$ Наприклад, вони справедливі для $A$: "сильно вдарити по склу", $B$: "скло розіб'ється". З першого правила випливає, що $A \le B$, а з другого $1-A \le 1-B$ або $B\le A$. Тому $B = A$ (точне значення при заданому $A$). Це природний результат: якщо по склу вдарити несильно ($A = 0.2$), то, вочевидь, воно не розіб'ється ($B = 0.2$).

✒ У бінарній логіці існує дуже потужний метод виводу за резолюцією, що застосовується в машинному виводі: $$ A\vee C,~\neg A\vee B~~~~~~~~~~\Rightarrow~~~~~~~~~~C\vee B. $$ У нечіткій логіці він не працює, оскільки нерівність $\min\bigr(\max(A,C),~\max(1-A, B)\,\bigr)~\le \max(C,B)$ не є вірною (наприклад, для $A=1/2,~B=C=0$). Це пов'язано з порушенням закону виключеного третього. У бінарній логіці резолюція означає, якщо посилки істинні, то або $A=0$ і тоді $C=1$, $B$ - будь-яке, або $A=1$ і тоді $B=1$, $C$ - будь-яке. Тому в будь-якому випадку $B \vee C$ істинне.


Вивід Заде для предикатів

Вивід Заде узагальнює правило modus ponens на випадок нечітких предикатів. Нехай є правило $A(x)\to B(y)$ і заданий предикат $A'(x)$ "схожий" на $A(x)$. Тоді: $$ A'(x),~~A(x)\to B(y)~~~~~~~~~\Rightarrow~~~~~~~B'(x) = A'\circ (A\to B) = \max_x\bigr[ \min\bigr[ A'(x),~ A(x)\to B(y)\bigr]\bigr]. $$ Нечітке правило $A(x)\to B(y)$ може бути задане у вигляді відношення (матриця $\mathbb{X}\times\mathbb{Y}$) або обчислене за допомогою заданих предикатів $A(x), B(y)$ і одного з визначень імплікації (що простіше).

В окремому випадку висловлювань $A'=A$ і імплікації Брауера $A\to B:~R=\text{ if }(A \le B): \{~1;~ B\}$, отримуємо: $$ B' = \left\{ \begin{array}{llll} \min(A,~1)=A, & ~~~& A \le B \\ \min(A,~B)=B, & ~~~& A \gt B \end{array} \right. ~~~~~=~~~~ \min(A,B) $$ Якщо $A=1$, то $B'= B = R$ (ступінь істинності правила), якщо $A=0$, то $B'=0$ (?), хоча в бінарній логіці істинність $B$ не визначена. При $A=0.5$ маємо $B'=0.5$.


Вивід Мамдані

Логічний вивід Мамдані - це евристичний спосіб нечітких міркувань, який використовується за наявності набору правил, що містять нечіткі змінні. Нехай, наприклад, є два правила, що залежать від 6 нечітких змінних $A_i,B_i,C_i$, визначуваних трьома параметрами $x,y,z$: $$ \begin{array}{llll} A_1(x) \,\&\,B_1(y) \to C_1(z),\\ A_2(x) \,\&\,B_2(y) \to C_2(z).\\ \end{array} $$ Припустимо, що значення дійсних параметрів $x,y$ відомі і дорівнюють $x_0,y_0$.
Задача полягає у визначенні найбільш підходящого значення параметра $z$, що задовольняє цим правилам.

На першому етапі пошуку $z$ проводиться фаззифікація (отримання значень нечітких змінних $A_1(x_0)$ і т.д.) і обчислення значень посилок на основі формул нечіткої логіки ($\min$ для $\&$ і $\max$ для $\vee$): $$ \left\{ \begin{array}{llll} \alpha_1 = \min\bigr(A_1(x_0),~B_1(y_0)\bigr) \\ \alpha_2 = \min\bigr(A_2(x_0),~B_2(y_0)\bigr) \end{array}\right., ~~~~~~~~~~~~~~ \left\{ \begin{array}{llll} \alpha_1 \to C_1(z)\\ \alpha_2 \to C_2(z)\\ \end{array}\right.. $$ Потім "активізуються" наслідки правил, у припущенні, що їхня істинність не повинна перевищувати істинності посилок (праворуч на малюнку рівні $\alpha_i$ відсікають вищі значення істинності наслідків): $$ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~C'_i(z) = \min (\alpha_i, C(z)). $$ Ці модифіковані наслідки об'єднуються по всіх правилах (логічне АБО), в результаті чого отримується функція розподілу $\mu(z)\in[0...1]$ для змінної $z$: $$ \mu(z) = \max_i C'_i(z).~~~~~~ $$ На останньому етапі проводиться дефазифікація, в результаті якої обирається конкретне значення для $z$. Наприклад, можна взяти точку центра тяжіння функції $\mu(z)$: $$ z_0 =\int z\,\mu(z)\,dz ~\Bigr/~ \int \mu(z)\,dz. $$ Зауважимо, що, як на етапі активізації, так і при дефазифікації посилки з низькою істинністю дають слабкий внесок у результат (зовсім хибні посилки взагалі на нього не впливають). Тому при активізації замість функції $\min$ можна також використовувати добуток: $C'_i(z)=\alpha_i\,C_i(z)$ (алгоритм Ларсена).

Існує модифікація цього методу - вивід Цукамото. На етапі активізації наслідків розв'язуються рівняння: $C_i(z) = \alpha_i$, що дають єдині розв'язки $z_i$. Такий підхід можливий тільки, коли нечіткі змінні $C_i(z)$ у правилах є монотонними функціями $z$ (зростаючими або спадними), інакше розв'язків буде декілька. На етапі дефазифікації також обчислюється центр тяжіння за отриманими розв'язками $z_1,z_2,...$: $$ z= \sum_i \alpha_i z_i~\Bigr/~\sum_i\alpha_i. $$

Існує також підхід Сугено, в якому в правилах наслідки записуються у вигляді інструкцій для значень $z=F(x,y)$, де $F$ - деякі функції (зазвичай лінійні). Після фаззифікації ми одразу отримуємо значення $z_i$, за якими, як і вище, за допомогою істинностей посилок $\alpha_i$ обчислюється центр тяжіння.


Нечіткі числа

Нечітке число $X$ - це функція належності $\mu_X(x)$ від дійсного числа $x$, що має єдиний одиничний максимум при $x=X$. На малюнку праворуч $\mu_0(x)$ - це "приблизно нуль", а $\mu_3(x)$ - приблизно три.

Нехай є дійсна функція двох (звичайних) чисел $z=f(x,y)$ і два нечітких числа $A(x), B(y)$. Нас цікавить функція належності $\mu_{f(A,B)}(z)$, що дорівнює ступеню впевненості в тому, що конкретне число $z$ є результатом операції (функції) $f$.

Переберемо всі можливі значення $x,y$ для яких $z=f(x,y)$ і з'ясуємо ступені впевненості того, що це нечіткі числа $A(x), B(y)$. Тоді за принципом розширення Заде функція належності операції, за визначенням, дорівнюватиме: $$ \mu_{f(A,B)}(z) = \sup_{x,y: f(x,y)=z}\min\bigr\{\mu_A(x),\,\mu_B(y)\bigr\}. $$ Таким чином, з усіх можливих "чітких" способів отримати $z$ обираємо той, який дає найбільше ($\sup$) значення мінімуму функцій належності нечітких чисел аргументів функції.

Часто для нечітких чисел використовують функції належності $L-R$ типу $$ \mu_A(x) = \left\{ \begin{array}{lll} L(a-x) & x \ge a \\ R(x-a) & x \ge a \\ \end{array} \right. ~~~~~~~ \begin{array}{lll} L(0)=R(0) = 1 \\ L,R \text{ - не зростають} \\ \end{array} $$ Найпростішим прикладом є трикутна функція належності $\langle a;\, \alpha, \beta \rangle$, наведена на малюнку. За допомогою принципу розширення для трикутних чисел можна отримати такі результати для стандартних арифметичних операцій: $$ \begin{array}{lll} \langle a_1;\, \alpha_1,\beta_1 \rangle \pm \langle a_2;\, \alpha_2,\beta_2 \rangle = \langle a_1\pm a_2;\, \alpha_1+\alpha_2,\beta_1+\beta_2 \rangle\\ \langle a_1;\, \alpha_1,\beta_1 \rangle \cdot \langle a_2;\, \alpha_2,\beta_2 \rangle = \langle a_1\cdot a_2;\, \alpha_1 a_2+\alpha_2 a_1,\beta_1 b_2+\beta_2 b_1\rangle\\ \langle a;\, \alpha,\beta \rangle^{-1} = \langle 1/a;\, \beta/a^2,\alpha/a^2 \rangle \\ \end{array} $$ Зауважимо, що для положення максимуму виконуються звичайні арифметичні операції, а величина нечіткості (ширина трикутника) збільшується.

Інший спосіб задання функцій належності $\langle a,b; \alpha, \beta \rangle$ - це трапеція з максимумом на інтервалі $[a,b]$ і граничними точками $\alpha,\beta$.


Нечітка логіка на Python

Визначимо клас з перевантаженими логічними операторами для нечіткої логіки:

 
class Fuzzy:
    def __init__(self, val=0):
        val = np.array(val) if isinstance(val,(list, np.ndarray)) else np.array([val])
        self.val = val.astype('float32')
        
    def __invert__(self):          # ~x      NOT
        return Fuzzy(1-self.val)
    
    def __and__(self, other):      # x & y   AND
        return Fuzzy( np.minimum(self.val, other.val) )

    def __or__(self, other):       # x | y   OR
        return Fuzzy( np.maximum(self.val, other.val) )

    def __eq__(self, other):
        return Fuzzy(self.val == other.val)
    
    def __str__(self):
        return f"{self.val[0]}" if len(self.val)==1 else  f"{self.val}"
    
    def minmax(self):
        return (self.val.min(), self.val.max())
    
    def __gt__(self, other):
        return Fuzzy( np.minimum( np.ones_like(self.val), 1-self.val+other.val) )

Приклад його використання:

 
x = Fuzzy(       [0,  0,  0,  0.5,0.5,0.5,1,  1,  1] )
y = Fuzzy(       [0,  0.5,1,  0,  0.5,1,  0,  0.5,1] )

print(x & y )  # [0.  0.  0.  0.  0.5 0.5 0.  0.5 1. ]    
print(x | y )  # [0.  0.5 1.  0.5 0.5 1.  1.  1.  1. ]
Перевірка тотожностей булевої алгебри:
 
vals = np.linspace(0,1,101, dtype='float32')

x  = Fuzzy(vals)
print ( (x &  x).minmax() )   # (0.0, 1.0)
print ( (x & ~x).minmax() )   # (0.0, 0.5)
print ( (x | ~x).minmax() )   # (0.5, 1.0)

x, y, z  = np.meshgrid(vals, vals, vals) 
x, y, z  = Fuzzy(x), Fuzzy(y),  Fuzzy(z)

print ( ((x & (y | z))  == ((x & y) | (x & z))).minmax() ) # (1.0, 1.0)