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

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

Моделирование работы ЭВМ на GPSS + Пояснительная записка
База данных электронного документооборота на Delphi + бд Intebase
Информационная система - продуктовый магазин на Turbo Pascal (База данны...

ИСПОЛЬЗОВАНИЕ ОТСЕЧЕНИЯ
Отсечение применяется для устранения бесконечных циклов, при программировании взаимоисключающих утверждений и при необходимости неудачного завершения доказательства цели. Рассмотрим все три случая на примерах.
Пример 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 November 05 2009 14:48:49 · 0 Комментариев · 7674 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Редактор анимаций
PHP: обучение на ...
Дешифратор содерж...
Создание меню на ...
Шкрыль А. - Разра...
Керниган Б.В., Ри...
DCAVI
Функции Visual Basic
Создание фракталов
PHP в примерах
Progressbar
IIIDTrans
Работа с матрицами
Род Стивенс. Delp...
Шифрование по алг...
Защита от спама ...
AlnComponents
С# для профессион...
ProLIB18
Indy in Depth Глу...

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20261
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Игровые автоматы д...
12.3. Пространство...
Q-деревья
Внимание - за вам...
Ламбда-подъем при ...
• L2TP не содержит...
Двоичная арифметика
Pin up - bir yerd&...
Invalid object fil...
Установка плагина ...
Континент дверной
Планирование трафи...
Наследование
Какие делать ставк...
Для редактирования...
Аффилиаты
Функции ввода-выво...
Метод onServiceCon...
Удаленные клиенты ...
Когда наступает по...
Программирование г...
ЭТАП 4. ПРИМЕР РЕА...
Глава 15
Шаблон типа regex
Кнопка с рисунком
Статистика



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


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