Автоматический просмотр выполнения программы

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

1) построить подробные диаграммы активных запросов (аналогичные диаграммам из данной главы), которые описывают действия, предпринимаемые интерпретатором;

2) воспользоваться отладочными средствами Вашего интерпретатора для наблюдения за ходом выполнения программы; или

3) ввести программу "вид" из разд. 7, 3 и использовать ее для наблюдения за ходом выполнения программы.

3.2. Предикат "сократить" Пространство поиска запроса

Пространство поиска запроса - это множество всех возможных ответов, рассматриваемых интерпретатором при выполнении запроса. В предыдущем разделе были полностью исследованы пространства поиска запросов к правилам "дядя" и "регистрация". Ясно, что часть пространства поиска запроса "регистрация" - когда интерпретатор пытается найти второй возраст Брайена — не влияет на способность программы находить правильные ответы. Эту часть пространства поиска можно отбросить с целью повышения эффективности работы программы.

Предикат "сократить" останавливает возврат назад

Существует специальный встроенный предикат "сократить" (записывается как символ !), который дает указание интерпретатору не возвращаться назад далее той точки, где стоит этот предикат. Предикат "сократить" применяется главным образом для уменьшения размера пространства поиска запроса. Этим предикатом, однако, следует пользоваться с осторожностью. Он не имеет четкого декларативного смысла (т. е. он всегда будет истинным), поэтому при употреблении данного предиката будет наноситься некоторый ущерб понятности программы. Наличие предиката "сократить" может непредвиденным образом нарушить работу программы.

Предикат "сократить" по-разному действует на составной запрос и на множество фраз, образующих процедуру. Эти два вида действия предиката четко различаются между собой.

Влияние предиката "сократить" на составной запрос

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

Пример составного запроса с предикатом "сократить":

|? -a (X), b (Y),!, c (X, Y, Z).

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

Этот составной запрос не обладает декларативным смыслом. При процедурном подходе, однако, его можно прочесть так:

Взять значение переменной Х из подцели "а"

и значение переменной Y из подцели "b ",

а затем выполнить подцель с (Х, Y, Z).

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие