В.Н. Пильщиков - Язык Плэнер, страница 8
Описание файла
DJVU-файл из архива "В.Н. Пильщиков - Язык Плэнер", который расположен в категории "". Всё это находится в предмете "искусственный интеллект" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 8 - страница
Когда список Ь1 станет пустым, то согласно условному оператору произойдет. выход из блока со эначением, равным последнему вна-- ченкю переменной К1 В данном примере идентификатор Ь испольэовался и как метка, н как переменная. Это не ошибка. В плэнере имена переменных, имена меток и имена процедур могут совпадать. Это ле выэывает путаницы, поскольку повиция, в которой находится идентификатор, однозначно определяет, какой объект обозначен данным идентификатором. [ЛО. Циклы С помощью описанных в предыдущем параграфе средств можно организовать любые циклические вычисления. Однако для удобства написания циклов в ябык встроены специальные функции, которые мы н рассмотрим в этом параграфе.
Один из типичных циклов, испольауемых в плэнерских программах,— это цикл по элементам некоторого списка: определен- 38 ные действия должны быть повторены для каждого элемента данного списка. Примером подобного цикла может служить задача ° переворачивания» списка, рассмотренная в предыдущем параграфе. Возможный способ организации таких циклов ааключается в том, что от списка постепенно отщепляется по одному элементу и для этого элемента выполняются требуемые действия. Если список является, скажем, значением переменной Ь, то схема этого цикла талона: А [СОХО ([ЕМРТУ .Ц [ОО В])] [ЯЕТ Е [1.Ц] [ЯЕТ 1 [КЕЯТ 1,Ц] [ОО А] В Здесь в начале каждого шага цикла выполняются одни и те же действия: проверяется, не пуст ли список Ь, и, если не пуст, выделяется его первый элемент, который присваивается некоторой переменной Е, а список иэ остальных элементов делается новым значением переменной Е. Для сокращения записи этой группы действий в язык встроена Функция ЛХ: [Г1М й»»], ВОВК.
Значениями обоих аргументов должны быть имена переменных, описанных в одном из объемлющих блоков, причем переменная 1» обязана иметь значение. Если им является непустой список, тогда функция присваивает первый элемент этого списка переменной йь а «хвосг» списка, т. е. список из остальных элемеитов,— переменной йц значение функции в данном случае равно (). При любом другом значении переменной 1» (пустом списке или атомарном выражении) функция ничего не декрет, ее значение— атом Т. Подчеркнем, что значениями аргументов функции Р1г( должны быть просто имена переменных, без всяких префиксов.
В пла-. нере, вообще, действует правило: если аргумент некоторой функции — это переменная, которой функция будет что-то присванватть то имя этой переменной укааь»вается беа префиксов. Используя функцию Р1Х, описанную выше схему цикла па алементам списка П можно упростить: А [СОг)Р ([Р1г( Е Ц [ОО В])] [00 А] В 39 Например, «перевернуть» список, явлнющийся значением переменной Ь, можно так: [РВ06 (Ь1 (ВЬ ( ) ) Е) [БЕТ 1Л .Ц А [СОЫП ([Р1Ы Е Ь1) [ВЕТПВЫ .В1])) [БЕТ ВЬ (.Е ),ВЬ)) [60 А)] Во многих случаях еще более удобным, чем функция Р1Ы, оредством для оргаииаации цикла по элементам списка является Функция ЬООР: [ЬООР х ! «» е» ... е»], РБПВВ, Ь ) 1. Первый аргумент х этой функции не вычисляется; он указывает пмя переменной, которая играет роль параметра цикла.
Эта переменная вводится при входе в функцию ЬООР и локализуется внутри иее. Функция действует следующим обравом. Она вводит переменную х и вычисляет значение второго аргумента, которое долл«но быть некоторым списком Ь. Далее фу«пщия последовательно присваивает переменной х элементы списка Ь и для каждого такого аначения переменной х по очереди вычисляет формы еь Значением функции является значение формы еы вычисленное иа последнем шаге цикла. Возможно, что зна~ением ! был пустой список, тогда цикл не выполняется, а значением функции является (). Действие функции ЬООР эквивалентно вычислению следующего выражения (а и Ь вЂ” вспомогательные переменные, имена которых отличны от названий других переменных): [РВ06 (х о (Ь ())) [БЕТ а !) А [СОЫП ([Р1Ы х а) [ВЕТПВЫ .Ь])] [БЕТ Ь [ПО е~ е» «»]] [60 А)) Испольауя функцию 1,00Р, «перевернуть» список Ь можно так: [РВ06 ((В1 ())) [ЬООР Е .1 [БЕТ ВЬ (.Е !.ВЬ)) .ВЬ]] Рассмотрим еще одни пример.
Подсчитать количество К атомов на верхнем уровне списка Ь можно следующим образом: [БЕТ К О) [100Р Х .Ь [СОЫП ([АТОМ .Х) [БЕТ К [+ .К 1Ц))) В этом примере аначение переменной К увеличивалось на 1 с помощью оператора [БЕТ К [+ .К 1)]. Подобное действие, как 40 и уменьшение значения некоторой переменной иа 1, встречается в плэнерских программах довольно часто, поэтому в яаык встроены функции АРШ и БПВ1, которые сокращают запись этих действий. Функции АРР1: [АРР1 1), ЯРВЕ, Значением аргумента должен быть идентификатор — имя существующей переменной, текущим вначением которой является число.
Функция увеличивает на 1 зто вначение и делает полученное число новым значением переменной. Это же число является и значением функции. Примеры: [РО [ЯЕТ Х 5) (.Х [АРР1 Х) .Х]] -~ (5 б б) [РО [ЯЕТ-Х г"] [ЯЕТ г" — Ч.4] [АРШ .Х] .У) -~- —,6.4 В последнем примере значением аргумента функции АРР1 является идентификатор У, поэтому меняется значение именно этой переменной, а не переменной Х.
Функция ЯРВР [ЯРВ1 1), ЯРВЕ, Эта функция действует аналогично функции АРШ, но только не увелнчвваег, а уменьшает ла 1 значение переменной. Функции АРР1 и ЯПВ1 попользуются для органивации циклов, в которых параметр цикла принимает числовые значения, изменяющиеся с шагом 1 или — 1. Например, цикл, параметр К которого меняет свое значение от 1 до некоторого числа 11 с шагом 1, может быть организован так: [ЯЕТ К О] А [АРР1 К] [СОМО ([ОТ .К .Р)) [60 В))] [60 А] В Для большего удобства в написании подобных циклов в яаык встроена Функция РОВ: [рОВ з п с, е, ... з„], РЯОВВ„Й ) 1.
Первый аргумент з данной функции не вычисляется и является параметром цикла, локализуемым внутри фу:вицин. Функция вводят переменную с именем з и вычисляет виачение своего второго аргумента, которое должно быть целым или вещественным числом 1т'. Далее функция по очереди присваивает переменной л значения 1, 2, 3 и т, д. и длн каждого такого значения переменной х последовательно вычисляет формы ео Цикл прекращается, когда очередное аначение переменной х становится строго болыпе числа У.
Значением функции является зяачение выражения еы вычисленное на последнем шаге цикла. В случае Л ( 1 цикл не выполняется ня разу, а значением функции объявляется пустой список (). Действие функции РОК эквивалентно вычислению следующего выражения (а и Ь вЂ” вспомогательные переменные): [РКОС ((х 0) а (Ь ( ))) [ЯЕТ а и] А [АО))1 х) [СОЕЙ ([СТ .х .а) [ВЕТСВВ .Ь) Ц [ЯЕТ Ь [ВО е~ ез ... еь]] [СО А)) Рассмотрим несколько примеров использования функции РОВ.
Следующая группа операторов вычисляет факториал Р целого числа Ы: [ЯЕТ Р 1] [РОК 1 .Ь( [БЕТ Р [Х .Р .Ц]) Действие встроенной функции [МЕМВ .Е .Ц (см. $ Ь7) можно описать в виде следующего блока: [РВОС () [РОК К [ЬЕЖСТН .Ц [СОКЕ ([ЕО [.К .Ц .Е) [ВЕТСВЫ .К]))п Функция РОВ„как видно из ее определения, предназначена для организации циклов, в которых начальное значение и шаг иаменеиия параметра цикла равны 1. Чаще всего именно такие циклы н используются в ялэнерских программах. Но если требуется органиаовать цикл, где это не так, тогда следует отказаться от использования функции РОВ либо приспособиться к ее особенностям.
Например, вычислить произведение Р = Ы.Х(Ы+ 1) Х ° . Х М с помощью этой функции можно следующим обрааом: [ЯЕТ Р .Ы] [РОК 1 [ — .М .Ы] [БЕТ Р [Х .Р [+.1 Ы))Ц В планере имеетсл еще две встроенниге функции, предназначенные для организации циклических вычислений. ФУнкЦиа %Н1ЬЕ: [КгН1ЬЕ Р е~ еэ ... еь), РАВЕ, й ) 1. Действие этой функции эквивалентно вычислению А [СОХО (р е, ез ... еь [СО А])) Таким образом, функция ЖН1ЬЕ вычисляет преднкат р и, если его значение отлично от (), последовательно вычисляет выраже- ния ес Затем эти действия повторяются вновь, Цикл прекращается, когда вначемие иредиката р становится равным ().
Значением функции всегда является пустой список (). Например, в реаультате вычисления [БЕТ Р [БЕТ К 1) ] [1ЧН1ЬЕ [1 Е .Р .11) [АВВ1 К) [ЯЕТ Р [Х Р К))! переменной Р будет присвоено значение наименьшего из факто- риалов, превосходящих заданное число йй Функция ПЕТ1Ь: [ПНТ1Ь е~ еэ ... еь р), РЯОВВ, й «) 1. Действие этой функции эквивалентно вычислению А [РО е1 еэ ... е» [СОг(В (р [ОО А)Ц) Следовательно, функция сначала вычисляет формы ео а ватам вычисляет предикат р. Если его аначение отлично от (), то данные действия повторяются вновь.
В противном случае функция еаканчнваег свою работу со значением (). [Л). Функции ЕУяЛ Следуя традициям языка лисп, планер имеет в числе своих встроенных функций функцию ЕЧАЬ, с помощью которой можно вычислять выражения, построенные в процессе выполнения программы. Обращение к этой функции имеет следующий вид: [ЕЧА1 е). Функция относится к классу ЯПВВ, поэтому при обращении к ней прежде всего вычисляется ее аргумент. Значение Е этого аргумента функция рассматривает кал простую форму (а Е обязано.
ею быть) и вычисляет ее, объявляя полученное значение своим вначением. Таким обрааом, функция ЕЧАЬ вычисляет вначение значения своего аргумента. Пусть, к примеру, значением переменной Х является список [+ 2 4), тогда имеем [ЕЧАЬ .Х) -~ 6 Действительно, аиачением аргумента является список [+ 2 4), вычислив который, функция ЕЧАЬ и получает число 6. Вычисление выражения, являющегося аначением переменной,— довольно типичное применение функции ЕЧАЬ в плэнерских программах. Такие выражения либо строятся во время 43 выполнения программы, либо известны заранее (при написании программы), но их нельая было вычислять раньше времени. Другое применение функции ЕЧАЬ вЂ” сразу вычислить только что построенные выражения. Напримор, если требуется вычислить условное выражение из двух клауз, которые варанее неиввестны, но являются значениями переменных Х п Ч, то это можно сделать, вычислив выражение [ЕЧАЬ [РОЕМ [СОР(П Х Х]]] Если, скажем, значением переменной Х является список (() А), а значением переменной У вЂ” список (Т В С), то в реаультате вычисления указанного выражения получится атом С.
В самом деле, при данных значениях переменных Х и У функция РОЕМ строит список [СОУП (() А) (Т В С)], который функция ЕЧАЬ и вычисляет,-получап в результате атом С. Еще один пример применения функции ЕЧА1 Пусть значением переменной Ь является непустой список, элементы которого— числа, и требуется вычислить сумму Б этих чисел. Следующие обращения к функции + [+ .Ь] и [+ ЬЬ] не дадут нам нужной суммы, а приведут лишь к ошибке. Действительно, в первом случае значением аргумента является список, а требуется число, во втором же случае в качестве аргумента задана не простая форма, а сегментная, что также недопустимо.