Робочий простий приклад використання методів "відсікання і відкату" і "відкату після невдачі" для організації циклів на мові Пролог:
% Даний приклад ілюструє як отримати безліч можливих рішень.
% Використовуються методи: відкат після невдачі (ОПН) і відсікання і відкат (ГО)
% Мета завдання: отримати різні списки дітей
predicates
nondeterm child (symbol, symbol)
all_childs
all_childs_Alisa
all_childs_before_Diana
first_child_Alisa
clauses
% База дітей
child ( "Тимур", "Козлов").
child ( "Аліса", "Попова").
child ( "Женя", "Кузнєцова").
child ( "Оля", "Фролова").
child ( "Аліса", "Шапочкина").
child ( "Петро", "Іванов").
child ( "Аліса", "Рубльова").
% Список всіх дітей - Метод відкату після невдачі (ОПН)
all_childs: - child (X, Y), write (X, "", Y), nl, fail.
% Список всіх дітей з ім'ям Аліса - Метод відкату після невдачі (ОПН)
all_childs_Alisa: - child (X, Y), X = "Аліса", write (X, Y), nl, fail.
% Список всіх дітей до Діани включно - Метод відсікання і відкату (ГО)
all_childs_before_Diana: - child (X, Y), write (X, Y), nl, X = "Діана".
% Перша дитина з ім'ям Аліса - Метод відсікання і відкату (ГО)
first_child_Alisa: - child (X, Y), X = "Аліса", write (X, Y), nl.
goal
% Write ( "Список всіх дітей:"), nl, all_childs.
% Write ( "Список дітей з ім'ям Аліса:"), nl, all_childs_Alisa.
% Write ( "Список всіх дітей до Діани включно:"), nl, all_childs_before_Diana.
write ( "Перша дитина з ім'ям Аліса:"), nl, first_child_Alisa.
Знак оклику в пролозі (так званий оператор відсікання), якщо пояснювати на пальцях, працює приблизно так: якщо сталося виконання команди "!", То навіть якщо в викликаних раніше правилах були інші варіанти вирішення для розгляду - відкат до цього правила все одно не буде виконаний. Ми заборонили відкат і пошук інших варіантів рішення.
Більше (А, 3): - А<3.
Більше (А, 5): - А<5.
Більше (А, 8): - А<8.
Goal більше (4, число).
Видасть відповідь: число = 5.
Хоча було два варіанти відповіді: 4 і 8. Але до перевірки останнього правила ми не дійшли, тому що в правилі "Більше (А, 5): - А<5. " запретил нам откатываться к предыдущим правилам своим восклицательным знаком, на который Пролог наткнулись, когда нашёл решение "число=5".
Сам заплутався в тому, що написав, але зрозуміло і швидко пояснити складно))