Листинг 5.2. Программа, в которой нет предиката cut

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 позволило отбросить части пространства поиска.

Рассмотрим еще один пример.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: