Отсечение - это специальный механизм Пролога, использование которого позволяет указать, какие из ранее сделанных выборов не следует пересматривать при возврате по цепочке согласованных целевых утверждений. Отсечение используется для повышения эффективности программ как по времени (не тратится время на попытки найти новые сопоставления для целей, для которых заранее известно, что они не внесут в решение ничего продуктивного), так и по памяти (нет необходимости хранить маркеры точек возврата). Часто отсечение является необходимым элементом программы - без него она правильно не работает.
Синтаксически отсечение представляется функтором "!" структуры без аргументов. Встроенный предикат "!" всегда согласуется с базой правил и не может быть пересогласован. Однако он имеет существенный побочный эффект, изменяющий порядок последующего возврата.
Пример 1
Пусть есть два правила и запрос (символами A ... U обозначены подцели).
C:-F,G,H,!,P,Q,R.  /* 1 */
C:-S,T,U.          /* 2 */
?-A,B,C,D,E.
Выполняя запрос, Пролог без каких-либо ограничений может выполнять возврат среди подцелей {A,B и F,G,H} или {A,B и S,T,U}, но до тех пор, пока не пройдет "однонаправленную калитку" "!". Здесь он опять может беспрепятственно возвращаться среди {P,Q,R}. Но если Прологу потребуется выполнить возврат левее "!", то будет совершен прыжок сразу к цели B. То есть, если отсечение "!" встречается в качестве подцели в некотором правиле (или запросе), то Прологу запрещается пересогласовывать все ранее согласованные подцели (лежащие левее знака "!") и цель, инициировавшую использование данного правила. Так, в примере, если Пролог перешагнет знак "!" в правиле 1, то правило 2 уже рассмотрено быть не может, пока Пролог не пересогласует цель B.
Можно выделить 3 основных случая использования отсечения.
  1. Указание интерпретатору Пролога, что найдено необходимое правило для заданной цели.
  2. Указание интерпретатору Пролога, что необходимо немедленно прекратить доказательство конкретной цели, не пытаясь рассматривать какие-либо альтернативы (конструкция "!,fail").
  3. Указание интерпретатору Пролога, что в ходе перебора альтернативных вариантов найдено необходимое решение, и нет смысла вести перебор далее.
Пример 2
Пусть необходимо написать правила для вычисления суммы ряда натуральных чисел 1, 2, ... N. Напрашивается пара следующих утверждений.
sum(1,1).                                    /* 1 */
sum(N,S):-N1 is N-1, sum(N1,S1), S is S1+N.  /* 2 */
Выполним следующий запрос
?-sum(5,X).   X=15
;             в результате - бесконечная рекурсия!
Для исправления ситуации необходимо модифицировать первое правило следующим образом (это пример первого случая использования отсечения)
sum(1,1):-!.                                 /* 1' */
Теперь попробуем такой запрос
?-sum(-5,X).     в результате - опять бесконечная рекурсия!
Поэтому перед первыми двумя добавляем еще одно утверждение (это пример второго случая использования отсечения)
sum(N,_):-N=<0, !, fail.                  /* 0 */
Примером третьего случая использования отсечения может служить Пролог-программа для игры в "крестики-нолики". В этой игре (как и во многих других) существует понятие "вынужденный ход", не подразумевающий альтернативы. Понятно, что код, отвечающий за анализ игровой позиции должен содержать отсечение в правилах, диагностирующих "вынужденный ход".
Следует отметить, что использование отсечения требует хорошего знания стратегии работы Пролог-системы!