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

Логіка й системи, засновані на знаннях: пряме і зворотне виведення, резолюція та експертні системи

База знань, логічне слідування й перевірка моделей, диз’юнкти Горна, пряме і зворотне виведення, резолюція, Пролог та експертні системи від MYCIN до графів знань — на маленькій системі, яка розпізнає тварину.

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

Серія Основи ШІ Частина 24 з 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 тем

Що ви винесете
  • Що означає, що з бази знань щось випливає, і чому перевірка всіх можливих світів непридатно повільна.
  • Як пряме і зворотне виведення роблять висновки з правил «якщо–то» і коли яке використовувати.
  • Чому експертні системи досягли успіху й натрапили на межі та де вручну записані знання живуть досі.

Що варто знати заздалегідь: Логіка й доведення: правила, за якими міркують у ШІ

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

Ця частина продовжує частину Логіка й доведення, де ви знайдете зв’язки, імплікацію та modus ponens.

1. База знань і машина виведення

Означення — база знань

База знань KB — це множина речень формальної мови (тут логіки висловлень), які система вважає істинними. Система вміє з нею дві операції: повідомити — додати до KB нове речення — і запитати — з’ясувати, чи випливає з KB речення α.

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

База знань — це зошит, у який ви записуєте, що є правдою: «кожна тварина з шерстю — ссавець», «ця тварина має шерсть». Машина виведення — це той, хто гортає зошит і відповідає на запитання, навіть коли відповідь у зошиті прямо не записана.

Такий підхід називають декларативним. Ви не програмуєте спосіб, як дійти до відповіді, — записуєте лише, що є правдою, а спосіб завжди той самий: машина виведення. Хочете навчити систему чогось нового? Дописуєте речення, нічого не переписуєте.

Усю частину нас супроводжуватиме маленька експертна система за зразком підручникової системи ZOOKEEPER Патріка Вінстона: дванадцять правил, за якими за спостережуваними ознаками розпізнають тварину. Ми спостерігали тварину, яка має шерсть, гострі зуби, кігті, жовто-бура й має чорні смуги. Що це?

2. Логічне слідування і моделі

Означення — модель і логічне слідування

Модель речення — це оцінка символів висловлень, за якої речення істинне. Множину моделей речення α позначаємо M(α).

З KB випливає α, пишемо KB ⊨ α, тоді й лише тоді, коли M(KB) ⊆ M(α) — у кожній моделі бази знань істинне й α.

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

Модель — це один «можливий світ», одна комбінація того, що правда, а що ні. Логічне слідування означає: яким би не був світ, якщо в ньому справджується все із зошита, то справджується й α. Ідеться не про те, що ймовірно, а про те, що неминуче.

KB ⊨ α ⇔ M(KB) ⊆ M(α)

KB ⊨ α
те, про що ми питаємо: чи випливає α з бази? Символ ⊨ говорить про істинність у світах, а не про те, чи вміємо ми щось вивести
M(KB)
світи, які база допускає, — оцінки, за яких істинні всі її речення одночасно (база — це їхня кон’юнкція); інші світи нас не цікавлять, про них база стверджує, що їх не сталося
⊆
включення: у жодному допущеному світі α не може бракувати; одного контрприкладу вистачило б, щоб α не випливало
M(α)
світи, у яких істинне α; їх може бути значно більше — α може бути істинним і там, де база не справджується
Що більше база знає, то менше світів допускає і то більше з неї випливає. Порожня база допускає всі світи, тож із неї випливають лише тавтології.

Найпряміший спосіб перевірити слідування — перевірка моделей (model checking): перебрати всі оцінки, вибрати ті, за яких істинна вся база, і подивитися, чи істинне в них і запитання. Наша база має 24 символи висловлень («має шерсть», «ссавець», «тигр»…), тож оцінок 224 = 16 777 216. З них 13 440 — моделі бази, і в усіх істинне «тигр». Відповідь — так, але ціною шістнадцяти мільйонів рядків таблиці істинності. З кожним наступним символом кількість подвоюється; для бази із сотнями символів це не завершилося б ніколи.

Приклад — перевірка моделей на трьох символах

