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

Рекурсии с процедурной точки зрения

Прелесть Турбо Пролога в том, что часто, когда вы задаете предложе-

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

Чтобы увидеть эту двойственность, создадим в следующем примере предикат

для присоединения одного списка к другому.

Определим предикат append с тремя аргументами:

append(List1, List2, List3)

Он объединяет List1 и List2 и создает List3. Вы еще раз пользуетесь

рекурсией (на этот раз с процедурной точки зрения).

Если List1 пустой, то результатом объединения List1 и List2 останет-

ся List2. В Турбо Прологе:

append([], List2, List2).

Если List1 не пустой, то можно объединить List1 и List2 для формиро-

вания List3, сделав голову List1 головой List3. ( В следующем утверждении

переменная X используется, как голова для List1 и для List3.) Хвост List3

- это L3, состоит из объединения остатка List1 (т.е. L1) и всего List2. В

Турбо Прологе:

append([X|L1], List2, [X|L3]) :-

append(L1, List2, L3).

Предикат append выполняется так: Пока List1 не пустой, рекурсивное

предложение передает по одному элементу в List3. Когда List1 станет пус-

тым, первое предложение подсоединит List2 к концу List3.