Запросы
Первое знакомство
Объекты и отношения
Базовыми понятиями для программы на Прологе являются объекты и отношения между объектами. Все знания выражаются только в виде отношений объектов. Например, такое знание как "John likes Mary" в Прологе выражается как отношение likes, связывающее объекты john и mary (разумеется, порядок перечисления объектов важен, поскольку "John likes Mary" — это совсем не то, что "Mary likes John").
Обычно имена отношений соответствуют глаголам, а имена объектов — существительным.
Факты
Факт задает (безусловное) отношение между объектами. Пример факта выражающего знание "John likes Mary":
likes(john, mary).
Отношение задано предикатом likes, а объекты — аргументами этого предиката, в качестве которых выступают константы john и mary. Аргументы предиката пишутся в скобках, через запятую; в конце ставится точка. Названия предикатов и констант начинаются с маленькой буквы …
Порядок аргументов выбирается программистом произвольно, но будучи единожды выбранным должен соблюдаться во всей программе. Т. е. мы можем договориться обозначать знание "John likes Mary" как likes(john, mary), а можем — как likes(mary, john); однако, какой бы вариант мы не избрали, likes(john, mary) — это совсем не то же самое, что likes(mary, john).
Отношения могу связывать разное количество объектов, например:
female(mary).
gives(john, book, mary).
Во втором примере может иметься в виду как книга вообще, так и некоторая конкретная книга; т. е. как "John gives Mary a book", так и "John gives Mary the book". Однако программист должен определиться, какой именно вариант имеется в виду.
В программе может быть определено сколько угодно фактов; один и тот же объект может участвовать в нескольких фактах, например:
male(john).
likes(john, mary).
likes(jane, john).
likes(alice, john).
Факты вместе с правилами (о которых речь дальше) формируют т. н. базу данных.
Запросы
Запрос используется для извлечения знаний из базы данных, т. е. для определения в базе некоторых отношений. В отличие фактов, которые мы соотносим с утвердительными предложениями, запрос соотносится с вопросительным предложением. Например, вопрос "Does John like Mary?" может быть выражен следующим запросом:
?- likes(john, mary).
Здесь "?-" — специальный символ, отмечающий запрос (в интерактивном режиме вводится автоматически), а "likes(john, mary)" — цель (т. е. то, что Пролог пытается доказать). В остальном простейший запрос не отличается от факта.
Получив запрос, Пролог просматривает базу данных в порядке ввода в поисках фактор удовлетворяющих запросу. Очевидно, что такой факт есть, поэтому ответом будет
yes
Ответ "yes" (или "true") означает, что цель likes(john, mary) удовлетворяется. Т. е. Пролог подтверждает, что в базе данных содержаться факты, из которых следует, что "John likes Mary".
Рассмотрим запрос:
?- likes(john, jane).
Поскольку в базе нет фактов, удовлетворяющих цели запроса, ответом будет
no
Ответ "no" означает, что цель не удовлетворяется, т. е., что в базе данных не содержится фактов, из которых следовало бы, что "John likes Mary". Важно понимать, что это не то же самое, что утверждать, что из фактов следует "John doesn't like Mary" (забегая вперед: в Прологе невозможно выразить отрицательные предложения).
В том случае, когда в запросе упомянут неиспользованный предикат, Пролог может выдать "no", а может сообщить об ошибке (это зависит от реализации).