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

Стиль программирования

В этом разделе дается краткое руководство по написанию хороших прог-

рамм на Турбо Прологе. Вначале мы рассмотрим хвостовую рекурсию, а затем

изложим ряд правил хорошего стиля программирования.

-----------------------------------------------------------------

Правило 1. Лучше использовать больше переменных и меньше

предикатов.

-----------------------------------------------------------------

Это правило часто противоречит требованию читабельности программ,

так что тщательный выбор объектов позволяет получить программы, которые

одновременно являются эффективными и не связаны с большими трудозатрата-

ми.

Так, например, если написать предикат для перестановки в обратном

порядке элементов списка

reverse(X,Y):-reverse1([],X,Y).

reverse1(Y,[],Y).

reverse1(X1,[U|X2],Y):-reverse1([U|X1],X2,Y).

то для него требуется меньший объем стека, чем для конструкции

reverse([],[]).

reverse([U|X],Y):-reverse(X,Y1),append(Y1,[U],Y).

append([],Y,Y).

append([U|X],Y,[U|Z]):-append(X,Y,Z).

в которой используется дополнительный предикат append.

-----------------------------------------------------------------

Правило 2. При указании подцелей в правиле ограниченные

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

-----------------------------------------------------------------

Поэтому, при написании предиката solve для решения системы уравнений

X+1=4

X+Y=5

и пользуясь методом "проб и ошибок" получаем, что

solve(X,Y):-

numb(X),plus(X,1,4),

numb(Y),plus(X,Y,5).

лучше чем

solve(X,Y):-

numb(X),numb(Y),

plus(X,Y,5),plus(X,1,4).

(Предикаты numb и plus взяты из программы CH19EX03.PRO). numb гене-

рирует числа, а plus(X,Y,Z) является предикатом, который может работать с

любым потоком параметров, и он выполняется успешно, когда Z получает зна-

чение суммы X и Y, и т.д.

----------------------------------------------------------------

Правило 3. Необходимо эффективно гарантировать невыполнение

предиката в случае, если решения не существует.

----------------------------------------------------------------

Допустим, мы хотим записать предикат singlepeak, с помощью которого

мы можем просмотреть список целых чисел и определить, есть ли среди них

максимум при равномерном нарастании и убывании чисел. Таким образом, ут-

верждение

singlepeak([1,2,5,7,11,8,6,4]).

будет выполняться успешно, а утверждение

singlepeak([1,2,3,9,6,8,5,4,3]).

будет выполняться неудачно.

В определении 1 не учитывается правило 3, поскольку наличие в списке

одного максимума определяется только тогда, когда с помощью предиката

append список будет поделен на все возможные комбинации:

Определение1

singlepeak(X):-append(X1,X2,X),up(X1),down(X2).

up([]).

up([U]).

up([U,V|Y]):-U<V,up([V,Y]).

down([]).

down([U]).

down([U,V|Y]):-U>V,down([V,Y]).

append([],Y,Y).

append([U|X],Y,[U|Z]):-append(X,Y,Z).

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

раннем этапе:

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