В.Н. Пильщиков - Язык Плэнер, страница 9
Описание файла
DJVU-файл из архива "В.Н. Пильщиков - Язык Плэнер", который расположен в категории "". Всё это находится в предмете "искусственный интеллект" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 9 - страница
Возможный выход — организовать цикл [ЯЕТ Я 0] [ЬООР )т .Ь [ЯЕТ Я [+ .Б .г(!]] Однако более эффективен иной выход: сначала построить «законпоез обращение к функции сложения — [+ В Н ... ( ], где Ь— числа из списка Ь, а вэтом уже вычислить это выражение, обратившись к функции ЕЧАЬ. Таким образом, наша задача может быть решена следующим образом: [ЯЕТ Я [ЕЧАЬ [РОЕМ [+ ).Ь]1]] [Л2. Определение новых функций До сих пор мы рассматривали лишь встроенные функции языка, продолжим их изучение и позже. Но сколько бы встроенных функций не было в языке, в любой более или менее сложной программе возникает необходимость в новых функциях, которые выполняют действия, специфичные именно для этой программы. Язык допускает использование таких функций.
Для этого поль- вователь должен сначала описать их, после чего он имеет право обращаться к ннм наравне со встроенными функциями. Для определения новой фуннции нужно обратиться к встроенной функции ВЕР1ЫЕ класса РБ()ВВ, унааав имя, параметры и правила вычисления определяемой функции: [ВЕР1ЫЕ гв (1АМВВА иаг ЬоНУ)] ЧРункция ВЕР1ЫЕ не вычисляет овои аргументы. Первый- ее аргумент — идентификатор ув — укааывает имя, которое выбрано для определяемой функции.
Второй аргумент — список (ЕАМВВА иаг доНу) — нааывается овределающам выражением функции ув. Его первый элемент ЕАМВВА указывает, что определяется именно фуйкция, а не процедура иного типа (сопоставитель .или теорема), второй элемент иаг описывает (формальные) аараметры определяемой функция, а третий элемент — простая форма ЬоН1г — нааывается телом функции ра и опнсывает алгоритм ов вычисления. В результате выполнения функции ВЕР1ЫЕ вырабатывается эначение гв.
Однако главное в работе данной функции ааключается в ее побочном эффекте —,в том, что она вводит и программу новую функцию с указанным именем и определяющим выражением, к которой теперь можно обращаться иа любой точки программы. (Отметим, что если имя новой функции совпадает с именем другой процедуры илй с именем константы, то эта процедура или константа автоматически уничтожается.) Обращение к новой функции записывается по тем же правилам, что и обращения к встроейным функцинм: дто ае ае ... аь'1 или (ув ае ае ...
аь), аДе ро — имЯ фУнкЦии, опРеДеленной нольаователем, а ае — аРгУ- менты (фактические параметры), ири которых функция должна быть вычислена. Сколько аргументов можно задавать при обращении к функции ро, какие ограничения на них накладываются — эсе это определяется элементом иаг из определяющего выражения данной функции. Синтаксически иаг может быть идентификатором, »-.переменной или списком, составленным иа идентификаторов и *-переменных.
Если иаг — идентификатор, тогда это имя единственного (формального) параметра функции. В данном случае к функции можно обращаться с любым числом аргументов, которые могут быть как простыми, так и сегментными формами. Во время вычисления обращения к функции все ати аргументы будут последовательно вычислены и из их эначений будет составлен 1 список, ко.торый станет значением этого единственного параметра функции. Если саг — идентификатор', помеченный префиксом «е», тогда этот идентификатор также является именам единственного параметра функции и при обращении к функции можно также задавать любое количество аргументов.
Однако в данном случае аргументы могут быть любыми выражениями, поскольку они не вычисляются: при обращении к функции ее параметру присваивается 1 список, состаалеикый из невычисленных аргументов. И, наконец, саг может иметь вид (и, и, ... еь), з ) О, где е~ — либо просто идентификаторы, либо идентификаторы, помеченные звездочкой. У такой функции ровно й параметров, их имена — идентификаторы гч (без звездочек), и при обращении к функции нужно указывать ровна з аргументов. Когда вычисляетсн обращение к функции, ьму параметру присваивается либо значение ьго аргумента (он должен бьжь простой формой), если и, не помечен звездочкой, либо сам ьй аргумент (любое выражение) в том виде, как он задан з обращении, если и~ помечен.
Обращение к функции, определенной пользователем, вычис- ляется следующим образом. Сначала, если нужно, вычисляются аргументы (зсе или только часть их), заданные в обращении. Эатем вводятся параметры функции, и им прпсваиваются указанным выше обрааом соответствующие значения, после чего вычисляется тело функции. Параметры функции локализуются в ее теле, где они рассматриваются как обычные переменные. Результат вычисления тела фулкцпи объявляется значением данного обращения к функции. Определяемые функции могут быть рекурсивными.
Никаких ограничений на рекурсии з планере нет. В частности, допускается косвенная рекурсия, когда одна функция обращается к другой, а та обращается (непосредственно или косвенно) к первой. При этом раарешено в теле любой определяемой функции Р указывать обращения к пока еще не определенным функциям (не определенным в момент вычисления функции ВЕР1НЕ, которая вводит в программу функцию Р). Но, естественно, к моменту вычисления первого обращения к функции Р все талие функции должны быть уже определены.
Раосмотрим описанные выше правила определения функций и вычисления обращений к ним па конкретных примерах.' В реаультате вычйсления выражения [ВЕРПЧЕ 1Р (ВАМВВА (Р»Е1 еЕ2) 1СОг(0 (.р'(ЕЪАТ, .ЕЦ) (Т (ЕУАЬ .Е21)))) будет определена функция с именем 1Р, дейотвие которой аналогично вычислению конструкции Н Р Феп Е1 е1зе Е2 яаыка алгол-60. В частности, аналогия распространяется и на то, что из двух выражений Е1 и Е2 вычисляться всегда будет лишь одно. Например, при значении перемепной ЪЧ, равном (А), обращение [1Р [ВМРЕ ЛУ] [ЯЕТ Х А] [ЯЕТ Х В]] вычисляется следующим обрааом.
Поскольку первый параметр функции 1Р не помечен, первый аргумент вычисляется; второй же и третий параметры помечены, поэтому два других аргумента не вычисляются. Следовательно, параметрам присваиваются такие значения: Р:= (), ЕП= [ЯЕТ Х А], Е2:= [ЯЕТ У В]. Теперь вычисляется тело функции 1Р, т.
е. условное выражение. Так как значение переменной Р равно (), в условном выражении вычис. ляется выражение из второй клаузы, т. е. выражение [ЕЧАЕ .Е2]. Вычисление его сводится к вычислению выражения .[ЯЕТ 'У В]. Таким образом, переменной Ч присваивается аначение В, а значением тела функции 1Р становится атом В. Этот же атом является и значением укаааннаго обращения к функции 1Р. Данный пример покааывает, какие параметры определяемых функций следует метить авеадочкой, а какие — нет. Если некоторые аргументы функции вообще не должны вычисляться либо они будут вычисляться,но только во время вычисления тела функции, тогда соответствующие параметры нщбходимо пометить.
Если же в теле функции должны испольэоватьсн значения аргументов, тогда соответствующие параметры ме метятся. В следующем примере определяется фувнция, обращаться к которой можно с любым количеством аргументов, причем при обращении все эти аргументы вычисляются. [ОЕИХЕ СА (ЬАМВПА М [/ [ЕЧМ [РОЕМ [+ ЕХ]]] [ЬЕНОТН .Щ])] Данная функция подсчитывает среднее арифметическое (числовых). аначений своих аргументов. Пусть, например, значением переменной Х является число 5.8, тогда обращение [СА 6 .Х [+ .Х 2.2]] вычисляется так. Поскольку в определяющем выражении данной функции в качестве описания параметров указан идентификатор М, то ато означает, что все аргументы, указанные в обращении, вычисляются и что из их значений составляется список, который присваивается параметру Е: Н:= (6 5.8 8.0). Далее вычисляется тело функции СА — обращение к функции деления, первый аргумент который находит сумму чисел списка Н (см.
$1.И), а второй — общее количество этих чисел. Таким образом, аначением функции СА является частное от деления 19.8 на 3, т. е. число 6.6. Отметим, что в общем случае правила яаыка ие накладывают ограничений на значения аргументов определяемых функций. Однако алгоритмы вычисления этих функций обычно ограничивают ! область допустимых аначений аргументов. Так, вначениями аргументов функции СА могут быть только числа. Подобного рода ограничения никак не фиксируются в плзнерскмх программах; помнить о них и придерживаться их обязан сам польэователь, если он не хочет, чтобы вычисление функции привело к ошибке.
Примером функции с прои»вольным числом аргументов, которые заранее не вычисляются, может служить следующая функция ОВ1, действие которой эквивалентно вычислению встроенной функции ОВ: [РЕР1ХЕ ОВ1 (1АМВРА «Р1Я [РВОС (Щ А [СО)ЧР ([Р1Н Р Р1Я] ()) ([ЕЧАЬ .Щ) (Т [66 А)Н))4 Например, обращение [ОВ1 [АТОМ .Х) [Е1) .Х (А)]) при значении (А) у переменной Х вычисляется так. Параметр функции ОВ1 помечен, поэтому ему присваивается список иэ не- вычисленных аргументов: Р1Я:= ([АТОМ .Х) [Е1) .Х (А))).
Далев вычисляется тело функции ОВ1, т. е. функция РВОО, которая вводит еще одну переменную Р и организует цикл по элементам списка ШЯ. На первом шаге цикла переменная Р получает вначение [АТОМ .Х], а переменная Р1Б — вначение ([ЕО .Х (А))), после чего вычисляется [ЕЧАР .Щ, т. е. [АТОМ .Х]. Поскольку эта форма имеет вначение «ложь», выполняется оператор перехода иэ третьей клауэы условного выражения.
На втором шаге цикла переменная Р получает вмачеиие [Е1) .Х (АЦ, а эначением переменной Р1Б становится пустой список (). Вычисление формы [ЕЧАЬ .Р] в этот рав сводится к вычислению [Е1) Х (А)], что дает значение Т, поэтому вычисление функции СОВР и, следовательно, функции РВ06 заканчивается с эти»1 вначением. Теперь уничтожается как переменная Р иэ тела функции РКОО, так и параметр Р1Б, и значением всего обращения к функции ОК1 объявляется атом Т. Приведем также пример рекурсивной функции: [РЕРП»(Е 1(А (КРАМЕРА (Б) [СОЫР ([АТОМ .Ц 1) ([ОК [ЧАК .Ц [ЕМРТУ .Ц) 0) (Т [+ [(ЧА [1 .Щ [»(А [КЕБТ 1 .Ц)))])] Эта функция определяет, сколько атомов входит (на всех уровяях) в выражение 1..
Если Р— атом, то эначением функции объявляется 1. Если Р— инее атомарное выражение или пустой список, то аначение функции равно О. Иначе Ь является иепустым спис- ком, и в этан случае функция )ЧА рекурсивно применяется к первому алемеиту списка Ь, чтобы определить сколько атомов входит в етот элемент, и к «хвосту» списка Ь, чтобы подсчитать число атоиов в этой части списка. Затем полученные числа складыватотся, что и дает общее количества атомов, входящих,в весь список Ь.
Например: [)»(А (А (В 2 (СЦ «70Ц -ь 5 1.»3. Программа Программа на пленере представляет собой последовательность выражений (точнее, простых форм). Зтп выражения принято навывать выражениями верхнего уровня нрограммы, чтобы отличить их от подвыражений, нз которых они состоят. Выполнить программу — ато вначит последовательно вычислить выражения ее верхнего уровня. Более точно, вычисление программы происходит так. Считывается ее первое выражение, и оно печатается на АЦПУ (при работе с пленер-системой в пакетном режиме) или на внране терминала (в диалоговом режиме).