predicates
a(symbol)
d(symbol)
clauses
a(“1”):-
write(“один”).
a(X):-
d(X),
write(“два”).
a(“3”):-
write(“три”).
d(“2a”).
d(“2b”).
Возьмем цель goal: a(N).
В соответствии с представленной схемой получаем все четыре решения:
1) один, N=1;
2) два, N=2a;
3) два, N=2b;
4) три,N=3.
Изменим программу, вставим предикат cut между двумя подцелями правила a(X) и проанализируем, что произойдет в результате выполнения программы, которая будет запущена той же самой целью goal:a{N).
Листинг 5.3.Программа с предикатом cut
predicates
a(symbol)
d(symbol)
clauses
a(“1”):-
write(“один”).
a(X):-
d(X),
!,
write(“два”).
a(“3”):-
write(“три”).
d(“2a”).
d(“2b”).
В результате получим только два ответа:
1) один, N=1;
2) два, N=2.
3) система ‘заморозила’ все альтернативы, стоящие до cut,и лишила тем самым возможности вернуться к подцели d(X),чтобы воспользоваться веткой d(“2b”).
4) отбросила все утверждения процедуры a, стоящие после утверждения с предикатом cut.(то есть перейти к утверждению a(“3”) –невозможно)
Использование предиката cut позволило отбросить части пространства поиска.
Рассмотрим еще один пример.