Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Метод отсечения и возврата




Метод возврата после неудачи

Повторение и рекурсия в Турбо-Прологе

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

· метод возврата после неудачи;

· метод отсечения и возврата;

· правило повтора, определяемое пользователем;

· обобщенное рекурсивное правило.

Правила повторений и рекурсии должны содержать средства управления их выполнением. Встроенные предикаты Турбо-Пролога fail и cut (!) используются для управления возвратами, а условия завершения используются для управления рекурсией. Правила Турбо-Пролога, выполняющие повторения, используют возврат, а правила, выполняющие рекурсию, используют самовызов.

Возврат является автоматически инициируемым системой процессом, если не используются специальные средства управления им.

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

Пример 26: распечатать все десятичные цифры.

domains

d=integer

predicates

decimal (d)

write_decimal

clauses

decimal (0)

decimal (1)

decimal (2)

decimal (3)

decimal (4)

decimal (5)

decimal (6)

decimal (7)

decimal (8)

decimal (9)

write_decimal:- decimal (C), write (C), nl, fail.

goal

write_decimal

В программе есть 10 предикатов, каждый из которых является альтернативным предложением для предиката decimal (d). Во время попытки вычислить цель внутренние подпрогрммы унификации связывают переменную C с термом первого предложения, то есть с цифрой 0. Так как существует следующее предложение, которое может обеспечить вычисление подцели decimal (C), то помещается указатель возврата, значение 0 выводится на экран. Предикат fail вызывает неуспешное завершение правила, внутренние подпрограммы унификации выполняют возврат и процесс повторяется до тех пор, пока не будет обработано последнее предложение.

Пример 27: подсчитать значения квадратов всех десятичных цифр.

domains

d =integer

predicates

decimal (d)

s (d, d)

cikl

clauses

decimal (0)

decimal (1)

decimal (2)

decimal (3)

decimal (4)

decimal (5)

decimal (6)

decimal (7)

decimal (8)

decimal (9)

s(X, Z):- Z=X*X.

cikl:-decimal (I), s(I, S), write (S), nl, fail.

goal

not(cikl)

Метод отсечения и возврата может быть использован для фильтрации данных, выбираемых из БД. Для управления возвратом при выборе данных по условию Турбо-Пролог использует встроенный предикат отсечения, обозначаемый символом восклицательного знака (!). Этот предикат, вычисление которого всегда завершается успешно, заставляет внутренние подпрограммы унификации «забыть» все указатели возврата, установленные во время попыток вычислить текущую подцель. Другими словами, отсечение запрещает выполнение возврата ко всем альтернативным решениям текущей подцели. Однако, следующие подцели могут создать новые указатели возврата и тем самым создать условия поиска новых решений. Область действия данного предиката отсечения на них уже не распространяется.

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

Пример 28: необходимо выдать десятичные цифры до 5 включительно.

domains

d=integer

predicates

decimal (d)

write_decimal

make_cut (d)

clauses

decimal (0)

decimal (1)

decimal (2)

decimal (3)

decimal (4)

decimal (5)

decimal (6)

decimal (7)

decimal (8)

decimal (9)

write_decimal:- decimal (C), write (C), nl, make_cut (D),!.

make_cut (D):-D=5.

goal

write_decimal

Предикат! используется для того, чтобы выполнить отсечение в указанном месте. Неуспешное выполнение предиката make_cut порождает предикат fail, который используется для возврата и доступа к цифрам до тех пор, пока цифра не будет равна 5.

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

Пример 29: необходимо выдать из БД первую цифру, равную 5.

domains

d=integer

predicates

decimal (d)

write_decimal

clauses

decimal (0)

decimal (5)

decimal (2)

decimal (3)

decimal (4)

decimal (5)

decimal (6)

decimal (5)

decimal (8)

decimal (9)

write_decimal:- decimal (C), С=5, write (C), nl,!, fail.

goal

write_decimal

Если из тела правила убрать предикат!, то будут найдены все три цифры 5, что является результатом применения метода возврата после неудачи. При внесении отсечения будет выдана единственная цифра 5.




Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 625; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.015 сек.