У меня есть такие пункты:
a(1).
a(2).
b(a).
c(A,B,C) :- a(A),d(B,C).
c(A,B,C) :- b(A),d(B,C).
d(B,C) :- a(B),!,a(C).
d(B,_) :- b(B).
Когда я запускаю запрос c(X,Y,Z), ответы следующие:
X = 1, Y = 1, Z = 1 ;
X = 1, Y = 1, Z = 2 ;
X = 2, Y = 1, Z = 1 ;
X = 2, Y = 1, Z = 2 ;
X = a, Y = 1, Z = 1 ;
X = a, Y = 1, Z = 2.
Таким образом, оператор отсечения (здесь d(B,C):-a(B),!,a(C)) игнорирует самые последние точки выбора, т. е. не выполняет дальнейший поиск d() и а(). Я думал, что разрез игнорирует ВСЕ предыдущие точки выбора и не будет возвращаться.
Может кто-нибудь объяснить точное поведение и почему я ошибаюсь?