В.Н. Пильщиков - Язык Плэнер, страница 10
Описание файла
DJVU-файл из архива "В.Н. Пильщиков - Язык Плэнер", который расположен в категории "". Всё это находится в предмете "искусственный интеллект" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 10 - страница
Затем ато выражение вычисляется. Полученное вначение также выводится на АЦПУ или терминал Далее все ати действия повторяются по отношению ко второму„ третьему и остальным выражениям верхнего уровня программы. После вычисления последнега выражения выполнение программы прекращается. Например, при вычислении программы, состоящей на выражений [ВЕЯТ 1 (А В СЦ [ПЕР!г)Е МАТОМ (ЬАМВЛА (Х) [НОТ [АТОМ,Х))Ц [МАТОМ е5) будет напечатано следующее: [ВЕЕТ 1 (А В С)) (В С) [РЕР1НЕ ПАТОМ (1АМВВА (Х) [)»(ОТ [АТОМ .Х)]Ц МАТОМ [ЕАТОМ е5) () Из каких выражений составлять программу — это решает польаовател»н но обычно структура плвнерской программы таиова.
Сначала выписываются обращения к функции ВЕР11»Е — определяются 'новые фуницни, необходимые для решения вадачи, поставленной перед нрограммой, а затем выписывается одно или кесколькгь обращений к втим функциям. Более того, в программе, как 4 н. Н. Пильщиков правило, выделяется одна функция, которая называется основной (или главной, ведущей) и которая решает всю задачу. Остальные же функции являются вспомогательными, оии решают какие-то подзадачи и используются основной функцией. В конце программы в таком случае. ставится одно обращение к ее основной функции, в качестве аргументов для которой задаются исходные данные программы. В качестве небольшого примера планерской программы рассмотрим программу, которая преобразует запись арифметических выражений из инфиксной формы в префиксную.
Инфиксная форма записи — зто обычная форма записи формул, когда знак операции размещается между операндами: х+ у, з Х у+» Х ю Х ш В префиксной же записи знак операции ставится перед операндами; например, укааанлые выше формулы записываются в префикспой форме так: (+ в у), (+ (Х х у) (Х з(Х ю и))).
Префиксная форма записи арифметических выражений более удобна для обработки, поатому часто до обработки выражений их преобразуют ив привычной инфиксной формы в префиксную, Именно . вта задача перевода нвс и будет интересовать, прячем для простоты мы рассматриваем преобразование ме любых арифметических .выражений, а только тех, которые содержат переменные, соединенные анаками + и Х Назовем условно такие выражения «многочленами». Более точ-- но их можно определить так.
«Переменная» — вто любой планерский идентификатор, «одночлен» вЂ” это либо одна переменная, Либо последовательность переменных, соединенных анаком Х, а «многочлен» вЂ” зто » список из одного одночлена или иа нескольких одночленов, соединенных анаком +. Примеры таких многочлеиов: (Х) (Х + У Х Е) (Х Х У + Е Х Иг Х Ч) Для решения поставленной задачи мы введем три новых функции: основную функцию ТВАИЯЬ и две вспомогательные функции МО)»(0 и РО1 г. Функция .МОНО от одного аргумента решает такую вадачу: она преобразует одночлен М (точнее, одночлен, заключенный в скобки) из илфиксной формы м префиксную. Если М вЂ” список из одной переменной, тогда функция в качестве своего аначеиия выдает зту же переменную но без скобок. Иначе М имеет вид (х Х у), где з — переменная, а у — одночлен.
В данном случае функция в качестве ответа выдает список (Х х у), где у — префиксная форма ааписи одночлена у, полученная в результате рекурсивного применения функции МОНО. Определение функции МО)»(Π— это первое выражение нашей программы: [ВЕР1ХЕ МОХО (КАМЕРА (М) [СОХО ([ЕО [ЬЕХСТН .М] 1] [1 .М]) (Т (Х [1 .М] [МОХО [ВКЯТ 2 .М]]))]Ц Вторым выражением программы является определение функции РОБУ от одного аргумента — многочлеиа Р: [ОКР1ХЕ РОБУ (САМВОА (Р) [РВОО (К) [ЯКТ К [МЕМЕ + .Р]] [СОХО ([ХОТ .К] [ВКТСВХ [МОХО .Р]])] (+ [МОХО [НКАО [ — .К 1] .Р]] [РОСУ [ВКЯТ .К .Р]])1)] Данная функция преобразует иификсную форму записи миогочлена Р в префиксную.
Для этого функция прежде всего определяет, есть ли в Р хотя бы один знак +. Если нет, тогда Р является одночленом, поэтому функция РО1Х применяет к нему функцию МОХО и с ее аначением заканчивает свою работу. Иначе значение переменной К укааывает номер первого атома + в списке Р Этот знак делит многочлен на две части: слева от него находится одночлен, справа — многочлен. Обе эти части преобразуются в префиксиую форму, для чего к многочлену рекурсивно применяется функция РОЮ', а к одночлеиу — функция МОХО.
Далее ив знака + и полученных реаультатов составляется список с круглыми скобками, который и представляет собой префиксную форму записи исходного многсчлена Р. Этот список объявляется значением функцил РОСУ. Фуикцмя РОСУ фактически полностью решает нашу задачу за одним исключением: если исходный многочлен является списком нз одной переменной, скажем (Х), то функция выдает в качестве ответа не (Х), а просто Х. Чтобы устранить этот дефект, мы вводим еще одну функцию ТВАХЯ1„ которая и будет тканной функцией программы. Определение данной функции — это третье выражение программы [ОКР1ХЕ ТКАНЯМ (ЕАМВОА Щ [СОХО ([К(] [1КХСТН .Ц 1] .Ц (Т [РО1У .Ц)])] Указанные три выражения составляют, можно сказать, описание программы.
Теперь, чтобы применить программу к каким-то исходным данным, надо вставить в программу еще одно выражение — 'обращение к функции ТВАХЯЕ, задав в качестве аргумента тот многочлен, который мы хотим преобразовать. Так: [ТВАХЯ (Х Х У + Е Х УР Х У + О)] В результате вычисления этого выражения мы пояучим ртвет (+ (Х Х У) (+ (Х К (Х 17 У)) Щ) бй 1 14.
Переменные н константы Любая испочьзуемая в программе переменная должна быть описана. Переменные описываются в блочной функции РК06, з функциях 1,00Р и РОК, е определяемых функциях и в ряде'других процедур языка, которые будут рассмотрены позже. Каждая переменная локализуется в теле той функции, в которой она описана, т. е. переменная сущоствует только во время вычнсленяя атой функции и не существует вне ее.
Как уже было сказано, именами переменных могут быть только идентификаторы. В языке разрешается совпадение имен. переменных с именами процедур, констант и меток. Любая существующая переменная может как иметь аначение, так и не иметь его. Значением переменной может 'быть любое выражение. Если переменная не имеет значения, то возможны ограничения,на ее будущее значение, о чем будет расскааано в гл. 5. Пока мы не будем учитывать эти ограничения.
В любой функции допускается испсльаование как ее локальных переменных, так и внешних по отношению к ней переменных. Имена локальных и внешних переменных могут совпадать. В таком случае предпочтение отдается переменной, описанной в ближайшей иэ активных (вычисление которых еще не окончено) объемлющих процедур. Следовательно, если в процедуре Р используется переменная Х и она описана в Р, то в Р используется ее лональная переменная Х. Но если Х не описана в Р, тогда берется переменная с этим именем из процедуры 6, которая вызвала процедуру Р.
Если переменная Х не описана и в 6, тогда рассматривается процедура, вызвавшая процедуру 0,и т. д. Такое правило называется правилом динамической идентификации верелезкыз, так как смьгсл переменных определяется динамикой выполнения программы и может меняться в зависимости от того, по какому пути идет вычисление программы.
В самом деле, процедура Р может быть вызвана из разных процедур: е одном случае, скажем,ив процедуры 01, а в другом — пз 02. Поэтому в первом случае под переменной Х, используемой, но не описанной в Р, понимается переменная из 01, а во втором —. из 02. В предыдущих параграфах уже был рассмотрен ряд встроенных функций языка (ЯЕТ, РВч', АВВ1 и ЯПВ1), используемых при работе с переменными. Сейчас мы опишем еще несколько подобных функций. Э~ ц Вои)ЦВ: [КОПОВ 1), ЭПИК. Это — функция-предикат, которая позволяет уанаттч описана ли в одной иэ объемлющих процедур переменная с именем й Если описана, то значение функции равно Т, не описана — (). 52 Например, если следующий блок [РВОО (Х (У Х)) ([ВООНО У] [ВООНВ .У] [ВОПЛО Е]Ц является выражением верхнего уровня программы, то его вычи- сление дает результат (Т Т ()).
Функции НАЯЧА)л [НАБЧА1. 1], БОВЕ. .Значением аргумента этой функции-предиката должно быть имя описанной переменной. Если в текущий момент данная переменная имеет какое-либо значение, то функция в качестве своего значения выдает атом Т, а если яе имеет — пустой список (). Например, еслл функция Р определена следующим образом: [ОЕР15)Е'Р (ЬАМВВА (Х) [РВОО (У (Х У)) ([НАЗЧА1 Х] [НАБЧА1 З] [НАЯЧАЕ .Е])])] тогда аначепием выражения [Р 5] будет список (Т Т ()). Функция П)ЧАЯБ161Ч: [УНАЯБ1СХ «], БАЕВЕ. Значением аргумента данной Функции таюие должно быть имя описанной переменной. Функции «отнимаетз значение у этой перемелной, т. е.
после вычисления функции у переменной не будет никакого значению Значение самой функции — ндептификатор й Фущщия ЧА1Л)Е [ЧА(Л)Е 1], ЗОВЕ. И адесь значением аргумента должен быть идентификатор — пмя описанной переменной, причем переменная обязана иметь значение. Именно ато значение и является результатом вычисления данной функции. Если,,например, значением переменной У является идентификатор Х, а значением переменной Х вЂ чис 5, то [ЧА)Л)Е Л] -+. 5 Отметим, что выражение [ЧАЕСЕ У] эквивалентно выражению Ч, поэтому явно указывать имя переменной при обращеиин к функции ЧАЕУЕ невыгодно.