Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 15
На сайте нет зарегистрированных пользователей

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

Расчет мер близости на отношениях на Delphi + Пояснительная записка
База данных электронного документооборота на Delphi + бд Intebase
Моделирование работы ЭВМ на GPSS + Пояснительная записка

Запрограммировать предикаты для работы с графами

Подчеркнем, что соединение разностных списков происходит неявно, в процессе унификации, поэтому операционное поведение программ с разностными списками труднее для понимания и при отладке часто имеет смысл использовать трассировку.
Как правило, Пролог-программы с явными обращениями к предикату 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 18 2011 21:17:51 · 0 Комментариев · 13407 Прочтений · Для печати

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


Страница 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...
Шаблон для новост...

Случайные загрузки
iComm v.6.1 - выв...
Dealer
Autorunner
VFW
Sztransppanel
KOL & MCK v1.69
Проигрыватель Mp3
AddPage [Исходник...
ProLIB18
Page Promoter 7.7...
Delphi7 Для профе...
SendSMS для PHP-F...
Berg
ComboBox97
Counter [Исходник...
NotePad Pro [Исхо...
Dynamic Titles дл...
3d Tank [Исходник...
Borland Delphi 8 ...
Дарахвелидзе П., ...

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
NetWare можгю, уст...
Проектирование сос...
Определить слова, ...
Перечислим основны...
binary search: клю...
Глава 13
Компиляция
Спецификация языка...
Дальнейшее развити...
Разработка чужими ...
Что делать, когда ...
1.3. ЧЕГО НЕТ В ЭТ...
Выбор меток NFC
Поле-шаблон
Задача о шахматах....
Разделители
Сайт DigitalDemogr...
Ставки на спорт в ...
Надстройки над OpenGL
Введение в язык XSLT
Перестановка парам...
Фактически при выв...
АЛФАВИТ ЯЗЫКА
Модель возникновения
Инсталляция SWI-Pr...
Статистика



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


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