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