Главная » Файлы » Методички » Пролог [ Добавить материал ]

Пример использования методов: откат после неудачи (ОПН) и отсечение и откат (ОО) на языке 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) | Категория: Пролог
Просмотров: 4478 | Загрузок: 0 | Рейтинг: 3.0/1 |
Комментарии (1)
+1   Спам
1. Totoro   09.01.2012   19:56
Говоря в грубой форме Prolog заканчивает работу как только находит 1 значение удовлетворяющие условию.

Имя *:
Email *:
Код *: