Опубликован: 27.07.2006 | Доступ: свободный | Студентов: 4406 / 1100 | Оценка: 4.28 / 4.13 | Длительность: 26:56:00
Специальности: Программист
Лекция 10:

Логическое программирование

Запросы к базе данных

Запрос - это последовательность предикатов, разделенных запятыми и завершающаяся точкой. На естественном языке запятая соответствует союзу "и", а на языке математической логики обозначает конъюнкцию. С помощью запросов можно "спрашивать" базу данных о том, какие утверждения являются истинными. Предикат запроса называется целью.

Простые вопросы, не содержащие никаких переменных, называют да-нет-вопросами. Они допускают лишь два возможных ответа: "Yes" означает наличие соответствующего факта в базе данных (первый запрос примера, приведенного ниже), "No" - его отсутствие (второй запрос). В случае ответа "Yes" говорят, что запрос завершился успехом, цель достигнута.

Пример

?- больше(слон, лошадь), больше(лошадь,осел).
Yes

?- больше(слон, собака).
No

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

?- больше(X, осел).
X = лошадь
Yes

При обработке запроса переменная X приняла значение "лошадь". Просматривая базу данных, интерпретатор обнаружил факт, утверждающий, что лошадь больше осла, и запрос был успешно выполнен.

Запросы с переменными могут иметь более одного решения. Первым всегда выводится то из решений, которое находится ближе к началу базы данных. Если нам достаточно только одного ответа, то можно нажать Enter и закончить поиск. В случае, если мы захотим получить очередной ответ, нужно нажать клавишу ; (точка с запятой), и Пролог начнет поиск других вариантов ответа на запрос. Сообщение "No" говорит об отсутствии очередного решения.

Пример

?- больше(осел, Х).
X = собака;
X = обезьяна;
No

?- больше(X,Y).
X = слон 
Y = лошадь;

X = лошадь
Y = осел;

X = осел
Y = собака;

X = осел
Y = обезьяна;
No

Задания

  1. Загрузите в Пролог базу данных "Цвет" (файл task1.pl ) и сформулируйте к ней следующие запросы.
    • Машина красного цвета?
    • Светофор желтого цвета?
    • Море синего цвета и солнце желтого цвета?
  2. Добавьте в базу данных факт

    цвет(трава, зеленый).

Сформулируйте запросы к измененной базе данных.

  • Какого цвета машина?
  • Что в этой базе данных зеленого цвета?
  • Какие элементы составляют эту базу данных и каковы соответствующие им цвета?

Унификация

Унификация есть основной механизм обработки запросов в логическом программировании. После того как пользователь посылает запрос интерпретатору, этот запрос активизируется. Интерпретатор приступает к анализу фраз базы данных в поисках первой фразы, заголовок которой будет унифицироваться с запросом. Для того чтобы запрос унифицировался с заголовком фразы, необходимо совпадение у них имени предиката, количества аргументов и унификация каждого из них.

Унификация термов, которыми являются аргументы, описывается приводимыми ниже правилами. В примерах используется предикат =, который пытается унифицировать свои аргументы.

  1. Переменная унифицируется с атомом или составным термом. В результате этого переменная становится конкретизированной, т. е. принимает значение данного атома или терма.
    ?- X=коля.
    X=коля
    Yes
  2. Переменная унифицируется с переменной, при этом они обе становятся как бы одной и той же переменной.
    ?- X=Y.
    X = _G161
    Y = _G161
    Yes
  3. Анонимная переменная унифицируется с любым термом.
    ?- автор(пушкин)=_.
    Yes
  4. Атом унифицируется с атомом, если они идентичны.
    ?- коля=коля.
    Yes
  5. Составной терм унифицируется с другим составным термом, если их имена и количество аргументов совпадает, а аргументы поддаются унификации.
    ?- отец(борис)=отец(X).
    X = борис 
    Yes
    ?- дедушка(борис, Y)=отец(X).
    No

Пример

Термы больше(Х, собака) и больше(осел, собака) унифицируются, потому что переменная X может быть конкретизирована атомом осел:

?- больше(Х,собака) = больше(осел,собака).
X = осел
Yes

Рассматриваемый в следующем примере запрос не будет успешным, потому что переменная X не может быть конкретизирована двумя значениями 1 и 2 одновременно.

?- p(X,2,2) = p(1,Y,X).
No

Если в этом примере вместо X мы используем анонимную переменную _, то унификация будет возможна, потому что при каждом использовании _ создается новая переменная. Смысл анонимности в том, что мы предоставляем Прологу возможность генерации имени для данной переменной и нам не нужны ни ее имя, ни ее значение. Переменная Y во время унификации конкретизируется значением 2:

?- p(_,2,2) = p(1,Y,_).
Y = 2
Yes

Пример

В следующем запросе унификация возможна, хотя и нет специфических переменных, которые могли бы быть связаны или унифицированы (как в предыдущих примерах):

?- f(a,g(X,Y)) = f(X,Z), Z = g(W,h(x)).
X = a
Y = h(x)
Z = g(a, h(x))
W = a
Yes
Дмитрий Фаттахов
Дмитрий Фаттахов
Виктория Бельгесова
Виктория Бельгесова

Добрый день. Как получить удостоверение о прохождении данного курса?