Доказательство факта

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

| ?-- выпО (owns (ибм, X), ПутьДоказательства).

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

Следующий вызов процедуры "вып0" будет эквивалентен такому запросу:

| ?- выпО (true,P1).

P1 = есть_в_программе

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

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

Доказательство правила

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

| ?-выпО (holds (ибм, X), Путь). %(1)

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

| ?— clause (holds (ибм, X), Тело!). %(2)

Тело1=own(ибм,X).

Подцель "вып0" данного правила эквивалентна:

| ?- выпО (owns (ибм, Х),Р1). %(3)

Р1 =n(owns (ибм, ролм), есть_в_программе)

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

Путь = п (holds (ибм, ролм), п (owns (ибм, ролм),

есть _в_программе))

Показ цепочки выводов

Требование просмотреть путь доказательств вызовет серию обращений к процедуре "отобразить- путь", что эквивалентно следующим запросам'.

| ?— отобразить—путь (", п(holds (ибм, ролм),

п(owns (ибм, ролм), есть_в_ программе))).

holds (ибм, ролм) ?

| ?— отобразить_,путь (' ', п (owns (ибм, ролм), есть_в_-программе)). owns (ибм, ролм) содержится в программе.

Ограничения программы "вып"

В приведенной версии программы "вып" не моделируется действие предиката "сократить". Если на вход программы "вып' подать запрос к процедуре, содержащий предикат "сократить", то этот предикат будет трактоваться как всегда истинная подцель. Предикат "сократить" не остановит процесс поиска с возвратом, выполняемый этой процедурой.

7.3. Видимый пролог

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

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

":Конец базы данных Х". Приведем пример запроса.

| ?- вид (holds (ибм, X)).

% Заголовок первого правила "holds"

подцель=hоlds (ибм, _0) элeмeнтбд=holds (_38, _42) У

noдцeль=owns(uбм,_0) элeмeнтбд=owns (ибм, ролм) У

holds (ибм, ролм)

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

для получения другого ответа

;

noдцeль=owns(uбм, _0) элeмeнтбд=owns (ролм, дейтапойнт) Н

подцель= owns (ибм, _0) элeмeнтбд=owns (атт, телетайп) Н

: Конец базы данных owns.

% Заголовок второго правила "holds"

подцель=hоlds(ибм,_0) элементбд=holds(_38,_42) У

подцель= owns (ибм, _78) элементбд=оwns (ибм. ролм) У

подцель=hоlds(ролм, _0) элeмeнтбд=holds(_339, _343) У

подцель=оwns (ролм,_0) элементбд-=оwns(ибм, ролм) Н

подцель=оwns(ролм. _0) элементбд=оwns(ролм, дейтапойнт) У

holds (ибм, дейтапойнт)

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

получения другого ответа

подцель=оwns (ролм, _0) элeмeнтбд=owns (атт, телетайп) Н :

:Конец базы данных owns.

noдцeль=holds(poлм,_0) элементбд= holds (_339,_343) У

подцель=owns(ролм, _379) элeмeнтбд=owns (ибм, ролм) Н

noдцeль=owns(poлм, -379) элeмeнтбд=owns(poлм, дейтапойнт)У

подцель=holds (дейтапойнт, _0) элeмeнтбд=holds(_702,_706) У

под цель=owns (дейтапойнт, _0) элeмeнтбд=owns (ибм, ролм) Н

noдцель=owns (дейтапойнт,_0) элeмeнтбд=owns (ролм.

дейтапойнт) Н

noдцeль=owns (дейтапойнт, -0) элeмeнтбд=owns(aтт, телетайп) Н

: Конец базы данных owns.

noдцeль=holds (дейтапойнт, -0) элементбд=holds (-702, _70б) У

подцель= owns (дейтапойнт, -742) элeмeнтбд=owns (ибм, ролм) Н

подцель=owns (дейтапойнт, _742) элeмeнтбд=owns(poлм,

дейтапойнт) H

noдцeль=owns (дейтапойнт_742) элементбд= owns (атт

телетайп) Н '.

:Конец базы данных owns.

:Конец базы данных holds.

подцель= owns (ролм, -379) элeмeнтбд=owns (атт, телетайп) Н

: Конец базы данных owns.

: Конец базы данных holds.

noдцeль=owns(uбм, _78) элeмeнтбд=owns (ролм. дейтапойнт)H

подцель=owns(ибм,_ 78) элементбд=owns(атт, телетайп) Н

: Конец базы данных owns.

: Конец базы данных holds.

нет

Посмотрите, как много времени тратится впустую на поиск несуществующего третьего ответа.

Соседние файлы в папке Гл.6,7,Прилож.,Допол