logo
TurboProlog / Документация / TOM_1

Использование поиска с возвратом в замкнутых системах

Поиск с возвратом является хорошим способом определить все возможные

решения целевого утверждения. Но, даже если ваша задача не имеет множест-

ва решений, можно использовать поиск с возвратом для выполнения итераций.

Просто определяется предикат с двумя предложениями

repeat.

repeat :- repeat.

Этим структура управления Пролога подводится к тому, что имеется

бесконечное множество различных решений. (Не пытайтесь понять каким обра-

зом - вы это поймете, прочитав о хвостовой рекурсии.) Цель предиката

repeat допустить бесконечность поиска с возвратом.

/* Программа CH07EX02.PRO*/

/* Использование repeat для сохранения введенных символов и печать

их до тех пор, пока пользователь не нажмет Enter (Ввод).*/

predicates

repeat

typewriter

clauses

repeat.

repeat :- repeat.

typewriter :-

repeat,

readchar(C), /* Читать символ, его значение присвоить С*/

write(C),

char_int(C,13). /* С = 13 в коде ASCII? */

Программа CH07EX02.PRO показывает, как работает repeat. Правило

typewriter :- ... описывает процесс приема символов с клавиатуры и отоб-

ражения их на экране, пока пользователь не нажмет клавишу Enter (код 13 в

ASCII):

typewriter :-

repeat,

readchar(C),

write(C),

char_int(C,13).

typewriter работает следующим образом:

1. Выполняет repeat (который ничего не делает).

2. Присваивает переменной С значение символа.

3. Отображает С.

4. Проверяет соответствует ли С коду 13.

5. Если соответствует, то завершение. Если нет - возвращается и ищет

альтернативы. Так как ни write ни readchar не являются альтернатива-

ми, постоянно происходит возврат к repeat, который всегда имеет аль-

тернативные решения.

6. Теперь обработка может снова продвигаться вперед: считывать сле-

дующий символ, отображать его и проверять на соответствие коду 13 в

ASCII.

Заметьте, кстати, что С теряет свое значение просле возврата и вы-

полнения предиката readchar(C). Этот предикат и сбрасывает значение пере-

менной C. Такой тип освобождения переменной существенен, когда поиск с

возвратом применяется для определения альтернативных решений целевого ут-

верждения, но не эффективен при использовании поиска с возвратом в других

целях. Смысл в том, что хотя поиск с возвратом и может повторять операции

сколько угодно раз, он не способен "запомнить" что либо из одного повто-

рения для другого. Все переменные теряют свои значения, когда обработка

возвращается и проходит те шаги, на которых эти значения устанавливались.

Это наиболее простой способ сохранения значений списка, общих результатов

или любых других значений при выполнении циклов повторения.