Пример использования методов: откат после неудачи (ОПН) и отсечение и откат (ОО) на языке Prolog
Рабочий простой пример использования методов "отсечения и отката" и "отката после неудачи" для организации циклов на языке Пролог: % Данный пример иллюстрирует как получить множество возможных решений. % Используются методы: откат после неудачи (ОПН) и отсечение и откат (ОО) % Цель задачи: получить различные списки детей 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". Сам запутался в том, что написал, но понятно и быстро объяснить сложно)) Добавил: COBA (11.11.2010) | Категория: Пролог Просмотров: 8368 | Загрузок: 0 | Рейтинг: 3.0/1 | |
Комментарии (1) | |
| |