русс | укр

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

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

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

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


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

ПОВТОРЕНИЯ И ВОЗВРАТЫ


Дата добавления: 2014-09-29; просмотров: 682; Нарушение авторских прав


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

Итеративное правило имеет следующий вид:

iterative_rule :- % правило повторения

<предикаты и правила>,

fail. % неудача

Встроенный предикат fail(неудача) вызывает возврат, поэтому <предикаты и правила> выполняются до тех пор, пока не будут перебраны все способы их повторного согласования.

Рассмотрим задачу о генерации платежной ведомости почасовых выплат кафедры ВТиПМ (пример 4.1).

Пример 4.1.

Предикат базы данных имеет вид:

/* преподаватель(имя, кафедра, почасовая_оплата, часы) */

prep(name, faculty, pay, hours)

Правило для вычисления выплаты несложно:

culc_sum(Pay, Hours, Sum_pay):-

Sum_pay=Pay*Hours.

Задача правила report (выдать отчет о выплатах) заключается в формировании отчета. Оно вызывает правило culc_sum для вычисления выплат, затем предикат write для печати информации о преподавателе, затем fail инициирует возврат к следующему утверждению prep.

/*Программа 4.1 «Платежная ведомость». Назначение:*/

/*демонстрация метода возврата после неудачи */

domains

 

name, faculty = symbol

pay, hours, sum_pay = real

 

predicates

 

prep(name, faculty, pay, hours)

report

culc_sum(pay, hours, sum_pay)

 

goal

write("Отчет о выплатах "),

nl, report.

 

clauses

 

prep("Иванов ", "ОМД",3.50,40.00).

prep("Петров ", "ВТиПМ",4.50,36.00).

prep("Сидоров ", "ВТиПМ",5.00,40.00).

prep("Данилов ", "ПКиСУ",4.50,25.50).

 

report :-

prep(N, ”ВТиПМ”, P,H),



culc_sum(P,H,S),

write(N,," $", S),nl,

fail.

 

culc_sum(P,H,S):-

S = P * H.

/* Конец программы */

Упражнение 4.1.

Для программы 4.1 напишите правило генерации списка всех преподавателей, у которых почасовая оплата 5 долларов.

2. ОТСЕЧЕНИЕ (!)

Автоматический перебор возможных вариантов — полезный программный механизм, так как он освобождает от необходимости программировать его самому.

С другой стороны, ничем не ограниченный перебор может стать источником неэффективности программы.

Поэтому необходимо уметь его ограничить или исключить вовсе.

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

Более точно, отсечение имеет два побочных (т.е. проявляемых при возврате) эффекта:

1. БЛОКИРУЕТ ВОЗВРАТ К ПРЕДШЕСТВУЮЩИМ ЕМУ ПОДЦЕЛЯМ В ДАННОМ УТВЕРЖДЕНИИ.

правило1:-

согласована подцель1, передоказать

согласована подцель2, нельзя

!,

согласована подцель3, попытка передоказать

отказ подцель4.

2. ЗАПРЕЩАЕТ ИСПОЛЬЗОВАНИЕ ВСЕХ УТВЕРЖДЕНИЙ ДАННОЙ ПРОЦЕДУРЫ, КОТОРЫЕ В БАЗЕ ДАННЫХ НАХОДЯТСЯ ПОСЛЕ ДАННОГО.

правило1:- передоказать

согласована подцель1, нельзя

!,

отказ подцель2.

 

правило1:- передоказать

<.......>.

правило1:- нельзя

< .......>.

Действие отсечения превращает процедуру, способную генерировать альтернативные варианты означивания переменных цели (такая процедура называется НЕДЕТЕРМИНИРОВАННОЙ), в процедуру, порождающую лишь один ответ (ДЕТЕРМИНИРОВАННУЮ).



<== предыдущая лекция | следующая лекция ==>
АРИФМЕТИКА В Turbo Prolog | ПРОГРАММИРОВАНИЕ АЛЬТЕРНАТИВ


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


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

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

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


 


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

 
 

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

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