Навигация
Главная
Поиск
Форум
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
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
21 ошибка прогр... 63301
Реклама
Сейчас на сайте
Гостей: 4
На сайте нет зарегистрированных пользователей

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

Моделирование круглосуточного интернет кафе на GPSS + Отчет
Моделирование работы класса персональных компьютеров на GPSS + Отчет + Б...
Создание последовательности окон и передвижение окон по экрану на Turbo ...

Реклама



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

ПОДПИСЫВАЙСЯ на канал о программировании
ИСПОЛЬЗОВАНИЕ ОТСЕЧЕНИЯ
Отсечение применяется для устранения бесконечных циклов, при программировании взаимоисключающих утверждений и при необходимости неудачного завершения доказательства цели. Рассмотрим все три случая на примерах.
Пример 1. Устранение бесконечных циклов. Вновь обратимся к утверждениям, определяющим вычисление факториала (см. тему «Рекурсия»).
'факт'(0,1).
'факт'(K,F): - К1 is К-1, 'факт'(К1,F1), F is F1*К.



Введя запрос:
?- 'факт'(0,X).



получим
X=1 -> ;



Если мы поставим <;>, т.е. запросим еще решения, то Пролог сделает попытку сопоставить 'факт'(0,Х) со вторым утверждением 'факт'(К,F): -.. . Сопоставление успешно, и теперь делается попытка доказать цель 'факт'(-1,F1), что в свою очередь приводит к цели 'факт'(-2,F2) и так далее, т.е. образуется бесконечный цикл.
К счастью, можно устранить такие ситуации, используя отсечение, и тем самым указывая Прологу, что не существует других решений в случае успешного согласования граничного условия.
'факт'(0,1):-!.
'факт'(К,F):-К1 is К-1,'факт'(К1,F1),F is F1*К.



Учитывая данное определение 'факт' и задавая вопрос:
? - 'факт'(0,Х).



получаем единственное решение:
X=1 -> ;
no



Пример 2. Программирование взаимоисключающих утверждений. При оценке роста человека чаще всего пользуются не числовыми данными, а качественными определениями, например "Человек высокого роста" или "Он был ниже среднего роста". Можно связать эти качественные оценки с числовыми данными (Н - высота человека, см), например, следующим образом:
ОЧЕНЬ_ВЫСОКИЙ, если Н>200;
ВЫСОКИЙ, если 170<Н<=200;
РОСТ= ВЫШЕ_СРЕДНЕГО, если 160<Н<=170;
СРЕДНИЙ, если 150<Н<=160;
НИЖЕ_СРЕДНЕГО, если 140<Н<=150;
МАЛЕНЬКИЙ, если Н<140.



Тогда описать классификацию людей по росту можно с помощью следующих утверждений языка Пролог:
/* первый вариант программы */
'рост'(Н,'ОЧЕНЬ ВЫСОКИЙ'):- Н>200.
'рост'(Н,'ВЫСОКИЙ'):- Н>170,Н=<200.
'рост'(Н,'ВЫШЕ СРЕДНЕГО'):- Н>160,Н=<170.
'рост'(Н,'СРЕДНИЙ'):- Н>150,H=<160.
'рост'(Н,'НИЖЕ СРЕДНЕГО'):- Н>140,H=<150.
'рост'(Н,'МАЛЕНЬКИЙ'):- Н<140.
/* второй вариант программы */
'рост1'(Н,'ОЧЕНЬ ВЫСОКИЙ'):- Н>200,!.
'рост1'(Н,'ВЫСОКИЙ'):- Н>170,!.
'рост1'(Н,'ВЫШЕ СРЕДНЕГО'):- Н>160,!.
'рост1'(Н,'СРЕДНИЙ'):- Н>150,!.
'рост1'(Н,'НИЖЕ СРЕДНЕГО'):- Н>140,!.
'рост1'(Н,'МАЛЕНЬКИЙ').



