Использование надрезов (snip)
Надрез обозначается открывающей скобкой [! и закрывающей скобкой !]. Например, для правила
цель:- подцель1,[! подцель2,подцель3 !],подцель4.
действие надреза распространяется на подцели подцель2 и подцель3, расположенные между этими двумя скобками.
Snip аналогичен cut, однако отличается от него тем, что если после бектрекинга управление передастся snip, весь предикат неуспешным не будет. Бектрекинг лишь "пропустит" те подцели, которые находятся внутри snip и продолжится для подцелей, которые расположены раньше snip[7].
Отличие надреза от отсечения:
Для cut если E неуспешна, бектрекинг попадает на cut и весь предикат A неуспешен, в отличие от ситуации со snip. Для snip, если подцель Е неуспешна, то бектрекинг попадает на подцель B.
Надрезы целесообразно использовать в случаях, когда нужно ограничить бектрекинг для исключения ненужного поиска, но отсечение не требуется.
УПРАЖНЕНИЕ. Вообще говоря, надрезы не реализованы в SWI-Prolog. Используя отсечение, реализуйте надрез (т.е. «заморозьте» точки возврата только для предикатов, которые должны быть внутри надреза). Одна из реализаций может быть представлена в виде схемы (по результату равносильна вышеприведённой схеме надреза) :
A:-B, T, E.
T:-C, D, !.
b(2). %(1)
b(3). %(2)
c(2). %(3)
c(3). %(4)
d(4). %(5)
d(5). %(6)
e(10). %(7)
e(11). %(8)
e(12). %(9)
a(X,Y,Z,W):-b(X),[! c(Y), d (Z) !],e(W). %(10)
a(X,X,X,X):-d(X). %(11)
/* В SWI-Prolog надрез можно реализовать через
отсечение следующим образом: */
a(X,Y,Z,W):-b(X),f(Y,Z),e(W).
a(X,X,X,X):-d(X).
f(Y,Z):-C(Y),d(Z),!.
2 ?- a(X,Y,Z,W).
X = 2,Y = 2,Z = 4,W = 10 ; X = 2,Y = 2,Z = 4,W = 11 ;
X = 2,Y = 2,Z = 4,W = 12 ; X = 3,Y = 2,Z = 4,W = 10 ;
X = 3,Y = 2,Z = 4,W = 11 ; X = 3,Y = 2,Z = 4,W = 12 ;
X = 4,Y = 4,Z = 4,W = 4 ; X = 5,Y = 5,Z = 5,W = 5.
Как видно из примера надрез «замораживает» предикаты c(Y) и d(Z) в строке (10). Поэтому при получении вывода с использованием этой строки значения переменных Y, Z при поиске всех альтернативных решений не меняются – для c(Y) и d(Z) не ищется других альтернатив, кроме как c(2) и d(4) соответственно.