- •Лабораторная работа № 1. Малая экспертная система.
- •Теоретические сведения
- •Диагностические экспертные системы.
- •Пример применения байесовской стратегии оценки выводов
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа № 2. Знакомство с инструментальными средствами для создания экспертных систем.
- •Теоретические сведения
- •Контрольное задание:
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа № 4.
- •Теоретические сведения
- •Контрольное задание:
- •Основные стандартные домены
- •Основные стандартные предикаты:
- •Ключевые слова
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа №7. Предложения (факты и правила), цели на языке пролог.
- •Теоретические сведения Clauses (условия): Facts (факты) и Rules (правила)
- •О фактах
- •Контрольные вопросы:
- •Лабораторная работа №8. Переменные на языке программирования пролог.
- •Теоретические сведения
- •Анонимные переменные
- •Контрольное задание:
- •Принципы отката:
- •Контрольные задания:
- •Преимущества рекурсии
- •Оптимизация обратной рекурсии
- •Контрольные задания:
- •Объявление списков
- •Головы и хвосты
- •Обработка списков
- •Использование списков
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа №13. Секция фактов Лабораторная работа № 1.
- •Теоретические сведения
- •Объявление секций фактов
- •Модификация секции фактов
- •Добавление фактов в период исполнения программы
- •Загрузка фактов из файла в период исполнения программы
- •Удаление фактов в период исполнения программы
- •Удаление нескольких фактов сразу
- •Ключевые слова для объявления фактов
- •Описания Факты, объявленные с ключевым словом nondeterm
- •Факты, объявленные с ключевым словом determ
- •Факты, объявленные с ключевым словом single
- •Сохранение базы данных фактов во время выполнения программы
- •Контрольные задания:
- •Контрольные вопросы:
Контрольные вопросы:
Дайте понятие цели.
Как называется цель, состоящая из двух или более частей?
Как называется каждая часть составной цели?
Дайте понятие конъюнктивной и дизъюнктивной подцелей.
Сформулируйте понятие условия.
Какие типы фраз составляют язык Пролог?
Из чего основана программа, написанная на языке Пролог?
Должен ли Prolog искать или выводить подтверждения факта?
Сформулируйте понятие и приведите пример правила.
Лабораторная работа №8. Переменные на языке программирования пролог.
Цель работы: формирование знаний синтаксических особенностей переменных, навыков работы с переменными на языке программирования Пролог.
Используемое программное обеспечение: Visual Prolog 5.2.
Теоретические сведения
Работа с переменными в Прологе достаточна своеобразна. Если в других, алгоритмических, языках программирования значение переменной, которое было ей присвоено, не изменяется до тех пор, пока не будет выполнено переприсваивание значения, то в Прологе переменная может получить некоторое значение в процессе поиска решения и потерять его, когда начнется поиск нового решения.
Переменная, не имеющая значения, называется свободной, переменная, имеющая значение, - конкретизированной.
Имя переменной должно начинаться с заглавной латинской буквы или символа нижнего подчеркивания (_) (в случае использования анонимных переменных), после которых могут следовать буквы латинского алфавита, цифры или символы подчеркивания.
В простых запросах можно использовать переменные, для постановки вопросов. Например, Who likes tennis (кто любит теннис)?:
likes(X, tennis).
В имени переменной, за исключением первого символа (который должен быть символом верхнего регистра или символом подчеркивания), Visual Prolog позволяет использовать нижний регистр или символы верхнего регистра на любой позиции. Один из способов сделать имя переменной более удобочитаемым - это использовать совместно верхний регистр и символы нижнего регистра: IncomeAndExpenditureAccount.
В Прологе нет оператора присваивания; это существенное различие между Прологом и другими языками программирования. Переменные в Прологе получают их значения, будучи согласованными, с константами в фактах или правилах.
До получения какого-то значения, переменные называются свободными; при получении значения они становится связанными. Но они остаются связанными только на время получения решения запроса; потом Пролог освобождает их.
Вы не можете сохранять информацию, передавая значение переменной. Переменные используются для сопоставления с образцом, а не как своего рода хранение информации.
Анонимные переменные
Анонимные переменные позволяют Вам упростить ваши программы. Если Вы нуждаетесь только в некоторой части информации из запроса, можно использовать анонимные переменные, чтобы игнорировать ненужные Вам значения. В Прологе анонимные переменные обозначаются символом нижнего подчеркивания (_).
Анонимные переменные можно использовать вместо любой другой переменной. Различие заключается в том, что для анонимной переменной никогда не будет устанавливаться значение.
Рассмотрим пример, который демонстрирует, как и когда переменные получают свои значения.
Реализуйте следующий программный код в Visual Prolog:
PREDICATES
nondeterm likes(symbol, symbol)
CLAUSES
likes(ellen, reading).
likes(john, computers).
likes(john, badminton).
likes(leonard, badminton).
likes(eric, swimming).
likes(eric, reading).
Рассмотрите такой запрос: Is there a person who likes both reading and swimming (Этот человек любит и чтение, и плавание)?
likes(Person, reading), likes(Person, swimming).
Пролог решит обе части этого запроса, просматривая в программе факты сверху вниз. В первой части запроса
likes(Person, reading)
переменная Person свободна; ее значение неизвестно до тех пор, пока Пролог не станет находить решение. С другой стороны, второй аргумент, reading, известен. Пролог ищет факт, который подходит для решения первой части запроса
likes(ellen, reading)
так как найдено соответствие (reading из факта сочетается с reading в запрос), Пролог привязывает свободную переменную Person со значением ellen. В то же время, Пролог помещает указатель в список фактов, показывая, насколько далеко продвинулась процедура поиска.
Далее по очереди будет полностью удовлетворение запроса (нахождение человека, который любит и чтение, и плавание), для этого нужно выполнение второй части запроса, основываясь на выполнение первой. Так как Person теперь связана с ellen, Пролог должен искать следующий факт
likes(ellen, swimming).
Поиск Прологом этого факта ведется с начала программы, но такого факта не обнаруживается, так как его нет в программе. Следовательно, вторая часть запроса, когда Person - это ellen, не истинна. Пролог теперь «освобождает» Person и пытается найти другое решения первой части запроса, еще раз используя свободную переменную Person. Поиск другого факта, удовлетворяющего первую часть запроса, начинается с указателя в списке фактов. Это возвращение к последнему отмеченному месту известно как отслеживание в обратном порядке.
Пролог ищет следующего человека, который любит чтение, т.е. пытается найти факт подобно likes(eric, reading). Переменная Person теперь связана с eric, и Пролог еще раз пытается удовлетворить вторую часть запроса, ища в программе факт подобно следующему:
likes(eric, swimming).
На этот раз соответствие полностью найдено, и запрос полностью удовлетворен. Пролог выдаст ответ (рис. 1):
Person=eric
1 Solution
Р
ис.
1. Вывод результата к вышеописанной
программе
Рассмотрим следующий пример и составим новое отношение-правило дед(X,Y) и определим, кто является дедушкой Кати.
Заданы отношения-факты:
родитель(“иван”, “катя”).
родитель(“анна”, “олег ”).
родитель(“олег”, “дима”).
родитель(“игорь”, “ольга”).
родитель(“олег”, “виктор”).
родитель(“игорь”, “иван”).
мужчина(“дима”).
мужчина(“иван”).
мужчина(“игорь”).
мужчина(“олег”).
мужчина(“виктор”).
женщина(“катя”).
женщина(“ольга”).
женщина(“анна”).
Опишем разделы доменов и предикатов.
DOMAINS
имя=string
PREDICATES
nondeterm родитель(имя, имя)
женщина(имя)
мужчина(имя)
nondeterm дед(имя, имя)
Отношение grandfather можно непосредственно записать на языке Prolog следующим образом: дед(X, Z):- родитель(X, Y), родитель(Y, Z), мужчина(X) или grandfather (X, Z):- parent(X, Y), parent(Y, Z) (рис. 2).
Рис. 2. Графы, которые определяют отношения mother и grandfather
После определения отношения необходимо прописать нашу цель:
GOAL
дед(X, "катя").
Откомпилируйте исходный код примера и запустите его. Результат выполнения программы должен отобразиться в окне (рис. 3):
Р
ис.
3. Окно вывода результата
В следующем примере рассмотрим использование анонимных переменных.
1. Реализуйте ниже приведенный код.
PREDICATES
male(symbol)
female(symbol)
nondeterm parent(symbol, symbol)
CLAUSES
male(bill).
male(joe).
female(sue).
female(tammy).
parent(bill, joe).
parent(sue, joe).
parent(joe, tammy).
В запросе, Вам нужно узнать, какие люди являются родителями, но Вам не обязательно знать, кто их дети. Пролог понимает, что каждый раз, когда Вы используете символ нижнего подчеркивания в запросе, Вы не нуждаетесь в нахождении значения переменной, на месте которой он ставится.
2. Задайте следующую цель:
GOAL
parent(Parent, _).
П
олучив
такой запрос, Пролог выдаст ответ (рис.
4):
Рис. 4. Вывод результата
В этом случае, из-за использования анонимной переменной, Пролог находит и сообщает о трех родителях, но ничего не упоминается о значении второго аргумента.