В первом варианте программы тело каждого правила содержит все условия, описывающие человека данной категории, во втором варианте все правила, кроме последнего, содержат знаки отсечения "!".
В первом варианте программы при возврате независимо от уже найденного единственно верного решения вновь будут безуспешно просматриваться все остальные, лежащие ниже решения. На это затрачивается много времени. Во второй программе благодаря отсечению просмотр остальных решений производиться не будет. Рассмотрим, что произойдет, если знаки отсечений удалить из утверждений. Тогда в ответ на запрос типа
? -'рост'(175,Х).
X='ОЧЕНЬ ВЫСОКИЙ' --->;
X='ВЫСОКИЙ' --->;
X='ВЫШЕ СРЕДНЕГО'-->;
X='СРЕДНИЙ'-->;
X='НИЖЕ СРЕДНЕГО'-->;
X='МАЛЕНЬКИЙ'-->;
no



будет получено несколько решений, из которых только первое верно, а остальные ошибочны. Таким образом, в данной программе отсечение несет двойную функцию: благодаря сокращению пространства поиска уменьшает время решения и, главное, отсекает неправильные варианты ответов на запрос, позволяя получить единственно правильное решение.
Чтобы определение роста стало полностью корректным, необходимо рассмотреть и такие случаи, когда значение Н задается либо меньшим 20 см, либо слишком большим(>300 см). И в том и в другом случаях доказательство должно завершаться неудачей (т.к. иметь подобный рост для человека нереально). Для этого во вторую программу введем еще одно утверждение:
'рост3'(Н,_) :- (Н<20;H>300),!,fail.
'рост3'(Н,'ОЧЕНЬ ВЫСОКИЙ'):- Н>200,!.
'рост3'(Н,'ВЫСОКИЙ') :- Н>170,!.
'рост3'(Н,'ВЫШЕ СРЕДНЕГО'):- Н>160,!.
'рост3'(Н,'СРЕДНИЙ') :- Н>150,!.
'рост3'(Н,'НИЖЕ СРЕДНЕГО') :- Н>140,!.
'рост3'(Н,'МАЛЕНЬКИЙ').
и обратимся к системе с запросом:
? - 'рост'(0,Х).
no



Сначала произойдет сопоставление запроса с головой первого утверждения. Цель (H<20; H>300) будет достигнута. Затем будет доказана цель - отсечение. Но когда встретится предикат fail, стоящий перед ним предикат отсечение остановит работу механизма возврата. В результате ответом на запрос будет "нет" (no). Преимущество введения предиката fail заключается в том, что выделяются случаи, когда доказательство утверждений должно закончиться неудачей.




Опубликовал Kest Ноябрь 05 2009 17:48:49 · 0 Комментариев · 7103 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Domen Name IP
Динамические за...
Delphi 6. Учебный...
ActiveX в Delphi
Профессиональное ...
mmmJlabel
Еext Editor
Создание фракталов
Delphi Russian Kn...
MicroGPSS Studen ...
Dnavigator
«Философия» прогр...
Исправление проц...
Базы данных в Инт...
Размещение элемен...
около 291 статьи ...
3d Tank [Исходник...
Советы по Delphi
Модифицированная ...
Pass [Исходник на...

Топ загрузок
Приложение Клие... 100575
Delphi 7 Enterp... 93776
Converter AMR<-... 20125
GPSS World Stud... 16139
Borland C++Buil... 13484
Borland Delphi ... 9443
Turbo Pascal fo... 7150
Калькулятор [Ис... 5358
Visual Studio 2... 5055
FreeSMS v1.3.1 3578
Случайные статьи
Все о языках-прогр...
Предпосылки создан...
Поддержка модема в...
Поддержка только о...
Программирование: ...
Разработка ПО.
Использование DLL ...
зательно
• Модернизированны...
Как я обращался в ...
Пример кода програ...
УНАСЛЕДОВАТЬ, ВКЛЮ...
Audit System Event...
Архивация данных в...
Сейчас в Интернете...
Пример: интрузивны...
9.4. Присоединени...
РАЗДЕЛЫ КНИГИ
8.5. И что это зна...
Прибор для проверк...
Смерть
Элементы управлени...
Понятие функтора
Вулкан Чемпион каз...
Неподвижная точка
Статистика



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


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