База KB = {дощ ⇒ мокро, мокро ⇒ слизько, дощ}, запитання α = слизько. Три символи дають 23 = 8 оцінок (1 = істина, 0 = хиба); імплікація p ⇒ q хибна лише для p = 1, q = 0.

дощмокрослизькодощ ⇒ мокромокро ⇒ слизькоKB
000110
001110
010100
011110
100010
101010
110100
111111

Уся база істинна лише в останньому рядку, тож |M(KB)| = 1. У цьому рядку істинне й «слизько» — M(KB) ⊆ M(слизько), а отже, KB ⊨ слизько. Алгоритм пройшов 8 рядків і в кожному обчислив 3 речення бази; загалом перевірка моделей коштує O(2n · |KB|).

Приклад — звідки взялося 13 440 моделей

У кожній моделі бази істинні п’ять спостережуваних фактів, а правила R1, R6 і R9 тоді вимушують «ссавець», «хижак» і «тигр». Ці 8 символів жорстко істинні. Решта 16 розпадаються на групи, не пов’язані між собою правилами, і кількості їхніх оцінок перемножуються:

  • «дає молоко» (R2 виконане, ссавець істинний) і «їсть м’ясо» (R5 виконане, хижак істинний): довільно, 2 · 2 = 4;
  • «має темні плями», «гепард» із правилом R8: три оцінки — плями без гепарда неприпустимі;
  • «має копита», «копитна», «має довгу шию», «жираф», «зебра» з R7, R10, R11: якщо «копитна» хибне, хибними мають бути й копита, а решта три символи вільні (8 можливостей); якщо істинне, мусить бути істинною зебра, копита вільні, а шия з жирафом мають 3 можливості (2 · 3 = 6); разом 14;
  • пташина група «має пір’я», «літає», «несе яйця», «птах», «не літає», «плаває», «пінгвін» з R3, R4, R12: без птаха не можуть бути істинними пір’я, ані водночас «літає» та яйця (3 можливості), а останні три символи вільні (8): 24; із птахом пір’я вільне (2), «літає» та яйця вільні (4), а з восьми оцінок «не літає, плаває, пінгвін» заборонена лише 1, 1, 0 (7): 56; разом 80.

Усього 4 · 3 · 14 · 80 = 13 440 — рівно стільки, скільки нарахувала перевірка моделей. І в кожній із них істинний тигр, бо він належить до жорстко істинних символів.

3. Виведення: коректне й повне

Замість перебирати світи можна маніпулювати реченнями: з наявних речень отримувати нові за правилами виведення, такими як modus ponens. Так робить і людина.

Означення — виведення, коректність, повнота

Пишемо KB ⊢ α, коли α можна отримати з KB скінченною кількістю застосувань правил виведення.

Процедура виведення коректна, коли з KB ⊢ α випливає KB ⊨ α — вона виводить лише те, що справді випливає.

Вона повна, коли з KB ⊨ α випливає KB ⊢ α — вона виводить усе, що випливає.

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

Символ ⊨ означає «так і є», символ ⊢ — «я вмію це вивести». Коректна машина ніколи не вигадає неправди. Повна машина нічого не пропустить. Ми хочемо і того, і того — і для загальної логіки це дорого, а для простішої форми правил, навпаки, дешево.

Означення — диз’юнкт Горна

Диз’юнкт Горна — це диз’юнкція літералів, з яких щонайбільше один додатний. Диз’юнкт рівно з одним додатним літералом називають визначеним, і його можна записати як правило

p1 ∧ p2 ∧ … ∧ pk ⇒ q,

де p1, …, pk — засновки, а q — висновок. Для k = 0 це факт q.

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

Диз’юнкт Горна — це правило «якщо справджується це, і це, і це, то справджується те». Жодного «або» у висновку, жодного «не» в засновках. Звучить як велике обмеження, але більшість фахових правил має саме таку форму — і виведення з них швидке.

Чому «диз’юнкція щонайбільше з одним додатним літералом» — те саме, що правило? Імплікація A ⇒ q еквівалентна ¬A ∨ q, а за законом де Моргана ¬(p1 ∧ … ∧ pk) — те саме, що ¬p1 ∨ … ∨ ¬pk:

¬p1 ∨ … ∨ ¬pk ∨ q ≡ (p1 ∧ … ∧ pk) ⇒ q

¬p1 ∨ … ∨ ¬pk
від’ємні літерали диз’юнкта; разом вони кажуть «якийсь засновок не справджується» — а це якраз заперечення кон’юнкції засновків
(p1 ∧ … ∧ pk)
засновки правила — з диз’юнкції від’ємних літералів вони стали умовою завдяки де Моргану; жоден із них не може бути від’ємним, інакше в правилі стояло б «якщо не справджується …»
q
єдиний додатний літерал, висновок; якби додатних було два, ми отримали б «то q або r», і машина виведення не знала б, який із них додати
⇒
диз’юнкт істинний, коли якийсь засновок не справджується або справджується висновок, — це означення імплікації; форма правила лише інакше читає ту саму диз’юнкцію
Наприклад, R6, ссавець ∧ має гострі зуби ∧ має кігті ⇒ хижак, — це диз’юнкт ¬ссавець ∨ ¬має гострі зуби ∨ ¬має кігті ∨ хижак.

4. Пряме виведення

Алгоритм — пряме виведення
  1. Кожне правило пам’ятає, скільки його засновків ще невідомо. Покладіть до порядку денного (агенди) всі факти.
  2. Візьміть символ з агенди. Якщо його вже оброблено, переходьте до наступного.
  3. Кожному правилу, яке має його серед засновків, зменште лічильник на 1. Якщо він упаде до 0, правило спрацьовує: додайте його висновок до агенди.
  4. Повторюйте, доки агенда не спорожніє.

Теорема. Для бази з визначених диз’юнктів Горна пряме виведення коректне й повне для символів висловлень: воно виводить саме ті, що випливають з KB. Воно працює за час, лінійний відносно розміру бази.

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

Ви виходите з того, що знаєте, і дивитеся, яке правило цим «відімкнулося». Кожен новий висновок може відімкнути наступне правило — як доміно. Ви закінчуєте, коли вже нічого нового не падає. Це називають виведенням, керованим даними.

факти правила 1. має шерсть 2. має гострі зуби 3. має кігті 4. жовто-бура 5. має чорні смуги 6. ссавець 7. хижак 8. тигр R1 має шерсть ⇒ ссавець R2 дає молоко ⇒ ссавець R3 має пір’я ⇒ птах R4 літає ∧ несе яйця ⇒ птах R5 ссавець ∧ їсть м’ясо ⇒ хижак R6 ссавець ∧ має гострі зуби ∧ має кігті ⇒ хижак R7 ссавець ∧ має копита ⇒ копитна R8 хижак ∧ жовто-бура ∧ має темні плями ⇒ гепард R9 хижак ∧ жовто-бура ∧ має чорні смуги ⇒ тигр R10 копитна ∧ має довгу шию ⇒ жираф R11 копитна ∧ має чорні смуги ⇒ зебра R12 птах ∧ не літає ∧ плаває ⇒ пінгвін
Пряме виведення: факти в порядку обробки, виведені — зеленим кроків: 8

Уже перше спостереження «має шерсть» відмикає правило R1, яке додає «ссавець» у кінець агенди. Решта чотири спостереження поки нічого не запускають, але зменшують лічильники. Коли настає черга ссавця, він відмикає R6 (гострі зуби й кігті ми вже знаємо) — виникає «хижак». Хижак відмикає R9, і маємо тигра. За вісім кроків, жодних мільйонів рядків. Правило R5 («ссавець, який їсть м’ясо, — хижак») не спрацювало ніколи: що тварина їсть м’ясо, ми не знаємо — і нам не треба цього знати.

def dopredne(fakta, pravidla):
    chybi = {r.id: len(r.kdyz) for r in pravidla}
    zname, agenda = set(), list(fakta)
    while agenda:
        p = agenda.pop(0)
        if p in zname:
            continue
        zname.add(p)
        for r in pravidla:
            if p in r.kdyz:
                chybi[r.id] -= 1
                if chybi[r.id] == 0:          # усі засновки відомі
                    agenda.append(r.pak)
    return zname

