Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

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

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

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

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

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

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. Такой тип освобождения переменной существенен, когда поиск с

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

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

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

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

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

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

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

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

Упражнения

1. Измените программу CH07EX02.PRO так, чтобы, если набирать клавиши

на нижнем регистре, то на дисплее отображались значения верхнего ре-

гистра.

2. Если вам нравится реботать с файлом I/O сейчас, найдите подходя-

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

петлю повторений для сравнения файла символ за символом. (Смотрите

Главу 12.)

Соседние файлы в папке Документация