Clauses. Проаналізуємо, що буде робити програма, коли їй задати наступний запит:

f(X,10):- X < 10.

f(X,20):- X >= 10, X < 20.

f(X,30):- X >= 20.

Проаналізуємо, що буде робити програма, коли їй задати наступний запит:

goal: f(5,Y), Y > 20.

При обчисленні першою цілі f(5,Y), Y приймає значення 10, тому друга підціль стане 10 > 20. Вона закінчується невдачею. Але зрозуміло, що й ввесь список підцілей, який буде перевірятись завдяки бектрекінгу, також буде закінчуватись невдачею.

Всі три правила обчислення функції f є взаємовиключними. Тому ми знаємо, що якщо успіх наступив в одному з них, немає необхідності перевіряти інші, бо вони приречені на невдачу. Отже, якщо в якійсь точці програми наступив успіх, для відміни непотрібного перебору, ми повинні явно вказати Пролог-системі, що не потрібно робити повернення із цієї точки. Це можна зробити за допомогою предикату cut(!). Попередня програма прийме вигляд:

 

Predicates

F(integer,integer).

Clauses

f(X,10):- X < 10,!.

f(X,20):- X >= 10, X < 20,!.

f(X,30):- X >= 20.

Предикат cut не дає робити повернення із тих точок програми, в яких він поставлений і програма стала ефективнішою. Але, якщо ми побудуємо запит типу:

goal: f(22,Y),

тоді Пролог-система зробить три перевірки, і тільки після цього зв'яже з У значення 30. Але ж наші перевірки взаємовиключні. Тому для підвищення ефективності, ми можемо запропонувати такий варіант програми:

Predicates

F(integer,integer).

Clauses

f(X,10):- X < 10,!.

f(X,20):- X < 20,!.

F(X,30).

В цьому випадку предикат відтинання міняє і декларативну сторону програми.

Предикат cut по різному діє на складний запит і на множину фраз. Розглянемо випадок, коли предикат відтинання є однією із підцілей складного запиту:

goal: a(X),b(Y),!,c(X,Y,Z)

При виконанні цього запиту Пролог-система пройде через предикат cut тільки в тому випадку, коли підціль а(X) i підцільb(Y) будуть задоволені. Після того, як підціль cut буде оброблена, система не зможе повернутися назад для повторного розгляду підцілей "а" і "b", якщо підціль "с" не задовільниться при поточних значенняхХ і У.

Приведемо ще один приклад використання cut:

 

Predicates

Buy_car(symbol, symbol)

Car(symbol, symbol,integer)

Colors(symbol, symbol)

Clauses

buy_car(Model, Color) :- car(Model, Color, Price),

colors(Color, sexy),!,

Price < 25000.

Car(maserati, green, 25000).

Car(corvette, black, 24000).

Car(corvette, red, 26000).

Car(porsche, red, 24000).

Colors(red, sexy).

Colors(black, mean).

Colors(green,preppy).

Використання предикату cut говорить про те, що нас спочатку цікавить модель і колір автомобіля, а потім вже ціна.

Для пояснення дії предикату cut повернемося до процесу керування побудови виведення в Пролозі. Нехай прологівська програма має наступний вигляд.

р: - a,b.