- •К.Є. Золотько, д.В. Красношапка
- •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. Діагностична медична експертна система
- •Список рекомендованої літератури
- •Посібник до вивчення курсу
2.11. Списки
Список – це структура даних, яка може зберігати довільну кількість однотипних елементів, наприклад:
[ ]
[1, 2, 3, 4, 5]
[tom, ann, john, bob]
Першим наведено порожній список. Непорожній список складається з двох елементів – голови і хвоста. Голова – перший елемент списку, інша частина списку – хвіст. Наприклад, в останньому списку tom – це голова, [ann, john, bob] – це хвіст списку. Список можна явно поділити на голову і хвіст за допомогою вертикальної риски:
[tom | [ann, john, bob]]
Насправді вертикальна риска має більш загальний зміст, нею можна виділити довільну кількість елементів: [tom, ann | [john, bob]], [tom, ann, john, bob] | [ ]].
Списки, як і всі структурні об’єкти в мові Пролог, – це дерева. Зокрема, третій список можна зобразити у вигляді дерева, показаного на рис. 9. Списки зручно використовувати, коли кількість компонентів у структурі змінна. Наприклад, якщо ми хочемо створити БД, у якій зберігаються прізвища викладачів і назви дисциплін, які вони викладають, її можна реалізувати таким чином:
domains
teacher = string
courses_list = string*
predicates
info(teacher, courses_list)
clauses
Info("Шевченко о.В.", ["Інформатика", "Чисельні методи"]).
Info("Нікольський а.С.", ["Комп’ютерна графіка"]).
Info("Рябчук м.В.", ["Фізика", "Хімія", "Астрономія"]).
goal
Info("Рябчук м.В.", X), write (X), nl.
Рис. 9. Зображення списку у вигляді дерева
Як видно, кількість дисциплін може варіюватися від нуля до довільної кількості. Списки описують за допомогою знака „*” (зірочка).
Основні операції зі списками такі:
перевірка об’єкта на належність до списку;
конкатенація (зчеплення) двох списків;
додавання або вилучення об’єкта зі списку.
Операції зі списками програмують із застосуванням рекурсії. У процесі обробки списку його розбивають на голову і хвіст. Процедура зазвичай складається з двох правил: у першому описують окремий випадок, у другому – більш загальний випадок.
Приклади
Перевірку об’єкта на належність до списку реалізують на основі таких міркувань:
об’єкт є головою списку;
об’єкт належить списку, якщо об’єкт належить хвосту списку.
Ці речення мовою Пролог записують так:
member(X, [X | Tail]).
member(X, [Head | Tail]):-
member(X, Tail).
Конкатенацію (зчеплення) двох списків реалізують у вигляді предиката з трьома аргументами: перший і другий аргументи – два вхідні списки, третій аргумент – вихідний список. Нижчеподані фрази показують, як зчепити два списки:
якщо перший аргумент порожній, то другий і третій аргументи являють собою один і той же список;
якщо перший аргумент непорожній, то він має голову й хвіст, а результатом зчеплення буде список, який складається з голови першого списку та зі списку, який становить конкатенацію хвоста першого списку і всього другого списку.
Мовою Пролог ці фрази записують таким чином:
append([], List, List).
append([X|L1], List2, [X|L3]) :-
append(L1, List2, L3).
Додати об’єкт до списку можна без будь-якої процедури, просто записуючи його у вигляді голови списку: [X | List]. Якщо ж треба явно описати процедуру додавання об’єкта до списку, її можна записати у вигляді факту:
add(X, List, [X | List]).
Вилучення об’єкта зі списку можна описати як предикат, що має три аргументи: 1) сам об’єкт; 2) початковий список; 3) результуючий список. Відношення вилучення записують двома реченнями:
якщо Х– голова списку, то результатом вилучення буде хвіст цього списку;
якщо Х знаходиться у хвості списку, то його треба вилучити звідти.
Мовою Пролог зазначене вище можна переписати так:
remove(X, [X | Tail], Tail).
remove(X, [Y | Tail], [Y | Tail1]):-
remove(X, Tail, Tail1).
Пролог має і вбудований предикат для роботи зі списками – findall. За допомогою нього можна зібрати всі розв’язки цілі в один список. Загальна форма така:
findall(ArgumentName, PredicateCall, ValuesList)
ArgumentName визначає, який параметр у вказаному предикаті PredicateCall слід зібрати в список ValuesList.
PredicateCall вказує предикат, із якого будуть зібрані значення.
ValuesList – вихідний список значень, зібраних за допомогою бектрекінгу.
У поданій нижче програмі за допомогою предиката findall із БД збирають у список TownList1 назви всіх міст, а в список TownList2 – назви міст, до яких існує дорога з Києва:
domains
town = symbol
town_list=town*
facts
town(town).
predicates
nondeterm road(town,town)
clauses
town(kyiv).
town(lviv).
town(dnipro).
town(donetsk).
road(kyiv,lviv).
road(lviv,krakiv).
road(kyiv,dnipro).
road(dnipro,donetsk).
goal
findall(X, town(X), TownList1), write(TownList1), nl,
findall(X, road(kyiv,X), TownList2), write(TownList2), nl.
2.12. Ігри