В.Н. Пильщиков - Язык Плэнер, страница 14
Описание файла
DJVU-файл из архива "В.Н. Пильщиков - Язык Плэнер", который расположен в категории "". Всё это находится в предмете "искусственный интеллект" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 14 - страница
Доступ ко всему списку свойств идентификатора или к его отдельным свойствам обеспечивает Функция ОЕТ: [ОЕТ 1 1яд?1, ЯПВВ. Если второго аргумента нет, то в качестве своего значения функция выдает весь список свойств идентификатора 1 в виде списка (НУР, У, ... НгРь Уь), в ) О. При этом свойства со значением () в данный список не включаются, а порядок расположени» свойств пронаволен. Б том случае, когда заданы оба аргумента, функция выдает значение только одного свойства — с названием 1лР; в частности, будет выдано (), если свойства с таким названием нет. Если, например, идентификатор АТОМ обладает указанными выше свойствами, то [6ЕТ АТОМ] -~- (ТИПАРГ (ЛЮБОЕ ВЫРАЖЕНИЕ) КЛАСС ЗАВЕ РОД ФУНКЦИЯ ЧИСЛОАРГ Ц [6ЕТ АТОМ' КЛАСС] ЗНВН [СЕТ АТОМ ТИПРЕЗ] -~ () Для изменения значения какого-нибудь одного свойства идентификатора применяется Функция РПТэ -[РПТ ~ ~вд и], БПВК.
Эта функция Заменяет в списке свойств идентификатора Х прежнее значенне свойства с названием Пт'Р на новоейпаченне, которьгм является выражение У. Если такого свойства не было, то оно добавляется, а если У вЂ” это пустой спиоок (), то данное свойство уничтожается, Значение функции равно У. Например, при указанных выше свойствах идентификатора АТОМ после вычисления [ВО [РОТ АТОМ РОД СОПОСТАВИТЕЛЪ] [РОТ АТОМ КЛАСС ()] [Р()Т АТОМ ЧИСЛОАРГ 0] [РНТ АТОМ ТИПАРГ ()]] у нндентифнкатора АТОМ окажется только два свойства: одно— с названием РОД и значением СОПОСТАВИТЕЛЪ, а другое — с названием ЧИСЛОАРГ и значением О. х.'г8.
Преобразование типов данных До оих пор мы считали, что атомарные вьгражения являются неделимыми конструкциями. Для большинства аадач такая точка зрения наиболее естественна и удобна. Однако в некоторых случаях выгодно лсе же рассматривать эти конструкции как составные. Поэтому в яаык встроен ряд функций, которые не считают атомарные выражения неделимыми объектами и которые позволяют преобразовать одни атомарные выражения в другие. Функция АТЬ: [АТЬ ~], БПВН, Эта функция разбивает идентификатор, являющийся значением ое аргумента, на отдельные символы, из которых состоит печатное наименование идентификатора, и превращает их в односимвольные атомы цифры — в целыз числа, остальные символы — в идентификаторы.
Ь-список из этих атомов объявляется значением функции. Например: [АТ1. СЛОВОМ] -~- (С Л О В О М) [АТЬ В5+ С.] -~ (В 5 + С .) Функция АТТ' полезна, например, в программах, обрабатывающих тексты на естественном яаыке. В этих программах прнходйтся определять, в каном падеже и числе входит в исходный текст каждое существительное, прилагательное и т. п. Если бы идентификаторы, представляющие эти слова, нельая было разделить на составляющие их буквы, тогда в программе пришлось бы хранить формы канщого слова во всех падежах единственного и множествепного чисел. Функция же АТЬ позволяет преобразовывать любое слово-идентификатор в список пз его букв, который уже можно анмализировать (например, находить основу и окончание слова) средствами языка.
Поэтому в программе можно хранить только основы слов и общую для всех слов таблицу окончаний. Если функция АТЬ полезна при анализе слов, то следующая функция полезна при их синтезе, например при соединении основы слова с окончанием. Функции ЬТА: [ЬТА Я), ЯПВВ. Значением аргумента должен быть-непустой список, элементами которого являются атомы. Функция <склеикает» эти атомы в один идентификатор, который она и выдает как свое значение.
Примеры: [ЬТА (С Л О В О М)[ -» СЛОВОМ [ЬТА (СЛОВ ОМ)) -» СЛОВОМ [ЬТА ( — 52 А «7Ц -» — 52А»7 [ЬТА (» Х $)) -»»Х$ [ЬТА (5 6.79) ) -» 56.79000 (замечание: у вещественных ггисел учитывается столько цифр из дробной части, 'сколько их в текущий момент выводится на печать — см. $ Ь(5). Подчеркнем, что значением функции ЬТА всегда является идентификатор, даже если он внешне имеет вид аапрещенного атома (как в третьем примере выше) или похож на друтие типы выражений (как в последних двух примерах). Рассмотрим одно из возмоншых применений функции ЬТА. В некоторых программах возникает потребность во «внутреннихэ названиях для их объектов, причем заранее количество таких имен неизвестно, так что запасти их ораву нельзя. Во многих версиях языка лисп в подобных ситуациях предлагается встроенная функция СЕХЯУМ, которая при каждом обращении к ней выдает в качестве своего значения некоторый новый идентификатор, отличный от всех остальных идентификаторов программы, В пленере такой встроенной функции нет, но она легко определяется с помощью функции ЬТА.
Для этого можно, например, ввести.кок- станту с именем ХСЕХЯУМ, дать ей начадьное значение 0 и ватем определить функцию СЕХЯУМ следующим образом: [ПЕР(ХЕ СЕХБУМ (ВАМВРА () .[РО [СЯЕТ ХСЕХБУМ [+:ХСЕХБУМ 1]] [(ТА (:ХСЕХБУМ «Ц]Ц Обращение к этой функции имеет вид [СЕХБУМ]. При первом обращении функция выдает в качестве своего значения идентификатор 1», прл втором — идентификатор 2», при сорок пятом— 45«и т. п.
Следующие две функции преобразуют шкалы в целые чмсла и наоборот. Фувнция ЯТХ: [БТХ з], БОВЕ. Эта функция преобразует шкалу 8, рассматриваемую как запись целого числа в восьмеричной системе, в соответствующее десятичное целое число. Например: [ЯТХ «2Ц -+ 27 Функция ХТЯ: [ХТЯ л], ЯУВК. Значением аргумента данной функции должно быть неотрицательное целое число. Оно преобразуется в ппгалу, представляющую запись этого числа з восьмеричной системе. Например: [ХТБ 17] -««2$ С помощью следующей встроенной функции можно' наменять внешние скобки у любых списков, можно заменять в обращеиилх к переменпым одни префиксы на другие, вообще отбрасывать префиксы или присоединять префиксы к именам переменных.
Функция ЕТЕ: [ЕТЕ ез ез], БУВК. Значениями обоих аргументов этой функции должны быть одновременно либо списки, либо идентификаторы и/или обращения к переменным. В первом случае значением функции является список, составленный из злементов списка Ьь но имеющий скобки списка Е„т. е. у списка Ез скобки ваменяются на скобки списка Ез. Во втором случае префикс выражении Ег аамеляется иа префикс выражения Ез. Более точно, в качестве своего значения функция выдает обращение к переменной, составленное из имени, взятого из Еь и префикса, взятого нз Ез (идентификаторы здесь условно рассматриваются кан 'обращения к переменным с пустым префиксом).
Примеры: [ЕТЕ (А (В С)) [ОООТЕ ( Ц] (А (В С)) [ЕТЕ [ОООТЕ «Х] [(]БОТЕ 1.А]] 1,Х [ЕТЕ [1]СОТЕ .Х] А] Х [ЕТЕ Х [ОУОТЕ;А]] -«:Х Отметим, что функция ЕТЕ осуществллет чисто синтаксическое преобразование,' поэтому не требуется, чтобы переменные, обращения к которым указаны в качестве аргументов, были описаны в программе. Функция ЕТЕ, как правило, применяется тогда, когда во время выполнения программы надо построить плэнерские выражения, которые затем будут вычислены с помощью функции ЕУАЬ, Здесь обычно возникает такая проблема: как, имея имя некоторой переменной, пострапть обращение к ией с некоторым префнксом7 Функция ЬТА в данпой ситуации не поможет, так как в результате вычисления, скажем, выражения [1ТА (.
Х)] получается конструкция .Х, которая внешне похожа на .-переменную, но которая ею не является: А вот функция ЕТЕ адесь как раз и пригодится: [ете х [ОООТК .сц .х причем выражение .Х действительно' является .-переменной. [Л9. Пример программы Рассмотрим аадачу преобразования выражений языка лисп в эквивалентные плэнерокие выражения с последующим их вычислением. Например, лисповское выраткение (ЗЕХРК МЕМВЕК (ЬАМВВА (А Ь) (СО)ч0 ((ЕО 1 ()) ЕЬЬ) ( (Е(] А (САН ' 1,) ) Т) (Т (МЕМВЕК А (СОК Ь)))))) должно быть преобразовано в плзнерское выражение [ВЕР1НЕ МЕМВЕК (ЬАМВВА (А 1,) [СОМО ([ЕО .Ь ( Ц ( )) ([ЕО .А [1 .Ь]) Т) (Т [МЕМВЕК .А [КЕЗТ 1 Ь]])])] которое и следует вычислить.
Для простоты мы ограничимся «базовым» лионом л будем предполагать, что лисповские выражения ааписаны беа ошибок, что точечные выражения лима не пспольауются и что встроенные лисповские функции переопределять нельзя. Ниже перечислены правила преобразования допускаемых нами лпсповских выражений (слева) в эквпвалентные плзнерские выражения; в этих правилах л обозначает простую плэнерскую форму, зквквалентную лпсповскому выражению х, а т — сегментный вариант этой формы.
70 члено» наело )г»1Ь, () -н () т т другие идентификаторы -~;неременнь»е (О()ОТЕ х) -н х (САВ х) -ь [1 х] (СВВ х) -» [ВЕБТ 1 х] ' (СО11Б х у) -»- (х у) (АТОМ х) -н [АТОМ х] (ЕО х у) -~ [ЕО т у] (СО(»)О (р» е») ... (рь ег)) -ь [СО)»)В (р» е») ... (рь е»П (БЕХРВ ] (ЬАМВОА (и» и, ... и„) е)) [ВЕР1МЕ 1 (ЬАМВОА (и, и.. и„) еП (( а» а» ... а„) »- [) а» аг .. а ] ((ЬАМВВА (и» и» ...