Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

7.6. Вопросы эффективности

Существует немало способов повысить эффективность программ на Прологе. Все они приведены ниже.

1) Как можно шире используйте механизм унификации. Напри­мер, вместо того, чтобы писать процедуру сопоставить:

сопоставить (X,Y) :- Х=1,Y=фред.

сопоставить () :- Х=2,Y=джо.

сопоставить () :- Х=З.Y=джим.

лучше определить факты:

сопоставить (1,фред).

сопоставить (2,джо).

сопоставить (3,джим).

Такое решение будет особенно эффективно в тех реализациях Пролога, где сопоставление по главному функтору дополнено сопо­ставлением по первому аргументу целевого утверждения в случае, если аргумент является простым термом (например, целым числом или атомом).

2) Сокращайте число избыточных утверждений насколько это возможно, однако не в ущерб ясности понимания программы. Пока­жем это на примере:

выход_целое (N) :-

получить_число(N),

write (N).

получить_число(N) :-

read(N),

integer(N).

лучше написать так:

read(N),

integer(N),

write(N).

3) Упорядочите утверждения в процедуре таким образом, чтобы сократить число неудачных обращений.

4) Убедитесь, что в процедуре определены граничные условия. Это позволит избежать ненужных обращений и возможных циклов в программе.

5) Используйте возможность отсечения (см.гл. 8) для устранения ненужных возвратов и сокращения альтернативных путей в про­грамме, если заранее известно, что тот или иной путь не приведет к решению.

Глава 8 Отсечение

В гл. 7 мы описали, как работает механизм возврата Пролога в том случае, когда одна из целей в конъюнкции целей терпит неуда­чу. Иногда возникает необходимость отключить механизм возврата. В данной главе определяется целевое утверждение, позволяющее управлять работой механизма возврата.

8.1. Почему используют отсечение?

Начнем с примера, в котором следует отключить механизм воз­врата. Рассмотрим следующую формулировку отношения являться дедом:

Х является дедом Y, если некоторый

Z является отцом Y и Х является отцом Z.

На Прологе данное описание примет вид:

дед(Х,Y) :- Отец(Z,Y), Отец(X,Z).

Предположим, что имеются факты:

отец(м-р_a, м-р_b).

отец(м-р_c, м-р_d).

………

………

………

отец,(м-p_w, м-p_x).

отец(м-p_y, м-p_z).

Пытаясь ответить на запрос

?-дед(Х,м-р_b).

Пролог заменяет его на целевые утверждения в теле утверждения дед (так как голова утверждения связывается с выданным запросом):

отец (Z,м-p_b), отец (X,Z).

Пролог доказывает первую из целей, связывая ее с первым фак­том отец и конкретизируя переменную Z значением м-р_а.

Теперь Пролог пробует доказать вторую цель при значении Z, равном м-р_а, т.е. отец(Х,м-р_а), но терпит неудачу. В этот момент начинает работать механизм возврата Пролога и предпринимается попытка повторного доказательства первой цели, отец(Z,м-р_b). Пролог пытается выбрать другое утверждение отец для м-р_b. Ко­нечно, он терпит неудачу, но все же впустую затрачивает время на поиск.

Для того, чтобы остановить работу механизма возврата Пролога после доказательства первой цели в теле утверждения дед, поместим после нее специальное целевое утверждение !, называемое отсече­нием:

дед(Х,Y) :- отец(Z,Y),!,отец(X,Z).

Учитывая данное определение, при доказательстве запроса

?-дед(Х,м-р_b).

Пролог связывает его с головой утверждения и затем пытается дока­зать цели в теле утверждения

отец (Z,м-p_b),!,отец (X,Z).

Как и раньше, первая из целей доказывается при

Z=м-р_а

Далее становится доказанным утверждение, осуществляющее управ­ление механизмом возврата, - отсечение; оно всегда доказуемо. Те­перь Пролог пробует доказать цель

отец(Х,м-р_а).

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

Итак, доказательство цели-отсечения всегда заканчивается ус­пешно, и после этого не могут быть передоказаны цели, стоящие в утверждении до отсечения, включая и головную цель.

Таким образом, в последовательности утверждений:

a :- !,b.

a :- c.

второе утверждение излишне, поскольку любой запрос:

?- a.

сопоставится с первым утверждением, после чего будет доказано от­сечение и, если попытка доказать утверждение b окончится неуда­чей, то работа Пролога прекратится без перехода ко второму утверж­дению.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]