Навигация
Главная
Поиск
Форум
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
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 64161
Модуль Forms 63868
Пример работы с... 60752
ТЕХНОЛОГИИ ДОСТ... 60751
Имитационное мо... 56272
Реклама
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

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

Моделирование системы управления качеством производственного процесса на...
Информационная система - продуктовый магазин на Turbo Pascal (База данны...
Моделирование процесса обеспечивающего надежность функционирования АСУ Т...

Реклама



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

ПОДПИСЫВАЙСЯ на канал о программировании
Управление механизмом вывода в Прологе


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

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 18:14:49 · 0 Комментариев · 6322 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Приложение Клиент...
Delphi 6. Учебный...
Секреты программи...
Моделирование дви...
Система баннеро-о...
Delphi 2005 для W...
Мониторинг сервер...
Task Shedule
PHP: обучение на ...
C# Учебный курс
Шейдеры в Delphi
HTMLredaktor
C++ Builder: Книг...
Text3D
Интерактивный инт...
EMS QuickExport S...
Основы программир...
Cтатьи Королевств...
DiskInfo
C++ Builder 6 СПР...

Топ загрузок
Приложение Клие... 100455
Delphi 7 Enterp... 86133
Converter AMR<-... 20071
GPSS World Stud... 12522
Borland C++Buil... 11608
Borland Delphi ... 8522
Turbo Pascal fo... 7035
Visual Studio 2... 4992
Калькулятор [Ис... 4744
FreeSMS v1.3.1 3539
Случайные статьи
Другие типы вращен...
Пример создания пр...
Учительский практи...
Ограничение объясн...
Объяснение решения
ЛОГИЧЕСКИЕ КЛЮЧИ
Как заполнять ране...
Компоненты DOA
СGІ-запрос
Изменение последов...
Генератор имен (ге...
Рекурсивное вычисл...
Онлайн казино. Игр...
Классы
Интерфейс UNIX
Символьные строки....
к ресурсам в сети ...
Клининговые компан...
Динамические маршр...
Что часто является...
сможете настроить ...
Метод обобщённого ...
Операнды компьютер...
Меню
Визуальные аффекты
Статистика



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


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