- •1.1. Факты
- •Вопросы или целевые утверждения
- •Переменные
- •1.4. Правила
- •1.5. Конъюнкция целевых утверждений
- •Пополнение базы знаний
- •Структура программы на языке Visual Prolog
- •Заключение
- •Пример выполнения контрольного задания
- •"Среда",14,"з").
- •Контрольные вопросы
- •Контрольные задания
- •Предметная область "Кулинария ".
- •Предметная область "Студенты группы".
- •Предметная область "Поставщики продуктов".
- •Предметная область "Оценка деятельности преподавателя". Отношения-факты:
- •Предметная область "Шахматы".
- •Предметная область "Управление троллейбусами".
- •Предметная область "Междугородные переговоры". Отношения-факты:
Вопросы или целевые утверждения
Чтобы выполнить простейшую программу на Прологе, откроем файл с программой "Меню" в среде Visual Prolog 5.2.
Программа начинает выполняться, если в нее ввести те вопросы, ответы на которые хочет получить пользователь. Для этого предназначен раздел GOAL (Цель). В нем записываются необходимые вопросы - третий тип утверждений в программе на Прологе.
Введите такие вопросы: "Есть ли в ресторане рыбное блюдо "окунь во фритюре"?"
GOAL
рыба("окунь_во_фритюре").
В диалоговом окне получаем ответ
yes
или "Является ли мясным блюдом блюдо "артишоки в белом соусе"?"
GOAL
мясо("артишоки_в_белом_соусе") .
по
При получении вопроса (целевого утверждения) программа начинает выполняться. Суть выполнения состоит в поиске в базе знаний заголовка утверждения, соответствующего вопросу. Если такое утверждение (факт) есть, то на экране появляется ответ "yes" (да). Если нет, как в случае вопроса закуска("салат_из_помидоров"), то на экране появляется отрицательный ответ "по"(нет).
Вопрос, или целевое утверждение, с помощью предиката описывает отношение (гипотезу), истинность которого для данной предметной области неизвестна и должна быть определена в процессе выполнения программы, в процессе согласования вопроса с утверждениями базы знаний. Синтаксис вопроса совпадает с синтаксисом предиката.
Переменные
Продолжим работу с "Меню". Предположим, что мы хотим получить информацию обо всех закусках. В этом случае мы, естественно, задали бы вопрос: "Какие блюда являются закусками?" или более формализовано: "Существуют ли те блюда (объекты) X, которые являются закусками?". Здесь имя X обозначает не какой-то конкретный объект, а любой, принадлежащий некоторому множеству (может быть пустому) объектов, обладающих свойством быть закуской и которые нужно найти в меню. В этом случае говорят, что X есть переменная.
На Прологе вопрос о закусках записывается так:
GOAL
закуска(X).
Будет получен ответ:
Х=артишоки_в_белом_соусе
Х=трюфели_в_шампанском
Х=салат_с_яйцом
3 Solutions
Все эти ответы содержат множество тех значений переменной X, при которых утверждение закуска(Х) истинно.
1.4. Правила
С помощью отношений, которые составляют начальную базу знаний, можно конструировать более сложные и более общие отношения. Например, с помощью отношений мясо и рыба, выражающих то, что их аргумент является вторым мясным или рыбным блюдом, можно определить отношение блюдо: "Блюдо - это второе мясное или рыбное блюдо", что записывается на Прологе в виде двух правил следующим образом:
PREDICATES /* Описание предиката блюдо */
блюдо(name)
CLAUSES
/*Правила, задающие определение понятия блюдо*/
блюдо(Y):-мясо(Y).
блюдо(Y):-рыба(У).
и читается так: "Y является блюдом, если Y - второе мясное блюдо, или Y является блюдом, если Y - второе рыбное блюдо". Последовательность двух правил означает их дизъюнкцию (операцию "или": первое правило или второе). Область действия переменной ограничена правилом, в котором она определена. Поэтому переменная из первого правила никак не связана с переменной Y из второго. Вопрос "Что является блюдом?", выраженный в виде:
GOAL
блюдо(Y).
вызовет следующие ответы:
У=говяжье_жаркое
У=цыпленок_в_липовом_цвете
У=окунь_во_фритюре
У=фаршированный_судак
4 Solutions
Можно построить и более сложные правила. Займемся теперь составлением обеда, в который входят закуска, второе блюдо (мясное или рыбное) и десерт. Обед является, следовательно, тройкой (X, Y, Z), где X - закуска, Y - блюдо, Z - десерт. В Прологе это выражается очень естественно в виде следующего правила:
/* Определение отношения "обед" */
обед(X,У,Z):-закуска(X), блюдо(Y), десерт(Z).
Оно читается так: "X, Y, Z удовлетворяют отношению обед, если X удовлетворяет отношению закуска, Y удовлетворяет отношению блюдо и Z удовлетворяет отношению десерт". Формально говоря, мы определили новое отношение как конъюнкцию (операцию И) трех других отношений, как конъюнкцию предикатов.
На вопрос "Что является обедом?":
GOAL
обед(X,Y,Z).
вы получите ответ:
Х=ар'гишоки_в_белом_соусе, У=говяжье_жаркое,
Z=грушевое_мороженое
Х=артишоки_в_белом_соусе,У=говяжье_жаркое,
Z=земляника_со_взбитыми_сливками
………………………………………………………..
36 Solutions
т. е. выдаст список всех 36 возможных комбинаций из трех блюд. Попробуйте это выполнить.
Правила описывают зависимость некоторого отношения от группы других отношений (зависимость предиката от группы других предикатов), называемых условиями (или целевыми утверждениями). Правило соответствует условному высказыванию (импликации) и имеет следующую синтаксическую структуру (рис. 2).
ПРАВИЛО
<заголовок – предикат> :- (<тело>).
<предикат
1>
<предикат
2>
………………..
<предикат
N>
<имя отношения>(<список аргументов>) :-
<имя отношения>(<список аргументов>).
Рис. 2. Синтаксическая структура правила
Правило состоит из заголовка и тела правила. Заголовок и тело соединяются с помощью символа соответствующего в русском языке слову "если". Правила также заканчиваются точкой. Заголовок правила описывает отношение, для определения которого предназначено правило. Тело правила в большинстве случаев представляет собой конъюнкцию предикатов (целевых утверждений), которые должны быть последовательно согласованы с базой знаний для того, чтобы заголовок правила был истинным. Предикаты (цели) в теле правила разделяются запятыми. Правило - это некоторое общее утверждение. Оно описывает закономерность, свойственную не какому-то конкретному объекту, а целому классу объектов. Поэтому в аргументы правил входят переменные. Правило можно рассматривать и как разбиение сложной задачи (цели) на более простые подзадачи (подцели).
Примеры правил:
любит(Х, "баскетбол"):-любит(X, "бег").
/* X любит баскетбол, если X любит бегать */
можно_купить(X):-есть_в_магазине(X,V),V<3000.
/* можно купить X, если X есть в магазине и стоит меньше
3000 р. */
старше (Р1#Р2) : - возраст (PkVJ ,
возраст (P2,V2),
Vi>V2.
/*субъект Рх старше субъекта Р2,если его возраст больше
возраста Р2*/
