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

Печать списков

К примеру, нужно напечатать элементы списка, это делается так:

/*Программа CH08EX01.PRO - печать элементов списка*/

domains

list = integer* /*или любой тип, какой вы хотите*/

predicates

write_a_list(list)

clauses

write_a_list([]) /*если список пустой - ничего не делать*/

write_a_list([H|T]) :-

/*присвоить H-голова,T-хвост, затем ...*/

write(H), nl,

write_a_list(T).

goal

write_a_list([1, 2, 3]).

Вот два целевых утверждения write_a_list, описанные на обычном язы-

ке:

Печатать пустой список - значит ничего не делать.

Иначе, печатать список - означает печатать его голову (которая явля-

ется одним элементом), затем печатать его хвост (список).

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

write_a_list([1, 2, 3]).

Оно удовлетворяет второму предложению, при H=1 и T=[2, 3]. Компьютер

напечатает 1 и вызовет рекурсивно write_a_list:

write_a_list([2, 3]). /*это write_a_list(T).*/

Этот рекурсивный вызов удовлетворяет второму предложению. На этот

раз H=2 и T=[3], так что компьютер печатает 2 и снова рекурсивно вызывает

write_a_list с целевым утверждением

write_a_list([3])

Итак, какому предложению подходит это целевое утвержение? Вспомните,

что хотя список [3] имеет всего один элемент, у него есть голова и хвост;

голова 3 и хвост []. Так, что снова целевое утверждение подходит под вто-

рое предложение с H=3 и T=[]. Компьютер печатает 3 и делает рекурсивный

вызов

write_a_list([]).

Теперь видно, что этому целевому утверждению подходит первое предло-

жение. Второе предложение не подходит, так как [] нельзя разделить на го-

лову и хвост. Так, что если бы не было первого предложения, целевое ут-

верждение было бы невыполнимым. А раз так, первое предложение подходит и

целевое утверждение выполняется без дальнейших действий.