Меллиш К. - Программирование на языке пролог стр 6.

Шрифт
Фон

?- нравится(джон, Что-то, что любит Джон).

Пролог позволяет использовать переменные и задавать вопросы в виде

?- нравится(джон,Х).

При желании можно давать переменным более длинные имена. Следующий вопрос вполне приемлем в Прологе:

?- нравится(джон, Что-точтонравитсяджону).

Почему? Потому что переменной может быть любое имя, начинающееся с прописной буквы. Рассмотрим следующую базу данных и запрос к Прологу:

нравится (джон,цветы).

нравится (джон,мэри).

нравится(поль,мэри).

?- нравится(джон,Х).

В вопросе спрашивается: Существует ли что-нибудь, что нравится Джону?В ответ Пролог напечатает:

Х=цветы

а затем будет ждать дальнейших приказов; это мы вкратце обсудим далее. Как это произойдет? При поступлении такого вопроса в Пролог-систему переменная, входящая в вопрос, изначально является неконкретизированной. Пролог просматривает базу данных в поисках факта, сопоставимогос вопросом. Если неконкретизированная переменная появляется в качестве аргумента, то Пролог считает, что такой аргумент сопоставим с любымдругим аргументом, находящимся в той же самой позиции факта. В нашем примере Пролог ищет любой факт с предикатом нравитсяи первым аргументом джон. Второйаргумент в этом случае может быть каким угодно, так как в вопросе вторым аргументом является неконкретизированная переменная. При обнаружении такого факта переменная Xстановится конкретизированной, обозначая объект, являющийся вторым аргументом найденного факта, каким бы этот аргумент ни был. Пролог просматривает факты базы данных в том порядке, в каком они вводились (на печатной странице это соответствует просмотру сверху вниз), поэтому факт нравится(джон, цветы)найден первым. С этого момента переменная Xобозначает объект цветыили, говоря другими словами, переменная Xконкретизируется значением цветы. Пролог с помощью специального маркераотмечает место в базе данных, в котором произошло сопоставление. Обсудим кратко причины, по которым оказалось необходимым использование такого маркера.

Обнаружив факт, соответствующий вопросу, Пролог печатает имена объектов, которые теперь обозначают переменные. В нашем примере есть только одна переменная X, которой соответствует объект цветы. Затем Пролог ждет дальнейших указаний, как об этом говорилось выше. Если в этой ситуации нажать на терминале клавишу RETURN , указывая тем самым, что вы удовлетворены полученным ответом, то Пролог прекратит дальнейший поиск в базе данных. Если вместо этого нажать клавишу ; (и вслед за ней клавишу RETURN ), то Пролог продолжит поиск в базе данных, начиная с места, отмеченного маркером.В такой ситуации, когда Пролог начинает поиск не с начала базы данных, а с места, отмеченного маркером, мы говорим, что Пролог пытается заново согласовать вопрос.

Предположим, что в ответ на первое найденное Прологом соответствие ( Х=цветы) мы предлагаем системе продолжить поиск (введя ; ). Это значит, что мы хотим согласовать вопрос иначе; мы хотим найти другой объект, который могла бы обозначать переменная X. Это также значит, что Пролог должен «забыть» о том, что переменная Xобозначает цветы, и снова продолжить поиск с неконкретизированной переменной X. Так как мы ищем альтернативное решение, то поиск продолжается с места, отмеченного маркером. Следующий найденный системой факт, соответствующий вопросу, есть нравится(джон,мэри).Переменная Xвновь становится конкретизированной, обозначая мэри,а Пролог отмечает маркером факт нравится(джон,мэри).Пролог напечатает Х=мэрии будет ожидать дальнейших команд. Если мы вновь введем точку с запятой, то Пролог продолжит поиск. В нашем примере нет больше ничего, что нравится Джону. Поэтому Пролог завершит поиск и предоставит нам возможность сделать новые запросы или ввести новые факты.

Что произойдет, если, имея те же факты, что и ранее, мы зададим вопрос:

?- нравится(Х,мэри).

В этом вопросе спрашивается: «Существует ли объект, которому нравится Мэри?».Теперь вы сами можете понять, что в примере объектами, которые нравятся Мэри, являются джони поль. Опять, если бы мы хотели увидеть все варианты, мы должны были бы вводить; после каждого ответа, выдаваемого Прологом:

?- нравится(Х, мэри). наш вопрос

Х=джон; первый ответ. Мы вводим ;

Х=поль; второй ответ. Вновь вводим ; .

нет больше ответов

нет.

1.4. Конъюнкции

нравится(мэри,пища).

нравится(мэри,вино).

нравится(джон,вино).

нравится(джон,мэри).

Мы хотим узнать, нравятся ли Джон и Мэри друг другу. Для этого мы спрашиваем: «Нравится ли Джон Мэрии нравится ли Мэри Джон?».Связка ивыражает тот факт, что нас интересует конъюнкция двух указанных целей мы хотим последовательно согласовать с базой данных обе цели. Мы выражаем это в вопросе, записывая обе цели через запятую:

?- нравится(джон,мэри),нравится(мэри,джон).

Запятая читается как «и» и используется для разделения произвольного числа различных целей, которые должны быть согласованы с базой данных для того, чтобы ответить положительно на вопрос. Если задана последовательность целей (разделенных запятыми), то Пролог пытается согласовать каждую цель по очереди, просматривая базу данных в поисках сопоставимых фактов. Чтобы согласовать с базой данных последовательность целей, необходимо согласовать все отдельные цели. Что должен напечатать Пролог в ответ на приведенный выше вопрос? Ответ будет нет. Действительно, так как имеет место факт, что Джону нравится Мэри, то первая цель согласуется с базой данных. Однако вторая цель не согласуется с базой данных, так как в ней отсутствует факт нравится(мэри,джон). Учитывая, что мы хотели знать, нравятся ли они обадруг другу, окончательным ответом на вопрос является нет.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке