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

Правила

Помимо фактов база данным может содержать факты. Правило отличается от факта тем, что связывается наличие отношения между объектами с выполнением некоторого условия, представленного целью или конъюнкцией целей. Другое отличие состоит в том, что правило обычно выражает не частные случаи, а общие закономерности. Приведем пример:

likes(bill, X) :- prefers(X, wine).

Здесь условие состоит из единственной цели prefers(X, wine). Данное правило соответствует предложению "Bill likes anybody, provided (if) she prefers a wine". В отличие фактов likes, данное правило охватывает не одну пару объектов, а (потенциально) множество таких пар (в данном случае две пары).

Выполним следующие запросы:

?- likes(bill, jane).

true.

?- likes(X, jane).

X = bill ; false.

Если при попытке удовлетворить цель Пролог встречает не факт, а правило, то Пролог запоминает текущее положение в базе данных и переходит удовлетворению целей этого правила так, как если бы они были запросом. Если исходная цель содержала переменные, то эти переменные будут связаны в ходе удовлетворения целей, перечисленных в правиле. Связывание переменных, указанных в запросе, с переменными, указанными правиле происходит по порядку, а не по имени (…).

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

Добавим в базу данных следующие правила.

likes(kate, X) :- likes(jane, X), likes(mary, X).

is_happy(X) :- likes(X, Y), likes(Y, X).

Рассмотрим выполнение следующих запросов

?- likes(X, john).

X = jane ; X = alice ; X = mary ; X = kate.

?- is_happy(X).

X = john ; X = mary ; false.

?- is_happy(X), prefers(X, Y).

X = mary, Y = wine ; false.

Более подробно Термы

Программа на Прологе — это набор термов. Термы:

  • константы:

    • атомы;

    • числа;

  • переменные;

  • структуры (составные термы).

Атомы можно записывать как:

  • последовательность букв и цифр, начиная с буквы в нижнем регистре, например…;

  • последовательность символов + - * / \ ~ < > : . ? @ # $ &, например…;

  • последовательность произвольных символов, заключенных в одинарные кавычки. Отметим, что 'mary' — это то же самое, что mary, а '--->' — то же самое, что --->.

Числа могут иметь знак, десятичную точку и экспоненту, например….

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

Структура состоит из функтора и компонентов (сначала функтор, потом компоненты в круглых скобках через запятую). Функтор — атом, а каждый из компонентов — произвольный терм (в т. ч. структура). Примеры:

likes(john, mary)

beliefs(alice, likes(john, mary))

knows(jane, beliefs(alice, likes(john, mary)))

birth_date(john, date(1980, 6, 15))

+(1, 2)

*(+(1, 2), +(3, 4))

Операторы

Оператор — особая форма записи функтора. Пример: 1 + 2 то же, что и +(1, 2), а (1 + 2) * 3 то же, что и *(+(1, 2), 3).

Оператор характеризуется положением, ассоциативностью и приоритетом. По положению и ассоциативности выделяются следующие типы:

  • префиксные операторы (операнд один, оператор перед операндом):

    • fy — запись o o a допустима и эквивалентна o(o(a)); пример: – (замена знака);

    • fx — запись o o a недопустима.

  • инфиксные операторы (операндов два, оператор между операндами):

    • yfx — запись a o b o c допустима и эквивалентна o(o(a, b), c); примеры: +, – (вычитание), и т. д.;

    • xfy — запись a o b o c допустима и эквивалентна o(a, o(b, c)); пример: ** (возведение в степень).

    • xfx — запись a o b o c недопустима; примеры: <, > и т. д.

  • постфиксные операторы (операнд один, оператор после операнда):

    • yf — запись a o o допустима и эквивалентна o(o(a)).

    • xf — запись a o o недопустима.

Приоритет — это целое число. Операторы с меньшим приоритетом «выполняются» раньше, чем операторы с большим приоритетом.

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