Отсечение
В процессе достижения цели Пролог-система осуществляет автоматический перебор вариантов, делая возврат при неуспехе какого-либо из них. Такой перебор – полезный программе механизм, так как он освобождает пользователя от необходимости производить этот перебор самому. С другой стороны ничем не ограниченный перебор может быть источником неэффективности программы. Поэтому требуется его ограничить или исключить вовсе. Для этого предусмотрено специальное целевое утверждение «!,», называемое отсечением. Отсечение реализуетяс следующим образом: после согласования ЦУ, стоящего перед отсечением, все предположения с тем же предикатомрасположенные после отсечения не рассматриваются. предположим, что надо вычислить число родителей кого-нибудь.
число_родителей (адам, 0):-,!
число_родителей (ева, 0):-,!
число_родителей (_, 2).
Можно выделить три основных функци отсечения:
1. Для устранения бесполезного цикла ( вычисление суммы 1+2+…+N)
сумма (1, 1):-,!
сумма (N, K):- N1=N-1, сумма (N1, K1), K=K1+N.
Если граничное условие будет записано в виде сумма (1, 1). , то сопоставление головы правила с запросом будет происходить успешно и при n=0, то есть будет предпринята попытка доказать цель сумма (0, К), что в свою очередь приводит к цели сумма (-1, К) и т.д.
2. При программировании взаимоисключающих утверждений.
max (X, Y, Max)
max (X, Y, X):- X>=Y.
max (X, Y, Y).
Или
max (X, Y, X):- X>=Y,!
max (_, Y, Y).
3. При необходимости неудачного завершения цели.
категория (Кр, _):- Кр>100,!, fail; Кр<0, !, fail.
категория (Кр, ‘A’):- Кр>80, !
категория (Кр, ‘В’):- Кр>40, !
категория (Кр, ‘С’).