Серце алгоритму — лічильник біля кожного правила r із засновками P(r):

бракує(r) = |P(r)| − |P(r) ∩ Відомі|

бракує(r)
скільки засновків ми ще не знаємо; за бракує(r) = 0 правило спрацьовує — завдяки числу машина помічає це, не перебираючи список засновків
|P(r)|
початкове значення: на початку ми нічого не знаємо, бракує всіх засновків
|P(r) ∩ Відомі|
засновки, які вже оброблено; кожен оброблений символ зменшує лічильник на 1 у кожного правила, де він трапляється, — і обробляється лише раз, тому нічого не зараховується двічі
Кожен символ обробляється щонайбільше раз, і кожна поява засновку зменшує лічильник щонайбільше раз — звідси лінійний час: кількість кроків пропорційна сумі довжин правил.

Як лічильники спадають під час нашого прогону (після обробки символу в цьому рядку; жирним — нуль, тобто спрацювання):

крокоброблений символR1R5R6R9R8
0—12333
1має шерсть02333
2має гострі зуби02233
3має кігті02133
4жовто-бура02122
5має чорні смуги02112
6ссавець01012
7хижак01001
8тигр01001

R5 зупиняється на одиниці (бракує «їсть м’ясо»), і R8 для гепарда теж (бракує «має темні плями»). Решти правил у таблиці немає; їхні засновки в прогоні або взагалі не з’явилися, або лише частково.

Теорема — пряме виведення коректне й повне (доведення)

Коректність. Кожен виведений символ виник зі спрацювання правила, усі засновки якого вже були відомі. У кожній моделі бази істинні факти і (за індукцією за порядком виведення) раніше виведені символи, тож за правилом істинний і новий висновок — це modus ponens.

Повнота. Після завершення візьмімо оцінку m: істина для виведених символів (і фактів), хиба для всіх інших. Це модель бази: якби якесь правило p1 ∧ … ∧ pk ⇒ q не справджувалося в m, усі pi були б виведені, а q ні — але тоді лічильник правила впав би до нуля і q було б виведено. Отже, якщо q випливає з бази, воно істинне в моделі m, а значить, його було виведено. ∎

Модель m — «найскромніша»: вона вірить лише в те, у що мусить. Для нашої бази це оцінка, за якої істинні саме 5 спостережень, ссавець, хижак і тигр.

5. Зворотне виведення

Алгоритм — зворотне виведення

Доводить ціль q:

  • якщо q — відомий факт, його доведено;
  • інакше для кожного правила p1 ∧ … ∧ pk ⇒ q спробуйте по черзі довести всі pi; якщо для якогось правила це вдасться, q доведено;
  • якщо жодне правило не вдалося, доведення зазнало невдачі.

Для визначених диз’юнктів Горна зворотне виведення коректне й повне і досліджує лише символи, пов’язані з ціллю.

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

Ви починаєте із запитання «це тигр?» і питаєте, що б це підтвердило: тигр — жовто-бурий хижак із чорними смугами. Це хижак? Хижак — це ссавець, який їсть м’ясо, або ссавець із гострими зубами й кігтями. Це ссавець? … Аж доки не дійдете до того, що знаєте. Це називають виведенням, керованим ціллю.

def zpetne(cil, fakta, pravidla, cesta=()):
    if cil in fakta:
        return True                           # ми знаємо це напряму
    if cil in cesta:
        return False                          # цикл: ціль доводить сама себе
    for r in pravidla:
        if r.pak == cil:                      # АБО: досить одного правила
            if all(zpetne(p, fakta, pravidla, cesta + (cil,))
                   for p in r.kdyz):          # І: мають вийти всі засновки
                return True
    return False                              # не знаємо, як це довести

Функція all зупиняється на першому засновку, який не виходить, — тому для R5 після невдачі з «їсть м’ясо» більше нічого не досліджується. Список cesta (шлях) стежить, щоб правила на кшталт «a ⇒ b, b ⇒ a» не зациклювалися.

R9 R5 ✗ R1 R6 R1 тигр хижак ссавець має шерсть їсть м’ясо ? ссавець має шерсть має гострі зуби має кігті жовто-бура має чорні смуги
Зворотне виведення для цілі «тигр»: під вузлами — номери правил

