Ответ в теме: Ввод строк до пустой. Вывод в обратном порядке

      Комментарии к записи Ответ в теме: Ввод строк до пустой. Вывод в обратном порядке отключены
#2277

В задаче требуется сохранять где-то введенные строки, чтобы затем вывести их на экран. Для хранения строк можно использовать список, каждый раз добавляя строку в начало списка. Последняя непустая строка окажется в списке первой, что даст требуемый порядок вывода. Однако, в этой задаче можно обойтись без списка, а строки сохранять в системном стеке, используя нехвостовую рекурсию:

predicates
read_strings_until_empty
clauses
read_strings_until_empty:-
readln(String), String <> "",
read_strings_until_empty, !,
write(String), nl; !.
goal
read_strings_until_empty.

Если строка является не пустой, то выполняется рекурсивный вызов. При этом локальные значения функции (в том числе считанная строка) будут помещены в стек. Когда рекурсивная функция завершит работу — локальные переменные восстановятся из стека и выполнится вывод строки на экран. Функция завершит работу если введена пустая строка.