Первый метод организации повторений получил название BAF-метода (Backtrack After Fail - возврат после отказа).
Предикат отказа fail используется для получения гарантированного неуспеха при доказательстве некоторой цели. Например, правило
A:- B,fail.
будет выполняться столько раз, сколько имеется альтернатив для B в этом правиле.
ПРОГРАММА 3.
a:- write(1).
a:- write(2).
b(X):- a,X='еще'.
c:- a.
d:- a,fail.
?-b(X).
?-c.
?-d.
ЗАДАНИЕ 4.3
Выполните программу 3 с данными запросами. Объясните результаты и нарисуйте деревья вывода.
ЗАДАНИЕ 4.4
Используя предикат fail, напишите правило, которое позволило бы распечатать столицы всех стран из базы.
country('England','London').
country('Russia','Moscow').
country('France','Paris').
country('China','Pekin').
country('Japan','Tokyo').
country('Italy','Rome').
ОРГАНИЗАЦИЯ ЦИКЛА UDR-МЕТОД
Второй способ организации повторений получил название UDR-метода (User Defined Repeat - повторение, управляемое пользователем).
Встроенный предикат repeat позволяет генерировать альтернативные решения с помощью механизма бэктрекинга, причем это возможно для целей, которые не всегда успешно согласовываются при первом обращении, либо которые могут иметь много решений. Всякий раз, когда при бэктрекинге происходит возврат к repeat, этот предикат успешно согласовывается, и при последующем согласовании предикатов, стоящих правее repeat, переменные могут конкретизироваться различными значениями.
|
|
Предикат repeat определяется следующим образом:
repeat.
repeat:- repeat.
ЗАМЕЧАНИЕ. Предикат repeat /0 является встроенным в SWI-Prolog. При попытке его переопределения интерпретатор скорей всего выдаст сообщение об ошибке.
ЗАДАНИЕ 4.5
Выполните программу 3 с запросом
?- repeat,a,fail.
Постройте дерево вывода и объясните результат.
ПРОГРАММА 4.
/* ввод с клавиатуры слов и вывод их на экран до тех пор, пока не будет введено слово stop (в конце терма, вводимого read, необходимо поставить точку и нажать клавишу Enter) */
r:- repeat, read(X), write(X), X=stop.
?-r.
Вывод схематично можно представить так:
ЗАДАНИЕ 4.6
Выполните программу 4 в режиме трассировки[6].
Можно предложить более общую схему организации цикла с помощью предиката repeat при выполнении некоторого условия.