» » »

Язык Prolog. Переменные. Анонимные переменные.

Язык Prolog. Переменные. Анонимные переменные

Использование переменных в Прологе аналогично, но не идентично использованию их в логике. Вопросы, включающие переменные носят перечислительный характер (в отличие от да-нет-вопросов): ответы в этом случае представляют собой списки термов. Например, вопрос «Кто в подчинении у Анри?» является вопросом «перечислительного» («списочного») типа. Ответ БД библио мог бы быть [эмиль, жозеф].

Прологовским эквивалентом местоимения «кто» является переменная:

? - начальник(Х, анри).

Ответ здесь хотелось бы получить посредством замены Х на такую константу, для которой в БД найдётся подходящий факт. Взяв константу Эмиль получаем:

? - начальник(Х, анри).

- - - > Х=эмиль

Система ответила одним значением переменной, преобразовав вопрос в истинный предикат, но почему не жозеф и не [эмиль, жозеф]? Для объяснения произвольности выбора вникнем в алгоритм получения ответа. Факты и правила БД - это не множество, а список. Обычно они текстуально упорядочены. Для получения ответа система просматривает БД в соответствующем порядке и выбирает первое удовлетворяющее предикату вопроса выражение.

Предикат вопроса представляет собой цель. Здесь это начальник(Х, анри).

Цель достигнута, если в БД удалось найти факт или правило, который (которое) удовлетворяет этому предикату. Чтобы удовлетворить приведённому только что простому предикату, нужно иметь факт вида начальник(_, анри), т.е. факт, содержащий:

· такое же имя предиката (начальник),

· столько же аргументов (два),

· те же константы на тех же местах (анри на втором месте)

При выполнении этих условий факт соответствует (следовательно, удовлетворяет) предикату. В нашем примере годится факт начальник(эмиль, анри).

Переменная Х принимает значение той константы, которая стоит на соответствующем месте в найденном факте. Хотя объяснять несколько долго, но это именно то, что подсказывает интуиция.

Анонимные переменные

Переменные, которые рассматривались выше, имели имена. Существуют и анонимные переменные. Допустим, что мы интересуемся наличием в БД библио хотя бы одной книги Виктора Гюго. Вопрос

? - книга(гюго, Х,Y). вызовет последовательность ответов

- - - > Х=отверженные, Y=издат(пош,1984);

- - - > Х=эрнани, Y=издат(галлимар,1974);

- - - > нет

Это не совсем то, что надо: - предполагалось получить «да» или «нет». Однако, заменяя Х и Y анонимными переменными (знак подчёркивания), получаем то, что хотели: на вопрос

? - книга(гюго, _,_). ответ будет

- - - > да

Для получения списка авторов, книги которых имеются в наличии, ставим следующий вопрос:

? - книга(А, _,_). Это даёт нам такой список

- - - > А=грэм;

- - - > А=кондиляк;

- - - > А=дьедоне;

- - - > А=гюго;

- - - > А=гюго;

- - - > А=хартман;

- - - > нет

Анонимные переменные не отличаются от обычных при поиске соответствий, но не принимают значений и не появляются в ответах. Отметим, что различные вхождения знака подчёркивания означают различные анонимные переменные.


Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.

Поделиться

Оплаченная реклама

Дисциплины