- •Лабораторная работа № 1. Малая экспертная система.
- •Теоретические сведения
- •Диагностические экспертные системы.
- •Пример применения байесовской стратегии оценки выводов
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа № 2. Знакомство с инструментальными средствами для создания экспертных систем.
- •Теоретические сведения
- •Контрольное задание:
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа № 4.
- •Теоретические сведения
- •Контрольное задание:
- •Основные стандартные домены
- •Основные стандартные предикаты:
- •Ключевые слова
- •Контрольные задания:
- •Контрольные вопросы:
- •Лабораторная работа №7. Предложения (факты и правила), цели на языке пролог.
- •Теоретические сведения Clauses (условия): Facts (факты) и Rules (правила)
- •О фактах
- •Контрольные вопросы:
- •Лабораторная работа №8. Переменные на языке программирования пролог.
- •Теоретические сведения
- •Анонимные переменные
- •Контрольное задание:
- •Принципы отката:
- •Контрольные задания:
- •Преимущества рекурсии
- •Оптимизация обратной рекурсии
- •Контрольные задания:
- •Объявление списков
- •Головы и хвосты
- •Обработка списков
- •Использование списков
- •Контрольное задание:
- •Контрольные вопросы:
- •Лабораторная работа №13. Секция фактов Лабораторная работа № 1.
- •Теоретические сведения
- •Объявление секций фактов
- •Модификация секции фактов
- •Добавление фактов в период исполнения программы
- •Загрузка фактов из файла в период исполнения программы
- •Удаление фактов в период исполнения программы
- •Удаление нескольких фактов сразу
- •Ключевые слова для объявления фактов
- •Описания Факты, объявленные с ключевым словом nondeterm
- •Факты, объявленные с ключевым словом determ
- •Факты, объявленные с ключевым словом single
- •Сохранение базы данных фактов во время выполнения программы
- •Контрольные задания:
- •Контрольные вопросы:
Сохранение базы данных фактов во время выполнения программы
Предикат save сохраняет факты из указанной секции фактов в файл. save требует один или два аргумента.
Если вы вызываете, save только с одним аргументом (без имени секции фактов), то он сохранит факты из базы данных dbasedom в файл по имени fileName.
Если вы вызываете, save с двумя аргументами (именем файла и именем секции фактов), то он сохранит все факты секции фактов databaseName в указанный файл.
К предикатам, принадлежащим секции фактов, можно обращаться точно так же как и к другим предикатам. Единственное различие состоит в том, что описания для предикатов находятся в секции фактов, а не в секции предикатов.
Рассмотрим пример, в котором необходимо найти всех женщин:
Для решения этой задачи опишем раздел доменов:
DOMAINS
имя = string
пол = char
Следующий раздел, который мы опишем - раздел фактов:
FACTS
человек(имя,пол)
Раздел предложений будет выглядеть следующим образом:
CLAUSES
человек("Helen",'Ж').
человек("Maggie",'Ж').
человек("Suzanne",'Ж').
человек("Per",'M').
Для нахождения женщин необходимо задать следующую цель (рис. 1):
GOAL
человек(Name,'Ж').
Рис. 1. Вывод результата первой цели
или человек("Maggie",'Ж'), чтобы проверить, описана ли женщина по имени Maggie (Мэгги) в секции фактов. Пролог ответит «Да» (рис. 2).
Рис. 2. Вывод результата второй цели
Предикаты, находящиеся в секции фактов, всегда не определены. Поскольку факты можно добавить в любое время в периоде исполнения программы, компилятор должен всегда предполагать, что возможно найти альтернативные решения в процессе бэктрэкинга. Если вы имеете предикат в секции фактов, для которого вы никогда не будете иметь больше чем одного факта, вы можете описать его как детерминированный, при помощи директивы компилятора determ:
FACTS
determ daylight_saving(integer)
Вы получите ошибку, если пробуете добавить факт для детерминированного предиката, который уже имеет факт (рис. 3).
Рис. 3. Сообщение об ошибке
Рассмотрим другой пример. Предположим, что вы имеете следующие секции фактов в вашей программе:
DATABASE
person(string, string, integer)
FACTS-likesDatabase
likes(string, string)
dislikes(string, string)
CLAUSES
person(“Fred”, “Capitola”, 35).
person(“Fred”, “Omaha”, 37).
person(“Michael”, “Brooklyn”, 26).
likes(“John”, “money”).
likes(“Jane”, “money”).
likes(“Chris”, “chocolate”).
likes(“John”, “broccoli”).
dislikes(“Fred”, “broccoli”).
dislikes(“Michael”, “beer”).
При помощи этих секций фактов, вы можете объявить следующие цели:
retract(person("Fred", _, _)). /* 1 */
retract(likes(_, "broccoli")). /* 2 */
retract(likes(_, "money"), likesDatabase). /* 3 */
retract(person("Fred", _, _), likesDatabase) /* 4 */
Первая цель удаляет первый факт для person о Фреде из секции фактов dbasedom (по умолчанию) и выводит ответ (рис. 4).
Рис. 4. Результат первой цели
Вторая цель удаляет первый факт, соответствующий, предикату likes(X, "broccoli") из секции фактов likesDatabase и выводит сообщение (рис. 5).
Рис. 5. Результат второй цели
При обработке
обеих из этих целей,
Третьи и четвертые цели иллюстрируют, как вы можете использовать дополнительный второй аргумент для проверки типа. Третья цель успешна, при её достижении удаляется первый факт из likesDatabase, соответствующий предикату likes(_, "money") (рис. 6).
Рис. 6. Результат третьей цели
Но четвертая - не компилируется, потому что в секции фактов likesDatabase нет (и может быть) фактов person. Сообщение об ошибке, выданное компилятором будет следующим:
506 Type error: The functor does not belong to the domain.
