Откат, Отсечение и т.д.
Отсечение используется в 2-х случаях:
1)Если вывод дошел до места то лучше искать не надо, надо улучшить найденные.
2)Если вывод дошел до места, следует прекратить всякие попытки дальнейшего поиска решения.
Пример:
Пусть необходимо ограничить перечень услуг представляемых библиотекой для нерадивого читателя:
услуги (читатель, вид_услуг);
книга_не_возвращена (читатель, книга),!,
минимальные_услуги (вид_услуг)
Примечание:
Не использовать отсечение, а использовать другой прием.
{A: - B, ! , C {A: - B, C
{ ≡ {
{A: - D {A: - not(B),C
Первые две клаузы можно записывать:
услуги (читатель, вид_услуг): - книга_не_возвращена (читатель, книга),
минимальные_услуги (вид_услуг),
услуги(читатель, вид_услуг): - not (книга_не_возвращена (читатель, книга)),
все_услуги (вид_услуг),
Когда необходимо вообще прекратить поиск. Пусть необходимо нерадивому читателю полностью отказать в каких-либо услугах:
услуги (Чит, Вид_услуг):- кн_не_возвр(Чит, кн), !, fail
услуги (Чит, Вид_услуг):- все_усл(Вид_усл)
Первая клауза рассчитана на отказ в услугах, отсечение не даёт её пересмотреть.
Вторая клауза рассчитана на законопослушного читателя.
Примечание: можно ли их менять местами? (с/м)
Пользоваться отсечением надо тогда, когда мы абсолютно уверены в его необходимости. Отсечение повышает эффективность работы за счёт узкой специализации. Если могут возникнуть совершенно неожиданные запросы, отсечение может дать побочные эффекты.
Пример: простая программа для определения количества родителей:
Число родит(Адам, 0) : - !.
Число родит(Ева, 0) : - !.
Число родит(Х, 2).
Число родит(Ева, Х)?
Х=0
Число родит(Вася, Х)?
Х=2
Система рассчитана на запрос о том, сколько родителей у конкретного индивидуума, если задать вопрос задать по-другому (правда ли, что у Евы 2-е родителей?)
Число родит(Ева, 2)?
Да
Число родит(Адам, N) : - !, N=0.
Число родит(Ева, N) : - !, N=0.
Число родит(Х, 2).