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

Предварительные и последующие операции

Характерно, что программа, которая находит решения к целевому утвер-

ждению и возвращается, может выполнять какие-либо предварительные или

последующие операции. Например, в нашем примере программа могла бы:

1. Напечатать "Some delightful places to live are..." (восхититель-

ные места для проживания).

2. Напечатать все решения для country(X).

3. Завершить печать фразой " And maybe ofhers" (Могут быть и дру-

гие).

Заметьте, что print_countries, определенное в предыдущем примере,

уже содержит предложение вывести на печать все решения country(X) и отпе-

чатать завершающее сообщение.

Первое предложение для print_countries соответствует шагу 2 и выво-

дит на печать все решения. Его второе предложение соответствует шагу 3 и

просто успешно завершает целевое утверждение (потому, что первое предло-

жение всегда в режиме fail - "неудачное завершение").

Можно было бы изменить второе предложение в CH07EX01.PRO

print_countries :- write("And maybe others."), nl

которое выполнило бы 3 шаг как обусловлено.

А, что можно сказать о 1 шаге? В нем нет смысла, когда print_countries

содержит только 2 предложения. Но, в предикате может быть и три:

print_countries :-

write("Some delightful places to live are"),

nl,

fail.

print_countries :-

country(X),

write(X),

nl,

fail.

print_countries :-

write("And maybe others."), nl.

Наличие fail в первом предложении важно, поскольку он обеспечивает,

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

ложению. Кроме того, это важно, потому что предикаты write и nl не обра-

зуют альтернатив. Строго говоря, первое предложение проверяет все возмож-

ные решения перед выполнением предиката fail.

Такая структура из трех предложений более удобна по сравнению с об-

щепринятым методом программирования и изощренный программист попытается,

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

print_countries_with_captions :-

write "Some delightful places to live are"),

nl,

print_countries,

write("And maybe others."),

nl.

print_countries :-

country(X),

write(X),

nl,

fail.

Ничего страшного здесь нет, но наш предполагаемый изощренный прог-

раммист сделал ошибку.