Навигация
Главная
Поиск
Форум
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
Содержание сайт... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Invision Power ... 65292
Организация зап... 63945
Модуль Forms 60857
Создание отчето... 60724
ТЕХНОЛОГИИ ДОСТ... 57045
Создание потоко... 56394
Пример работы с... 54286
Имитационное мо... 52494
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

Информационная система - продуктовый магазин на Turbo Pascal (База данны...
Моделирование работы обрабатывающего участка цеха в GPSS
Моделирование автовокзала + Отчет + Блок схема

Реклама



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

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


Процедура "вып". Единственным аргументом процедуры "вып" (сокращение от слова "выполнить") является запрос, который эта процедура выполняет. Если выполнение запроса окажется успешным, то процедура "вып" напечатает запрос с конкретизированными переменными, а затем спросит пользователя, не желает ли он посмотреть путь доказательства или получить иной ответ. Если ответов на запрос больше не существует, то процедура "вып" потерпит неудачу.
Использование процедуры "вып". Посмотрите, как процедура "вып" отвечает на запрос к нижеследующей базе данных "разновидность", содержащей сведения о разновидностях собраний, которые включают в себя другие вспомогательные собрания:

разновидность (собрание_38, собрание_381).
разновидность (собрание_381, собрание_382).
разновидность (собрание_39, собрание_391).
?- вып (разновидность (собрание_38, X)).
разновидность (собрание_38, собрание_381)



введите символ h для просмотри пути доказательства или символ ; для получения другого ответа.

Поскольку данный запрос может быть успешно выполнен, процедура "вып" печатает его, причем переменная Х унифицирована с константой «собрание_381». Теперь, если пользователь введет символ "h", процедура "вып" пояснит, как она выполнила запрос:
h
разновидность (собрание_38, собрание_381) содержится в программе.

Объяснение. Объяснение вырабатывается следующим образом. Если запрос унифицируется с фактом, содержащимся в текущей программе, то на печать выдаются текст запроса и слова «содержится в программе». Если запрос унифицируется с правилом, входящим в текущую программу, то печатаются запрос и вопросительный знак. Далее по этой же схеме печатаются подцели данного правила. Подцели выделяются при печати с помощью отступа.
Ниже приводится пример сеанса работы с процедурой "вып", который иллюстрирует выдачу объяснений этой процедурой. Обратите внимание на то, что форма объяснений отражает форму фраз, которые используются при выполнении запроса. Транзитивное отношение "имеет_отношение_к" основывается на приведенной выше базе данных "разновидность". Отношение "имеет_отношение_к" выражает то обстоятельство, что тема одного собрания может косвенно затрагивать тему другого, т.е через тему промежуточного собрания.

имеет_отношение_к (X,Y) :-
разновидность (X,Y).
имеет_отношение_к (X,Y) :-
разновидность (X,Z),
имеет_отношение_к (Z,Y).

?- вып (имеет_отношение_к (собрание_38, X)).
имеет_отношение_к (собрание_38, собрание_381) % первый ответ



введите символ h для просмотра пути доказательства или символ ; для получения другого ответа.
h

имеет_отношение_к (собрание_38, собрание_381) ?
разновидность (собрание_38, собрание_381) содержится в программе.

имеет_отношение_к (собрание_38, собрание_381)
введите символ h для просмотра пути доказательства или символ ; для получения другого ответа.
;

имеет_отношение_к (собрание_38, собрание_382) % второй ответ
введите символ h для просмотра пути доказательства или символ ; для получения другого ответа.
h

имеет_отношение_к (собрание_38, собрание_382) ?
разновидность (собрание_38, собрание_381) содержится в программе.
имеет_отношение_к (собрание_381, собрание_382) ?
разновидность (собрание_381, собрание_382) содержится в программе.

имеет_отношение_к (собрание_38, собрание_382)
введите символ h для просмотра пути доказательства или символ ; для получения другого ответа.
;
нет

Заметьте, что процедура "вып" повторно печатает запрос после ввода пользователем символа h.
Как работает процедура "вып". Единственным аргументом процедуры "вып" является запрос, который она далее передает процедуре "вып()". Процедура "вып()" возвращает структуру вида:

п (Запрос, ПутьДоказательства)

через свой второй аргумент. Здесь «Запрос» - это исходный запрос, а «ПутьДоказательства» - это структура, описывающая шаги, необходимые для доказательства запроса. В простейшем случае, когда запрос можно доказать по единственному факту, переменная «ПутьДоказательства» унифицируется со словами «есть_в_программе». Если запрос доказывается при помощи правила, то переменная «ПугьДоказательства» унифицируется с рекурсивной структурой "п", содержащей все подцели правила.
После конкретизации переменная «ПутьДоказательства» передается процедуре "спросить_у_пользователя". Эта процедура спрашивает пользователя, желает ли он просмотреть путь доказательства. В случае утвердительного ответа вызывается процедура "отобразить_путь", а в противном случае процедура "спросить_у_пользователя" терпит неудачу и процедура "вып()" возвращается назад для поиска другого ответа.

Реализация программы "вып"

% выполнить запрос.
вьп(Х) :-
вып() (Х,Р),
спросить_у_пользователя (X, Р).

спросить_у_пюльзователя (X, Р) :-
write (X), nl,
write (' введите символ h для просмотра пути доказательства '),
write (' или символ ; '),nl,
write (' для получения другого ответа.'),
nl,
get() (A),get0 (_), % ввод символа + перевод строки
А = 104, % ascii-код символа 'h'
отобразить_путь ('', Р), % "означает отсутствие отступа
!,
спросить_у_пользователя (X, Р).

% исходный случай: последняя фраза была фактом.
% + -
% Запрос Путь
вып()(true, есть_в_программе) :- !.
% составной запрос; вернуть Р1, соединенную с Р2 запятой
вып()(А, Б), (Р1, Р2)) :-
!,
вып()(А, Р1),
вып()(Б, Р2).

