Организация цикла baf-метод

Первый метод организации повторений получил название 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 при выполнении некоторого условия.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: