06 — Мова правил¶
🇬🇧 English | 🇺🇦 Українська
Правила зберігаються як читабельний текст і компілюються у внутрішні індекси перед обчисленням.
Граматика¶
rule := "IF" antecedent "THEN" clause [ "WITH" number ]
antecedent := clause { ("AND" | "OR") clause }
clause := identifier "IS" [ "NOT" ] identifier
identifier := letter { letter | digit | "_" }
Приклади¶
IF Temperature IS Cold THEN Fan IS Slow
IF Temperature IS Hot AND Humidity IS High THEN Fan IS Fast
IF Battery IS NOT Low OR Distance IS Near THEN Aggression IS Bold
IF Speed IS Extreme THEN Brake IS Hard WITH 0.8
Імена та ключові слова¶
IF, IS, NOT, AND, OR, THEN, WITH не залежать від регістру. Пробіли, табуляція та перенесення рядків вільні.
Імена змінних і множин мають існувати в системі. Вони зберігаються як FName, тому зберігають набраний регістр для показу, але зіставляються без урахування регістру: IF speed IS fast успішно розв’язується в системі, де оголошено Speed і Fast. З тієї ж причини дві множини однієї змінної з іменами Low і low буде позначено як дублікат.
Сім ключових слів вище зарезервовані й не можуть бути іменем змінної чи множини. Система зі змінною на ім’я Or компілюється без зауважень, але кожне правило, що її згадує, не розбирається — і повідомлення вказує на правило, а не на ім’я. Перейменуйте змінну.
letter у граматиці вище визначається класифікацією символів платформи, тож не-ASCII імена (кирилиця, латиниця з діакритикою, CJK) можуть бути прийняті на одній машині й відхилені на іншій. Тримайте ідентифікатори в межах ASCII-літер, цифр і _; ім’я множини — це лише ключ, а локалізоване формулювання тримайте в UI.
Передумови посилаються лише на входи. Наслідок посилається лише на вихід. Невідоме ім’я, використання виходу в передумові або входу в наслідку створює діагностичну помилку.
AND¶
AND об’єднує ступені через вибрану T-норму. За стандартного Minimum сила правила дорівнює найслабшій умові:
Distance.Near = 0.7
Integrity.High = 0.4
AND / Minimum = 0.4
Product перемножує ступені: 0.7 × 0.4 = 0.28.
OR¶
OR використовує S-норму. Maximum бере найсильнішу умову. Probabilistic Sum обчислює a + b - ab і дає взаємне підсилення без виходу за 1.
NOT¶
NOT доповнює конкретне твердження:
IF Health IS NOT Low THEN Speed IS Fast
Якщо Health.Low = 0.25, то Health NOT Low = 0.75. NOT дозволено і в наслідку, хоча зазвичай окрема позитивно названа вихідна множина читається краще.
WITH¶
WITH задає вагу правила від 0 до 1:
IF Visibility IS Poor THEN Caution IS High WITH 0.65
Вага множиться на силу передумови. Відсутня вага дорівнює 1.
Обмеження одного сполучника¶
Одне правило використовує або AND, або OR у всій передумові. Змішаний вираз відхиляється, щоб прихований пріоритет операторів не змінював задум:
# Некоректно
IF A IS High AND B IS Low OR C IS Near THEN Result IS Strong
Розбийте його на два явні правила або введіть окрему змінну, якщо потрібна складніша логіка.
Поради¶
- Одне правило має виражати одну зрозумілу думку.
- Використовуйте ваги для тонкого налаштування після того, як форми множин уже правильні.
- Не дублюйте повністю однакові правила: за сумарної агрегації вони можуть підсилювати одне одного.
- Індекс у
RuleActivationsвідповідає позиції правила в авторському масиві, навіть коли правило не скомпілювалося.
Математичну поведінку операторів пояснює 07 — Логічний висновок і налаштування.