% простой запрос; вернуть структуру п( )
вып()(А,п (А,Р1)):-
clause (А, Тело),
вып() (Тело,Р1).

% отобразить путь выполнения:
% + +
отобразить_путь (Отступ, п (Фраза, есть_в_программе)) :-
write (Отступ), write (Фраза),
write ( содержится в программе.'), nl, !.

% первая подцель составного запроса
отобразить_путь (Отступ, п (Фраза, (Подцель, Подцели)) ) :-
сцепить (Отступ,' ', НовыйОтступ),
отобразить_путь (НовыйОтступ, Подцель),
!,
отобразить_путь (НовыйОтступ, Подцели).

% остальные подцели составного запроса
отобразить_путь (Отступ, (Подцель, Путь)) :-
отобразить_путь (Отступ, Подцель),
!,
отобразить_путь (Отступ, Путь).

отобразить_путь (Отступ, п (Фраза, Путь)) :-
write (Отступ), write (Фраза),
write (' ? '), nl,
сцепить (Отступ,' ', НовыйОтступ),
!,
отобразить_путь (НовыйОтступ, Путь).

% + + -
сцепить (X, Y, Z) :- % сцепить два атома
name (X, Хсписок),
name (У, Усписок),
присоединить (Хсписок, Усписок, Z список),
name (Z, Zсписок),!.




Доказательство факта. Лучше всего можно будет понять работу процедуры "вып", если рассмотреть входную и выходную информацию ее подцелей. Посмотрите, что получится, если на вход процедуры "вып()" поступит запрос, который является доказуемым по факту:

?- вып() (разновидность (собрание_38, X), ПутьДоказательства).




Процедура "вып()" вызовет подцель "clause", которая унифицирует переменную Х с константой «собрание_381», а переменную «Тело» - с «true», так как «разновидность (собрание_38, собрание_381)» — это факт.
Следующий вызов процедуры "вып()" будет эквивалентен такому
запросу:

?- вып() (true, P1).
Р1 = есть_-в_программе




Ответ на этот запрос получен по первому правилу "вып()". Значение переменной Р1 передается далее и становится частью структуры "п", которая '''возвращается через предыдущий вызов "вып()":

ПутьДоказательства = п (разновидность (собрание_38, собрание_381), есть_в_программе)

Доказательство правила. Предположим, что на вход процедуры "вып()" поступает запрос, который можно доказать только при помощи правила:

?- вып() (имеет_отношение_к (собрание_38, X), Путь). %(1)




Этот вызов согласуется с третьим правилом процедуры "вып()". Подцель "clause" этого правила эквивалентна запросу:

?- clause (имеет_отношение_к (собрание_38, X), Тело1). %(2)
Тело1 =" разновидность (собрание_38, X).




Подцель "вып()" данного правила эквивалентна:
?- вып() (разновидность (собрание_38, Х), Р1). %(3)
P1 =n(разновидность (собрание_38, собрание_381), есть_в_программе)




А этот запрос - точно такой же, как и проанализированный ранее. Теперь запрос (1) к процедуре "вып()"даст следующий результат:

Путь = п (имеет_отношение_к (собрание_38, собрание_381), п (разновидность (собрание_38, собрание_381),
есть_в_программе))




Показ цепочки выводов. Требование просмотреть путь доказательства вызовет серию обращений к процедуре "отобразить, путь", что эквивалентно следующим запросам:
?- отобразить_путь (' ' ,п (имеет_отношение_к (собрание_38. собрание_381),
п (разновидность (собрание_38, собрание_381), есть_в_программе))).




имеет_отношение_к (собрание_38, собрание_381) ?
?- отобразить_путь (‘ ‘, п (разновидность (собрание_38, собрание_381), есть_в_ программе)).



разновидность (собрание_38, собрание_381) содержится в программе.

Ограничения программы "вып". В приведенной версии программы "вып," не моделируется действие предиката "сократить". Если на вход программы "вып" подать запрос к процедуре, содержащий предикат "сократить", то этот предикат будет трактоваться как всегда истинная подцель. Предикат "сократить" не остановит процесс поиска с возвратом, выполняемый этой процедурой
Опубликовал Kest October 24 2010 23:09:00 · 0 Комментариев · 3446 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PCXReader. Програ...
IPAddresseEdit
NotePad Pro [Исхо...
ИНТЕРНЕТ ПРОГРАММ...
Игра в крестики н...
IpEditAdress
Программирование ...
Win-Prolog 3.618
CLR via C#
Шкрыль А. - Разра...
Архив программ
Последнее загруж...
База данных фильм...
PBEditPack
Сапёр
Защита от спама ...
SMExport
Измерение тактово...
FilesInfo
Динамические за...

Топ загрузок
Приложение Клие... 100376
Delphi 7 Enterp... 83098
Converter AMR<-... 20046
Borland C++Buil... 11180
GPSS World Stud... 10916
Borland Delphi ... 8128
Turbo Pascal fo... 6973
Visual Studio 2... 4963
Калькулятор [Ис... 4364
FreeSMS v1.3.1 3510
Случайные статьи
Pikavippi s-pankin...
Как быть, если ни ...
Гарантирует, что п...
Приемы безопасного...
ИЗМЕНЕНИЕ МАРШРУТО...
Работаем с FTP на ...
Эппель обрабатывал...
Интерактивные зака...
Счетчик ссылок vnode
Проектирование экр...
Самоуправление или...
Оболочка независим...
ИСПОЛЬЗОВАНИЕ ОТСЕ...
Раскрытая запись а...
Множество. Формат
Групповые функции
РЕЖИМ "КОНСУЛЬТАЦИЯ"
Приложение RADIUS ...
Упражнение 2: прое...
Получение индексны...
информационно – сп...
Операционная систе...
Применение каскадн...
Свойства ARM
Бюджеты и инфографика
Статистика



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


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