logo
TurboProlog / Документация / TOM_1

Предотвращение поиска с возвратом к предыдущей подцели в правиле.

r1 :- a, b, !, c.

Такая запись является способом сообщить Турбо Прологу о том, что вас

удовлетворит первое решение, найденное им для подцелей a и b. Имея воз-

можность найти множественные решения при обращении к c путем поиска с

возвратом, Турбо Пролог при этом не может произвести поиск с возвратом

через отсечение и найти альтернативное решение для обращений a и b. Он

также не может возвратиться к другому предложению, определяющему предикат

r1.

В качестве конкретного примера рассмотрим программу CH05EX07.PRO.

/* Program CH05EX07.PRO - использование отсечения */

predicates

buy_car(symbol, symbol)

car(symbol, symbol, integer)

colors(symbol, symbol)

clauses

buy_car(Model, Color) :-

car(Model, Color, Price),

colors(Color, sexy),!,

Price < 25000.

car(maserati, green, 25000).

car(corvette, black, 24000).

car(corvette, red, 26000).

car(porsche, red, 24000).

colors(red, sexy).

colors(black, mean).

colors(green, preppy).

В данном примере поставлена цель найти "Корвет" приятного цвета, ко-

торый можно себе позволить по стоимости. Отсечение в правиле buy_car оз-

начает, что поскольку в базе данных содержится только один "Корвет" при-

ятного цвета, хоть и со слишком высокой ценой, то нет нужды искать другую

машину.

Получив целевое утверждение

buy_car(corvette, Y)

1. Турбо Пролог обращается к car, первой подцели для предиката

buy_car.

2. Выполняет проверку для первой машины, "Мазерати", которая завер-

шается неудачно.

3. Затем он проверяет следующее предложение car и находит соответст-

вие, связывая переменную Color со значением black.

4. Он переходит к следующему обращению и проверяет, имеет ли выбран-

ная машина приятный цвет. Черный цвет не является приятным в данной

программе, таким образом проверка завершается неудачно.

5. Турбо Пролог выполняет поиск с возвратом к обращению car и снова

ищет "Корвет", удовлетворяющий этому критерию.

6. Он находит соответствие и снова проверяет цвет. На этот раз цвет

оказывается приятным, и Турбо Пролог переходит к следующей подцели в

правиле: к отсечению. Отсечение немедленно выполняется, "заморажи-

вая" все переменные, ранее связанные в этом предложении.

7. Теперь Турбо Пролог переходит к следующей (и последней) подцели в

правиле, к сравнению

Price < 25000.

8. Эта проверка завершается неудачно, и Турбо Пролог пытается совер-

шить поиск с возвратом с целью найти другую машину для проверки.

Поскольку отсечение предотвращает поиск с возвратом, то нет способа

решить последнюю подцель, и наше целевое утверждение завершается не-

удачно.