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

5. Управление поиском решений

Управление выполнением программы – это отход от декларативности в сторону процедурных свойств, что может возникнуть, например, при необходимости выполнения циклов. Пролог одинаково хорошо выполняет повторы и в процедурах, и в структурах данных.

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

Кроме переупорядочивания предложений существуют другие методы управления программой.

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

Иногда наоборот необходимо найти не одно решение, а много (несколько) решений.

Управление поиском решения можно рассматривать с процедурной точки зрения.

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

Используя откат или рекурсию при решении задачи, можно получить один и тот же результат, хотя алгоритмы их выполнения различны. Конкретная ситуация диктует тот или иной выбор реализации циклических частей программы. Рисунок 5.1. демонстрирует оба способа реализации циклических частей программы и средства, которые используются в случае отката для управления логическим поиском.

Рис. 5.1.Два способа управления поиском решения

Есть несколько способов реализации повторов в Прологе. Наиболее удобными считаются два способа - откат после неудачи и отсечение и откат.

5.1.Метод отката после неудачи – опн

Использование предиката fail

Листинг 5.1.Программа, использующая ОПН

domains

name=symbol

predicates

country(name)

print_countries

clauses

country(england).

country(france).

country(germany).

country(denmark).

print_countries:-

country(X),

write(X),

nl,

fail.

print_countries.

Пояснения к программе:

Поставим перед программой две разные цели:

1)country(X);

2)print_countries.

Как поведет себя каждая из этих целей, если мы сделаем ее сначала внешней, а потом внутренней?

Внешняя цель

Для country(X) c fail и без fail внешняя цель даст одинаковый ответ – все 4 решения. Fail для внешней цели в этом случае просто избыточна, потому что внешняя цель заставит ее получить все ответы и без fail.

Для print_countries внешняя цель без fail даст одно решение- england- , потому что откат для получения других решений просто некуда выполнить. В разделе clauses нет больше предиката с таким именем (print_countries). Без fail у нас нет повода обратиться к country , даже если цель внешняя.

Для print_countries внешняя цель с fail даст все 4 решения. Print_countries использует поиск с возвратом с тем, чтобы получить все решения для country, заставляя Пролог выполнять поиск с возвратом через правило print_countries. При этом Пролог возвратится к той подцели в правиле, которая может дать множественные решения, то есть к недетерминированной подцели. Предикаты nl и write не могут быть согласованы повторно, так как они не в состоянии дать нам новые решения, поэтому Пролог вынужден откатиться к предыдущей подцели, то есть к country.

Внутренняя цель

Для цели country(X) с fail и без fail результат одинаков – ответ будет один. Это происходит потому, что fail стоит в правиле print_countries,а в country fail не задействован.

Для цели print_countries c fail мы получим все 4 ответа, а без fail –один ответ.

Замечание :

Помещать подцель после fail в теле правила бесполезно, так как fail – всегда неудача, а значит, нет возможности для достижения подцели, расположенной после fail.

Вывод

Метод ОПН - откат после неудачи –позволяет управлять вычислением цели при поиске всех возможных ее решений. Для этого используется встроенный предикат fail.