Навигация
Главная
Поиск
Форум
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
На сайте нет зарегистрированных пользователей

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

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

Управление механизмом вывода в Прологе


В прологе механизм вывода уже существует, иногда бывает необходимо либо более рационально использовать его либо заставить делать вообще не свойственные ему операции. Для этого используют встроенные предикаты и некоторые типовые приемы.
(см. книгу И.Н. Соломон “Программирование на прологе”)

1. ОПН
Пусть есть БД
giv (“обезъяна”)
………………..
giv (“зебра”)



Необходимо заставить пролог распечатать всех животных
giv(x)



Тот же эффект можно получить используя предикат fail
giv (“обезъяна”), write (“обезъяна”), fail
…………………………………………..
giv (“обезъяна”)
………………..
giv (“зебра”)
……………
run: giv(x), write(x), fail
run.




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

domains
file = datafile (*указатель на файл*)

predicates
giv (symbol, symbol)

run
goal
openwrite (datafile, “Млекопитающие”)
run
closefail(datafile)
clauses
giv (“обезъяна”, “млекопитающие”)
………………………………………
giv (“лебедь”, “птица”)
run: giv(X, “млекопитающие”)
write(X), nl
writedevice(datafile)
write(X), nl
writedevice(screen)
fail
run




2. Отсечение, откат и т.д.
Отсечение используется в 2-х случаях:
1. Если вывод дошел до места то лучше искать не надо, надо улучшить найденные.
2. Если вывод дошел до места, следует прекратить всякие попытки дальнейшего поиска решения.

Пример:
Пусть необходимо ограничить перечень услуг представляемых библиотекой для нерадивого читателя.


услуги (читатель, вид_услуг);
книга_не_возвращена (читатель, книга),!,
минимальные_услуги (вид_услуг)





Примечание:
Не использовать отсечение, а использовать другой прием.


Первые две клаузы можно записывать

услуги (читатель, вид_услуг): - книга_не_возвращена (читатель, книга),
минимальные_услуги (вид_услуг),
услуги(читатель, вид_услуг): - not (книга_не_возвращена (читатель, книга)),
все_услуги (вид_услуг),




2) Когда необходимо вообще прекратить поиск. Пусть необходимо нерадивому читателю полностью отказать в каких-либо услугах
услуги (Чит, Вид_услуг):- кн_не_возвр(Чит, кн), !, fail
услуги (Чит, Вид_услуг):- все_усл(Вид_усл)



Первая клауза рассчитана на отказ в услугах, отсечение не даёт её пересмотреть.
Вторая клауза рассчитана на законопослушного читателя.
Примечание: можно ли их менять местами? (с/м)
Пользоваться отсечением надо тогда, когда мы абсолютно уверены в его необходимости.
Отсечение повышает эффективность работы за счёт узкой специализации. Если могут возникнуть совершенно неожиданные запросы, отсечение может дать побочные эффекты.
Пример: простая программа для определения количества родителей
Число родит(Адам, 0) : – !.
Число родит(Ева, 0) : – !.
Число родит(Х, 2).
Число родит(Ева, Х)?
Х=0
Число родит(Вася, Х)?
Х=2



Система рассчитана на запрос о том, сколько родителей у конкретного индивидуума, если задать вопрос задать по-другому (правда ли, что у Евы 2-е родителей?)
Число родит(Ева, 2)?
Да
Число родит(Адам, N) : – !, N=0.
Число родит(Ева, N) : – !, N=0.
Число родит(Х, 2).




3) Метод повтора, определённый пользователем.
Рассмотрим следующую структуру

Repeat1 является утверждением без аргументов и всегда сопоставляется успешно. Repeat2 является правилом с одной подцелью, ссылающееся на Repeat1.
Если в каком-либо запросе в качестве подцели будет содержаться какая-нибудь Repeat4, то такая подцель будет сопоставляться успешно сколько угодно раз. И каждый раз Prolog будет считать, что он нашел новую альтернативу, т.е. эта конструкция обманывает интерпретатор, порождая альтернативу там, где их на самом деле нет.
a : – b, c, repeat, l, m, …



Пусть среди подцели правее repeat есть приводящие к неуспеху. Подцели пересопоставляются справа налево. Как только ближайшей правой подцелью станет repeat будет полностью повторяться поиск сопоставления по l и m. Это используется для организации циклов.
Do_loop : – repeat,
<тело цикла>
fail



Цикл бесконечный. Для нормальной работы надо менять параметр цикла и предусмотреть условие выхода.
Do_loop : – repeat
<тело>
<усл_вых>



Условие выхода – успех.
Пример:
predicates
write_mess
rep.
echo.
test(symbol)
goal.
write_mess, echo
clouses
rep.
rep : – rep.
write_mes : – nl, write(“Введите строку”), nl,
write(“Я её повторю”), nl,
write(“Для остального - stop”), nl.
echo : – rep,
readln (str),
write (str),
test (str), !.
test (stop) : – nl, write (“Конец работы”).
Test (_): – fail.



При вводе любой строки кроме “stop” предикат test не сопоставляется, тело цикла повторяется с разными строками. Если будет введена строка “stop”, тест сопоставляется успешно. Поводов для отката не видно, да и отсечение в любом случае воспрепятствует откату. Цикл закончен.
Вопрос: так ли необходим предикат отсечения, нельзя ли его убрать?
Примечание: возможно использование нескольких предикатов типа rep.
rep1.
rep1 : – rep1.
rep2.
rep2 : – rep2.




4) Простая рекурсия.
recursive_rule : –
<предикаты>,
recursive_rule



При каждом новом вызове вводятся новые конкретные переменные. Если рекурсивное правило не генерирует указатели отката и последняя подцель – само рекурсивное правило, Turbo Prolog сам убирает все дополнительные операции со стеком, вызванные рекурсией – это называется устранением хвостовой рекурсии.
Восходящая рекурсия – вызов правила с возрастающим аргументом.
Нисходящая – с убывающим.
Очевидно, что среди признаков должен быть хотя бы один, который при неуспехе прекращает рекурсию.
Чтобы прекратить рекурсию среди предикатов.
Пример:
Read_char : – read_char (Ch),
Ch <> ‘$’,
Write (Ch),
Read_char.



Повтор или вывод введённых символов будет до тех пор, пока не будет введён знак $.
Опубликовал Kest January 11 2010 15:14:49 · 0 Комментариев · 7283 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
HTMLredaktor
С. Г. Горнаков - ...
Dnavigator
RAS
Книга по Delphi (...
Аватары в комме...
DiskInfo
Plasma
oTextrackBar
Язык программиров...
Strawberry Prolog...
Berg
PHP5. Профессиона...
Программа "AutoRu...
PDJ_Anima
PHP 5 на примерах
Abbrevia
Измерение тактово...
Программирование ...
FilesInfo

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97832
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
В приведенном ниже...
выполнить привязку...
6.10. Обработка ф...
Регистрация в кази...
Игра 6 на 7 на Str...
Eastern women
Простой графически...
Стандартные подпро...
Блоки для построен...
Структура buf
Перестановка парам...
по любому протоколу
Унификация доступа...
Функции
Дополнительный ша...
Почему пользовател...
Проверка достоверн...
Пиктограмма для ре...
LOCATE (ОПРЕДЕЛИТЬ)
Оптимизация форума...
Трояны - это свои ...
Canon 1210 картридж
В программе предпо...
Форматы цифрового ...
Понятие модели и м...
Статистика



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


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