Применим эти правила к следующему примеру:

        С :- Р, Q, R, !, S, Т, U.

        С :- V.

        А :- В, С, D.

        ?-  А.

Здесь  А,  В,  С,  D,  Р  и т.д. имеют синтаксис термов. Отсечение повлияет на вычисление цели  С  следующим образом. Перебор будет возможен в списке целей  Р,    Q,  R;  однако, как только точка отсечения будет достигнута, все альтернативные решения для этого списка изымаются из рассмотрения. Альтернативное предложение, входящее в  С:

        С :- V.

также не будет учитываться. Тем не менее, перебор будет возможен в списке целей  S,  Т,   U.  'Цель-родитель' предложения, содержащего отсечения, -это цель  С  в предложении

        А :- В, С, D.

Поэтому отсечение повлияет только на цель  С.   С другой стороны, оно будет 'невидимо' из цели  А.  Таким образом, автоматический перебор все равно будет происходить в списке целей  В,  С,  D,  вне зависимости от наличия отсечения в предложении, которое используется для достижения  С.

Назад | Содержание | Вперёд

Назад | Содержание | Вперёд

5. 2.    Примеры, использующие отсечение

5. 2. 1.    Вычисление максимума

Процедуру нахождения наибольшего из двух чисел можно запрограммировать в виде отношения

        mах( X, Y, Мах)

где  Мах = X,  если  Х  больше или равен   Y,  и  Мах  есть  Y,  если  Х   меньше  Y.  Это соответствует двум таким предложениям:

        mах( X, Y, X) :- Х >= Y.

        max( X, Y, Y) :- Х < Y.

Эти правила являются взаимно исключающими. Если выполняется первое, второе обязательно потерпит неудачу. Если неудачу терпит первое, второе обязательно должно выполниться. Поэтому возможна более экономная формулировка, использующая понятие 'иначе':

        если Х >= Y, то Мах = X,

        иначе Мах = Y.

На Прологе это записывается при помощи отсечения:

        mах( X, Y, X) :- Х >= Y,  !.

        mах( X, Y, Y).

5. 2. 2.    Процедура проверки принадлежности списку, дающая единственное решение

Для того, чтобы узнать, принадлежит ли Х списку L, мы пользовались отношением

        принадлежит( X, L)

Программа была следующей:

        принадлежит( X, [X | L] ).

        принадлежит X, [Y | L] ) :- принадлежит( X, L).

Эта программа дает 'недетерминированный' ответ: если Х встречается в списке несколько раз, то будет найдено каждое его вхождение. Исправить этот недостаток не трудно: нужно только предотвратить дальнейший перебор сразу же после того, как будет найден первый X, а это произойдет, как только в первом предложении наступит успех.

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату