Откат, Отсечение и т.д.

Отсечение используется в 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).

Hosted by uCoz