Алгоритм дослідив 11 цілей. Хижака він спершу спробував довести правилом R5 — ссавця довів, але натрапив на «їсть м’ясо»: цього ми не знаємо, тож він відмовився від R5 і спробував R6, яке вдалося. Тут зворотне виведення сильне: воно знає, чого йому бракує. Експертна система в такий момент запитає користувача: «Ця тварина їсть м’ясо?» Уся розмова з експертною системою — це, власне, зворотне виведення вголос.

Коли що використовувати? Пряме виведення підходить, коли надходять дані й ви хочете знати, що з них випливає, — наприклад, моніторинг виробництва. Зворотне — коли у вас конкретне запитання: діагноз, запит до бази даних. Якби ми запитали «це зебра?», зворотне виведення спростувало б це, дослідивши лише 5 цілей: зебра — копитна, а копит наша тварина не має.

6. Резолюція: виведення для всієї логіки

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

Означення — резолюція

Речення зводять до кон’юнктивної нормальної форми — кон’юнкції диз’юнктів, кожен із яких є диз’юнкцією літералів. Правило резолюції: з диз’юнктів (A ∨ ℓ) і (B ∨ ¬ℓ) виведіть (A ∨ B).

Доведення від супротивного: KB ⊨ α тоді й лише тоді, коли KB ∧ ¬α невиконувана. Резолюція виводить з KB ∧ ¬α нові диз’юнкти; якщо вона виведе порожній диз’юнкт, суперечність знайдено. Така процедура коректна й повна (Робінсон, 1965).

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

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

( A ∨ ℓ ), ( B ∨ ¬ℓ ) ⊢ ( A ∨ B )

ℓ, ¬ℓ
доповнювальні літерали — у кожному світі істинний рівно один із них, тож один із диз’юнктів він не виконає; той мусить бути виконаний своєю рештою. Тому ℓ у результаті бракує
A
решта першого диз’юнкта: справджується щоразу, коли ℓ хибне (тоді перший диз’юнкт тримає лише A)
B
решта другого диз’юнкта: справджується щоразу, коли ℓ істинне (тоді ¬ℓ не справджується, і другий диз’юнкт тримає B)
Яким би не було ℓ, одна з решт мусить справджуватися — це і є все доведення того, що резолюція коректна. З (ℓ) і (¬ℓ) виникає порожній диз’юнкт, якого ніщо не виконує: суперечність.
Алгоритм — зведення до кон’юнктивної нормальної форми
  1. Усуньте еквівалентності: α ⇔ β замініть на (α ⇒ β) ∧ (β ⇒ α).
  2. Усуньте імплікації: α ⇒ β замініть на ¬α ∨ β.
  3. Пересуньте заперечення аж до символів: ¬¬α ≡ α, ¬(α ∧ β) ≡ ¬α ∨ ¬β, ¬(α ∨ β) ≡ ¬α ∧ ¬β (де Морган).
  4. Розкрийте ∨ відносно ∧: α ∨ (β ∧ γ) ≡ (α ∨ β) ∧ (α ∨ γ).

Приклад: (дощ ∨ сніг) ⇒ мокро

крок 2: ¬(дощ ∨ сніг) ∨ мокро

крок 3: (¬дощ ∧ ¬сніг) ∨ мокро

крок 4: (¬дощ ∨ мокро) ∧ (¬сніг ∨ мокро) — два диз’юнкти, обидва навіть диз’юнкти Горна.

Розкриття на 4-му кроці може експоненційно подовжити формулу; тому розв’язувачі на практиці використовують перетворення Цейтіна з допоміжними символами, яке дає лише лінійно довший результат (виконуваний тоді й лише тоді, коли виконувана початкова формула).

Приклад: база {дощ ⇒ мокро, мокро ⇒ слизько, дощ}, запитання «слизько». У нормальній формі та з доданим запереченням запитання:

(¬дощ ∨ мокро), (¬мокро ∨ слизько), (дощ), (¬слизько)

