Навигация
Главная
Поиск
Форум
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
Бип из системно... 64031
Организация зап... 60451
Invision Power ... 60044
Приложение «Про... 59949
Оператор выбора... 58877
Модуль Forms 58183
Подключение Mic... 57884
Создание отчето... 57616
ТЕХНОЛОГИИ ДОСТ... 53931
Программируемая... 52091
Пример работы с... 50079
Имитационное мо... 49348
21 ошибка прогр... 44239
Реклама
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

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

Моделирование литейного цеха на GPSS + Пояснительная записка
Сравнение двух бинарных деревьев на 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 25 2010 00:09:00 · 0 Комментариев · 3253 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Animated Menus
Создание меню на ...
Архив значков
Crypt32
Printgrid
Меню проводника в...
PBEditPack
Добавление басса ...
Мод "register.php...
Borland Delphi 6....
Программирование ...
SUIPack
Редактор анимаций
Размещение элемен...
C# Учебный курс
JanReplace
Пример OpenGL гра...
Последние загруж...
Запрет гостям ск...
Zoom [Исходник на...

Топ загрузок
Приложение Клие... 100341
Delphi 7 Enterp... 80556
Converter AMR<-... 20029
Borland C++Buil... 10871
GPSS World Stud... 9967
Borland Delphi ... 7902
Turbo Pascal fo... 6925
Visual Studio 2... 4931
Калькулятор [Ис... 4178
FreeSMS v1.3.1 3492
Случайные статьи
Переходить ли в но...
Подготовка к хакингу
Отключение шифрова...
Выбор доменного им...
8.6. Принципы
Межмодульные перем...
2. RADIUS-прокси т...
Функции GetX и Get...
Применение протоко...
Необходимые компле...
Поиск минимума фун...
ММ С.2.
Если импульсный от...
Расстановка, или С...
Группа блоков созд...

HTPC на базе Windows
Обсуждение структу...
Объектно-ориентиро...
Кодирование
Определение версии...
Pointer type Ident...
Модные кроссовки 2017
показана куча из 1...
Безопастность Dial...
Статистика



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


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