- •К.Є. Золотько, д.В. Красношапка
- •1. Теоретичні основи створення систем штучного інтелекту
- •1.1. Методи розв’язання задач
- •Розв’язання задач методом пошуку в просторі станів
- •Загальна схема алгоритму Харта, Нільсона і Рафаеля
- •Розв’язання задач методом редукції
- •Розв’язання задач дедуктивного вибору
- •Розв’язання задач, що використовують немонотонну логіку, імовірнісну логіку
- •1.2. Експертні системи
- •Експертні системи, засновані на правилах (пряме виведення – forward chaining)
- •Експертні системи, що ґрунтуються на логіці (зворотне виведення – backward chaining)
- •Модуль (компонент) пояснення
- •Модуль (компонент) набуття знань
- •Етапи проектування експертної системи
- •Відмінність експертних систем від традиційних програм
- •2. Основи програмування мовою Visual Prolog
- •2.1. Загальний огляд мови Пролог
- •2.2. Основні теоретичні відомості Основні визначення мови Visual Prolog
- •2.3. Структура програми, складеної мовою Visual Prolog
- •2.4. Предикати введення – виведення
- •2.5. Об’єкти даних
- •Завдання 1
- •2.6. Вбудовані механізми мови Пролог. Керування бектрекінгом
- •2.7. Організація циклів. Рекурсія
- •2.8. Використання динамічної бази даних
- •2.9. Рекомендації щодо створення програм мовою Пролог
- •Завдання 2
- •2.10. Рекурсивні структури даних
- •Структура даних типу дерево
- •Обходи дерева
- •Бінарний пошук на дереві
- •Сортування за деревом
- •Лексикографічне впорядкування
- •2.11. Списки
- •Info("Шевченко о.В.", ["Інформатика", "Чисельні методи"]).
- •Info("Нікольський а.С.", ["Комп’ютерна графіка"]).
- •Info("Рябчук м.В.", ["Фізика", "Хімія", "Астрономія"]).
- •Info("Рябчук м.В.", X), write (X), nl.
- •Ігри двох осіб із повною інформацією
- •Мінімаксний принцип
- •Реалізація деяких методів пошуку в просторі станів у мові Пролог
- •Завдання 3
- •Засоби програмування інтерфейсів у Visual Prolog 5.2
- •3.1. Створення найпростішого додатка
- •Додавання пункту меню
- •Додавання речення для реагування на вибір пункту меню
- •Використання діалогових вікон, створених користувачем
- •Завдання 4
- •Варіанти завдань
- •Тема 1. Консультативна інтерактивна експертна система з визначення оптимальної конфігурації пеом
- •Тема 2. Діагностична інтерактивна експертна система пошуку причини й усунення несправності кольорового телевізора lg cf-20f60k
- •Порядок пошуку причини й усунення несправності телевізора lg cf-20f60k
- •Тема 3. Консультативна експертна система для вибору породи собаки
- •Тема 4. Медична консультативна експертна система щодо вибору лікарських трав
- •Тема 5. Експертна система для визначення мінерального добрива
- •Тема 6. Консультативна інтерактивна експертна система, яка допомагає директору фірми в процесі прийняття кандидата на роботу
- •Тема 7. Консультативна експертна система прогнозу повені та необхідності евакуації населення міста
- •Тема 8. Діагностична медична експертна система
- •Список рекомендованої літератури
- •Посібник до вивчення курсу
Додавання речення для реагування на вибір пункту меню
Для додавання речення можна було б використати редактор тексту VPI і додати потрібний фрагмент коду. Але простіше й зручніше це зробити за допомогою так званих експертів коду (Code Experts). Для цього натиснемо у вікні проекту кнопку Window на лівій інструментальній панелі й кнопку Code Expert на правій інструментальній панелі. З'явиться один із видів експертів коду – експерт діалогів і вікон (Dialog/Window Expert) (рис. 17).
Рис. 17. Вікно експерта коду
Потім виконаємо такі кроки:
- виберемо у вікні Event Type пункт Menu;
- виберемо у вікні Event or Item пункт id_hello;
- натиснемо кнопку Add Clause;
- натиснемо кнопку Edit Clause.
Вставка предиката dlg_Note в речення
Натиснення кнопки Edit Clause видасть редактор, у якому вже додано таке речення:
task_win_eh(_Win,e_Menu(id_hello,_ShiftCtlAlt),0):-!, !.
де task_win_eh – предикат оброблювача події для вікна Task.
Зверху й знизу від поданого речення знаходяться коментарі %BEGIN Task Window, id_hello, теж додані експертом діалогів і вікон. Змінна _Win містить дескриптор вікна – у розглядуваному випадку вікна Task. Змінна _ShiftCtlAlt містить комбінацію клавіш, якими ми можемо викликати меню.
Тепер для вставки предиката dlg_Note скористаємося контекстним меню (рис. 18). Установимо курсор на речення після першого предиката !, натиснемо праву клавішу миші й виберемо в меню пункти Insert | Predicate Call | Window, Dialog or Toolbar.
Рис. 18. Додавання предиката dlg_Note через контекстне меню
Далі у вікні Insert Call of… вибиремо опції Common Dialog та dlg_Note, а також у полі Note Message введемо фразу „Hello World!”, включаючи лапки (рис. 19).
Тепер кінцевий код речення виглядатиме таким чином:
task_win_eh(_Win,e_Menu(id_hello,_ShiftCtlAlt),0):-!,
Title="Title",
dlg_Note(Title,"Hello World!"),!.
Перевіримо роботу додатка. Натиснувши кнопку Run на панелі інструментів, скомпілюємо, скомпонуємо і виконаємо проект. Тепер, якщо в меню нашого додатка вибрати команду Test | Hello World, з’явиться вікно MessageBox із повідомленням „Hello World!”.
Рис. 19. Вікно Insert Call of…
Використання діалогових вікон, створених користувачем
Для створення нового діалогу в лівій частині вікна проекту натиснемо кнопку Dialog, а в правій частині вікна – кнопку New. Відкриється вікно Dialog Attributes, у якому у відповідних рядках введемо ім'я діалогу, наприклад My, константу (вона вводиться автоматично), заголовок, за потреби – прапори стилю, розміри та тип (модальний або немодальний). Після натиснення кнопки ОК з'являться вікно діалогу і вікна елементів керування та шарів. Відредагуємо вікно діалогу, наприклад, розмістимо в ньому рядок введення та командну кнопку. Після редагування вікна виділимо його назву у вікні проекту й натиснемо кнопку Code Expert. У вікні Dialog and Window Expert у групі Dialog or Window Selection поставимо перемикач на Dialog, у списку знайдемо ім'я діалогу – My. У групі Place Code Source in... у списку виберемо назву проекту (наприклад, New.pro). Натиснемо кнопку Default Code, при цьому у файл (наприклад, New.pro) буде вставлений код, стосовний цього діалогу.
Для виклику діалогу створимо пункт меню. У лівій частині вікна проекту виберемо кнопку Menu, а в правій – Edit. У вікні Task Menu натиснемо кнопку New, введемо текст, наприклад My_dialog, константа вводиться автоматично – id_My_dialog. Далі натиснемо кнопку Code Expert, у групі Dialog or Window Selection поставимо перемикач на Window, у списку Event Type виберемо Menu, у списку Event or Item – ім'я нашого пункту меню (My_dialog) і натиснемо кнопки Add Clause і Edit Clause. У вікні редактора в тілі правила task_win_eh поставимо курсор після першого предиката ! та коми й за допомогою контекстного меню виконаємо команду Insert – Predicate Call – Window, Dialog or Toolbar.
З'явиться вікно Insert Call of..., у якому поставимо перемикач на User Defined Dialog, у списку знайдемо ім'я нашого діалогу – My – і натиснемо ОК. Далі викличемо Code Expert, поставимо перемикач на Dialog, у списку знайдемо ім'я My, у списку Event Type виберемо Control, у списку Event or Item виберемо pb: idc_Push_Button, натиснемо кнопку Add Clause i Edit Clause.
Далі в редакторі в тілі правила dlg_my_eh необхідно спочатку отримати дескриптор елемента керування поля введення для доступу до його атрибутів. Для цього в контекстному меню виконаємо команду Insert – Predicate Call – VPI Predicate, у списку виберемо предикат win_GetCtlHandle, натиснемо ОК. Атрибут CtrlId змінимо за допомогою контекстного меню на idc_edit (команда Insert – Resource Identifier – Dialog Controls). Змінна CtrlWin буде зберігати дескриптор поля введення idc_edit.
Далі за допомогою предиката win_GetText отримаємо текст із поля введення idc_edit (команда Insert – Predicate Call – VPI Predicate), атрибут _Win змінимо на дескриптор поля введення – CtrlWin. Потім уведемо послідовно за допомогою контекстного меню предикат str_real (команда Insert – Predicate Call – Standart Predicate), арифметичний вираз і знову предикати str_real та win_SetText (останній вставляє текст у поле введення). Код для правила dlg_my_eh буде таким:
dlg_my_eh(_Win,e_Control(idc_push_button,_CtrlType,_CtrlWin,_CtlInfo),0):-!, CtrlWin = win_GetCtlHandle(_Win, idc_edit),
Text = win_GetText(CtrlWin),
str_real(Text,RealParam), Y=cos(RealParam),str_real(TextY,Y),
win_SetText(CtrlWin, TextY),
!.