- •Первое знакомство Объекты и отношения
- •Запросы
- •Переменные
- •Конъюнкция
- •Правила
- •Более подробно Термы
- •Операторы
- •Эквивалентность и унификация
- •Арифметика
- •Выполнение целей (повторение)
- •Структуры и деревья
- •Обработка списков
- •Отсечение
- •Разное Ввод-вывод
- •Управление порядком вычислений
- •Динамическое создание и анализ структур
- •Пролог как база данных
- •Работа с файлами
Переменные
Переменная используется для обозначения неизвестного объекта (в отличие от константы, обозначающей известный объект). Переменные могут использоваться в запросах для перечисления объектов, входящих в некоторое отношение.
Запрос с переменными соответствует специальным вопросительным предложениями. Haпример вопрос "Whom does John like?" может быть выражен запросом
?- likes(john, X).
Здесь неизвестный объект задан переменной X. Переменные всегда должны начинаться с большой буквы (чтобы Пролог мог отличить их констант).
Ответом будет:
X = mary.
Это означает, что цель likes(john, X) удовлетворяется подстановкой константы mary на место переменной X, т. е. если на место X подставить mary, то полученная цель likes(john, mary).
Аналогично:
?- likes(john, X).
Пусть запрос имеет вид:
likes(X, john).
Ответом будет:
X = jane;
X = alice.
В данном случае Пролог нашел два ответа. После вывода каждого ответа (кроме последнего) Пролог требует ввести точку с запятой или точку. Если пользователь вводит точку, то вывод ответов прекращается, а если точку с запятой — то продолжается. После последнего ответа Пролог (сам) выводит точку.
Этот означает, что цель likes(X, john) удовлетворяется как подстановкой X = jane, так и подстановкой X = alice.
В запросе можно использовать несколько переменных, например:
?- likes(X, Y).
Ответом будет
X = john,
Y = mary;
X = jane,
Y = john;
X = alice,
Y = john.
Запятые выводятся автоматически.
Если нас не интересует конкретный объект, то можно использовать подчеркивание. Например:
?- likes(john, _).
Ответом будет:
yes
Этот запрос соответствует вопросу "Does John likes somebody?".
Конъюнкция
Запрос может включать несколько целей, разделенных запятыми, которые Пролог интерпретирует как знак конъюнкции.
Пусть даны следующие факты:
likes(john, mary).
likes(jane, john).
likes(alice, john).
prefers(mary, wine).
prefers(jane, wine).
Рассмотрим следующий запрос:
?- likes(X, john), prefers(X, wine).
Этот запрос можно интерпретировать (…). Ответом будет:
X = jane ; false.
В ответе Пролог связал переменную X только с константой jane, поскольку, это единственная подстановка, одновременно удовлетворяющая обе цели.
При поиске ответа на запрос Пролог сначала пытается удовлетворить первую (самую левую) цель, просматривая базу данных от начала к концу. Когда ему это удается, он запоминает текущее положение в базе данных и связывает упомянутые в первой цели переменные, после чего пытается удовлетворить следующую (т. е. находящуюся справа) цель, вновь начиная просмотр базы данных с начала. При попытке удовлетворить каждую следующую цель Пролог учитывает связывания переменных, сделанные им при удовлетворении всех предыдущих (т. е. всех расположенных левее) целей. Если удовлетворить какую-либо цель не удается, то Пролог возвращается к предыдущей (т. е. находящейся слева) цели, отменяет связывания переменных, сделанные при последнем удовлетворении этой цели, и возобновляет просмотр базы данных с запомненной позиции в попытке найти другой способ удовлетворения. Когда Прологу удается удовлетворить последнюю (самую правую) цель Пролог вывод ответ содержащий, все сделанный привязки, после чего (как и в случае неудовлетворения цели) возвращается к предыдущей цели.
Рассмотрим удовлетворение целей в вышеприведенном примере (…).
?- likes(X, john), prefers(X, beer).
false.
?- likes(X, john), prefers(X, Y).
X = jane, Y = wine ; false.
Один и тот же предикат может встречаться в нескольких целях одного и того же запроса.
Добавим в базу данных факт
likes(mary, john).
и выполним следующий запрос
?- likes(X, Y), likes(Y, X).
X = john, Y = mary ; X = mary, Y = john.