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

Упражнение

Измените программу CH07EX01.PRO так, чтобы:

1. Предикат country имел 2 характеристики - название и население.

2. На печать вывести только названия стран, имеющих население более

10 миллионов (1e+).

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

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

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

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

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.

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

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

Упражнение

Не спешите переворачивать страницу - постарайтесь определить и по-

нять в чем ошибка программиста!

Вы правы - проблема в том, что, как написано в последнем примере,

print_countries всегда будет "неудачно завершаться", а выполнение print

_countries_with_captions никогда не начнется. В результате "And maybe

ofhers." никогда не отпечатается.

Запомните это. Все что необходимо сделать - это восстановить первое

предложение print_countries для предиката

print_countries.

в его первоначальное положение. Если вы хотите, чтобы целевое утверждение

print_countries_with_captions было выполнимым, оно должно иметь по край-

ней мере одно предложение не содержащее fail.

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