русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2013-12-23; просмотров: 1093; Нарушение авторских прав


Механизм возврата

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

Компоновка данных в список

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

Findall (Var_, Predicate_, List_), где Var_ обозначает имя для терма предиката Predicate_, в соответствии с типом которого формируются элементы списка List_.

Пример 41: использование предиката findall.

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:- findall(C, decimal (C), L), write (L).

goal

write_decimal.

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

· механизм возврата;

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

· правило повтора, использующее бесконечный цикл;

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

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

 

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



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

domains

d=integer

predicates

decimal (d)

write_decimal (d)

clauses

decimal (0).

decimal (1).

decimal (2).

decimal (3).

decimal (4).

decimal (5).

decimal (6).

decimal (7).

decimal (8).

decimal (9).

write_decimal (C):- decimal (C), write (C), nll.

goal

write_decimal (C).

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

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

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 вызывает неуспешное завершение правила, внутренние подпрограммы унификации выполняют возврат и процесс повторяется до тех пор, пока не будет обработано последнее предложение.

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

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)

Пример 45: необходимо выдать десятичные цифры до 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 (C),!.

make_cut (C):-C=5.

goal

write_decimal

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

Пример 46: необходимо выдать из БД первую цифру , равную 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, !.

goal

write_decimal

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



<== предыдущая лекция | следующая лекция ==>
Сортировка списков | Методы организации рекурсии


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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