> V, singlepeak([V|W],Down).
Правило 4. Механізм уніфікації повинен виконувати як можна більше роботи.
Наприклад, для перевірки на рівність двох списків можна використати наступний фрагмент програми:
equal([],[]).
equal([U|X],[U|Y]):-equal(X,Y).
aле в цьому немає потреби, тому що предикат
equal(Х,Х)
за рахунок механізму уніфікації виконає всю потрібну роботу.
Правило 5. Для повтору краще використовуйте бектрекінг ніж рекурсію.
Бектрекінг зменшує стекові вимоги. Ідея заключається у тому, щоб використовувати конструкцію типу repeat...fail замість рекурсії. Наприклад, для повторного обчислення деякого предикату process(X,Y) можна використати наступну послідовність предикатів:
run:-readln(X),
process(X,Y),
write(Y),
run.
Але комбінація repeat...fail зменшує необхідність кінечного рекурсивного виклику. Визначивши
repeat.
repeat:-repeat.
ми можемо перевизначити run без рекурсії:
run:-repeat,
readln(X),
process(X,Y),
write(Y),
fail.
Тут, fail примушує Пролог виконувати бектрекінг в repeat, який завжди виконується успішно.
Література.
1. И. Братко. Программирование на языке Пролог для искусственного интеллекта. Москва, Мир, 1990.
2. Дж. Малпас. Реляционный язык Пролог и его применение. Москва, Мир, 1990.