Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65420
ТЕХНОЛОГИИ ДОСТ... 62345
Имитационное мо... 58002
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

Пользователей: 13,089
новичок: duskob67
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование вычислительного центра на GPSS + Отчет + Блок схема
Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема
Информационная система - продуктовый магазин на Turbo Pascal (База данны...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Запрограммировать предикаты для работы с графами

Подчеркнем, что соединение разностных списков происходит неявно, в процессе унификации, поэтому операционное поведение программ с разностными списками труднее для понимания и при отладке часто имеет смысл использовать трассировку.
Как правило, Пролог-программы с явными обращениями к предикату append могут быть переработаны в более эффективные за счет исключения простого append и использования разностных списков и разностного предиката append, что в ряде случаев по сути равносильно использованию переменных-накопителей.
Заметим, что имя функтора dl выбрано произвольно и может быть заменено на любой другой бинарный фунтор, и даже опущено - тогда первый и второй аргументы разностного списка становятся двумя отдельными аргументами предиката, использующего разностный список. При этом рассмотренный выше разностный append от трех аргументов превратится в
append_dl (Z1, Z2, Z2, Z3, Z1, Z2).

4. При программировании ряда предикатов могут потребоваться средства управления механизмом бектрекинга пролог-интерпретатора. В языке Пролог для этого используются два основных стандартных предиката без аргументов - предикаты fail и cut (обычно обозначаемый как !).
Предикат fail инициирует бектрекинг - при его выполнении происходит возврат к последней по времени точке бектрекинга (при этом автоматически восстанавливается вся операционная обстановка этой точки, включая значения переменных) и возобновляется доказательство текущей цели от этой точки. Fail по сути является предикатом, который никогда не выполняется, т.к. отсутствуют определяющие его предложения, поэтому можно использовать вместо fail любой неопределенный предикат с другим именем.
Заметим, что по смыслу предикат fail должен стоять последним в списке целей правой части любого пролог-правила (предложения).
Стандартный прологовский предикат ! предотвращает бектрекинг, в этом смысле его действие противоположно действию fail. Предикат ! употребляется для сокращения дерева доказательства цели путем отсечения некоторых его ветвей, поэтому он называется отсечением.
В общем случае выполнение отсечения ! в предложении S общего вида:
P:- R1, ..., Rk, !, Rk+1, ..., Rn.
где 0 £ k £ n,
относящемуся к пролог-процедуре P и используемого при доказательстве цели G, означает уничтожение всех последних по времени точек бектрекинга, возникающих с момента входа в процедуру P (т.е. начиная с поиска предложения этой процедуры, заголовок или левая часть которого унифицируема с текущей доказываемой целью G). Напомним, что под пролог-процедурой Р понимается набор из всех предложений, в левой части которых стоит предикат Р.
При выполнении отсечения, во-первых, отбрасываются все точки бектрекинга, возникающие при доказательстве целей R1, ..., Rk, расположенных левее предшествующих отсечению (то есть отбрасываются все альтернативные решения конъюнкции целей R1, ..., Rk), а во-вторых, уничтожается также точка бектрекинга, связанная с возможными альтернативами доказательства цели G, поэтому другие предложения процедуры P, заголовок которых унифицируем с G, будут при доказательстве отброшены.
В то же время выполненное отсечение не влияет на цели Rk+1, ..., Rn, расположенные правее его и возникающие при их доказательстве точки бектрекинга, таким образом, эти цели могут порождать более одного решения.
Однако, если при доказательстве конъюнкции Rk+1, ..., Rn возник неуспех (fail), и процесс возврата, исчерпав все альтернативы в возникших при этом доказательстве точках бектрекинга, достиг точки отсечения, то далее он распространяется до последней по времени точки бектрекинга, возникшей перед входом в процедуру P.
По семантике отсечения подразделяются на зеленые и красные [Стерлинг, с.127-132, 136-140]. Зеленые отсечения не изменяют декларативное значение (смысл) логической программы - множество возможных ее решений, то есть при них отсекаются ненужные ветви доказательства и уничтожаются лишние точки бектрекинга. Полезность таких отсечений определяется тем, что экономится время доказательства и, что более важно, необходимая память (вся связанная с точками бектрекинга информация запоминается в стеке).
Очевидно, что все вводимые в детерминированную программу отсечения являются зелеными (если они не отсекают единственное решение).
Красные отсечения изменяют декларативное значение программы, они обычно появляются, когда в недетерминированной программе необходимо по каким-либо причинам отбросить часть решений. Примером красного отсечения является отсечение в предикате member:
member (X, [X| Xl]):-!
member (X, [Y| Yl]):- member (X, Yl).
Вычисление в прототипе (o, i) приводит к поиску только первого вхождения элемента X в список Xl, поэтому результат вычислений будет отличаться от результата вычислений этого предиката, но без отсечения.
Отметим, что введение отсечения приводит к потере модульности предиката (становится важным порядок предложений в программе), а также очень часто - к потере его инвертируемости. Таким образом, программы с отсечениями менее гибки и менее декларативны, чем их аналоги без отсечений.

5. При программировании может оказаться полезным еще один стандартный пролог-предикат not, реализующий ограниченную форму отрицания - отрицание как безуспешное выполнение. Точнее, not(G) успешно завершает работу тогда, когда его аргумент - цель G - не может быть доказана (т.е. возникает неуспех).
Большинство реализаций Пролога запрещает использовать внутри цели G к моменту ее доказательства свободные переменные, за исключением анонимных, во избежание некорректностей, связанных с логической трактовкой их значений.
Семантика предиката not может быть определена двумя пролог-предложениями с помощью предикатов fail и cut (при этом G - метапеременная):
not(G):- G, !, fail.
not(G).
Таким образом, можно считать предикат cut слабой формой логического отрицания.
Во многих случаях при решении задачи подходит как предикат not, так и отсечение. Если же выбирать между этими предикатами, то, несмотря на меньшую эффективность, использование not предпочтительнее, чем менее понятная конструкция с отсечением.
Опубликовал Kest February 19 2011 00:17:51 · 0 Комментариев · 10149 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Страница 5 из 5 << < 2 3 4 5
Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
PDJ Scrollers
Run
Дарахвелидзе П., ...
Swing. Эффектные...
Delphi Быстрый Ст...
Zoom [Исходник на...
Page Promoter 7.7...
IIIDTrans
Синтаксический ан...
Библия хакера 2. ...
FormShape [Исходн...
Flud Vkontakte.ru
FreeNet
Быстрое создание ...
TDBF
Java 2. Наиболее ...
Иллюстрированный ...
WordReport
Geo-Whois
Socoban

Топ загрузок
Приложение Клие... 100472
Delphi 7 Enterp... 87473
Converter AMR<-... 20081
GPSS World Stud... 13089
Borland C++Buil... 11933
Borland Delphi ... 8633
Turbo Pascal fo... 7042
Visual Studio 2... 5001
Калькулятор [Ис... 4860
FreeSMS v1.3.1 3544
Случайные статьи
Настройка событий ...
Увеличение пропуск...
Зашита обмена данн...
Руководство по пон...
• Внешний SQL-сервер
Обзор панели управ...
Да, Microsoft чрез...
Аппаратные IP-теле...
String variable ex...
Механизм условных ...
Стоимость корневог...
Network File System
Интернет-ресурсы, ...
Часто возникают ди...
Экзамен 200-100 Ze...
ВОЗДЕЙСТВИЕ ОТСЕЧЕ...
Установка объектив...
Класс ТРеn
Ошибки при передач...
Основные игры в он...
Стандартные матем...
Объекты WordArt
Немного программир...
Варианты дисплея с...
5. Настройте агент...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?