Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Упражнения.

1. Введите и запустите программу CH05EX06.PRO и исследуйте следующие

целевые утверждения:

a. father(X, Y).

b. everybody.

2. Измените тело правила, определяющего everybody, таким образом,

чтобы правило заканчивалось выражением write (удалите обращение к

fail). Теперь скомпилируйте и запустите программу, задавая everybody

в качестве вопроса по подсказке Goal:. Почему Турбо Пролог не нахо-

дит всех решений, как в случае вопроса father(X, Y)?

3. Перенесите обращение к fail в конец правила everybody. Опять за-

дайте вопрос everybody по подсказке Goal:. Почему решения для

everybody прерваны No ? В качестве ключа к разгадке добавьте

everybody вторым предложением к определению предиката everybody и

вновь исследуйте целевое утверждение.

Прерывание поиска с возвратом: отсечение.

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

зуется для прерывания поиска с возвратом; отсечение обозначается воскли-

цательным знаком (!). Действует отсечение просто: через отсечение невоз-

можно совершить поиск с возвратом.

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

теле правила. Когда процесс проходит через отсечение, немедленно удовлет-

воряется обращение к cut и выполняется обращение к очередной подцели (ес-

ли таковая имеется). Однажды пройдя через отсечение, уже невозможно про-

извести поиск с возвратом в подцелях, расположенным в обрабатываемом

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

предикатам, определяющим обрабатывающей предикат (предикат, содержащий

отсечение).

Существуют два основных случая применения отсечения:

1. Если вы заранее знаете, что определенные посылки никогда не при-

ведут к осмысленным решениям, то поиск решений в этом случае будет

лишней тратой времени и памяти. Если в такой ситуации вы примените

отсечение, то программа станет быстрее и экономичнее. Такой прием

называют "зеленым" отсечением.

2. Когда отсечения требует сама логика программы для исключения из

рассмотрения альтернативных подцелей. Это называют "красным" отсече-

нием.

Как использовать отсечение.

В этом разделе даются примеры, показывающие как следует использовать

отсечение в ваших программах. В этих примерах используется несколько ус-

ловных правил (r1,r2 и r3), которые определяют условный предикат r, плюс

несколько подцелей (a,b, c и т.д.).

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

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. Эта проверка завершается неудачно, и Турбо Пролог пытается совер-

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

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

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

удачно.

Соседние файлы в папке Документация