(дощ) і (¬дощ ∨ мокро) дають (мокро); (мокро) і (¬мокро ∨ слизько) дають (слизько); (слизько) і (¬слизько) дають порожній диз’юнкт. Суперечність — «слизько» випливає з бази.

Резолюція універсальна, але загалом дорога: для логіки висловлень задача виконуваності (SAT) NP-повна. Сучасні SAT-розв’язувачі все одно справляються з мільйонами змінних — про них ішлося в частині про задоволення обмежень.

7. Правила зі змінними і Пролог

Логіка висловлень має ваду: «Рекс — ссавець» і «Мицька — ссавець» для неї два непов’язані символи. Правило про всіх ссавців довелося б переписувати для кожної тварини окремо. Логіка предикатів із частини про логіку й доведення розв’язує це змінними: ∀x : має_шерсть(x) ⇒ ссавець(x).

Означення — уніфікація

Уніфікатор двох виразів — це підстановка замість змінних, після якої обидва вирази тотожні. Наприклад, rodič(jan, Y) і rodič(X, petr) (rodič = батько чи мати) уніфікує підстановка {X / jan, Y / petr}. Алгоритм уніфікації знаходить найзагальніший уніфікатор, якщо він існує.

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

Уніфікація — це «знайди, що підставити, щоб пасувало». Коли правило говорить про якийсь x, а ви питаєте про Рекса, уніфікація підставить x = Рекс, і правило можна застосувати. Виведення тоді працює так само, як у логіці висловлень, лише з підстановками.

def unifikuj(a, b, s):                    # s: досі знайдена підстановка (словник)
    if s is None:
        return None                           # уже раніше не вдалося
    a, b = dosad(a, s), dosad(b, s)           # застосуй те, що вже знаємо
    if a == b:
        return s
    if je_promenna(a):
        return None if vyskytuje_se(a, b) else {**s, a: b}
    if je_promenna(b):
        return None if vyskytuje_se(b, a) else {**s, b: a}
    if slozeny(a) and slozeny(b) and a.jmeno == b.jmeno and len(a.args) == len(b.args):
        for x, y in zip(a.args, b.args):      # аргументи один за одним
            s = unifikuj(x, y, s)
        return s
    return None                               # різні константи чи предикати

На прикладі rodič(jan, Y) і rodič(X, petr): предикати збігаються, тож порівнюються аргументи. jan і X дають {X / jan}, Y і petr додають Y / petr. Натомість rodič(jan, Y) і rodič(petr, eva) не уніфікуються — jan і petr різні константи. Перевірка vyskytuje_se (occurs check) запобігає підстановці на кшталт X / f(X), яка вела б до нескінченного виразу. (Пролог її заради швидкості типово пропускає.)

На зворотному виведенні з уніфікацією стоїть Пролог (Ален Кольмерое, Марсель, 1972) — мова, у якій програма є базою знань, а запуск програми — це запит (rodic = батько чи мати, prarodic = дід чи баба, kdo = хто):

rodic(jan, petr).
rodic(petr, eva).

prarodic(X, Z) :- rodic(X, Y), rodic(Y, Z).

?- prarodic(jan, Kdo).
Kdo = eva.

Пролог дістається до цілі prarodic(jan, Kdo) точнісінько як наше дерево для тигра: знаходить правило, уніфікує X = jan, доводить rodic(jan, Y), знаходить Y = petr, а потім rodic(petr, Z) з результатом eva.

8. Експертні системи

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

  • DENDRAL (Стенфорд, з 1965 року) визначав будову молекул за даними мас-спектрометра — перша система, яка виконувала роботу науковців за їхніми власними правилами.
  • MYCIN (Стенфорд, 1970-ті) діагностував бактеріальні інфекції крові й рекомендував антибіотики. Мав близько шестисот правил, і в оцінюванні 1979 року його рекомендації виявилися так само добрими, як рекомендації стенфордських фахівців, або кращими. Проте в лікарні його так і не застосовували.
  • XCON (компанія DEC, з 1980 року) складав конфігурації комп’ютерів VAX за замовленням. Мав тисячі правил і, за даними компанії, заощаджував десятки мільйонів доларів на рік.

Але медицина рідко знає певність. Тому MYCIN додавав до кожного правила число, яке показувало, наскільки фахівець йому довіряє:

