Навигация
Главная
Поиск
Форум
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
Реклама
Кладбище 9 января о Кладбище памяти жертв девятого января.
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

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

Моделирование процесса обработки заданий пакетным режимом работы с квант...
Моделирование работы перекрёстка по регулированию движения на GPSS + Поя...
База данных междугородних телефонных разговоров на Delphi

repeat


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



Что произойдет, если мы поместим предикат repeat как целевое утверждение в одно из наших правил?
Во-первых, это целевое утверждение согласуется с базой данных, так как имеется соответствующий факт – первое утверждение определения предиката repeat. Во-вторых, если в процессе возврата вновь будет достигнуто это место, то Пролог будет иметь возможность испробовать альтернативу – правило (второе утверждение). При использовании правила порождается другое целевое утверждение repeat. Так как оно сопоставляется с фактом для предиката repeat, то это целевое утверждение вновь согласуется с базой данных. Если процесс возврата снова дойдет до этого места, то Пролог вновь использует правило там, где он ранее использовал факт. Чтобы доказать согласованность вновь порожденного целевого утверждения, он снова выберет факт. И так далее. В действительности в процессе возврата целевое утверждение repeat может быть согласовано бесконечное число раз. Обратим внимание на существенность порядка, в котором записаны утверждения для предиката repeat. (Что произойдет, если факт будет записан после правила?)
Для чего нужно порождать целевые утверждения, которые всегда будут согласовываться в процессе возврата? Они нужны для того, чтобы создавать правила, в которых имеется возможность выбора вариантов, из правил, которые такой возможности не содержат. И тем самым мы можем заставить их порождать каждый раз различные значения.
Рассмотрим встроенный предикат get0, который описан в гл. 5. Если Пролог пытается доказать согласованность целевого утверждения get0(X) , то он понимает это как указание взять очередную литеру (букву, цифру, пробел или что-либо еще), которая была введена в систему, и попытаться сопоставить целочисленный код этой литеры со значением X . Если они будут сопоставимы, то целевое утверждение считается согласованным, в противном случае оно несогласовано. При этом нет никакого выбора – предикат get0 всегда обрабатывает только текущую литеру, введенную в систему в момент обращения к предикату. При следующем обращении к целевому утверждению, включающему get0 , он возьмет следующую литеру, но при этом опять не будет никакого выбора. Мы можем определить новый предикат new_get следующим образом:
new_get(X):- repeat, get0(X).



Предикат new_get обладает следующим свойством: он порождает одно за одним значения всех последующих литер (в порядке их поступления) как альтернативные решения. Почему так получается? Когда мы первый раз вызываем new_get(X), то подцель repeat согласуется и подцель getO(X) тоже, при этом переменная X конкретизируется очередной литерой. Когда мы инициируем возврат, то выясняется, что последним местом, где имелся выбор, является repeat . Пролог забывает все, что было сделано с того момента, а повторное согласование целевого утверждения repeat успешно завершается. Теперь он вновь должен обратить свое внимание на getO(X). К этому моменту текущей литерой является следующая литера, и в результате X получает в качестве значения вторую литеру.
Мы можем использовать наше определение new_get, чтобы определить другой полезный предикат. Предикат get обычно является встроенным. Когда Пролог обрабатывает целевое утверждение get(X), он рассматривает его как указание читать литеры до тех пор, пока он не найдет очередную неуправляющую литеру, имеющую изображение при печати (пробел, признак конца строки и т. д.). Затем он пытается сопоставить целочисленный код этой литеры со значением X. Мы можем написать приблизительное определение предиката get следующим образом:
get(X):- new_get(X), X › 32.



Чтобы понять это определение, нужно вспомнить, что в кодировке ASCII все неуправляющие (печатаемые) литеры имеют код, превышающий 32, все остальные литеры имеют код, меньший или равный 32. Что происходит при попытке согласовать get(X)? Прежде всего new_get(X) сопоставляет X с текущей литерой, введенной в систему. Если ее код меньше или равен 32, то следующее целевое утверждение неверно и new_get будет вынужден породить следующую литеру как следующее возможное решение. Эта литера будет затем сравнена с 32 и так далее. В конце концов new_get найдет неуправляющую литеру, сравнение закончится успешно и код этой литеры будет возвращен в качестве результата get.
Упражнение 6.1. Приведенное определение предиката get не будет работать надлежащим образом, если мы обратимся к целевому утверждению get(X) с уже определенным значением X . Почему это происходит?
Неприятность, связанная с предикатом repeat, состоит в том, что он всегда имеет альтернативное решение. Следовательно, в процессе возврата repeat никогда не будут пересмотрены решения, принятые раньше, чем произошел последний вызов repeat, если только мы не отсечем каким-либо образом эту постоянную возможность выбора. В силу сказанного предыдущие определения должны быть переписаны следующим образом:
new_get(X):- repeat, get0(X).
get(X):- new_get(X), X › 32,!.



Заметим, что это определение по-прежнему работает, лишь если мы пытаемся согласовать get(X) с неконкретизированной значением переменной X . Из-за проблемы, связанной с механизмом возврата за repeat, в каждом применении new_get необходимо предусматривать отсечение дальнейших вариантов, как только порождается литера, удовлетворяющая заданным условиям.

Опубликовал Kest July 09 2009 13:13:02 · 0 Комментариев · 17700 Прочтений · Для печати

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


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



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

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

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

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

Пароль



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

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

Случайные загрузки
С/C++ Программиро...
Microsoft Press -...
Delphix Sample [И...
WordReport
CarGame [Исходник...
Gold Submitter II...
Добавление басса ...
Globus VCL Extent...
JBlabel3D
EditNew
HtmlLerz PRO
Text effect
Работа с базами д...
Dynamic Titles дл...
SearchAndReplace
Geo-Whois
Размещение элемен...
32 урока по Delphi
Переработанный пл...
Программирование ...

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98018
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14239
Borland Delphi ... 10374
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
1.1. Точная постан...
Руки прочь от PHP!
отчетность через и...
Стратегия в покере...
Программирование а...
Данная книга
Чтобы сократить не...
Модемы, поддержива...
Palladium
Физические и матем...
Windows с точки вр...
Ключевые слова
Блоки имеют следую...
Снова об интерфейс...
Приложение Gesture...
Команды библиотеки...
Недостатки рекурси...
Страница не умещае...
Популярно о PageRank
Состав программног...
read(X)
Устройства тестиро...
Знаки пожарной без...
Серия X рекомендов...
Официальный сайт В...
Статистика



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


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