Главная
»
Информационные системы
»
Представление знаний в ИС
»
Язык Prolog. Конъюнкция. Переменные.
Язык Prolog. Конъюнкция. Переменные.
Конъюнкция
В логических формулах используют связки и простые предикаты. То же самое имеет место и в Прологе. Самую ходовую связку - конъюнкцию - обозначают запятой:
? - начальник(эмиль, анри), начальник(жозев, анри).
Это выражение соответствует такой логической формуле
Начальник(Эмиль, Анри) Начальник(Жозев, Анри).
Конъюнкция в Прологе, как и в логике, истинна только при истинности всех компонент. Однако имеется важное отличие: в Прологе семантика учитывает порядок оценки компонент (слева направо)
Переменные
Использование переменных в Прологе аналогично, но не идентично использованию их в логике. Вопросы, включающие переменные носят перечислительный характер (в отличие от да-нет-вопросов): ответы в этом случае представляют собой списки термов. Например, вопрос «Кто в подчинении у Анри?» является вопросом «перечислительного» («списочного») типа. Ответ БД библио мог бы быть [эмиль, жозеф].
Прологовским эквивалентом местоимения «кто» является переменная:
? - начальник(Х, анри).
Ответ здесь хотелось бы получить посредством замены Х на такую константу, для которой в БД найдётся подходящий факт. Взяв константу Эмиль получаем:
? - начальник(Х, анри).
- - - > Х=эмиль
Система ответила одним значением переменной, преобразовав вопрос в истинный предикат, но почему не жозеф и не [эмиль, жозеф]? Для объяснения произвольности выбора вникнем в алгоритм получения ответа. Факты и правила БД - это не множество, а список. Обычно они текстуально упорядочены. Для получения ответа система просматривает БД в соответствующем порядке и выбирает первое удовлетворяющее предикату вопроса выражение.
Предикат вопроса представляет собой цель. Здесь это начальник(Х, анри).
Цель достигнута, если в БД удалось найти факт или правило, который (которое) удовлетворяет этому предикату. Чтобы удовлетворить приведённому только что простому предикату, нужно иметь факт вида начальник(_, анри), т.е. факт, содержащий:
· такое же имя предиката (начальник),
· столько же аргументов (два),
· те же константы на тех же местах (анри на втором месте)
При выполнении этих условий факт соответствует (следовательно, удовлетворяет) предикату. В нашем примере годится факт начальник(эмиль, анри).
Переменная Х принимает значение той константы, которая стоит на соответствующем месте в найденном факте. Хотя объяснять несколько долго, но это именно то, что подсказывает интуиция.
Ещё один способ выразить семантику рассмотренного выше вопроса состоит в формулировании следующего запроса: «Можно ли сопоставить (присвоить, назначить) переменной Х такой терм, чтобы результатом была формула из БД?» Утвердительный ответ обеспечивает назначение Х=эмиль. Это лишь одно из возможных назначений-ответов. Си-Пролог в интерактивном режиме даёт все ответы, если после каждого ставить точку с запятой:
? - начальник(Х, анри).
- - - > Х=эмиль;
- - - > Х=жозеф;
- - - > нет
Нет означает исчерпание возможностей.
Если вопрос ? - начальник(Х, анри). считать обращением к процедуре, то константа анри будет входом, а переменная Х - результатом. Это взгляд пользователя, но не Пролога. В выражениях, содержащихся в БД, различие между аргументами не производится. Лишь в вопросах переменные «заказывают» значения для ответов, например:
? - начальник(жозеф, Y).
- - - > Y=анри;
- - - > нет
? - начальник(Х, Y).
- - - > Х=эмиль, Y=анри;
- - - > Х=жозеф, Y=анри;
- - - > нет
Переменные можно также использовать в фактах: начальник(Х, адемар). Это выражение является записью на Прологе фразы «Адемар - большой начальник» и логической формулы . Цель вида начальник(_, адемар) достигается в том случае, если в БД содержится факт начальник(Х, адемар).
При использовании переменной в конъюнкции переменная устанавливает связь между сомножителями конъюнкции. Разумеется, все вхождения переменной принимают одно и то же значение. Ответ на вопрос ? - начальник(Х, анри), библиотекарь(Х). («Над каким библиотекарем Анри начальник?») получается путём последовательного удовлетворения двух частей (достижения двух частичных целей, подцелей) конъюнкции. Первая часть начальник(Х, анри), удовлетворяется фактом начальник(эмиль, анри). реализующим присваивание (назначение) Х=эмиль. Если бы первая подцель не достигалась, то ответ на весь вопрос был бы - нет. Присваивание значения переменной Х преобразует вторую подцель библиотекарь(Х) в библиотекарь(эмиль) которая достигается. Полный ответ
- - - > Х=эмиль.
Для получения второго ответа система сперва ищет второе достижение второй подцели. Это всегда библиотекарь(эмиль). при дальнейшем пробегании по БД в предписанном порядке (Дублирование выражений запрещено). Подцель теперь не достигается вновь. Система возвращается к предыдущей подцели начальник(Х, анри). т.е. осуществляет возврат. Подцель вновь достигается при использовании факта начальник(жозеф, анри). Отсюда получаем присваивание Х=жозеф и т.д. В рассмотренном нами примере только один ответ, ибо недостижима цель библиотекарь(жозеф), средствами (фактами) БД библио.
Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.