Означення — коефіцієнт упевненості

Коефіцієнт упевненості CF ∈ [−1, 1] виражає міру довіри до висновку: 1 — напевно справджується, −1 — напевно не справджується, 0 — не знаємо. Якщо той самий висновок підтримують два правила з додатними коефіцієнтами CF1 і CF2, підсумковий коефіцієнт дорівнює

CF = CF1 + CF2 · (1 − CF1).

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

Одна підказка переконує вас на 0,6, друга, незалежна, — на 0,5. Разом 0,6 + 0,5 · 0,4 = 0,8 — друга підказка забирає половину залишкової непевності. Коефіцієнти впевненості не є ймовірностями й не задовольняють теорему Баєса; згодом їх замінили баєсові мережі, які мають у програмі власну частину.

CF = CF1 + CF2 · (1 − CF1)

CF1
довіра з першого правила; друге правило не може її знизити, лише додати
CF2
яку частку залишкової непевності друге правило усуває; якби просто додавати, дві підказки по 0,6 дали б безглузді 1,2
1 − CF1
непевність, що лишилася після першого правила; тільки від неї ще можна відняти, тому результат ніколи не перевищить 1
Еквівалентно 1 − CF = (1 − CF1) · (1 − CF2): залишкові непевності перемножуються. Тому порядок правил не має значення.
Приклад — три підказки і правило з непевними засновками

Три підказки 0,6, 0,5 і 0,5: спершу 0,6 + 0,5 · (1 − 0,6) = 0,8, потім 0,8 + 0,5 · (1 − 0,8) = 0,9. Перевірка через непевності: 1 − 0,4 · 0,5 · 0,5 = 0,9.

Непевні засновки. У MYCIN (Шортліфф і Б’юкенен, 1975) кон’юнкція засновків отримує коефіцієнт своєї найслабшої ланки, а висновок правила — коефіцієнт правила, помножений на цей мінімальний коефіцієнт (правило при цьому застосовують, лише коли мінімум перевищує 0,2): CF(висновок) = CF(правило) · mini CF(pi). Правило з коефіцієнтом 0,7, засновки якого мають коефіцієнти 0,9 і 0,6, додає висновку 0,7 · min(0,9; 0,6) = 0,42.

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

9. Знання в сучасному штучному інтелекті

  • Графи знань. Google з 2012 року відповідає на багато запитів із графа знань — мережі фактів на зразок (Прага, столиця, Чехія). Вільно доступна Вікідата має понад сто мільйонів елементів. Це база знань, лише замість правил переважають факти.
  • Правила там, де все має бути перевірним. Податкові розрахунки, умови страхування, схвалення кредитів чи політики безпеки досі пишуть як правила: кожне рішення можна пояснити й обґрунтувати.
  • Мовні моделі та знання. Мовна модель має величезну кількість знань, але розподілених у вагах мережі — їх не можна прочитати чи виправити по одному, і модель часом упевнено вигадує. Тому до неї під’єднують пошук у базі знань (RAG) або інструменти й машини виведення, які перевіряють результат.
  • Нейросимвольний ШІ поєднує одне й друге: мережа розпізнає, що бачить, а логіка виводить із цього, що випливає. Прикладом є системи, які шукають математичні доведення: модель пропонує крок, а формальний інструмент механічно його перевіряє.

10. Підсумок

  • База знань — це множина речень; KB ⊨ α означає, що α істинне в усіх моделях бази. Перевірка моделей це підтверджує, але ціною 2n оцінок.
  • Виведення (⊢) працює з реченнями замість світів. Ми хочемо, щоб воно було коректним (нічого не вигадує) і повним (нічого не пропускає).
  • Для диз’юнктів Горна досить прямого виведення (від фактів, кероване даними) або зворотного (від цілі, кероване запитанням); пряме працює за лінійний час, зворотне досліджує лише те, що пов’язане з ціллю.
  • Для всієї логіки висловлень є резолюція і доведення від супротивного; для правил зі змінними — уніфікація і Пролог.
  • Експертні системи показали і силу, і межі вручну записаних знань — і підготували ґрунт для навчання з даних.

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

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

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