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.