В.Н. Пильщиков - Язык Плэнер (1156455), страница 28
Текст из файла (страница 28)
Функция ТЕМР применяется в тех случаях, когда надо проверить, может ли быть вычисление некоторого выражения успешным или. нет, и когда надо при любом исходе сразу же уничтожить все следы этой проверки. Например, рассмотренная в 1 3.3 функция РАТН при поиске пути в графе иаменяет аначения переменных иа предикатов и операторов графа, и если она находит - путь, то аиачения этих переменных оказываются отличными от начальных вначений. Когда мы хотим определить, существует ли путь в графе, но не хотим, чтобы при этом менялись значения переменных, следует вычислить выражение [ТЕМР [РАТН А С]]. Здесь функция РАТН все же иамеиит эначения переменных, но затем функция ТЕМР восстановит их начальные аначения.
Следующие блочные функции представляют собой компоэиции трех предыдущих функций с функцией РВОС: [РРКОС (и~ и» ... и ) е~ е» ... е»], РЯ()ВВ, т) О; й ) 1 [ЯРВОС (и~ и» ... и„) е~ е» ... е»], РЯОВК, т) О, )е ) 1 [ТРВОС (и~ и» ... и,) е~ е» ... е»], РЯОВВ, т >~ О, )«~ >1 Любая иа этих функций вычисляется так же, как и функция РВОС, но перед выходом иа нее (по ВЕТБК3) или после того, как выполнен последний оператор е») выполняются те же «выходяые» действия, что и в функциях РЕЕМ, ЯТКС или ТЕМР соответственно.
Например, при выходе из функции ЯРКОС уничтожают ся все Р-точки, поставленные при вычислении ее тела, но сохраняются обратные операторы. Отметим, однако, что при выходе из этих функций, осуществляемом с помощью функции 60 или ЕХ1Т, «выходные» действия не выполняютея.
Все предыдущие функции этого параграфа можно использовать только тогда, когда известно эаранее, что Р-точки и/или обратные операторы должны быть уничтожены. Но бывает и так, что мы не внаем об атом ааранее и уанаем об этом поаже, когда вычисления уже начаты. В таких ситуациях применяются встроенные функции РЕКМЕХ, ЯТКСЕХ, ТЕМРЕХ и РА1ЬЕХ, которые подобно функции ЕХ1Т осуществляют выход иэ некоторой 133 объемлющей процедуры, уничтожая при этом Р-точки и/или обратные операторы внутри данной процедуры.
Функция РЕВМЕХ: [РЕВМЕХ е?л и?], ЯПВК. Эта функция действует. аналогично функции ЕХ1Т (см. 3 1Л8 и 2.8), т. е. осуществляет выход со аначением Б из (У+1)-й объемлющей процедуры с .именем РУ, но перед выходом оиа уничтожает все Р-точки и обратные операторы, появившиеся с начала вычисления данной процедуры (для встроенных процедур класса ЯПВК и определяемых процедур — с того момента, как началось вычисление их аргументов). Функция ЯТК6ЕХ: [ЯТВСЕХ е?и л?], БОВЕ. Данная функция действует аналогично функции РЕКМЕХ, по уничтожает только Р-точки. Функция ТЕМРЕХ: [ТЕМРЕХ е?л и?], ЯПВВ.
Эта функция действует так же, как функция ЯТВСЕХ, по дополнительно еще выполняет все обратные операторы, запомненные с начала вычисления процедуры, иа которой сейчас осуществляется выход. Функции РА1ЬЕХ«[РА1ЬЕХ е?л л?], БПВК. И зта функция осуществляет выход из (Ж+ 1)-й и объемлющей процедуры с именем Р?У, но выход по неуспеху: функции уничтожает все Р-точки, поставленные внутри данной процедуры, и вырабатывает неуспех, связывая с ним сообщение.Е. Таким обрааом, по этому неуспеху происходит возврат к развилке, которая была определена до начала выполнения данной процедуры РХ Отметим, что при выходе из функций РЕЕМ, БТКС, ТЕМР, РРКОС, ЯРВОС и ТРКОС, осуществляемом функцией РЕВМЕХ, ЯТВСЕХ, ТЕМРЕХ или РА1ЬЕХ, выполняются «выходные? действия последних функций.
Приведем пример использования рассмотренных функций: [РКОС (Х) [АЬТ () [КЕТОВ)«? Т]] [БЕТ Х [ФБ]] [605)О ([ЕО [5 .Х] 2] [РА11ЕХ (5 2) РВОС]) ([Е«) [ — 2 .Х] 6] [РЕВМЕХ (7 6) РВОС]) (Т [РА1Ц)] ])] Если в задаче о восьми фераях существует решение, в котором один иа фераей расположен на 5-й горизонтали и 2-й вертикали, тогда данное, выражение вырабатывает неуспех с сообщением 134 (5 2).
Если же есть решение, где один иэ ферзей находится на 7-й горизонтали и б-й вертикали, тогда все Р-точки и обратные операторы внутри этого выражения уничтожаются, а само выражение успешно и имеет аиачеиие (7 6). В остальных случаях значением выражения является атом Т. 3.7. Именованные развилки Раавилки, которые мы до сих пор рассматривали, не идентифицируются. Если воэвраты по неуспеху происходят только к поь следним развилкам, то рааличать развилки и ие нужно, Но если требуется осуществить возврат к какой-то предыдущей раавилке, то воаникает проблема: каким образом указать эту раавилку? В некоторых случаях здесь помогает рассмотренная в предыдущем параграфе функция РА1ЬЕХ.
С ее помощью можно осуществить возврат к развилке, что была определена до входа в какую-то объемлющую процедуру. Однако другие развилки, например те, что остались в процедурах, уже'аакончнвших свою работу, оказываются недоступными. В связи с этим в планере разрешено давать развилкам имена, чтобы затем можно было ссылаться на эти развилки и осуществ-' лять воаврат к ним по неуспеху. ФУикЦиа РР: 1РР вате е1 еэ ... еа1, РЯ)ВВ, й) 1. Эта функция действует точно так же, как функция АЬТ, т. е: определяет развилку, Ьй альтернативой которой является вычисление формы еь ио в дополнение к атому функция РР дает имя своей раавилке, которое задается аргументом вате.
Данный аргумент должен быть атомом или ;переменной, аначением которой является атом; этот атом и есть имя развилки. Осуществить возврат по неуспеху к раавилке, имеющей имя, можно с помощью функции РА11,. В 1 3,2 были рассмотрены обращения к этой функции с одним аргументом или беэ аргументов. Допускается также обращение с двумя аргументами: [РАН е а), В()ВВ.
Значением первого аргумента, как и раньше, может быть любое выражение Е, а вот значением второго аргумента должен быть какой-либо атом А. Функция РА1Ь уничтожает все Р-точки, пот ставленные после того, как была определена развилка с именем А, и вырабатывает обычный неуспех, связывая с ним сообщение Е. Тем самым этот неуспех вернет программу к развилке с именем А. Если раавилок с именем А несколько, то воаврат происходит к последней иэ ннх. Если же таких раэвилок вообще нет, то осуществляется выход по неуспеху на верхний уровень программы 135 вычнсление текущего выражения программы оказывается неуопешным.
Рассмотрим следующий пример. Предположим, что некоторое дерево задается своим корнем Я и функцией ДОЧВЕРШ, которая по названию любой вершины дерева выдает список названий всех ее дочерних вершин. Требуется определить, есть ли.ввтом дереве хотя бы одна вершина на уровне, глубина которого больше заданного чдсла Ы. (Считаем, что корень дерева находится на нулевом уровне, его дочерние вершины в на первом уровне л т, д.) Решение втой задачи может быть описано в виде следующей функции: [ПЕР!НЕ УРОВ (1АМВВА (Б Х) [РВОО ((К 0)) [РР 1 () [ВЕТПВН [ХЕ() [МЕБЯ] АМОКО]]] 1 [БЕТ Я [АМОКО [ДОЧВЕРШ .Я]]] [АВВ1 К] [СОНЕ ([ЬЕ .К .Х] [60 Ц)] [РА1Ь Т 1]])] Данная функция ведет поиск в глубину выбирает какую-то ветвь дерева и исследует ее до конца или до уровня Н+ 1.
Число К указывает уровень рассматриваемой в данный момент вершины Я. Если К не больше Х, а Б — концевая вершина, то функция ДОЧВЕРШ в качестве своего значения выдает пустой список, поэтому функция АМОКО вырабатывает неуспех (с сообщением АМОКО), по которому присходит возврат к предыдущей вершине дерева, и далее рассматривается другая ветвь от атой предыдущей вершины. Если глубина дерева ие превосходит Н, то будут просмотрены все вершины дерева и в конце концов программа вернется к функции РР по неуспеху, с которым связано сообщение АМОНО.
В данном случае значение функции УРОВ равно (). Но если при просмотре дерева была найдена вершина на более глубоком; чем Х, уровне, 'тогда поиск ораву же прекрап(ается и вырабатывается неуспех с сообщением Т, который, минуя зсе развилки, соответствующие точкам ветвления дерева,распространится до функции РР. В данном случае значениям функции УРОВ. является атом Т. 3.8. Функции «к и Г1]Ч0 В планере проверку каких-либо условий можно оформить не только в виде функций-предикатов, принимающих значения «истина> и «ложь», но и в виде функций, вычисление которых успешно, если проверяемое условие выполнено, и неуспешно в противном случае. Таковы, найример, рассмотренные выше функ.- ции БОМ, ФБ и РАТН.
Если для работы с преднкатами использу- 1ЗБ ется функция СОг)О, то для работы с функциями второго типа в языке испольауетсн встроенная функция 1Р, обращение к которой можно рассматривать как условное выражение, реагирующее на успех/неуспех. Как и у функции СОг)О, аргументы функции 1Р называются клаузами, а их пер;зые злемеиты — условиями. Обращение к этой функции имеет следующий вид; [1Р.(е е ... етщ ) [еа е„... е, )], РВОВК, Функция 1Р прежде всего ставит Р-точку, а' затем по очереди вычисляет условия ес Если вычисление очередного условия неуспешно, то выработанный при этом неуспех будет «пойман» данной Р-точкой, после чего функция переходит к вычислению условия иэ' следующей клаузы. Если окажется, что все условия не-. успешны, функция уничтожит свою Р-точку и успешно закончит работу со значением ( ).