Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.docx
Скачиваний:
1
Добавлен:
25.12.2018
Размер:
94.2 Кб
Скачать

Переменные

Переменная используется для обозначения неизвестного объекта (в отличие от константы, обозначающей известный объект). Переменные могут использоваться в запросах для перечисления объектов, входящих в некоторое отношение.

Запрос с переменными соответствует специальным вопросительным предложениями. 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]