- •Лабораторная работа № 1. Малая экспертная система.
- •Теоретические сведения
- •Диагностические экспертные системы.
- •Пример применения байесовской стратегии оценки выводов
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа № 2. Знакомство с инструментальными средствами для создания экспертных систем.
- •Теоретические сведения
- •Контрольное задание:
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа № 4.
- •Теоретические сведения
- •Контрольное задание:
- •Основные стандартные домены
- •Основные стандартные предикаты:
- •Ключевые слова
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа №7. Предложения (факты и правила), цели на языке пролог.
- •Теоретические сведения Clauses (условия): Facts (факты) и Rules (правила)
- •О фактах
- •Контрольные вопросы:
- •Лабораторная работа №8. Переменные на языке программирования пролог.
- •Теоретические сведения
- •Анонимные переменные
- •Контрольное задание:
- •Принципы отката:
- •Контрольные задания:
- •Преимущества рекурсии
- •Оптимизация обратной рекурсии
- •Контрольные задания:
- •Объявление списков
- •Головы и хвосты
- •Обработка списков
- •Использование списков
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа №13. Секция фактов Лабораторная работа № 1.
- •Теоретические сведения
- •Объявление секций фактов
- •Модификация секции фактов
- •Добавление фактов в период исполнения программы
- •Загрузка фактов из файла в период исполнения программы
- •Удаление фактов в период исполнения программы
- •Удаление нескольких фактов сразу
- •Ключевые слова для объявления фактов
- •Описания Факты, объявленные с ключевым словом nondeterm
- •Факты, объявленные с ключевым словом determ
- •Факты, объявленные с ключевым словом single
- •Сохранение базы данных фактов во время выполнения программы
- •Контрольные задания:
- •Контрольные вопросы:
Принципы отката:
Подцели нужно выполнять по порядку, сверху вниз.
Предложения предиката проверяются по порядку следования в программе, сверху вниз.
Продолжение поиска происходит согласно третьему основному принципу отката:
Если подцель соответствует голове правила, тело этого правила должно быть так же выполнено. Тело правила предоставляет новый набор подцелей, которые необходимо решить.
Согласно четвертому основному принципу отката:
Цель считается выполненной, когда найден факт соответствующий каждой из крайних точек (листьев) целевого дерева.
Рассмотрим программу, которая содержит информацию (факты) об именах и возрасте некоторых игроков в теннисном клубе.
Опишите раздел доменов. Задайте типы аргументов предиката.
child = symbol
age = integer
Опишите раздел предикатов.
nondeterm player(child, age)
Опишите раздел предложений.
player(peter, 9).
player(paul, 10).
player(chris, 9).
player(susan, 9).
Ваша программа должна выглядеть следующим образом:
DOMAINS
child = symbol
age = integer
PREDICATES
nondeterm player(child, age)
CLAUSES
player(peter, 9).
player(paul, 10).
player(chris, 9).
player(susan, 9).
Допустим, Вы
используете
player(Person1, 9),
player(Person2, 9),
Person1<> Person2.
Это означает найти Person1 (9 лет) и Person2 (9 лет) так, чтобы Person1 и Person2 были разные люди.
Сначала
player(Person2, 9).
Если опять сопоставить Person2 с peter, Пролог перейдет к третьей и заключительной подцели
Person1 <> Person2.
Так как Person1
и Person2
оба связаны со
значением peter,
третья подцель не выполняется. Из-за
этого,
player(Person2, 9).
Эта подцель выполняется, сопоставляя Person2 с chris.
Теперь третья подцель:
Person1 <> Person2
возвращает
положительный результат, так как peter
и chris
разные люди. Теперь, основная цель
выполняется, создавая турнир между
chris
и peter.
Однако так как
player(Person2, 9)
может также быть
удовлетворена, сопоставляя Person2
со susan,
Пытаясь найти
большее количество решений,
Для поиска еще
одного решения,
И опять пытаемся найти новое решение. Пролог делает откат ко второй подцели, но на сей раз безуспешно. Когда вторая подцель не выполнилась, происходит откат к первой подцели, на этот раз, связывая Person1 со susan. Пытаясь выполнять вторую подцель, Пролог сопоставляет Person2 с peter, и третья подцель возвращает положительный результат при данных Person1 и Person2. Найдена пятая пара игроков для турнира.
Делая опять откат ко второй подцели, Person2 связываем с chris. Найдено шестое решение.
Последнее решение,
это и Person1,
и Person2
сопоставить с susan. Так как третья подцель
в данном случае не выполнится,
Введите следующую составную цель:
player(Person1, 9),
player(Person2, 9),
Person1<> Person2.
Пролог выдаст вам ответ (рис. 1):
Person1=peter, Person2=chris
Person1=peter, Person2=susan
Person1=chris, Person2=peter
Person1=chris, Person2=susan
Person1=susan, Person2=peter
Person1=susan, Person2=chris
6 Solutions
Р
ис.
1. Вывод результата программы
Рассмотрим пример и создадим новый проект.
Имеется база данных, содержащая следующие предикаты: отдыхает(имя, город), украина(город), россия(город), прибалтика(город). Составить правило, позволяющее определить, кто отдыхал в России. Проследить поиск решения задачи с помощью отладчика Visual Prolog и построить целевое дерево поиска с возвратом.
З
апустите
среду Visual
Prolog
и создайте новый проект (Project
| New
Project),
активизируется окно Application
Expert
(Эксперт приложения) (рис. 2).
Рис. 2. Создание нового проекта
Определите имя проекта (Primer) и базовый каталог, куда будет сохранен проект (рис. 3).
Рис.3. Окно Application Expert
Н
а
вкладке Target установите параметры и
нажмите кнопку Create для создания проекта
(рис. 4).
Рис. 4. Установки на вкладке Target окна Application Expert
Откройте окно Compiler Options (Options | Project | Compiler Options).
Откройте вкладку Warnings и установите опции компилятора для созданного проекта (рис. 5).
Рис. 5. Установки опций компилятора
Нажмите OK.
В окне проекта выделите файл Пример.pro и откройте его для редактирования (двойной щелчок или кнопка Edit) (рис. 6).
Рис. 6. Окно проекта
Файл с расширением *.pro содержит секции PREDICATES, CLAUSES, GOAL. Допишите необходимые определения так, чтобы получилась программа (рис. 7):
DOMAINS
имя, город = string
PREDICATES
отдыхает(имя, город)
украина(город)
россия(город)
прибалтика(город)
отдых_россия(имя)
CLAUSES
отдыхает(sasha, antalia).
отдыхает(anna, sochi).
отдыхает(dima, urmala).
отдыхает(oleg, kiev).
украина(kiev).
россия(sochi).
прибалтика(urmala).
отдых_россия(X):- отдыхает(X, Y), россия(Y).
GOAL
отдых_россия(X), write(X), nl.
Р
ис.
7. Окно проекта
Сохраните проект (Project | Save Project).
Запустите его на исполнение (Project | Run, или клавиша <F9>, или кнопка <R>).
Результат выполнения программы:
anna
Проследите поиск этого решения с помощью отладчика (Debugger) (рис. 8). Для этого:
запустите отладчик (Project | Debug);
в окне отладчика выберите команду View | Local Variables (для просмотра текущих значений переменных);
нажимайте клавишу <F7> (или Run | Trace Into) для пошагового выполнения программы, текущие значения переменных отображаются в окне Variables For Current Clause.
Рис. 8. Окно отладчика
Поиск решения можно представить следующим образом (рис. 9):
решение: X=
anna
Рис. 9. Целевое дерево поиска решения
Использование предиката fail
Рассмотрим следующий пример программы, иллюстрирующей использование предиката fail.
База данных содержит факты вида father(name, name). Создать проект, позволяющий определить, кто чей отец.
Создайте новый проект и напишите нижеприведенный программный код.
DOMAINS
name = symbol
PREDICATES
father(name, name)
everybody
CLAUSES
father(“павел”, “петр”).
father(“петр”, “михаил”).
father(“петр”, “иван”).
everybody:- father(X, Y), write(X, “ - это отец”, Y, “a”), nl, fail.
GOAL
everybody.
Результат выполнения программы (рис. 10):
павел - это отец петра
петр - это отец михаила
петр - это отец ивана
Р
ис.
10. Вывод программы
Если внутренняя
цель полностью выполнится, то ничего
не заставляет
Объект предиката everybody производит более корректный ответ. Предикат everybody использует откат для поиска всех решений father(X, Y), заставляя Пролог постоянно крутиться в теле правила everybody, пока не выполниться одна из предшествующих подцелей:
father(X, Y), write(X," is ",Y, "а"), nl, fail.
fail
никогда не выполниться, поэтому
Предикат write
является детерминированным, поэтому
Обратите внимание, что бесполезно размещать подцель после fail в теле правила. Так как предикат fail всегда не выполняется, то и стоящие за ним подцели никогда не будут выполнены.
Создайте проект, реализующий железнодорожный справочник. В справочнике содержится следующая информация о каждом поезде: номер поезда, пункт назначения и время отправления.
вывести всю информацию из справочника;
Решение:
DOMAINS
nom = integer
p, t = string
PREDICATES
poezd(nom, p, t)
CLAUSES
poezd(233, moskva, “12-30”).
poezd(257, moskva, “22-40”).
poezd(133, armavir, “10-20”).
poezd(353, armavir, “20-40”).
poezd(353, adler, “02-30”).
poezd(413, adler, “11-10”).
poezd(256, piter, “21-30”).
GOAL
write(“Расписание поездов”), nl,
write(“Номер Пункт прибытия Время отправления”), nl,
poezd(N, P, T), write(N, “ ”, P, “ ”, T), nl, fail.
Результат выполнения программы:
Расписание поездов
Номер Пункт прибытия Время отправления
233 moskva 12-30
257 moskva 22-40
133 armavir 10-20
353 armavir 20-40
353 adler 02-30
413 adler 11-10
256 piter 21-30
организовать поиск поезда по пункту назначения;
Решение:
GOAL
write ("Пункт назначения:"), readln(P), nl,
write ("Номер Время отправления"), nl,
poezd(N, P, T), write(N, " ", T), nl, fail.
Результат выполнения программы:
Пункт назначения: armavir
Номер Время отправления
133 10-20
353 20-40
вывести информацию о поездах, отправляющихся в заданный временной промежуток.
Решение:
GOAL
write(" Время отправления:"), nl,
write("c..."), readln(T1),
write("до..."), readln(T2), nl,
write("Номер Пункт назначения Время отправления"), nl,
poezd(N, P, T), T >= T1, T <= T2, write(N, " ", P, " ", T), nl, fail.
Результат выполнения программы:
Время отправления:
c...10-00
до...15-00
Номер Пункт назначения Время отправления
233 moskva 12-30
133 armavir 10-20
413 adler 11-10
20. Рассмотрим другой пример: имеется база данных, содержащая данные о спортсменах: имя и вид спорта. Определить возможные пары одного из спортсменов-теннисистов с другими теннисистами.
Решение:
DOMAINS
имя, вид_сп = string
PREDICATES
играет(имя, вид_сп)
спис_спортс
CLAUSES
играет("саша", теннис).
играет("аня", волейбол).
играет("олег", футбол).
играет("коля", теннис).
играет("саша", футбол).
играет("андрей", теннис).
спис_спортс:- играет(X,теннис), !, играет(Y, теннис),
X<>Y, write(X, "-", Y), nl, fail.
GOAL
write("Пары теннисистов"),nl,
спис_спортс.
Результат выполнения программы:
Пары теннисистов
саша-коля
саша-андрей
Использование предиката not
Есть одна вещь, на
которую необходимо обращать внимание
при использовании предиката
not:
он выполняется, если нельзя доказать
правомерность подцели.
Это приводит к ситуации, которая запрещает
несвязанным переменным быть связанным
в предикате not.
Когда подцель со свободными переменными
вызывается из not,
Если Вы перепишите это так, чтобы подцель not стояла первой в теле правила, Вы получите сообщение о том, что свободные переменные не могут быть использованы в not.
Неправильное использование приведет к сообщению об ошибке или к ошибке в логике вашей программы.
Следующий пример показывает правильный способ использования предиката not.
PREDICATES
nondeterm likes_shopping(symbol)
nondeterm has_credit_card(symbol, symbol)
bottomed_out(symbol, symbol)
CLAUSES
likes_shopping(Who):-
has_credit_card(Who, Card),
not(bottomed_out(Who, Card)),
write(Who, “ can shop with the ”, Card, “ credit card.\n”).
has_credit_card(chris, visa).
has_credit_card(chris, diners).
has_credit_card(joe, shell).
has_credit_card(sam, mastercard).
has_credit_card(sam, citibank).
bottomed_out(chris, diners).
bottomed_out(sam, mastercard).
bottomed_out(chris, visa).
Введите следующую цель:
likes_shopping(Who).
Пролог ответит (рис. 11):
Рис. 11. Вывод результата программы
